[
  {
    "path": ".github/CONTRIBUTING.md",
    "content": "# Contributing Guidelines\n\nWant to help out with the Swift Algorithm Club? Great! While we don't have strict templates on the format of each contribution, we do have a few guidelines that should be kept in mind:\n\n**Readability**\n\nOur repo is all about learning. The `README` file is the cake, and the sample code is the cherry on top. A good contribution has succinct explanations supported by diagrams. Code is best introduced in chunks, weaved into the explanations where relevant. \n\n> When choosing between brevity and performance, err to the side of brevity as long as the time complexity of the particular implementation is the same. You can make a note afterwards suggesting a more performant way of doing things. \n\n**API Design Guidelines**\n\nA good contribution abides to the [Swift API Guidelines](https://swift.org/documentation/api-design-guidelines/). We review the pull requests with this in mind.\n\n**Swift Language Guidelines**\n\nWe follow the following Swift [style guide](https://github.com/raywenderlich/swift-style-guide). \n\n## Contribution Categories\n\n### Refinement\n\nUnit tests. Fixes for typos. No contribution is too small. :-)\n\nThe repository has over 100 different data structures and algorithms. We're always interested in improvements to existing implementations and better explanations. Suggestions for making the code more Swift-like or to make it fit better with the standard library are most welcome.\n\n### New Contributions\n\nBefore writing about something new, you should do 2 things:\n\n1. Check the main page for existing implementations\n2. Check the [pull requests](https://github.com/raywenderlich/swift-algorithm-club/pulls) for \"claimed\" topics. More info on that below. \n\nIf what you have in mind is a new addition, please follow this process when submitting your contribution:\n\n1. Create a pull request to \"claim\" an algorithm or data structure. This is to avoid having multiple people working on the same thing.\n2. Use this [style guide](https://github.com/raywenderlich/swift-style-guide) for writing code (more or less).\n3. Write an explanation of how the algorithm works. Include **plenty of examples** for readers to follow along. Pictures are good. Take a look at [the explanation of quicksort](../Quicksort/) to get an idea.\n4. Include your name in the explanation, something like *Written by Your Name* at the end of the document. \n5. Add a playground and/or unit tests.\n\nFor the unit tests:\n\n- Add the unit test project to `.travis.yml` so they will be run on [Travis-CI](https://travis-ci.org/raywenderlich/swift-algorithm-club). Add a line to `.travis.yml` like this:\n\n```\n- xctool test -project ./Algorithm/Tests/Tests.xcodeproj -scheme Tests\n```\n\n- Configure the Test project's scheme to run on Travis-CI:\n    - Open **Product -> Scheme -> Manage Schemes...**\n    - Uncheck **Autocreate schemes**\n    - Check **Shared**\n\n![Screenshot of scheme settings](../Images/scheme-settings-for-travis.png)\n\n## Want to chat?\n\nThis isn't just a repo with a bunch of code... If you want to learn more about how an algorithm works or want to discuss better ways of solving problems, then open a [Github issue](https://github.com/raywenderlich/swift-algorithm-club/issues) and we'll talk!\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "content": "### Brief Intro\n\n<!-- Describe the issue briefly.-->\n\n### More Details\n\n<!-- If necessary, start off with the code snippet. Put the code in between ``` to format them into code blocks.-->\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "<!-- Thanks for contributing to the SAC! Before you submit your pull request, please make sure to check the following boxes by putting an x in the [ ] -->\n\n### Checklist\n\n- [ ] I've looked at the [contribution guidelines](https://github.com/raywenderlich/swift-algorithm-club/blob/master/.github/CONTRIBUTING.md).\n- [ ] This pull request is complete and ready for review.\n\n### Description\n\n<!-- In a short paragraph, describe the PR --> \n\n"
  },
  {
    "path": ".gitignore",
    "content": "# Xcode\nbuild/\nDerivedData/\n\n*.pbxuser\n*.mode1v3\n*.mode2v3\n*.perspectivev3\n*.xccheckout\n*.moved-aside\n*.xcuserstate\n\nxcuserdata\n\n!default.pbxuser\n!default.mode1v3\n!default.mode2v3\n!default.perspectivev3\n!default.xcworkspace\n\nprofile\n*.hmap\n*.ipa\n\n# CocoaPods\nPods/\n!Podfile.lock\n\n# Temporary files\n.DS_Store\n.Trashes\n.Spotlight-V100\n*.swp\n*.lock\n"
  },
  {
    "path": ".swiftlint.yml",
    "content": "cyclomatic_complexity: 12\nfile_length: 550\nfunction_body_length: 80\nfunction_parameter_count: 8\nline_length: 150\ntype_body_length: 300\nvariable_name:\n  min_length:\n    error: 1\n    warning: 1\n  excluded:\n    - N\n\ndisabled_rules:\n  - valid_docs\n\ncustom_rules:\n  smiley_face:\n    name: \"Smiley Face\"\n    regex: '( :\\))'\n    match_kinds:\n      - comment\n      - string\n    message: \"A closing parenthesis smiley :) creates a half-hearted smile, and thus is not preferred. Use :]\"\n    severity: warning\n"
  },
  {
    "path": "3Sum and 4Sum/3Sum.playground/Contents.swift",
    "content": "// last checked with Xcode 10.1\n#if swift(>=4.2)\nprint(\"Hello, Swift 4.2!\")\n#endif\n\nextension Collection where Element: Equatable {\n  \n  /// In a sorted collection, replaces the given index with a successor mapping to a unique element.\n  ///\n  /// - Parameter index: A valid index of the collection. `index` must be less than `endIndex`\n  func formUniqueIndex(after index: inout Index) {\n    var prev = index\n    repeat {\n      prev = index\n      formIndex(after: &index)\n    } while index < endIndex && self[prev] == self[index]\n  }\n}\n\nextension BidirectionalCollection where Element: Equatable {\n  \n  /// In a sorted collection, replaces the given index with a predecessor that maps to a unique element.\n  ///\n  /// - Parameter index: A valid index of the collection. `index` must be greater than `startIndex`.\n  func formUniqueIndex(before index: inout Index) {\n    var prev = index\n    repeat {\n      prev = index\n      formIndex(before: &index)\n    } while index > startIndex && self[prev] == self[index]\n  }\n}\n\nfunc threeSum<T: BidirectionalCollection>(_ collection: T, target: T.Element) -> [[T.Element]] where T.Element: Numeric & Comparable {\n  let sorted = collection.sorted()\n  var ret: [[T.Element]] = []\n  var l = sorted.startIndex\n  \n  ThreeSum: while l < sorted.endIndex { defer { sorted.formUniqueIndex(after: &l) }\n    var m = sorted.index(after: l)\n    var r = sorted.index(before: sorted.endIndex)\n    \n    TwoSum: while m < r && r < sorted.endIndex { \n      let sum = sorted[l] + sorted[m] + sorted[r]\n      if sum == target {\n        ret.append([sorted[l], sorted[m], sorted[r]])\n        sorted.formUniqueIndex(after: &m)\n        sorted.formUniqueIndex(before: &r)\n      } else if sum < target {\n        sorted.formUniqueIndex(after: &m)\n      } else {\n        sorted.formUniqueIndex(before: &r)\n      }\n    }\n  }\n  \n  return ret\n}\n\n// Answer: [[-1, 0, 1], [-1, -1, 2]]\nthreeSum([-1, 0, 1, 2, -1, -4], target: 0)\n\n// Answer: [[-1, -1, 2], [-1, 0, 1]]\nthreeSum([-1, -1, -1, -1, 2, 1, -4, 0], target: 0)\n\n// Answer: [[-1, -1, 2]]\nthreeSum([-1, -1, -1, -1, -1, -1, 2], target: 0)\n"
  },
  {
    "path": "3Sum and 4Sum/3Sum.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "3Sum and 4Sum/3Sum.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "3Sum and 4Sum/3Sum.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "3Sum and 4Sum/4Sum.playground/Contents.swift",
    "content": "// last checked with Xcode 10.1\n#if swift(>=4.2)\nprint(\"Hello, Swift 4.2!\")\n#endif\n\nextension Collection where Element: Equatable {\n  \n  /// In a sorted collection, replaces the given index with a successor mapping to a unique element.\n  ///\n  /// - Parameter index: A valid index of the collection. `index` must be less than `endIndex`\n  func formUniqueIndex(after index: inout Index) {\n    var prev = index\n    repeat {\n      prev = index\n      formIndex(after: &index)\n    } while index < endIndex && self[prev] == self[index]\n  }\n}\n\nextension BidirectionalCollection where Element: Equatable {\n  \n  /// In a sorted collection, replaces the given index with a predecessor that maps to a unique element.\n  ///\n  /// - Parameter index: A valid index of the collection. `index` must be greater than `startIndex`.\n  func formUniqueIndex(before index: inout Index) {\n    var prev = index\n    repeat {\n      prev = index\n      formIndex(before: &index)\n    } while index > startIndex && self[prev] == self[index]\n  }\n}\n\nfunc fourSum<T: BidirectionalCollection>(_ collection: T, target: T.Element) -> [[T.Element]] where T.Element: Numeric & Comparable {\n  let sorted = collection.sorted()\n  var ret: [[T.Element]] = []\n  \n  var l = sorted.startIndex\n  FourSum: while l < sorted.endIndex { defer { sorted.formUniqueIndex(after: &l) }\n    var ml = sorted.index(after: l)\n                                      \n    ThreeSum: while ml < sorted.endIndex { defer { sorted.formUniqueIndex(after: &ml) }\n      var mr = sorted.index(after: ml)\n      var r = sorted.index(before: sorted.endIndex)\n      \n      TwoSum: while mr < r && r < sorted.endIndex {\n        let sum = sorted[l] + sorted[ml] + sorted[mr] + sorted[r]\n        if sum == target {\n          ret.append([sorted[l], sorted[ml], sorted[mr], sorted[r]])\n          sorted.formUniqueIndex(after: &mr)\n          sorted.formUniqueIndex(before: &r)\n        } else if sum < target {\n          sorted.formUniqueIndex(after: &mr)\n        } else {\n          sorted.formUniqueIndex(before: &r)\n        }\n      }\n    }\n  }\n  return ret\n}\n\n// answer: [[-2, -1, 1, 2], [-2, 0, 0, 2], [-1, 0, 0, 1]]\nfourSum([1, 0, -1, 0, -2, 2], target: 0)\n"
  },
  {
    "path": "3Sum and 4Sum/4Sum.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "3Sum and 4Sum/4Sum.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "3Sum and 4Sum/4Sum.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "3Sum and 4Sum/README.md",
    "content": "# 3Sum and 4Sum\n\n3Sum and 4Sum are extensions of a popular algorithm question, the [2Sum][5]. \n\n## 3Sum\n\n> Given an array of integers, find all subsets of the array with 3 values where the 3 values sum up to a target number. \n>\n> **Note**: The solution subsets must not contain duplicate triplets.\n>\n> For example, given the array [-1, 0, 1, 2, -1, -4], and the target **0**:\n> The solution set is: [[-1, 0, 1], [-1, -1, 2]] // The two **-1** values in the array are considered to be distinct\n\nThere are 2 key procedures in solving this algorithm. Sorting the array, and avoiding duplicates.\n\n### Sorting\n\nSorting your input array allows for powerful assumptions:\n\n* duplicates are always adjacent to each other\n* moving an index to the right increases the value, while moving an index to the left decreases the value\n\nYou'll make use of these two rules to create an efficient algorithm.\n\n### Avoiding Duplicates\n\nSince you pre-sort the array, duplicates will be adjacent to each other. You just need to skip over duplicates by comparing adjacent values:\n\n```swift\nextension Collection where Element: Equatable {\n  \n  /// In a sorted collection, replaces the given index with a successor mapping to a unique element.\n  ///\n  /// - Parameter index: A valid index of the collection. `index` must be less than `endIndex`\n  func formUniqueIndex(after index: inout Index) {\n    var prev = index\n    repeat {\n      prev = index\n      formIndex(after: &index)\n    } while index < endIndex && self[prev] == self[index]\n  }\n}\n```\n\nA similar implementation is used to get the unique index *before* a given index:\n\n```swift\nextension BidirectionalCollection where Element: Equatable {\n  \n  /// In a sorted collection, replaces the given index with a predecessor that maps to a unique element.\n  ///\n  /// - Parameter index: A valid index of the collection. `index` must be greater than `startIndex`.\n  func formUniqueIndex(before index: inout Index) {\n    var prev = index\n    repeat {\n      prev = index\n      formIndex(before: &index)\n    } while index > startIndex && self[prev] == self[index]\n  }\n}\n```\n\n### Assembling the Subsets\n\nYou'll keep track of 3 indices to represent the 3 numbers. The sum at any given moment is `array[l] + array[m] + array[r]`:\n\n```swift\n      m ->      <- r\n[-4, -1, -1, 0, 1, 2]\n  l   \n```\n\nThe premise is quite straightforward (given that you're familiar with 2Sum). You'll iterate `l` through the array. For every iteration, you also apply the 2Sum algorithm to elements after `l`. You'll check the sum every time you moving the indices to check if you found match. Here's the algorithm:\n\n```swift\nfunc threeSum<T: BidirectionalCollection>(_ collection: T, target: T.Element) -> [[T.Element]] where T.Element: Numeric & Comparable {\n  let sorted = collection.sorted()\n  var ret: [[T.Element]] = []\n  var l = sorted.startIndex\n  \n  ThreeSum: while l < sorted.endIndex { defer { sorted.formUniqueIndex(after: &l) }\n    var m = sorted.index(after: l)\n    var r = sorted.index(before: sorted.endIndex)\n    \n    TwoSum: while m < r && r < sorted.endIndex { \n      let sum = sorted[l] + sorted[m] + sorted[r]\n      if sum == target {\n        ret.append([sorted[l], sorted[m], sorted[r]])\n        sorted.formUniqueIndex(after: &m)\n        sorted.formUniqueIndex(before: &r)\n      } else if sum < target {\n        sorted.formUniqueIndex(after: &m)\n      } else {\n        sorted.formUniqueIndex(before: &r)\n      }\n    }\n  }\n  \n  return ret\n}\n```\n\n## 4Sum\n\n> Given an array S of n integers, find all subsets of the array with 4 values where the 4 values sum up to a target number. \n>\n> **Note**: The solution set must not contain duplicate quadruplets.\n\n### Solution\n\nFoursum is a very straightforward extension to the threeSum algorithm. In threeSum, you kept track of 3 indices:\n\n```swift\n      m ->      <- r\n[-4, -1, -1, 0, 1, 2]\n  l   \n```\n\nFor fourSum, you'll keep track of 4:\n\n```swift\n         mr ->  <- r\n[-4, -1, -1, 0, 1, 2]\n  l  ml -> \n```\n\nHere's the code for it (notice it is very similar to 3Sum):\n\n```swift\nfunc fourSum<T: BidirectionalCollection>(_ collection: T, target: T.Element) -> [[T.Element]] where T.Element: Numeric & Comparable {\n  let sorted = collection.sorted()\n  var ret: [[T.Element]] = []\n  \n  var l = sorted.startIndex\n  FourSum: while l < sorted.endIndex { defer { sorted.formUniqueIndex(after: &l) }\n    var ml = sorted.index(after: l)\n    \n    ThreeSum: while ml < sorted.endIndex { defer { sorted.formUniqueIndex(after: &ml) }\n      var mr = sorted.index(after: ml)\n      var r = sorted.index(before: sorted.endIndex)\n      \n      TwoSum: while mr < r && r < sorted.endIndex {\n        let sum = sorted[l] + sorted[ml] + sorted[mr] + sorted[r]\n        if sum == target {\n          ret.append([sorted[l], sorted[ml], sorted[mr], sorted[r]])\n          sorted.formUniqueIndex(after: &mr)\n          sorted.formUniqueIndex(before: &r)\n        } else if sum < target {\n          sorted.formUniqueIndex(after: &mr)\n        } else {\n          sorted.formUniqueIndex(before: &r)\n        }\n      }\n    }\n  }\n  return ret\n}\n```\n\n[5]:\thttps://github.com/raywenderlich/swift-algorithm-club/tree/master/Two-Sum%20Problem\n\n*Written for the Swift Algorithm Club by Kai Chen and Kelvin Lau*\n"
  },
  {
    "path": "A-Star/AStar.swift",
    "content": "// Written by Alejandro Isaza.\n\nimport Foundation\n\npublic protocol Graph {\n    associatedtype Vertex: Hashable\n    associatedtype Edge: WeightedEdge where Edge.Vertex == Vertex\n\n    /// Lists all edges going out from a vertex.\n    func edgesOutgoing(from vertex: Vertex) -> [Edge]\n}\n\npublic protocol WeightedEdge {\n    associatedtype Vertex\n\n    /// The edge's cost.\n    var cost: Double { get }\n\n    /// The target vertex.\n    var target: Vertex { get }\n}\n\npublic final class AStar<G: Graph> {\n    /// The graph to search on.\n    public let graph: G\n\n    /// The heuristic cost function that estimates the cost between two vertices.\n    ///\n    /// - Note: The heuristic function needs to always return a value that is lower-than or equal to the actual\n    ///         cost for the resulting path of the A* search to be optimal.\n    public let heuristic: (G.Vertex, G.Vertex) -> Double\n\n    /// Open list of nodes to expand.\n    private var open: HashedHeap<Node<G.Vertex>>\n\n    /// Closed list of vertices already expanded.\n    private var closed = Set<G.Vertex>()\n\n    /// Actual vertex cost for vertices we already encountered (refered to as `g` on the literature).\n    private var costs = Dictionary<G.Vertex, Double>()\n\n    /// Store the previous node for each expanded node to recreate the path.\n    private var parents = Dictionary<G.Vertex, G.Vertex>()\n\n    /// Initializes `AStar` with a graph and a heuristic cost function.\n    public init(graph: G, heuristic: @escaping (G.Vertex, G.Vertex) -> Double) {\n        self.graph = graph\n        self.heuristic = heuristic\n        open = HashedHeap(sort: <)\n    }\n\n    /// Finds an optimal path between `source` and `target`.\n    ///\n    /// - Precondition: both `source` and `target` belong to `graph`.\n    public func path(start: G.Vertex, target: G.Vertex) -> [G.Vertex] {\n        open.insert(Node<G.Vertex>(vertex: start, cost: 0, estimate: heuristic(start, target)))\n        while !open.isEmpty {\n            guard let node = open.remove() else {\n                break\n            }\n            costs[node.vertex] = node.cost\n\n            if (node.vertex == target) {\n                let path = buildPath(start: start, target: target)\n                cleanup()\n                return path\n            }\n\n            if !closed.contains(node.vertex) {\n                expand(node: node, target: target)\n                closed.insert(node.vertex)\n            }\n        }\n\n        // No path found\n        return []\n    }\n\n    private func expand(node: Node<G.Vertex>, target: G.Vertex) {\n        let edges = graph.edgesOutgoing(from: node.vertex)\n        for edge in edges {\n            let g = cost(node.vertex) + edge.cost\n            if g < cost(edge.target) {\n                open.insert(Node<G.Vertex>(vertex: edge.target, cost: g, estimate: heuristic(edge.target, target)))\n                parents[edge.target] = node.vertex\n            }\n        }\n    }\n\n    private func cost(_ vertex: G.Edge.Vertex) -> Double {\n        if let c = costs[vertex] {\n            return c\n        }\n\n        let node = Node(vertex: vertex, cost: Double.greatestFiniteMagnitude, estimate: 0)\n        if let index = open.index(of: node) {\n            return open[index].cost\n        }\n\n        return Double.greatestFiniteMagnitude\n    }\n\n    private func buildPath(start: G.Vertex, target: G.Vertex) -> [G.Vertex] {\n        var path = Array<G.Vertex>()\n        path.append(target)\n\n        var current = target\n        while current != start {\n            guard let parent = parents[current] else {\n                return [] // no path found\n            }\n            current = parent\n            path.append(current)\n        }\n\n        return path.reversed()\n    }\n\n    private func cleanup() {\n        open.removeAll()\n        closed.removeAll()\n        parents.removeAll()\n    }\n}\n\nprivate struct Node<V: Hashable>: Hashable, Comparable {\n    /// The graph vertex.\n    var vertex: V\n\n    /// The actual cost between the start vertex and this vertex.\n    var cost: Double\n\n    /// Estimated (heuristic) cost betweent this vertex and the target vertex.\n    var estimate: Double\n\n    public init(vertex: V, cost: Double, estimate: Double) {\n        self.vertex = vertex\n        self.cost = cost\n        self.estimate = estimate\n    }\n\n    static func < (lhs: Node<V>, rhs: Node<V>) -> Bool {\n        return lhs.cost + lhs.estimate < rhs.cost + rhs.estimate\n    }\n\n    static func == (lhs: Node<V>, rhs: Node<V>) -> Bool {\n        return lhs.vertex == rhs.vertex\n    }\n\n    var hashValue: Int {\n        return vertex.hashValue\n    }\n}\n"
  },
  {
    "path": "A-Star/Images/graph.dot",
    "content": "digraph G {\n    rankdir=LR;\n    { A [ label = \"h = 3\" ] }\n    { rank = same; B [ label = \"h = 2\" ]; C [ label = \"h = 2\" ]; D [ label = \"h = 2\" ] }\n    { rank = same; E [ label = \"h = 1\" ]; F [ label = \"h = 1\" ]; G [ label = \"h = 1\" ] }\n    { H  [ label = \"h = 0\", style = filled, color = green ] }\n    A -> { B C D }\n    B -> E\n    E -> F\n    D -> G\n    G -> H\n}\n"
  },
  {
    "path": "A-Star/Images/step1.dot",
    "content": "digraph G {\n    rankdir=LR;\n    { A [ label = \"g = 0\\nh = 3\", style = filled, color = deepskyblue1 ] }\n    { rank = same; B [ label = \"g = 1\\nh = 2\", style = filled, color = lightgrey ]; C [ label = \"g = 1\\nh = 2\", style = filled, color = lightgrey ]; D [ label = \"g = 1\\nh = 2\", style = filled, color = lightgrey ] }\n    { rank = same; E [ label = \"g = \\?\\nh = 1\" ]; F [ label = \"g = \\?\\nh = 1\" ]; G [ label = \"g = \\?\\nh = 1\" ] }\n    { H  [ label = \"g = \\?\\nh = 0\" ] }\n    A -> { B C D }\n    B -> E\n    E -> F\n    D -> G\n    G -> H\n}\n"
  },
  {
    "path": "A-Star/Images/step2.dot",
    "content": "digraph G {\n    rankdir=LR;\n    { A [ label = \"g = 0\\nh = 3\", style = filled, color = lightblue ] }\n    { rank = same; B [ label = \"g = 1\\nh = 2\", style = filled, color = deepskyblue1 ]; C [ label = \"g = 1\\nh = 2\", style = filled, color = lightgrey ]; D [ label = \"g = 1\\nh = 2\", style = filled, color = lightgrey ] }\n    { rank = same; E [ label = \"g = 2\\nh = 1\", style = filled, color = lightgrey ]; F [ label = \"g = \\?\\nh = 1\" ]; G [ label = \"g = \\?\\nh = 1\" ] }\n    { H  [ label = \"g = \\?\\nh = 0\" ] }\n    A -> { B C D }\n    B -> E\n    E -> F\n    D -> G\n    G -> H\n}\n"
  },
  {
    "path": "A-Star/Images/step3.dot",
    "content": "digraph G {\n    rankdir=LR;\n    { A [ label = \"g = 0\\nh = 3\", style = filled, color = lightblue ] }\n    { rank = same; B [ label = \"g = 1\\nh = 2\", style = filled, color = lightblue ]; C [ label = \"g = 1\\nh = 2\", style = filled, color = deepskyblue1 ]; D [ label = \"g = 1\\nh = 2\", style = filled, color = lightgrey ] }\n    { rank = same; E [ label = \"g = 2\\nh = 1\", style = filled, color = lightgrey ]; F [ label = \"g = \\?\\nh = 1\" ]; G [ label = \"g = \\?\\nh = 1\" ] }\n    { H  [ label = \"g = \\?\\nh = 0\" ] }\n    A -> { B C D }\n    B -> E\n    E -> F\n    D -> G\n    G -> H\n}\n"
  },
  {
    "path": "A-Star/Images/step4.dot",
    "content": "digraph G {\n    rankdir=LR;\n    { A [ label = \"g = 0\\nh = 3\", style = filled, color = lightblue ] }\n    { rank = same; B [ label = \"g = 1\\nh = 2\", style = filled, color = lightblue ]; C [ label = \"g = 1\\nh = 2\", style = filled, color = lightblue ]; D [ label = \"g = 1\\nh = 2\", style = filled, color = deepskyblue1 ] }\n    { rank = same; E [ label = \"g = 2\\nh = 1\", style = filled, color = lightgrey ]; F [ label = \"g = \\?\\nh = 1\" ]; G [ label = \"g = 2\\nh = 1\", style = filled, color = lightgrey ] }\n    { H  [ label = \"g = \\?\\nh = 0\" ] }\n    A -> { B C D }\n    B -> E\n    E -> F\n    D -> G\n    G -> H\n}\n"
  },
  {
    "path": "A-Star/Images/step5.dot",
    "content": "digraph G {\n    rankdir=LR;\n    { A [ label = \"g = 0\\nh = 3\", style = filled, color = lightblue ] }\n    { rank = same; B [ label = \"g = 1\\nh = 2\", style = filled, color = lightblue ]; C [ label = \"g = 1\\nh = 2\", style = filled, color = lightblue ]; D [ label = \"g = 1\\nh = 2\", style = filled, color = lightblue ] }\n    { rank = same; E [ label = \"g = 2\\nh = 1\", style = filled, color = deepskyblue1 ]; F [ label = \"g = 3\\nh = 1\", style = filled, color = lightgrey ]; G [ label = \"g = 2\\nh = 1\", style = filled, color = lightgrey ] }\n    { H  [ label = \"g = \\?\\nh = 0\" ] }\n    A -> { B C D }\n    B -> E\n    E -> F\n    D -> G\n    G -> H\n}\n"
  },
  {
    "path": "A-Star/Images/step6.dot",
    "content": "digraph G {\n    rankdir=LR;\n    { A [ label = \"g = 0\\nh = 3\", style = filled, color = lightblue ] }\n    { rank = same; B [ label = \"g = 1\\nh = 2\", style = filled, color = lightblue ]; C [ label = \"g = 1\\nh = 2\", style = filled, color = lightblue ]; D [ label = \"g = 1\\nh = 2\", style = filled, color = lightblue ] }\n    { rank = same; E [ label = \"g = 2\\nh = 1\", style = filled, color = lightblue ]; F [ label = \"g = 3\\nh = 1\", style = filled, color = lightgrey ]; G [ label = \"g = 2\\nh = 1\", style = filled, color = deepskyblue1 ] }\n    { H  [ label = \"g = 3\\nh = 0\", style = filled, color = lightgrey ] }\n    A -> { B C D }\n    B -> E\n    E -> F\n    D -> G\n    G -> H\n}\n"
  },
  {
    "path": "A-Star/Images/step7.dot",
    "content": "digraph G {\n    rankdir=LR;\n    { A [ label = \"g = 0\\nh = 3\", style = filled, color = lightblue ] }\n    { rank = same; B [ label = \"g = 1\\nh = 2\", style = filled, color = lightblue ]; C [ label = \"g = 1\\nh = 2\", style = filled, color = lightblue ]; D [ label = \"g = 1\\nh = 2\", style = filled, color = lightblue ] }\n    { rank = same; E [ label = \"g = 2\\nh = 1\", style = filled, color = lightblue ]; F [ label = \"g = 3\\nh = 1\", style = filled, color = lightgrey ]; G [ label = \"g = 2\\nh = 1\", style = filled, color = lightblue ] }\n    { H  [ label = \"g = 3\\nh = 0\", style = filled, color = deepskyblue1 ] }\n    A -> { B C D }\n    B -> E\n    E -> F\n    D -> G\n    G -> H\n}\n"
  },
  {
    "path": "A-Star/README.md",
    "content": "# A*\n\nA* (pronounced \"ay star\") is a heuristic best-first search algorithm. A* minimizes node expansions, therefore minimizing the search time, by using a heuristic function. The heuristic function gives an estimate of the distance between two vertices. For instance if you are searching for a path between two points in a city, you can estimate the actual street distance with the straight-line distance.\n\nA* works by expanding the most promising nodes first, according to the heuristic function. In the city example it would choose streets which go in the general direction of the target first and, only if those are dead ends, backtrack and try other streets. This speeds up search in most sitations.\n\nA* is optimal (it always find the shortest path) if the heuristic function is admissible. A heuristic function is admissible if it never overestimates the cost of reaching the goal. In the extreme case of the heuristic function always retuning `0` A* acts exactly the same as [Dijkstra's Algorithm](../Dijkstra). The closer the heuristic function is to the actual distance the faster the search.\n\n## Example\n\nLet's run through an example on this simple directed graph. We are going to assume that all edges have a cost of 1 and the heuristic function is going to be the column starting at goal and going back:\n\n![Graph](Images/graph.png)\n\nOn the first step we expand the root node on the left (blue). We set the cost `g` to zero and add all neighbors to the open list (grey). \n\n![Step 1](Images/step1.png)\n\nWe put the first node in the closed list (light blue) so that we don't try expanding it again if there were to be loops in the graph. Next we take the node on the open list with the smallest value of `g + h` where `g` is the current cost (0) plus the edge cost (1). Since all nodes in the open list have the same value we choose the top one.\n\n![Step 2](Images/step2.png)\n\nWe repeat the process and pick the next node from the open list. In this case there are no new nodes to add to the open list.\n\n![Step 3](Images/step3.png)\n\nWe expand the next node. One more node on the open list, but nothing exciting yet.\n\n![Step 4](Images/step4.png)\n\nSicne the top and the bottom nodes have the same value we choose the top one. This is not a great choice but we could do better if we had a better heuristic function.\n\n![Step 5](Images/step5.png)\n\nNow we expand the bottom node because it has a smaller value than the middle node (2 + 1 < 3 + 1).\n\n![Step 6](Images/step6.png)\n\nAnd we finally reach the goal! We never even expanded that middle node. We didn't have to because its value is 4, which is equal to the total lenght of our solution and therefore guaranteed to not be part of the optimal solution.\n\n![Step 7](Images/step7.png)\n\nThe final step is to backtrack from the goal node to buld the optimal path.\n"
  },
  {
    "path": "A-Star/Tests/AStarTests.swift",
    "content": "import Foundation\nimport XCTest\n\nstruct GridGraph: Graph {\n    struct Vertex: Hashable {\n        var x: Int\n        var y: Int\n\n        static func == (lhs: Vertex, rhs: Vertex) -> Bool {\n            return lhs.x == rhs.x && lhs.y == rhs.y\n        }\n\n        public var hashValue: Int {\n            return x.hashValue ^ y.hashValue\n        }\n    }\n\n    struct Edge: WeightedEdge {\n        var cost: Double\n        var target: Vertex\n    }\n\n    func edgesOutgoing(from vertex: Vertex) -> [Edge] {\n        return [\n            Edge(cost: 1, target: Vertex(x: vertex.x - 1, y: vertex.y)),\n            Edge(cost: 1, target: Vertex(x: vertex.x + 1, y: vertex.y)),\n            Edge(cost: 1, target: Vertex(x: vertex.x, y: vertex.y - 1)),\n            Edge(cost: 1, target: Vertex(x: vertex.x, y: vertex.y + 1)),\n        ]\n    }\n}\n\nclass AStarTests: XCTestCase {\n    func testSameStartAndEnd() {\n        let graph = GridGraph()\n        let astar = AStar(graph: graph, heuristic: manhattanDistance)\n        let path = astar.path(start: GridGraph.Vertex(x: 0, y: 0), target: GridGraph.Vertex(x: 0, y: 0))\n        XCTAssertEqual(path.count, 1)\n        XCTAssertEqual(path[0].x, 0)\n        XCTAssertEqual(path[0].y, 0)\n    }\n\n    func testDiagonal() {\n        let graph = GridGraph()\n        let astar = AStar(graph: graph, heuristic: manhattanDistance)\n        let path = astar.path(start: GridGraph.Vertex(x: 0, y: 0), target: GridGraph.Vertex(x: 10, y: 10))\n        XCTAssertEqual(path.count, 21)\n        XCTAssertEqual(path[0].x, 0)\n        XCTAssertEqual(path[0].y, 0)\n        XCTAssertEqual(path[20].x, 10)\n        XCTAssertEqual(path[20].y, 10)\n    }\n\n    func manhattanDistance(_ s: GridGraph.Vertex, _ t: GridGraph.Vertex) -> Double {\n        return Double(abs(s.x - t.x) + abs(s.y - t.y))\n    }\n}\n"
  },
  {
    "path": "A-Star/Tests/AStarTests.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t611D099C1F8978AB00C7092B /* AStarTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 611D099B1F8978AB00C7092B /* AStarTests.swift */; };\n\t\t611D099E1F8978BC00C7092B /* AStar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 611D099D1F8978BB00C7092B /* AStar.swift */; };\n\t\t611D09A01F89795100C7092B /* HashedHeap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 611D099F1F89795100C7092B /* HashedHeap.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t611D099B1F8978AB00C7092B /* AStarTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AStarTests.swift; sourceTree = \"<group>\"; };\n\t\t611D099D1F8978BB00C7092B /* AStar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AStar.swift; path = ../AStar.swift; sourceTree = \"<group>\"; };\n\t\t611D099F1F89795100C7092B /* HashedHeap.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = HashedHeap.swift; path = \"../../Hashed Heap/HashedHeap.swift\"; sourceTree = \"<group>\"; };\n\t\t7B2BBC801C779D720067B71D /* AStarTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AStarTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7B2BBC941C779E7B0067B71D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t7B2BBC7D1C779D720067B71D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t7B2BBC681C779D710067B71D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC831C779D720067B71D /* Tests */,\n\t\t\t\t7B2BBC721C779D710067B71D /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC721C779D710067B71D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC801C779D720067B71D /* AStarTests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC831C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t611D099F1F89795100C7092B /* HashedHeap.swift */,\n\t\t\t\t611D099D1F8978BB00C7092B /* AStar.swift */,\n\t\t\t\t611D099B1F8978AB00C7092B /* AStarTests.swift */,\n\t\t\t\t7B2BBC941C779E7B0067B71D /* Info.plist */,\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t7B2BBC7F1C779D720067B71D /* AStarTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"AStarTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t7B2BBC7C1C779D720067B71D /* Sources */,\n\t\t\t\t7B2BBC7D1C779D720067B71D /* Frameworks */,\n\t\t\t\t7B2BBC7E1C779D720067B71D /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = AStarTests;\n\t\t\tproductName = TestsTests;\n\t\t\tproductReference = 7B2BBC801C779D720067B71D /* AStarTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t7B2BBC691C779D710067B71D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0720;\n\t\t\t\tLastUpgradeCheck = 0900;\n\t\t\t\tORGANIZATIONNAME = \"Swift Algorithm Club\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t7B2BBC7F1C779D720067B71D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2;\n\t\t\t\t\t\tLastSwiftMigration = 0900;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"AStarTests\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 7B2BBC681C779D710067B71D;\n\t\t\tproductRefGroup = 7B2BBC721C779D710067B71D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t7B2BBC7F1C779D720067B71D /* AStarTests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t7B2BBC7E1C779D720067B71D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t7B2BBC7C1C779D720067B71D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t611D099C1F8978AB00C7092B /* AStarTests.swift in Sources */,\n\t\t\t\t611D099E1F8978BC00C7092B /* AStar.swift in Sources */,\n\t\t\t\t611D09A01F89795100C7092B /* HashedHeap.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t7B2BBC871C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Default;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC881C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Default;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t7B2BBC8D1C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Default;\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC8E1C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Default;\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"AStarTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC871C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC881C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"AStarTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC8D1C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC8E1C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 7B2BBC691C779D710067B71D /* Project object */;\n}\n"
  },
  {
    "path": "A-Star/Tests/AStarTests.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Tests.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "A-Star/Tests/AStarTests.xcodeproj/xcshareddata/xcschemes/AStarTests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0900\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"AStarTests.xctest\"\n               BlueprintName = \"AStarTests\"\n               ReferencedContainer = \"container:AStarTests.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "A-Star/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "AVL Tree/AVLTree.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\n\nlet tree = AVLTree<Int, String>()\n\ntree.insert(key: 5, payload: \"five\")\nprint(tree)\n\ntree.insert(key: 4, payload: \"four\")\nprint(tree)\n\ntree.insert(key: 3, payload: \"three\")\nprint(tree)\n\ntree.insert(key: 2, payload: \"two\")\nprint(tree)\n\ntree.insert(key: 1, payload: \"one\")\nprint(tree)\nprint(tree.debugDescription)\n\nlet node = tree.search(input: 2)   // \"two\"\n\ntree.delete(key: 5)\ntree.delete(key: 2)\ntree.delete(key: 1)\ntree.delete(key: 4)\ntree.delete(key: 3)\n"
  },
  {
    "path": "AVL Tree/AVLTree.playground/Sources/AVLTree.swift",
    "content": "// The MIT License (MIT)\n\n// Copyright (c) 2016 Mike Taghavi (mitghi[at]me.com)\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\npublic class TreeNode<Key: Comparable, Payload> {\n  public typealias Node = TreeNode<Key, Payload>\n\n  var payload: Payload?\n\n  fileprivate var key: Key\n  internal var leftChild: Node?\n  internal var rightChild: Node?\n  fileprivate var height: Int\n  weak fileprivate var parent: Node?\n\n  public init(key: Key, payload: Payload?, leftChild: Node?, rightChild: Node?, parent: Node?, height: Int) {\n    self.key = key\n    self.payload = payload\n    self.leftChild = leftChild\n    self.rightChild = rightChild\n    self.parent = parent\n    self.height = height\n\n    self.leftChild?.parent = self\n    self.rightChild?.parent = self\n  }\n\n  public convenience init(key: Key, payload: Payload?) {\n    self.init(key: key, payload: payload, leftChild: nil, rightChild: nil, parent: nil, height: 1)\n  }\n\n  public convenience init(key: Key) {\n    self.init(key: key, payload: nil)\n  }\n\n  var isRoot: Bool {\n    return parent == nil\n  }\n\n  var isLeaf: Bool {\n    return rightChild == nil && leftChild == nil\n  }\n\n  var isLeftChild: Bool {\n    return parent?.leftChild === self\n  }\n\n  var isRightChild: Bool {\n    return parent?.rightChild === self\n  }\n\n  var hasLeftChild: Bool {\n    return leftChild != nil\n  }\n\n  var hasRightChild: Bool {\n    return rightChild != nil\n  }\n\n  var hasAnyChild: Bool {\n    return leftChild != nil || rightChild != nil\n  }\n\n  var hasBothChildren: Bool {\n    return leftChild != nil && rightChild != nil\n  }\n}\n\n// MARK: - The AVL tree\n\nopen class AVLTree<Key: Comparable, Payload> {\n  public typealias Node = TreeNode<Key, Payload>\n\n  fileprivate(set) var root: Node?\n  fileprivate(set) var size = 0\n\n  public init() { }\n}\n\n// MARK: - Searching\n\nextension TreeNode {\n  public func minimum() -> TreeNode? {\n    return leftChild?.minimum() ?? self\n  }\n\n  public func maximum() -> TreeNode? {\n    return rightChild?.maximum() ?? self\n  }\n}\n\nextension AVLTree {\n  subscript(key: Key) -> Payload? {\n    get { return search(input: key) }\n    set { insert(key: key, payload: newValue) }\n  }\n\n  public func search(input: Key) -> Payload? {\n    return search(key: input, node: root)?.payload\n  }\n\n  fileprivate func search(key: Key, node: Node?) -> Node? {\n    if let node = node {\n      if key == node.key {\n        return node\n      } else if key < node.key {\n        return search(key: key, node: node.leftChild)\n      } else {\n        return search(key: key, node: node.rightChild)\n      }\n    }\n    return nil\n  }\n}\n\n// MARK: - Inserting new items\n\nextension AVLTree {\n  public func insert(key: Key, payload: Payload? = nil) {\n    if let root = root {\n      insert(input: key, payload: payload, node: root)\n    } else {\n      root = Node(key: key, payload: payload)\n    }\n    size += 1\n  }\n\n  private func insert(input: Key, payload: Payload?, node: Node) {\n    if input < node.key {\n      if let child = node.leftChild {\n        insert(input: input, payload: payload, node: child)\n      } else {\n        let child = Node(key: input, payload: payload, leftChild: nil, rightChild: nil, parent: node, height: 1)\n        node.leftChild = child\n        balance(node: child)\n      }\n    } else {\n      if let child = node.rightChild {\n        insert(input: input, payload: payload, node: child)\n      } else {\n        let child = Node(key: input, payload: payload, leftChild: nil, rightChild: nil, parent: node, height: 1)\n        node.rightChild = child\n        balance(node: child)\n      }\n    }\n  }\n}\n\n// MARK: - Balancing tree\n\nextension AVLTree {\n  fileprivate func updateHeightUpwards(node: Node?) {\n    if let node = node {\n      let lHeight = node.leftChild?.height ?? 0\n      let rHeight = node.rightChild?.height ?? 0\n      node.height = max(lHeight, rHeight) + 1\n      updateHeightUpwards(node: node.parent)\n    }\n  }\n\n  fileprivate func lrDifference(node: Node?) -> Int {\n    let lHeight = node?.leftChild?.height ?? 0\n    let rHeight = node?.rightChild?.height ?? 0\n    return lHeight - rHeight\n  }\n\n  fileprivate func balance(node: Node?) {\n    guard let node = node else {\n      return\n    }\n\n    updateHeightUpwards(node: node.leftChild)\n    updateHeightUpwards(node: node.rightChild)\n\n    var nodes = [Node?](repeating: nil, count: 3)\n    var subtrees = [Node?](repeating: nil, count: 4)\n    let nodeParent = node.parent\n\n    let lrFactor = lrDifference(node: node)\n    if lrFactor > 1 {\n      // left-left or left-right\n      if lrDifference(node: node.leftChild) > 0 {\n        // left-left\n        nodes[0] = node\n        nodes[2] = node.leftChild\n        nodes[1] = nodes[2]?.leftChild\n\n        subtrees[0] = nodes[1]?.leftChild\n        subtrees[1] = nodes[1]?.rightChild\n        subtrees[2] = nodes[2]?.rightChild\n        subtrees[3] = nodes[0]?.rightChild\n      } else {\n        // left-right\n        nodes[0] = node\n        nodes[1] = node.leftChild\n        nodes[2] = nodes[1]?.rightChild\n\n        subtrees[0] = nodes[1]?.leftChild\n        subtrees[1] = nodes[2]?.leftChild\n        subtrees[2] = nodes[2]?.rightChild\n        subtrees[3] = nodes[0]?.rightChild\n      }\n    } else if lrFactor < -1 {\n      // right-left or right-right\n      if lrDifference(node: node.rightChild) < 0 {\n        // right-right\n        nodes[1] = node\n        nodes[2] = node.rightChild\n        nodes[0] = nodes[2]?.rightChild\n\n        subtrees[0] = nodes[1]?.leftChild\n        subtrees[1] = nodes[2]?.leftChild\n        subtrees[2] = nodes[0]?.leftChild\n        subtrees[3] = nodes[0]?.rightChild\n      } else {\n        // right-left\n        nodes[1] = node\n        nodes[0] = node.rightChild\n        nodes[2] = nodes[0]?.leftChild\n\n        subtrees[0] = nodes[1]?.leftChild\n        subtrees[1] = nodes[2]?.leftChild\n        subtrees[2] = nodes[2]?.rightChild\n        subtrees[3] = nodes[0]?.rightChild\n      }\n    } else {\n      // Don't need to balance 'node', go for parent\n      balance(node: node.parent)\n      return\n    }\n\n    // nodes[2] is always the head\n\n    if node.isRoot {\n      root = nodes[2]\n      root?.parent = nil\n    } else if node.isLeftChild {\n      nodeParent?.leftChild = nodes[2]\n      nodes[2]?.parent = nodeParent\n    } else if node.isRightChild {\n      nodeParent?.rightChild = nodes[2]\n      nodes[2]?.parent = nodeParent\n    }\n\n    nodes[2]?.leftChild = nodes[1]\n    nodes[1]?.parent = nodes[2]\n    nodes[2]?.rightChild = nodes[0]\n    nodes[0]?.parent = nodes[2]\n\n    nodes[1]?.leftChild = subtrees[0]\n    subtrees[0]?.parent = nodes[1]\n    nodes[1]?.rightChild = subtrees[1]\n    subtrees[1]?.parent = nodes[1]\n\n    nodes[0]?.leftChild = subtrees[2]\n    subtrees[2]?.parent = nodes[0]\n    nodes[0]?.rightChild = subtrees[3]\n    subtrees[3]?.parent = nodes[0]\n\n    updateHeightUpwards(node: nodes[1])    // Update height from left\n    updateHeightUpwards(node: nodes[0])    // Update height from right\n\n    balance(node: nodes[2]?.parent)\n  }\n}\n\n// MARK: - Displaying tree\n\nextension AVLTree {\n  fileprivate func display(node: Node?, level: Int) {\n    if let node = node {\n      display(node: node.rightChild, level: level + 1)\n      print(\"\")\n      if node.isRoot {\n        print(\"Root -> \", terminator: \"\")\n      }\n      for _ in 0..<level {\n        print(\"        \", terminator:  \"\")\n      }\n      print(\"(\\(node.key):\\(node.height))\", terminator: \"\")\n      display(node: node.leftChild, level: level + 1)\n    }\n  }\n\n  public func display(node: Node) {\n    display(node: node, level: 0)\n    print(\"\")\n  }\n}\n\n// MARK: - Delete node\n\nextension AVLTree {\n  public func delete(key: Key) {\n    if size == 1 {\n      root = nil\n      size -= 1\n    } else if let node = search(key: key, node: root) {\n      delete(node: node)\n      size -= 1\n    }\n  }\n\n  private func delete(node: Node) {\n    if node.isLeaf {\n      // Just remove and balance up\n      if let parent = node.parent {\n        guard node.isLeftChild || node.isRightChild else {\n          // just in case\n          fatalError(\"Error: tree is invalid.\")\n        }\n\n        if node.isLeftChild {\n          parent.leftChild = nil\n        } else if node.isRightChild {\n          parent.rightChild = nil\n        }\n\n        balance(node: parent)\n      } else {\n        // at root\n        root = nil\n      }\n    } else {\n      // Handle stem cases\n      if let replacement = node.leftChild?.maximum(), replacement !== node {\n        node.key = replacement.key\n        node.payload = replacement.payload\n        delete(node: replacement)\n      } else if let replacement = node.rightChild?.minimum(), replacement !== node {\n        node.key = replacement.key\n        node.payload = replacement.payload\n        delete(node: replacement)\n      }\n    }\n  }\n}\n\n// MARK: - Debugging\n\nextension TreeNode: CustomDebugStringConvertible {\n  public var debugDescription: String {\n    var s = \"key: \\(key), payload: \\(payload), height: \\(height)\"\n    if let parent = parent {\n      s += \", parent: \\(parent.key)\"\n    }\n    if let left = leftChild {\n      s += \", left = [\" + left.debugDescription + \"]\"\n    }\n    if let right = rightChild {\n      s += \", right = [\" + right.debugDescription + \"]\"\n    }\n    return s\n  }\n}\n\nextension AVLTree: CustomDebugStringConvertible {\n  public var debugDescription: String {\n    return root?.debugDescription ?? \"[]\"\n  }\n}\n\nextension TreeNode: CustomStringConvertible {\n  public var description: String {\n    var s = \"\"\n    if let left = leftChild {\n      s += \"(\\(left.description)) <- \"\n    }\n    s += \"\\(key)\"\n    if let right = rightChild {\n      s += \" -> (\\(right.description))\"\n    }\n    return s\n  }\n}\n\nextension AVLTree: CustomStringConvertible {\n  public var description: String {\n    return root?.description ?? \"[]\"\n  }\n}\n"
  },
  {
    "path": "AVL Tree/AVLTree.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "AVL Tree/AVLTree.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "AVL Tree/AVLTree.swift",
    "content": "// The MIT License (MIT)\n\n// Copyright (c) 2016 Mike Taghavi (mitghi[at]me.com)\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\npublic class TreeNode<Key: Comparable, Payload> {\n  public typealias Node = TreeNode<Key, Payload>\n  \n  var payload: Payload?   // Value held by the node\n  \n  fileprivate var key: Key    // Node's name\n  internal var leftChild: Node?\n  internal var rightChild: Node?\n  fileprivate var height: Int\n  weak fileprivate var parent: Node?\n  \n  public init(key: Key, payload: Payload?, leftChild: Node?, rightChild: Node?, parent: Node?, height: Int) {\n    self.key = key\n    self.payload = payload\n    self.leftChild = leftChild\n    self.rightChild = rightChild\n    self.parent = parent\n    self.height = height\n    \n    self.leftChild?.parent = self\n    self.rightChild?.parent = self\n  }\n  \n  public convenience init(key: Key, payload: Payload?) {\n    self.init(key: key, payload: payload, leftChild: nil, rightChild: nil, parent: nil, height: 1)\n  }\n  \n  public convenience init(key: Key) {\n    self.init(key: key, payload: nil)\n  }\n  \n  var isRoot: Bool {\n    return parent == nil\n  }\n  \n  var isLeaf: Bool {\n    return rightChild == nil && leftChild == nil\n  }\n  \n  var isLeftChild: Bool {\n    return parent?.leftChild === self\n  }\n  \n  var isRightChild: Bool {\n    return parent?.rightChild === self\n  }\n  \n  var hasLeftChild: Bool {\n    return leftChild != nil\n  }\n  \n  var hasRightChild: Bool {\n    return rightChild != nil\n  }\n  \n  var hasAnyChild: Bool {\n    return leftChild != nil || rightChild != nil\n  }\n  \n  var hasBothChildren: Bool {\n    return leftChild != nil && rightChild != nil\n  }\n}\n\n// MARK: - The AVL tree\n\nopen class AVLTree<Key: Comparable, Payload> {\n  public typealias Node = TreeNode<Key, Payload>\n  \n  fileprivate(set) var root: Node?\n  fileprivate(set) var size = 0\n  \n  public init() { }\n}\n\n// MARK: - Searching\n\nextension TreeNode {\n  public func minimum() -> TreeNode? {\n    return leftChild?.minimum() ?? self\n  }\n  \n  public func maximum() -> TreeNode? {\n    return rightChild?.maximum() ?? self\n  }\n}\n\nextension AVLTree {\n  subscript(key: Key) -> Payload? {\n    get { return search(input: key) }\n    set { insert(key: key, payload: newValue) }\n  }\n  \n  public func search(input: Key) -> Payload? {\n    return search(key: input, node: root)?.payload\n  }\n  \n  fileprivate func search(key: Key, node: Node?) -> Node? {\n    if let node = node {\n      if key == node.key {\n        return node\n      } else if key < node.key {\n        return search(key: key, node: node.leftChild)\n      } else {\n        return search(key: key, node: node.rightChild)\n      }\n    }\n    return nil\n  }\n}\n\n// MARK: - Inserting new items\n\nextension AVLTree {\n  public func insert(key: Key, payload: Payload? = nil) {\n    if let root = root {\n      insert(input: key, payload: payload, node: root)\n    } else {\n      root = Node(key: key, payload: payload)\n    }\n    size += 1\n  }\n  \n  private func insert(input: Key, payload: Payload?, node: Node) {\n    if input < node.key {\n      if let child = node.leftChild {\n        insert(input: input, payload: payload, node: child)\n      } else {\n        let child = Node(key: input, payload: payload, leftChild: nil, rightChild: nil, parent: node, height: 1)\n        node.leftChild = child\n        balance(node: child)\n      }\n    } else if input != node.key {\n      if let child = node.rightChild {\n        insert(input: input, payload: payload, node: child)\n      } else {\n        let child = Node(key: input, payload: payload, leftChild: nil, rightChild: nil, parent: node, height: 1)\n        node.rightChild = child\n        balance(node: child)\n      }\n    }\n  }\n}\n\n// MARK: - Balancing tree\n\nextension AVLTree {\n  fileprivate func updateHeightUpwards(node: Node?) {\n    if let node = node {\n      let lHeight = node.leftChild?.height ?? 0\n      let rHeight = node.rightChild?.height ?? 0\n      node.height = max(lHeight, rHeight) + 1\n      updateHeightUpwards(node: node.parent)\n    }\n  }\n  \n  fileprivate func lrDifference(node: Node?) -> Int {\n    let lHeight = node?.leftChild?.height ?? 0\n    let rHeight = node?.rightChild?.height ?? 0\n    return lHeight - rHeight\n  }\n  \n  fileprivate func balance(node: Node?) {\n    guard let node = node else {\n      return\n    }\n    \n    updateHeightUpwards(node: node.leftChild)\n    updateHeightUpwards(node: node.rightChild)\n    \n    var nodes = [Node?](repeating: nil, count: 3)\n    var subtrees = [Node?](repeating: nil, count: 4)\n    let nodeParent = node.parent\n    \n    let lrFactor = lrDifference(node: node)\n    if lrFactor > 1 {\n      // left-left or left-right\n      if lrDifference(node: node.leftChild) > 0 {\n        // left-left\n        nodes[0] = node\n        nodes[2] = node.leftChild\n        nodes[1] = nodes[2]?.leftChild\n        \n        subtrees[0] = nodes[1]?.leftChild\n        subtrees[1] = nodes[1]?.rightChild\n        subtrees[2] = nodes[2]?.rightChild\n        subtrees[3] = nodes[0]?.rightChild\n      } else {\n        // left-right\n        nodes[0] = node\n        nodes[1] = node.leftChild\n        nodes[2] = nodes[1]?.rightChild\n        \n        subtrees[0] = nodes[1]?.leftChild\n        subtrees[1] = nodes[2]?.leftChild\n        subtrees[2] = nodes[2]?.rightChild\n        subtrees[3] = nodes[0]?.rightChild\n      }\n    } else if lrFactor < -1 {\n      // right-left or right-right\n      if lrDifference(node: node.rightChild) < 0 {\n        // right-right\n        nodes[1] = node\n        nodes[2] = node.rightChild\n        nodes[0] = nodes[2]?.rightChild\n        \n        subtrees[0] = nodes[1]?.leftChild\n        subtrees[1] = nodes[2]?.leftChild\n        subtrees[2] = nodes[0]?.leftChild\n        subtrees[3] = nodes[0]?.rightChild\n      } else {\n        // right-left\n        nodes[1] = node\n        nodes[0] = node.rightChild\n        nodes[2] = nodes[0]?.leftChild\n        \n        subtrees[0] = nodes[1]?.leftChild\n        subtrees[1] = nodes[2]?.leftChild\n        subtrees[2] = nodes[2]?.rightChild\n        subtrees[3] = nodes[0]?.rightChild\n      }\n    } else {\n      // Don't need to balance 'node', go for parent\n      balance(node: node.parent)\n      return\n    }\n    \n    // nodes[2] is always the head\n    \n    if node.isRoot {\n      root = nodes[2]\n      root?.parent = nil\n    } else if node.isLeftChild {\n      nodeParent?.leftChild = nodes[2]\n      nodes[2]?.parent = nodeParent\n    } else if node.isRightChild {\n      nodeParent?.rightChild = nodes[2]\n      nodes[2]?.parent = nodeParent\n    }\n    \n    nodes[2]?.leftChild = nodes[1]\n    nodes[1]?.parent = nodes[2]\n    nodes[2]?.rightChild = nodes[0]\n    nodes[0]?.parent = nodes[2]\n    \n    nodes[1]?.leftChild = subtrees[0]\n    subtrees[0]?.parent = nodes[1]\n    nodes[1]?.rightChild = subtrees[1]\n    subtrees[1]?.parent = nodes[1]\n    \n    nodes[0]?.leftChild = subtrees[2]\n    subtrees[2]?.parent = nodes[0]\n    nodes[0]?.rightChild = subtrees[3]\n    subtrees[3]?.parent = nodes[0]\n    \n    updateHeightUpwards(node: nodes[1])    // Update height from left\n    updateHeightUpwards(node: nodes[0])    // Update height from right\n    \n    balance(node: nodes[2]?.parent)\n  }\n}\n\n// MARK: - Displaying tree\n\nextension AVLTree {\n  fileprivate func display(node: Node?, level: Int) {\n    if let node = node {\n      display(node: node.rightChild, level: level + 1)\n      print(\"\")\n      if node.isRoot {\n        print(\"Root -> \", terminator: \"\")\n      }\n      for _ in 0..<level {\n        print(\"        \", terminator:  \"\")\n      }\n      print(\"(\\(node.key):\\(node.height))\", terminator: \"\")\n      display(node: node.leftChild, level: level + 1)\n    }\n  }\n  \n  public func display(node: Node) {\n    display(node: node, level: 0)\n    print(\"\")\n  }\n  \n  public func inorder(node: Node?) -> String {\n    var output = \"\"\n    if let node = node {\n      output = \"\\(inorder(node: node.leftChild)) \\(print(\"\\(node.key) \")) \\(inorder(node: node.rightChild))\"\n    }\n    return output\n  }\n  \n  public func preorder(node: Node?) -> String {\n    var output = \"\"\n    if let node = node {\n      output = \"\\(preorder(node: node.leftChild)) \\(print(\"\\(node.key) \")) \\(preorder(node: node.rightChild))\"\n    }\n    return output\n  }\n  \n  public func postorder(node: Node?) -> String {\n    var output = \"\"\n    if let node = node {\n      output = \"\\(postorder(node: node.leftChild)) \\(print(\"\\(node.key) \")) \\(postorder(node: node.rightChild))\"\n    }\n    return output\n  }\n}\n\n// MARK: - Delete node\n\nextension AVLTree {\n  public func delete(key: Key) {\n    if size == 1 {\n      root = nil\n      size -= 1\n    } else if let node = search(key: key, node: root) {\n      delete(node: node)\n      size -= 1\n    }\n  }\n  \n  private func delete(node: Node) {\n    if node.isLeaf {\n      // Just remove and balance up\n      if let parent = node.parent {\n        guard node.isLeftChild || node.isRightChild else {\n          // just in case\n          fatalError(\"Error: tree is invalid.\")\n        }\n        \n        if node.isLeftChild {\n          parent.leftChild = nil\n        } else if node.isRightChild {\n          parent.rightChild = nil\n        }\n        \n        balance(node: parent)\n      } else {\n        // at root\n        root = nil\n      }\n    } else {\n      // Handle stem cases\n      if let replacement = node.leftChild?.maximum(), replacement !== node {\n        node.key = replacement.key\n        node.payload = replacement.payload\n        delete(node: replacement)\n      } else if let replacement = node.rightChild?.minimum(), replacement !== node {\n        node.key = replacement.key\n        node.payload = replacement.payload\n        delete(node: replacement)\n      }\n    }\n  }\n}\n\n// MARK: - Advanced Stuff\n\nextension AVLTree {\n  public func doInOrder(node: Node?, _ completion: (Node) -> Void) {\n    if let node = node {\n      doInOrder(node: node.leftChild) { lnode in\n        completion(lnode)\n      }\n      completion(node)\n      doInOrder(node: node.rightChild) { rnode in\n        completion(rnode)\n      }\n    }\n  }\n  \n  public func doInPreOrder(node: Node?, _ completion: (Node) -> Void) {\n    if let node = node {\n      completion(node)\n      doInPreOrder(node: node.leftChild) { lnode in\n        completion(lnode)\n      }\n      doInPreOrder(node: node.rightChild) { rnode in\n        completion(rnode)\n      }\n    }\n  }\n  \n  public func doInPostOrder(node: Node?, _ completion: (Node) -> Void) {\n    if let node = node {\n      doInPostOrder(node: node.leftChild) { lnode in\n        completion(lnode)\n      }\n      doInPostOrder(node: node.rightChild) { rnode in\n        completion(rnode)\n      }\n      completion(node)\n    }\n  }\n}\n\n// MARK: - Debugging\n\nextension TreeNode: CustomDebugStringConvertible {\n  public var debugDescription: String {\n    var s = \"key: \\(key), payload: \\(payload), height: \\(height)\"\n    if let parent = parent {\n      s += \", parent: \\(parent.key)\"\n    }\n    if let left = leftChild {\n      s += \", left = [\" + left.debugDescription + \"]\"\n    }\n    if let right = rightChild {\n      s += \", right = [\" + right.debugDescription + \"]\"\n    }\n    return s\n  }\n}\n\nextension AVLTree: CustomDebugStringConvertible {\n  public var debugDescription: String {\n    return root?.debugDescription ?? \"[]\"\n  }\n}\n\nextension TreeNode: CustomStringConvertible {\n  public var description: String {\n    var s = \"\"\n    if let left = leftChild {\n      s += \"(\\(left.description)) <- \"\n    }\n    s += \"\\(key)\"\n    if let right = rightChild {\n      s += \" -> (\\(right.description))\"\n    }\n    return s\n  }\n}\n\nextension AVLTree: CustomStringConvertible {\n  public var description: String {\n    return root?.description ?? \"[]\"\n  }\n}\n"
  },
  {
    "path": "AVL Tree/README.markdown",
    "content": "# AVL Tree\r\n\r\nAn AVL tree is a self-balancing form of a [binary search tree](../Binary%20Search%20Tree/), in which the height of subtrees differ at most by only 1.\r\n\r\nA binary tree is *balanced* when its left and right subtrees contain roughly the same number of nodes. That is what makes searching the tree really fast. But if a binary search tree is unbalanced, searching can become really slow.\r\n\r\nThis is an example of an unbalanced tree:\r\n\r\n![Unbalanced tree](Images/Unbalanced.png)\r\n\r\nAll the children are in the left branch and none are in the right. This is essentially the same as a [linked list](../Linked%20List/). As a result, searching takes **O(n)** time instead of the much faster **O(log n)** that you'd expect from a binary search tree.\r\n\r\nA balanced version of that tree would look like this:\r\n\r\n![Balanced tree](Images/Balanced.png)\r\n\r\nOne way to make the binary search tree balanced is to insert the nodes in a totally random order. But that doesn't guarantee success, nor is it always practical.\r\n\r\nThe other solution is to use a *self-balancing* binary tree. This type of data structure adjusts the tree to keep it balanced after you insert or delete nodes. The height of such a tree is guaranteed to be *log(n)* where *n* is the number nodes. On a balanced tree all insert, remove, and search operations take only **O(log n)** time. That means fast. ;-)\r\n\r\n## Introducing the AVL tree\r\n\r\nAn AVL tree fixes any imbalances by \"rotating\" the tree to the left or right.\r\n\r\nA node in an AVL tree is considered balanced if its subtrees differ in \"height\" by at most 1. The tree itself is balanced if all its nodes are balanced.\r\n\r\nThe *height* of a node is how many steps it takes to get to that node's lowest leaf. For example, in the following tree it takes three steps to go from A to E, so the height of A is 3. The height of B is 2, the height of C is 1, and the height of the others is 0 because they are leaf nodes.\r\n\r\n![Node height](Images/Height.png)\r\n\r\nAs mentioned, in an AVL tree a node is balanced if its left and right subtree have the same height. It doesn't have to be the exact same height, but the difference may not be greater than 1. These are all examples of balanced trees:\r\n\r\n![Balanced trees](Images/BalanceOK.png)\r\n\r\nBut the following are trees that are unbalanced, because the height of the left subtree is too large compared to the right subtree:\r\n\r\n![Unbalanced trees](Images/BalanceNotOK.png)\r\n\r\nThe difference between the heights of the left and right subtrees is called the *balance factor*. It is calculated as follows:\r\n\r\n\tbalance factor = abs(height(left subtree) - height(right subtree))\r\n\r\nIf after an insertion or deletion the balance factor becomes greater than 1, then we need to re-balance this part of the AVL tree. And that is done with rotations.\r\n\r\n## Rotations\r\nEach tree node keeps track of its current balance factor in a variable. After inserting a new node, we need to update the balance factor of its parent node. If that balance factor becomes greater than 1, we \"rotate\" part of that tree to restore the balance.\r\n\r\n![Rotation0](Images/RotationStep0.jpg)\r\n\r\nFor the rotation we're using the terminology:\r\n* *Root* - the parent node of the subtrees that will be rotated;\r\n* *Pivot* - the node that will become parent (basically will be on the *Root*'s position) after rotation;\r\n* *RotationSubtree* - subtree of the *Pivot* upon the side of rotation\r\n* *OppositeSubtree* - subtree of the *Pivot* opposite the side of rotation\r\n\r\nLet take an example of balancing the unbalanced tree using *Right* (clockwise direction) rotation:\r\n\r\n![Rotation1](Images/RotationStep1.jpg) ![Rotation2](Images/RotationStep2.jpg) ![Rotation3](Images/RotationStep3.jpg)\r\n\r\nThe steps of rotation could be described by following:  \r\n\r\n1. Assign the *RotationSubtree* as a new *OppositeSubtree* for the *Root*;\r\n2. Assign the *Root* as a new *RotationSubtree* for the *Pivot*;\r\n3. Check the final result\r\n\r\n\r\nIn pseudocode the algorithm above could be written as follows:\r\n```\r\nRoot.OS = Pivot.RS\r\nPivot.RS = Root\r\nRoot = Pivot\r\n```\r\n\r\nThis is a constant time operation - __O(1)__\r\nInsertion never needs more than 2 rotations. Removal might require up to __log(n)__ rotations.\r\n\r\n## The code\r\n\r\nMost of the code in [AVLTree.swift](AVLTree.swift) is just regular [binary search tree](../Binary%20Search%20Tree/) stuff. You'll find this in any implementation of a binary search tree. For example, searching the tree is exactly the same. The only things that an AVL tree does slightly differently are inserting and deleting the nodes.\r\n\r\n> **Note:** If you're a bit fuzzy on the regular operations of a binary search tree, I suggest you [catch up on those first](../Binary%20Search%20Tree/). It will make the rest of the AVL tree easier to understand.\r\n\r\nThe interesting bits are in the `balance()` method which is called after inserting or deleting a node.\r\n\r\n## See also\r\n\r\n[AVL tree on Wikipedia](https://en.wikipedia.org/wiki/AVL_tree)\r\n\r\nAVL tree was the first self-balancing binary tree. These days, the [red-black tree](../Red-Black%20Tree/) seems to be more popular.\r\n\r\n*Written for Swift Algorithm Club by [Mike Taghavi](https://github.com/mitghi) and [Matthijs Hollemans](https://github.com/hollance)*\r\n"
  },
  {
    "path": "AVL Tree/Tests/AVLTreeTests.swift",
    "content": "//\n//  AVLTreeTestsTests.swift\n//  AVLTreeTestsTests\n//\n//  Created by Barbara Rodeker on 2/19/16.\n//  Copyright © 2016 Swift Algorithm Club. All rights reserved.\n//\n\nimport XCTest\nclass AVLTreeTests: XCTestCase {\n  var tree: AVLTree<Int, String>?\n\n    func testSwift4() {\n        // last checked with Xcode 9.0b4\n        #if swift(>=4.0)\n            print(\"Hello, Swift 4!\")\n        #endif\n    }\n  override func setUp() {\n    super.setUp()\n\n    tree = AVLTree()\n  }\n\n  override func tearDown() {\n    // Put teardown code here. This method is called after the invocation of each test method in the class.\n    super.tearDown()\n  }\n\n  func testAVLTreeBalancedAutoPopulate() {\n    self.tree?.autopopulateWithNodes(10)\n\n    do {\n      try self.tree?.inOrderCheckBalanced(self.tree?.root)\n    } catch _ {\n      XCTFail(\"Tree is not balanced after autopopulate\")\n    }\n  }\n\n  func testAVLTreeBalancedInsert() {\n    self.tree?.autopopulateWithNodes(5)\n\n    for i in 6...10 {\n      self.tree?.insert(key: i)\n      do {\n        try self.tree?.inOrderCheckBalanced(self.tree?.root)\n      } catch _ {\n        XCTFail(\"Tree is not balanced after inserting \" + String(i))\n      }\n    }\n  }\n\n  func testAVLTreeBalancedDelete() {\n    self.tree?.autopopulateWithNodes(5)\n\n    for i in 1...6 {\n      self.tree?.delete(key: i)\n      do {\n        try self.tree?.inOrderCheckBalanced(self.tree?.root)\n      } catch _ {\n        XCTFail(\"Tree is not balanced after deleting \" + String(i))\n      }\n    }\n  }\n\n  func testEmptyInitialization() {\n    let tree = AVLTree<Int, String>()\n\n    XCTAssertEqual(tree.size, 0)\n    XCTAssertNil(tree.root)\n  }\n\n  func testSingleInsertionPerformance() {\n    self.measure {\n      self.tree?.insert(key: 5, payload: \"E\")\n    }\n  }\n\n  func testMultipleInsertionsPerformance() {\n    self.measure {\n      self.tree?.autopopulateWithNodes(50)\n    }\n  }\n\n  func testSearchExistentOnSmallTreePerformance() {\n    self.measure {\n      print(self.tree?.search(input: 2))\n    }\n  }\n\n  func testSearchExistentElementOnLargeTreePerformance() {\n    self.measure {\n      self.tree?.autopopulateWithNodes(500)\n      print(self.tree?.search(input: 400))\n    }\n  }\n\n  func testMinimumOnPopulatedTree() {\n    self.tree?.autopopulateWithNodes(500)\n    let min = self.tree?.root?.minimum()\n    XCTAssertNotNil(min, \"Minimum function not working\")\n  }\n\n  func testMinimumOnSingleTreeNode() {\n    let treeNode = TreeNode(key: 1, payload: \"A\")\n    let min = treeNode.minimum()\n\n    XCTAssertNotNil(min, \"Minimum on single node should be returned\")\n    XCTAssertEqual(min?.payload, treeNode.payload)\n  }\n\n  func testDeleteExistentKey() {\n    self.tree?.delete(key: 1)\n    XCTAssertNil(self.tree?.search(input: 1), \"Key should not exist anymore\")\n  }\n\n  func testDeleteNotExistentKey() {\n    self.tree?.delete(key: 1056)\n    XCTAssertNil(self.tree?.search(input: 1056), \"Key should not exist\")\n  }\n\n  func testInsertSize() {\n    let tree = AVLTree<Int, String>()\n    for i in 0...5 {\n      tree.insert(key: i, payload: \"\")\n      XCTAssertEqual(tree.size, i + 1, \"Insert didn't update size correctly!\")\n    }\n  }\n\n  func testDelete() {\n    let permutations = [\n      [5, 1, 4, 2, 3],\n      [2, 3, 1, 5, 4],\n      [4, 5, 3, 2, 1],\n      [3, 2, 5, 4, 1],\n    ]\n\n    for p in permutations {\n      let tree = AVLTree<Int, String>()\n\n      tree.insert(key: 1, payload: \"five\")\n      tree.insert(key: 2, payload: \"four\")\n      tree.insert(key: 3, payload: \"three\")\n      tree.insert(key: 4, payload: \"two\")\n      tree.insert(key: 5, payload: \"one\")\n\n      var count = tree.size\n      for i in p {\n        tree.delete(key: i)\n        count -= 1\n        XCTAssertEqual(tree.size, count, \"Delete didn't update size correctly!\")\n      }\n    }\n  }\n}\n\nextension AVLTree where Key : SignedInteger {\n  func autopopulateWithNodes(_ count: Int) {\n    var k: Key = 1\n    for _ in 0...count {\n      self.insert(key: k)\n      k = k + 1\n    }\n  }\n}\n\nenum AVLTreeError: Error {\n  case notBalanced\n}\n\nextension AVLTree where Key : SignedInteger {\n  func height(_ node: Node?) -> Int {\n    if let node = node {\n      let lHeight = height(node.leftChild)\n      let rHeight = height(node.rightChild)\n\n      return max(lHeight, rHeight) + 1\n    }\n    return 0\n  }\n\n  func inOrderCheckBalanced(_ node: Node?) throws {\n    if let node = node {\n      guard abs(height(node.leftChild) - height(node.rightChild)) <= 1 else {\n        throw AVLTreeError.notBalanced\n      }\n      try inOrderCheckBalanced(node.leftChild)\n      try inOrderCheckBalanced(node.rightChild)\n    }\n  }\n}\n"
  },
  {
    "path": "AVL Tree/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "AVL Tree/Tests/Tests.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t7B80C3C91C77A112003CECC7 /* TreeNodeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C3C71C77A112003CECC7 /* TreeNodeTests.swift */; };\n\t\t7B80C3CA1C77A112003CECC7 /* AVLTreeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C3C81C77A112003CECC7 /* AVLTreeTests.swift */; };\n\t\t7B80C3CC1C77A120003CECC7 /* AVLTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C3CB1C77A120003CECC7 /* AVLTree.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t7B2BBC801C779D720067B71D /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7B2BBC941C779E7B0067B71D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };\n\t\t7B80C3C71C77A112003CECC7 /* TreeNodeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TreeNodeTests.swift; sourceTree = SOURCE_ROOT; };\n\t\t7B80C3C81C77A112003CECC7 /* AVLTreeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AVLTreeTests.swift; sourceTree = SOURCE_ROOT; };\n\t\t7B80C3CB1C77A120003CECC7 /* AVLTree.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AVLTree.swift; path = ../AVLTree.swift; sourceTree = SOURCE_ROOT; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t7B2BBC7D1C779D720067B71D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t7B2BBC681C779D710067B71D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC831C779D720067B71D /* Tests */,\n\t\t\t\t7B2BBC721C779D710067B71D /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC721C779D710067B71D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC801C779D720067B71D /* Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC831C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B80C3CB1C77A120003CECC7 /* AVLTree.swift */,\n\t\t\t\t7B80C3C81C77A112003CECC7 /* AVLTreeTests.swift */,\n\t\t\t\t7B80C3C71C77A112003CECC7 /* TreeNodeTests.swift */,\n\t\t\t\t7B2BBC941C779E7B0067B71D /* Info.plist */,\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tpath = TestsTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t7B2BBC7F1C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t7B2BBC7C1C779D720067B71D /* Sources */,\n\t\t\t\t7B2BBC7D1C779D720067B71D /* Frameworks */,\n\t\t\t\t7B2BBC7E1C779D720067B71D /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tproductName = TestsTests;\n\t\t\tproductReference = 7B2BBC801C779D720067B71D /* Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t7B2BBC691C779D710067B71D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0720;\n\t\t\t\tLastUpgradeCheck = 0800;\n\t\t\t\tORGANIZATIONNAME = \"Swift Algorithm Club\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t7B2BBC7F1C779D720067B71D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2;\n\t\t\t\t\t\tLastSwiftMigration = 0800;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 7B2BBC681C779D710067B71D;\n\t\t\tproductRefGroup = 7B2BBC721C779D710067B71D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t7B2BBC7F1C779D720067B71D /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t7B2BBC7E1C779D720067B71D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t7B2BBC7C1C779D720067B71D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7B80C3CC1C77A120003CECC7 /* AVLTree.swift in Sources */,\n\t\t\t\t7B80C3C91C77A112003CECC7 /* TreeNodeTests.swift in Sources */,\n\t\t\t\t7B80C3CA1C77A112003CECC7 /* AVLTreeTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t7B2BBC871C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC881C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t7B2BBC8D1C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC8E1C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC871C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC881C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC8D1C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC8E1C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 7B2BBC691C779D710067B71D /* Project object */;\n}\n"
  },
  {
    "path": "AVL Tree/Tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Tests.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "AVL Tree/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0800\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "AVL Tree/Tests/TreeNodeTests.swift",
    "content": "//\n//  TreeNodeTest.swift\n//  AVLTreeTests\n//\n//  Created by Barbara Rodeker on 2/19/16.\n//  Copyright © 2016 Swift Algorithm Club. All rights reserved.\n//\n\nimport XCTest\n\nclass TreeNodeTests: XCTestCase {\n   \n    var root: TreeNode<String, String>?\n    var left: TreeNode<String, String>?\n    var right: TreeNode<String, String>?\n    func testSwift4() {\n        // last checked with Xcode 9.0b4\n        #if swift(>=4.0)\n            print(\"Hello, Swift 4!\")\n        #endif\n    }\n    override func setUp() {\n        super.setUp()\n\n        left = TreeNode<String, String>(key: \"Name\", payload: \"Left\")\n        right = TreeNode<String, String>(key: \"Name\", payload: \"Right\")\n        root = TreeNode<String, String>(key: \"Name\", payload: \"Root\", leftChild: left, rightChild: right, parent: nil, height: 0)\n    }\n\n    override func tearDown() {\n        // Put teardown code here. This method is called after the invocation of each test method in the class.\n        super.tearDown()\n    }\n\n    func testSingleNodeCreationNOPayload() {\n        let treeNode = TreeNode<String, String>(key: \"Building\")\n        XCTAssertNil(treeNode.payload, \"Payload for this case should be nil\")\n    }\n\n    func testSingleNodeCreationWithPayload() {\n        XCTAssertNotNil(self.root!, \"Payload for this case should not be nil\")\n    }\n\n    func testIsRoot() {\n        XCTAssertTrue(self.root!.isRoot)\n    }\n\n    func testNotIsLeaf() {\n        XCTAssertFalse(self.root!.isLeaf, \"root node is not leaf\")\n    }\n\n    func testNotIsLeftChild() {\n        XCTAssertFalse(self.root!.isLeftChild, \"root node is not left child\")\n    }\n\n    func testNotIsRightChild() {\n        XCTAssertFalse(self.root!.isRightChild, \"root node is not right child\")\n    }\n\n    func testIsLeftChild() {\n        XCTAssertTrue(self.left!.isLeftChild)\n    }\n\n    func testIsRightChild() {\n        XCTAssertTrue(self.right!.isRightChild)\n    }\n\n    func isLeaf() {\n        XCTAssertTrue(self.left!.isLeaf)\n    }\n\n    func testHasAnyChild() {\n        XCTAssertTrue(self.root!.hasAnyChild)\n    }\n\n    func testNotHasAnyChild() {\n        XCTAssertFalse(self.left!.hasAnyChild)\n    }\n\n    func testHasBothChildren() {\n        XCTAssertTrue(self.root!.hasBothChildren)\n    }\n\n    func testNotHasBothChildren() {\n        XCTAssertFalse(self.left!.hasBothChildren)\n    }\n\n}\n"
  },
  {
    "path": "Algorithm Design.markdown",
    "content": "# Algorithm design techniques\n\nWhat to do when you're faced with a new problem and you need to find an algorithm for it.\n\n### Is it similar to another problem?\n\nIf you can frame your problem in terms of another, more general problem, then you might be able to use an existing algorithm. Why reinvent the wheel?\n\nOne thing I like about [The Algorithm Design Manual](http://www.algorist.com) by Steven Skiena is that it includes a catalog of problems and solutions you can try. (See also his [algorithm repository](http://www3.cs.stonybrook.edu/~algorith/).)\n\n### It's OK to start with brute force\n\nNaive, brute force solutions are often too slow for practical use but they're a good starting point. By writing the brute force solution, you learn to understand what the problem is really all about.\n\nOnce you have a brute force implementation you can use that to verify that any improvements you come up with are correct. \n\nAnd if you only work with small datasets, then a brute force approach may actually be good enough on its own. Don't fall into the trap of premature optimization!\n\n### Divide and conquer\n\n>\"When you change the way you look at things, the things you look at change.\"</br>\n>Max Planck, Quantum theorist and Nobel Prize Winner\n\nDivide and conquer is a way of dealing with a large problem by breaking it down into bits and pieces and working your way up towards the solution.\n\nInstead of seeing the whole problem as a single, huge and complex task you divide the problem in relatively smaller problems that are easier to understand and deal with.\n\nYou solve smaller problems and aggregate the solution until you are left with the solution only. At each step the problem at hand shrinks and the solution gets mature until you have the final correct solution.\n\nSolving the smaller task and applying the same solution repetitively ( or often times recursively) to other chunks give you the result in less time.\n"
  },
  {
    "path": "All-Pairs Shortest Paths/APSP/APSP/APSP.h",
    "content": "//\n//  APSP.h\n//  APSP\n//\n//  Created by Andrew McKnight on 5/6/16.\n//\n\n#import <Cocoa/Cocoa.h>\n\n//! Project version number for APSP.\nFOUNDATION_EXPORT double APSPVersionNumber;\n\n//! Project version string for APSP.\nFOUNDATION_EXPORT const unsigned char APSPVersionString[];\n\n// In this header, you should import all the public headers of your framework using statements like #import <APSP/PublicHeader.h>\n\n\n"
  },
  {
    "path": "All-Pairs Shortest Paths/APSP/APSP/APSP.swift",
    "content": "//\n//  Base.swift\n//  APSP\n//\n//  Created by Andrew McKnight on 5/6/16.\n//\n\nimport Foundation\nimport Graph\n\n/**\n `APSPAlgorithm` is a protocol for encapsulating an All-Pairs Shortest Paths algorithm.\n It provides a single function `apply` that accepts a subclass of `AbstractGraph` and\n returns an object conforming to `APSPResult`.\n */\npublic protocol APSPAlgorithm {\n\n  associatedtype Q: Hashable\n  associatedtype P: APSPResult\n\n  static func apply(_ graph: AbstractGraph<Q>) -> P\n\n}\n\n/**\n `APSPResult` is a protocol defining functions `distance` and `path`, allowing for opaque\n queries into the actual data structures that represent the APSP solution according to the algorithm used.\n */\npublic protocol APSPResult {\n\n  associatedtype T: Hashable\n\n  func distance(fromVertex from: Vertex<T>, toVertex to: Vertex<T>) -> Double?\n  func path(fromVertex from: Vertex<T>, toVertex to: Vertex<T>, inGraph graph: AbstractGraph<T>) -> [T]?\n\n}\n"
  },
  {
    "path": "All-Pairs Shortest Paths/APSP/APSP/FloydWarshall.swift",
    "content": "//\n//  FloydWarshall.swift\n//  APSP\n//\n//  Created by Andrew McKnight on 5/5/16.\n//\n\nimport Foundation\nimport Graph\n\nprivate typealias Distances = [[Double]]\nprivate typealias Predecessors = [[Int?]]\nprivate typealias StepResult = (distances: Distances, predecessors: Predecessors)\n\n/**\n Encapsulation of the Floyd-Warshall All-Pairs Shortest Paths algorithm, conforming to the `APSPAlgorithm` protocol.\n\n - note: In all complexity bounds, `V` is the number of vertices in the graph, and `E` is the number of edges.\n */\npublic struct FloydWarshall<T>: APSPAlgorithm where T: Hashable {\n\n  public typealias Q = T\n  public typealias P = FloydWarshallResult<T>\n\n  /**\n   Floyd-Warshall algorithm for computing all-pairs shortest paths in a weighted directed graph.\n\n   - precondition: `graph` must have no negative weight cycles\n   - complexity: `Θ(V^3)` time, `Θ(V^2)` space\n   - returns a `FloydWarshallResult` struct which can be queried for shortest paths and their total weights\n   */\n  public static func apply<T>(_ graph: AbstractGraph<T>) -> FloydWarshallResult<T> {\n\n    var previousDistance = constructInitialDistanceMatrix(graph)\n    var previousPredecessor = constructInitialPredecessorMatrix(previousDistance)\n    for intermediateIdx in 0 ..< graph.vertices.count {\n      let nextResult = nextStep(intermediateIdx, previousDistances: previousDistance, previousPredecessors: previousPredecessor, graph: graph)\n      previousDistance = nextResult.distances\n      previousPredecessor = nextResult.predecessors\n\n//      // uncomment to see each new weight matrix\n//      print(\"  D(\\(k)):\\n\")\n//      printMatrix(nextResult.distances)\n//\n//      // uncomment to see each new predecessor matrix\n//      print(\"  ∏(\\(k)):\\n\")\n//      printIntMatrix(nextResult.predecessors)\n    }\n    return FloydWarshallResult<T>(weights: previousDistance, predecessors: previousPredecessor)\n\n  }\n\n  /**\n   For each iteration of `intermediateIdx`, perform the comparison for the dynamic algorith,\n   checking for each pair of start/end vertices, whether a path taken through another vertex\n   produces a shorter path.\n\n   - complexity: `Θ(V^2)` time/space\n   - returns: a tuple containing the next distance matrix with weights of currently known\n   shortest paths and the corresponding predecessor matrix\n   */\n  static fileprivate func nextStep<T>(_ intermediateIdx: Int, previousDistances: Distances,\n                               previousPredecessors: Predecessors, graph: AbstractGraph<T>) -> StepResult {\n\n    let vertexCount = graph.vertices.count\n    var nextDistances = Array(repeating: Array(repeating: Double.infinity, count: vertexCount), count: vertexCount)\n    var nextPredecessors = Array(repeating: Array<Int?>(repeating: nil, count: vertexCount), count: vertexCount)\n\n    for fromIdx in 0 ..< vertexCount {\n      for toIndex in 0 ..< vertexCount {\n//        printMatrix(previousDistances, i: fromIdx, j: toIdx, k: intermediateIdx) // uncomment to see each comparison being made\n        let originalPathWeight = previousDistances[fromIdx][toIndex]\n        let newPathWeightBefore = previousDistances[fromIdx][intermediateIdx]\n        let newPathWeightAfter = previousDistances[intermediateIdx][toIndex]\n\n        let minimum = min(originalPathWeight, newPathWeightBefore + newPathWeightAfter)\n        nextDistances[fromIdx][toIndex] = minimum\n\n        var predecessor: Int?\n        if originalPathWeight <= newPathWeightBefore + newPathWeightAfter {\n          predecessor = previousPredecessors[fromIdx][toIndex]\n        } else {\n          predecessor = previousPredecessors[intermediateIdx][toIndex]\n        }\n        nextPredecessors[fromIdx][toIndex] = predecessor\n      }\n    }\n    return (nextDistances, nextPredecessors)\n\n  }\n\n  /**\n   We need to map the graph's weight domain onto the one required by the algorithm: the graph\n   stores either a weight as a `Double` or `nil` if no edge exists between two vertices, but\n   the algorithm needs a lack of an edge represented as ∞ for the `min` comparison to work correctly.\n\n   - complexity: `Θ(V^2)` time/space\n   - returns: weighted adjacency matrix in form ready for processing with Floyd-Warshall\n   */\n  static fileprivate func constructInitialDistanceMatrix<T>(_ graph: AbstractGraph<T>) -> Distances {\n\n    let vertices = graph.vertices\n\n    let vertexCount = graph.vertices.count\n    var distances = Array(repeating: Array(repeating: Double.infinity, count: vertexCount), count: vertexCount)\n\n    for row in vertices {\n      for col in vertices {\n        let rowIdx = row.index\n        let colIdx = col.index\n        if rowIdx == colIdx {\n          distances[rowIdx][colIdx] = 0.0\n        } else if let w = graph.weightFrom(row, to: col) {\n          distances[rowIdx][colIdx] = w\n        }\n      }\n    }\n\n    return distances\n\n  }\n\n  /**\n   Make the initial predecessor index matrix. Initially each value is equal to it's row index, it's \"from\" index when querying into it.\n\n   - complexity: `Θ(V^2)` time/space\n  */\n  static fileprivate func constructInitialPredecessorMatrix(_ distances: Distances) -> Predecessors {\n\n    let vertexCount = distances.count\n    var predecessors = Array(repeating: Array<Int?>(repeating: nil, count: vertexCount), count: vertexCount)\n\n    for fromIdx in 0 ..< vertexCount {\n      for toIdx in 0 ..< vertexCount {\n        if fromIdx != toIdx && distances[fromIdx][toIdx] < Double.infinity {\n          predecessors[fromIdx][toIdx] = fromIdx\n        }\n      }\n    }\n\n    return predecessors\n\n  }\n\n}\n\n/**\n `FloydWarshallResult` encapsulates the result of the computation, namely the\n minimized distance adjacency matrix, and the matrix of predecessor indices.\n\n It conforms to the `APSPResult` procotol which provides methods to retrieve\n distances and paths between given pairs of start and end nodes.\n */\npublic struct FloydWarshallResult<T>: APSPResult where T: Hashable {\n\n  fileprivate var weights: Distances\n  fileprivate var predecessors: Predecessors\n\n  /**\n   - returns: the total weight of the path from a starting vertex to a destination.\n   This value is the minimal connected weight between the two vertices, or `nil` if no path exists\n   - complexity: `Θ(1)` time/space\n   */\n  public func distance(fromVertex from: Vertex<T>, toVertex to: Vertex<T>) -> Double? {\n\n    return weights[from.index][to.index]\n\n  }\n\n  /**\n   - returns: the reconstructed path from a starting vertex to a destination,\n   as an array containing the data property of each vertex, or `nil` if no path exists\n   - complexity: `Θ(V)` time, `Θ(V^2)` space\n   */\n  public func path(fromVertex from: Vertex<T>, toVertex to: Vertex<T>, inGraph graph: AbstractGraph<T>) -> [T]? {\n\n    if let path = recursePathFrom(fromVertex: from, toVertex: to, path: [ to ], inGraph: graph) {\n      let pathValues = path.map { vertex in\n        vertex.data\n      }\n      return pathValues\n    }\n    return nil\n\n  }\n\n  /**\n   The recursive component to rebuilding the shortest path between\n   two vertices using the predecessor matrix.\n\n   - returns: the list of predecessors discovered so far\n   */\n  fileprivate func recursePathFrom(fromVertex from: Vertex<T>, toVertex to: Vertex<T>, path: [Vertex<T>],\n                                          inGraph graph: AbstractGraph<T>) -> [Vertex<T>]? {\n\n    if from.index == to.index {\n      return [ from, to ]\n    }\n\n    if let predecessor = predecessors[from.index][to.index] {\n      let predecessorVertex = graph.vertices[predecessor]\n      if predecessor == from.index {\n        let newPath = [ from, to ]\n        return newPath\n      } else {\n        let buildPath = recursePathFrom(fromVertex: from, toVertex: predecessorVertex, path: path, inGraph: graph)\n        let newPath = buildPath! + [ to ]\n        return newPath\n      }\n    }\n\n    return nil\n  }\n\n}\n"
  },
  {
    "path": "All-Pairs Shortest Paths/APSP/APSP/Helpers.swift",
    "content": "//\n//  Helpers.swift\n//  APSP\n//\n//  Created by Andrew McKnight on 5/6/16.\n//\n\nimport Foundation\n\n/**\n Print a matrix, optionally specifying only the cells to display with the triplet (i, j, k) -> matrix[i][j], matrix[i][k], matrix[k][j]\n */\nfunc printMatrix(_ matrix: [[Double]], i: Int = -1, j: Int = -1, k: Int = -1) {\n\n  if i >= 0 {\n    print(\"  k: \\(k); i: \\(i); j: \\(j)\\n\")\n  }\n\n  var grid = [String]()\n\n  let n = matrix.count\n  for x in 0..<n {\n    var row = \"\"\n    for y in 0..<n {\n      if i < 0 || ( x == i && y == j ) || ( x == i && y == k ) || ( x == k && y == j ) {\n        let value = NSString(format: \"%.1f\", matrix[x][y])\n        row += \"\\(matrix[x][y] >= 0 ? \" \" : \"\")\\(value) \"\n      } else {\n        row += \"  .  \"\n      }\n    }\n    grid.append(row)\n  }\n  print((grid as NSArray).componentsJoined(by: \"\\n\"))\n  print(\" =======================\")\n\n}\n\nfunc printIntMatrix(_ matrix: [[Int?]]) {\n\n  var grid = [String]()\n\n  let n = matrix.count\n  for x in 0..<n {\n    var row = \"\"\n    for y in 0..<n {\n      if let value = matrix[x][y] {\n        let valueString = NSString(format: \"%i\", value)\n        row += \"\\(value >= 0 ? \" \" : \"\")\\(valueString) \"\n      } else {\n        row += \"  ø  \"\n      }\n    }\n    grid.append(row)\n  }\n  print((grid as NSArray).componentsJoined(by: \"\\n\"))\n  print(\" =======================\")\n\n}\n"
  },
  {
    "path": "All-Pairs Shortest Paths/APSP/APSP/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>FMWK</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>$(CURRENT_PROJECT_VERSION)</string>\n\t<key>NSPrincipalClass</key>\n\t<string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "All-Pairs Shortest Paths/APSP/APSP.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\nimport Graph\nimport APSP\n\nvar graph = AdjacencyListGraph<String>()\n\nlet v1 = graph.createVertex(\"Montreal\")\nlet v2 = graph.createVertex(\"New York\")\nlet v3 = graph.createVertex(\"Boston\")\nlet v4 = graph.createVertex(\"Portland\")\nlet v5 = graph.createVertex(\"Portsmouth\")\n\ngraph.addDirectedEdge(v1, to: v2, withWeight: 3)\ngraph.addDirectedEdge(v1, to: v5, withWeight: -4)\ngraph.addDirectedEdge(v1, to: v3, withWeight: 8)\n\ngraph.addDirectedEdge(v2, to: v4, withWeight: 1)\ngraph.addDirectedEdge(v2, to: v5, withWeight: 7)\n\ngraph.addDirectedEdge(v3, to: v2, withWeight: 4)\n\ngraph.addDirectedEdge(v4, to: v1, withWeight: 2)\ngraph.addDirectedEdge(v4, to: v3, withWeight: -5)\n\ngraph.addDirectedEdge(v5, to: v4, withWeight: 6)\n\nlet result = FloydWarshall<String>.apply(graph)\n\nlet path = result.path(fromVertex: v1, toVertex: v4, inGraph: graph)\n"
  },
  {
    "path": "All-Pairs Shortest Paths/APSP/APSP.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx' last-migration='1010'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "All-Pairs Shortest Paths/APSP/APSP.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "All-Pairs Shortest Paths/APSP/APSP.playground/timeline.xctimeline",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Timeline\n   version = \"3.0\">\n   <TimelineItems>\n      <LoggerValueHistoryTimelineItem\n         documentLocation = \"file:///Users/kachen/src/swift-algorithm-club/All-Pairs%20Shortest%20Paths/APSP/APSP.playground#CharacterRangeLen=0&amp;CharacterRangeLoc=971&amp;EndingColumnNumber=68&amp;EndingLineNumber=34&amp;StartingColumnNumber=68&amp;StartingLineNumber=34&amp;Timestamp=523221730.015692\"\n         selectedRepresentationIndex = \"0\"\n         shouldTrackSuperviewWidth = \"NO\">\n      </LoggerValueHistoryTimelineItem>\n      <LoggerValueHistoryTimelineItem\n         documentLocation = \"file:///Users/kachen/src/swift-algorithm-club/All-Pairs%20Shortest%20Paths/APSP/APSP.playground#CharacterRangeLen=4&amp;CharacterRangeLoc=908&amp;EndingColumnNumber=9&amp;EndingLineNumber=34&amp;StartingColumnNumber=5&amp;StartingLineNumber=34&amp;Timestamp=523221730.015887\"\n         selectedRepresentationIndex = \"0\"\n         shouldTrackSuperviewWidth = \"NO\">\n      </LoggerValueHistoryTimelineItem>\n   </TimelineItems>\n</Timeline>\n"
  },
  {
    "path": "All-Pairs Shortest Paths/APSP/APSP.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t491AA3821CE8C5F700A2E2C5 /* Graph.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 491AA37F1CE8C5C900A2E2C5 /* Graph.framework */; };\n\t\t493D8DE31CDD2A1C0089795A /* APSPTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 493D8DE21CDD2A1C0089795A /* APSPTests.swift */; };\n\t\t493D8DF41CDD5B960089795A /* APSP.h in Headers */ = {isa = PBXBuildFile; fileRef = 493D8DF31CDD5B960089795A /* APSP.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t493D8DF91CDD5B9B0089795A /* FloydWarshall.swift in Sources */ = {isa = PBXBuildFile; fileRef = 493D8DD81CDC38C60089795A /* FloydWarshall.swift */; };\n\t\t493D8DFA1CDD5B9E0089795A /* Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 493D8DDA1CDD29C80089795A /* Helpers.swift */; };\n\t\t49BFA27A1CDD93F400522D66 /* APSP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49BFA2791CDD93F400522D66 /* APSP.swift */; };\n\t\t49BFA2801CDE742900522D66 /* APSP.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 493D8DF11CDD5B960089795A /* APSP.framework */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t491AA37E1CE8C5C900A2E2C5 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 491AA3791CE8C5C900A2E2C5 /* Graph.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 49BFA2FD1CDF886B00522D66;\n\t\t\tremoteInfo = Graph;\n\t\t};\n\t\t491AA3801CE8C5C900A2E2C5 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 491AA3791CE8C5C900A2E2C5 /* Graph.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 49BFA3071CDF886B00522D66;\n\t\t\tremoteInfo = GraphTests;\n\t\t};\n\t\t491AA3831CE8C5F900A2E2C5 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 491AA3791CE8C5C900A2E2C5 /* Graph.xcodeproj */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 49BFA2FC1CDF886B00522D66;\n\t\t\tremoteInfo = Graph;\n\t\t};\n\t\t49BFA27E1CDE742700522D66 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 493D8D7E1CDC2DAE0089795A /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 493D8DF01CDD5B960089795A;\n\t\t\tremoteInfo = APSP;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\t491AA3791CE8C5C900A2E2C5 /* Graph.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = Graph.xcodeproj; path = ../../Graph/Graph.xcodeproj; sourceTree = \"<group>\"; };\n\t\t493D8DD81CDC38C60089795A /* FloydWarshall.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FloydWarshall.swift; sourceTree = \"<group>\"; };\n\t\t493D8DDA1CDD29C80089795A /* Helpers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Helpers.swift; sourceTree = \"<group>\"; };\n\t\t493D8DE01CDD2A1C0089795A /* APSPTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = APSPTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t493D8DE21CDD2A1C0089795A /* APSPTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APSPTests.swift; sourceTree = \"<group>\"; };\n\t\t493D8DE41CDD2A1C0089795A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t493D8DF11CDD5B960089795A /* APSP.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = APSP.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t493D8DF31CDD5B960089795A /* APSP.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = APSP.h; sourceTree = \"<group>\"; };\n\t\t493D8DF51CDD5B960089795A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t49BFA2791CDD93F400522D66 /* APSP.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = APSP.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t493D8DDD1CDD2A1C0089795A /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t49BFA2801CDE742900522D66 /* APSP.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t493D8DED1CDD5B960089795A /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t491AA3821CE8C5F700A2E2C5 /* Graph.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t491AA37A1CE8C5C900A2E2C5 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t491AA37F1CE8C5C900A2E2C5 /* Graph.framework */,\n\t\t\t\t491AA3811CE8C5C900A2E2C5 /* GraphTests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t493D8D7D1CDC2DAE0089795A = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t491AA3791CE8C5C900A2E2C5 /* Graph.xcodeproj */,\n\t\t\t\t493D8D881CDC2DAE0089795A /* APSP */,\n\t\t\t\t493D8DE11CDD2A1C0089795A /* APSPTests */,\n\t\t\t\t493D8D871CDC2DAE0089795A /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t493D8D871CDC2DAE0089795A /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t493D8DE01CDD2A1C0089795A /* APSPTests.xctest */,\n\t\t\t\t493D8DF11CDD5B960089795A /* APSP.framework */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t493D8D881CDC2DAE0089795A /* APSP */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t493D8DF31CDD5B960089795A /* APSP.h */,\n\t\t\t\t49BFA2791CDD93F400522D66 /* APSP.swift */,\n\t\t\t\t493D8DD81CDC38C60089795A /* FloydWarshall.swift */,\n\t\t\t\t493D8DDA1CDD29C80089795A /* Helpers.swift */,\n\t\t\t\t493D8DF51CDD5B960089795A /* Info.plist */,\n\t\t\t);\n\t\t\tpath = APSP;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t493D8DE11CDD2A1C0089795A /* APSPTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t493D8DE21CDD2A1C0089795A /* APSPTests.swift */,\n\t\t\t\t493D8DE41CDD2A1C0089795A /* Info.plist */,\n\t\t\t);\n\t\t\tpath = APSPTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXHeadersBuildPhase section */\n\t\t493D8DEE1CDD5B960089795A /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t493D8DF41CDD5B960089795A /* APSP.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXHeadersBuildPhase section */\n\n/* Begin PBXNativeTarget section */\n\t\t493D8DDF1CDD2A1C0089795A /* APSPTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 493D8DE51CDD2A1C0089795A /* Build configuration list for PBXNativeTarget \"APSPTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t493D8DDC1CDD2A1C0089795A /* Sources */,\n\t\t\t\t493D8DDD1CDD2A1C0089795A /* Frameworks */,\n\t\t\t\t493D8DDE1CDD2A1C0089795A /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t49BFA27F1CDE742700522D66 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = APSPTests;\n\t\t\tproductName = APSPTests;\n\t\t\tproductReference = 493D8DE01CDD2A1C0089795A /* APSPTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n\t\t493D8DF01CDD5B960089795A /* APSP */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 493D8DF61CDD5B960089795A /* Build configuration list for PBXNativeTarget \"APSP\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t493D8DEC1CDD5B960089795A /* Sources */,\n\t\t\t\t493D8DED1CDD5B960089795A /* Frameworks */,\n\t\t\t\t493D8DEE1CDD5B960089795A /* Headers */,\n\t\t\t\t493D8DEF1CDD5B960089795A /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t491AA3841CE8C5F900A2E2C5 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = APSP;\n\t\t\tproductName = APSP;\n\t\t\tproductReference = 493D8DF11CDD5B960089795A /* APSP.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t493D8D7E1CDC2DAE0089795A /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0730;\n\t\t\t\tLastUpgradeCheck = 1010;\n\t\t\t\tORGANIZATIONNAME = \"Swift Algorithm Club\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t493D8DDF1CDD2A1C0089795A = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.3;\n\t\t\t\t\t\tLastSwiftMigration = 1010;\n\t\t\t\t\t};\n\t\t\t\t\t493D8DF01CDD5B960089795A = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.3;\n\t\t\t\t\t\tLastSwiftMigration = 1010;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 493D8D811CDC2DAE0089795A /* Build configuration list for PBXProject \"APSP\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t);\n\t\t\tmainGroup = 493D8D7D1CDC2DAE0089795A;\n\t\t\tproductRefGroup = 493D8D871CDC2DAE0089795A /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectReferences = (\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 491AA37A1CE8C5C900A2E2C5 /* Products */;\n\t\t\t\t\tProjectRef = 491AA3791CE8C5C900A2E2C5 /* Graph.xcodeproj */;\n\t\t\t\t},\n\t\t\t);\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t493D8DDF1CDD2A1C0089795A /* APSPTests */,\n\t\t\t\t493D8DF01CDD5B960089795A /* APSP */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXReferenceProxy section */\n\t\t491AA37F1CE8C5C900A2E2C5 /* Graph.framework */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = wrapper.framework;\n\t\t\tpath = Graph.framework;\n\t\t\tremoteRef = 491AA37E1CE8C5C900A2E2C5 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t491AA3811CE8C5C900A2E2C5 /* GraphTests.xctest */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = wrapper.cfbundle;\n\t\t\tpath = GraphTests.xctest;\n\t\t\tremoteRef = 491AA3801CE8C5C900A2E2C5 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n/* End PBXReferenceProxy section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t493D8DDE1CDD2A1C0089795A /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t493D8DEF1CDD5B960089795A /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t493D8DDC1CDD2A1C0089795A /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t493D8DE31CDD2A1C0089795A /* APSPTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t493D8DEC1CDD5B960089795A /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t49BFA27A1CDD93F400522D66 /* APSP.swift in Sources */,\n\t\t\t\t493D8DF91CDD5B9B0089795A /* FloydWarshall.swift in Sources */,\n\t\t\t\t493D8DFA1CDD5B9E0089795A /* Helpers.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t491AA3841CE8C5F900A2E2C5 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = Graph;\n\t\t\ttargetProxy = 491AA3831CE8C5F900A2E2C5 /* PBXContainerItemProxy */;\n\t\t};\n\t\t49BFA27F1CDE742700522D66 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 493D8DF01CDD5B960089795A /* APSP */;\n\t\t\ttargetProxy = 49BFA27E1CDE742700522D66 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin XCBuildConfiguration section */\n\t\t493D8D8B1CDC2DAE0089795A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t493D8D8C1CDC2DAE0089795A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t493D8DE61CDD2A1C0089795A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = APSPTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.swift-algorithm-club.APSPTests\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t493D8DE71CDD2A1C0089795A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = APSPTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.swift-algorithm-club.APSPTests\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t493D8DF71CDD5B960089795A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tFRAMEWORK_VERSION = A;\n\t\t\t\tINFOPLIST_FILE = APSP/Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.swift-algorithm-club.APSP\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t493D8DF81CDD5B960089795A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tFRAMEWORK_VERSION = A;\n\t\t\t\tINFOPLIST_FILE = APSP/Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.swift-algorithm-club.APSP\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t493D8D811CDC2DAE0089795A /* Build configuration list for PBXProject \"APSP\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t493D8D8B1CDC2DAE0089795A /* Debug */,\n\t\t\t\t493D8D8C1CDC2DAE0089795A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t493D8DE51CDD2A1C0089795A /* Build configuration list for PBXNativeTarget \"APSPTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t493D8DE61CDD2A1C0089795A /* Debug */,\n\t\t\t\t493D8DE71CDD2A1C0089795A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t493D8DF61CDD5B960089795A /* Build configuration list for PBXNativeTarget \"APSP\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t493D8DF71CDD5B960089795A /* Debug */,\n\t\t\t\t493D8DF81CDD5B960089795A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 493D8D7E1CDC2DAE0089795A /* Project object */;\n}\n"
  },
  {
    "path": "All-Pairs Shortest Paths/APSP/APSP.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "All-Pairs Shortest Paths/APSP/APSP.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "All-Pairs Shortest Paths/APSP/APSP.xcodeproj/xcshareddata/xcschemes/APSP.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1010\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"493D8DF01CDD5B960089795A\"\n               BuildableName = \"APSP.framework\"\n               BlueprintName = \"APSP\"\n               ReferencedContainer = \"container:APSP.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"493D8DF01CDD5B960089795A\"\n            BuildableName = \"APSP.framework\"\n            BlueprintName = \"APSP\"\n            ReferencedContainer = \"container:APSP.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"493D8DF01CDD5B960089795A\"\n            BuildableName = \"APSP.framework\"\n            BlueprintName = \"APSP\"\n            ReferencedContainer = \"container:APSP.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"493D8DF01CDD5B960089795A\"\n            BuildableName = \"APSP.framework\"\n            BlueprintName = \"APSP\"\n            ReferencedContainer = \"container:APSP.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "All-Pairs Shortest Paths/APSP/APSP.xcodeproj/xcshareddata/xcschemes/APSPTests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1010\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"493D8DDF1CDD2A1C0089795A\"\n               BuildableName = \"APSPTests.xctest\"\n               BlueprintName = \"APSPTests\"\n               ReferencedContainer = \"container:APSP.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"493D8DDF1CDD2A1C0089795A\"\n               BuildableName = \"APSPTests.xctest\"\n               BlueprintName = \"APSPTests\"\n               ReferencedContainer = \"container:APSP.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"493D8DDF1CDD2A1C0089795A\"\n            BuildableName = \"APSPTests.xctest\"\n            BlueprintName = \"APSPTests\"\n            ReferencedContainer = \"container:APSP.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"493D8DDF1CDD2A1C0089795A\"\n            BuildableName = \"APSPTests.xctest\"\n            BlueprintName = \"APSPTests\"\n            ReferencedContainer = \"container:APSP.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "All-Pairs Shortest Paths/APSP/APSP.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:APSP.playground\">\n   </FileRef>\n   <FileRef\n      location = \"container:APSP.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "All-Pairs Shortest Paths/APSP/APSP.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "All-Pairs Shortest Paths/APSP/APSP.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "All-Pairs Shortest Paths/APSP/APSPTests/APSPTests.swift",
    "content": "//\n//  APSPTests.swift\n//  APSPTests\n//\n//  Created by Andrew McKnight on 5/6/16.\n//\n\nimport APSP\nimport Graph\nimport XCTest\n\nstruct TestCase<T> where T: Hashable {\n\n  var from: Vertex<T>\n  var to: Vertex<T>\n  var expectedPath: [T]\n  var expectedDistance: Double\n\n}\n\nclass APSPTests: XCTestCase {\n  /**\n   See Figure 25.1 of “Introduction to Algorithms” by Cormen et al, 3rd ed., pg 690\n   */\n  func testExampleFromBook() {\n\n    let graph = AdjacencyMatrixGraph<Int>()\n    let v1 = graph.createVertex(1)\n    let v2 = graph.createVertex(2)\n    let v3 = graph.createVertex(3)\n    let v4 = graph.createVertex(4)\n    let v5 = graph.createVertex(5)\n\n    graph.addDirectedEdge(v1, to: v2, withWeight: 3)\n    graph.addDirectedEdge(v1, to: v5, withWeight: -4)\n    graph.addDirectedEdge(v1, to: v3, withWeight: 8)\n\n    graph.addDirectedEdge(v2, to: v4, withWeight: 1)\n    graph.addDirectedEdge(v2, to: v5, withWeight: 7)\n\n    graph.addDirectedEdge(v3, to: v2, withWeight: 4)\n\n    graph.addDirectedEdge(v4, to: v1, withWeight: 2)\n    graph.addDirectedEdge(v4, to: v3, withWeight: -5)\n\n    graph.addDirectedEdge(v5, to: v4, withWeight: 6)\n\n    let result = FloydWarshall<Int>.apply(graph)\n\n    let cases = [\n      TestCase<Int>(from: v1, to: v4, expectedPath: [1, 5, 4], expectedDistance: 2),\n      TestCase<Int>(from: v1, to: v5, expectedPath: [1, 5], expectedDistance: -4),\n      TestCase<Int>(from: v2, to: v1, expectedPath: [2, 4, 1], expectedDistance: 3),\n      TestCase<Int>(from: v2, to: v3, expectedPath: [2, 4, 3], expectedDistance: -4),\n      TestCase<Int>(from: v2, to: v4, expectedPath: [2, 4], expectedDistance: 1),\n      TestCase<Int>(from: v2, to: v5, expectedPath: [2, 4, 1, 5], expectedDistance: -1),\n      TestCase<Int>(from: v3, to: v1, expectedPath: [3, 2, 4, 1], expectedDistance: 7),\n      TestCase<Int>(from: v3, to: v2, expectedPath: [3, 2], expectedDistance: 4),\n      TestCase<Int>(from: v3, to: v4, expectedPath: [3, 2, 4], expectedDistance: 5),\n      TestCase<Int>(from: v3, to: v5, expectedPath: [3, 2, 4, 1, 5], expectedDistance: 3),\n      TestCase<Int>(from: v4, to: v1, expectedPath: [4, 1], expectedDistance: 2),\n      TestCase<Int>(from: v4, to: v2, expectedPath: [4, 3, 2], expectedDistance: -1),\n      TestCase<Int>(from: v4, to: v3, expectedPath: [4, 3], expectedDistance: -5),\n      TestCase<Int>(from: v4, to: v5, expectedPath: [4, 1, 5], expectedDistance: -2),\n      TestCase<Int>(from: v5, to: v1, expectedPath: [5, 4, 1], expectedDistance: 8),\n      TestCase<Int>(from: v5, to: v2, expectedPath: [5, 4, 3, 2], expectedDistance: 5),\n      TestCase<Int>(from: v5, to: v3, expectedPath: [5, 4, 3], expectedDistance: 1),\n      TestCase<Int>(from: v5, to: v4, expectedPath: [5, 4], expectedDistance: 6),\n      ]\n\n    for testCase: TestCase<Int> in cases {\n      if let computedPath = result.path(fromVertex: testCase.from, toVertex: testCase.to, inGraph: graph),\n         let computedDistance = result.distance(fromVertex: testCase.from, toVertex: testCase.to) {\n        XCTAssert(computedDistance == testCase.expectedDistance, \"expected distance \\(testCase.expectedDistance) but got \\(computedDistance)\")\n        XCTAssert(computedPath == testCase.expectedPath, \"expected path \\(testCase.expectedPath) but got \\(computedPath)\")\n      }\n    }\n\n  }\n\n  func testExampleFromReadme() {\n\n    let graph = AdjacencyMatrixGraph<Int>()\n    let v1 = graph.createVertex(1)\n    let v2 = graph.createVertex(2)\n    let v3 = graph.createVertex(3)\n    let v4 = graph.createVertex(4)\n\n    graph.addDirectedEdge(v1, to: v2, withWeight: 4)\n    graph.addDirectedEdge(v1, to: v3, withWeight: 1)\n    graph.addDirectedEdge(v1, to: v4, withWeight: 3)\n\n    graph.addDirectedEdge(v2, to: v3, withWeight: 8)\n    graph.addDirectedEdge(v2, to: v4, withWeight: -2)\n\n    graph.addDirectedEdge(v3, to: v4, withWeight: -5)\n\n    let result = FloydWarshall<Int>.apply(graph)\n\n    let cases = [\n      TestCase<Int>(from: v1, to: v2, expectedPath: [1, 2], expectedDistance: 4),\n      TestCase<Int>(from: v1, to: v3, expectedPath: [1, 3], expectedDistance: 1),\n      TestCase<Int>(from: v1, to: v4, expectedPath: [1, 3, 4], expectedDistance: -4),\n\n      TestCase<Int>(from: v2, to: v3, expectedPath: [2, 3], expectedDistance: 8),\n      TestCase<Int>(from: v2, to: v4, expectedPath: [2, 4], expectedDistance: -2),\n\n      TestCase<Int>(from: v3, to: v4, expectedPath: [3, 4], expectedDistance: -5),\n    ]\n\n    for testCase: TestCase<Int> in cases {\n      if let computedPath = result.path(fromVertex: testCase.from, toVertex: testCase.to, inGraph: graph),\n        let computedDistance = result.distance(fromVertex: testCase.from, toVertex: testCase.to) {\n        XCTAssert(computedDistance == testCase.expectedDistance, \"expected distance \\(testCase.expectedDistance) but got \\(computedDistance)\")\n        XCTAssert(computedPath == testCase.expectedPath, \"expected path \\(testCase.expectedPath) but got \\(computedPath)\")\n      }\n    }\n\n  }\n\n}\n"
  },
  {
    "path": "All-Pairs Shortest Paths/APSP/APSPTests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "All-Pairs Shortest Paths/README.markdown",
    "content": "# All-Pairs Shortest Paths\n\nThe All-Pairs shortest path problem simultaneously computes the shortest path from each node in the graph to each other node, provided a path exists for each pair. In the naive approach, we could simply compute a single-source shortest path from each node to each other node. The number of shortest paths computed is then bound by `O(V^2)`, where `V` is the number of vertices in the graph. Because SSSP is also bounded by `O(V^2)`, the total running time for the naive approach would be `O(V^4)`.\n\nHowever, by applying a dynamic approach on the adjacency matrix of the graph, a running time of `O(V^3)` is achievable, using the `Floyd-Warshall` algorithm. Floyd-Warshall iterates through an adjacency matrix, and for each pair of start(`i`) and end(`j`) vertices it considers if the current distance between them is greater than a path taken through another vertex(`k`) in the graph (if paths `i` ~> `k` and `k` ~> `j` exist). It moves through an adjacency matrix for every vertex `k` applying its comparison for each pair (`i`, `j`), so for each `k` a new adjacency matrix `D(k)` is derived, where each value `d(k)[i][j]` is defined as:\n\n<img src=\"img/weight_comparison_formula.png\" width=\"400px\" />\n\nwhere `w[i][j]` is the weight of the edge connecting vertex `i` to vertex `j` in the graph's original adjacency matrix.\n\nWhen the algorithm memoizes each refined adjacency and predecessor matrix, its space complexity is `O(V^3)`, which can be optimised to `O(V^2)` by only memoizing the latest refinements. Reconstructing paths is a recursive procedure which requires `O(V)` time and `O(V^2)` space.\n\n# Example\n\nFor the following weighted directed graph\n\n<img src=\"img/example_graph.png\" width=\"200px\" />\n\nthe adjacency matrix representation `w` is\n\n<img src=\"img/original_adjacency_matrix.png\" width=\"200px\" />\n\n### Calculating shortest paths' weights\n\nAt the beginning of the algorithm, `D(0)` is the same as `w`, with the following exceptions to accommodate the comparison function:\n\n1. vertices with no path connecting them have the `ø` replaced with `∞`\n2. the diagonal has all `0`s\n\nHere are all the adjacency matrices derived when perform Floyd-Warshall on the above graph:\n\n<img src=\"img/d0.png\" width=\"200px\" />\n<img src=\"img/d1.png\" width=\"200px\" />\n\n<img src=\"img/d2.png\" width=\"200px\" />\n<img src=\"img/d3.png\" width=\"200px\" />\n\nwith the last being the result, which tells for each pair of starting and ending vertices, the total weight of the shortest path connecting them. During the step where `k = 2`, the comparison that winds up changing the top right value from `2` to `-4` goes like this:\n\n\tk = 2, i = 0, j = 3\n\td(k-1)[i][j] => d(1)[0][3] = 2\n\td(k-1)[i][k] => d(1)[0][2] = 1\n\td(k-1)[j][k] => d(1)[2][3] = -5\n\ntherefore `min(2, 2 + -5) => min(2, -4)` produces a new weight of `-4` for the element at `d(2)[0][3]`, meaning that the shortest known path 1 ~> 4 before this step was from 1 -> 2 -> 4 with a total weight of -2, and afterwards we discovered a shorter path from 1 -> 3 -> 4 with a total weight of -4.\n\n### Reconstructing shortest paths\n\nThis algorithm finds only the lengths of the shortest paths between all pairs of nodes; a separate bookkeeping structure must be maintained to track predecessors' indices and reconstruct the shortest paths afterwards. The predecessor matrices at each step for the above graph follow:\n\n<img src=\"img/pi0.png\" width=\"200px\" />\n<img src=\"img/pi1.png\" width=\"200px\" />\n\n<img src=\"img/pi2.png\" width=\"200px\" />\n<img src=\"img/pi3.png\" width=\"200px\" />\n\n# Project Structure\n\nThe provided xcworkspace allows working in the playground, which imports the APSP framework target from the xcodeproj. Build the framework target and rerun the playground to get started. There is also a test target in the xcodeproj.\n\nIn the framework:\n\n- protocols for All-Pairs Shortest Paths algorithms and results structures\n- an implementation of the Floyd-Warshall algorithm\n\n# TODO\n\n- Implement naive `O(V^4)` method for comparison\n- Implement Johnson's algorithm for sparse graphs\n- Implement other cool optimized versions\n\n# References\n\nChapter 25 of Introduction to Algorithms, Third Edition by Cormen, Leiserson, Rivest and Stein [https://mitpress.mit.edu/books/introduction-algorithms](https://mitpress.mit.edu/books/introduction-algorithms)\n\n*Written for Swift Algorithm Club by [Andrew McKnight](https://github.com/armcknight)*\n"
  },
  {
    "path": "Array2D/Array2D.playground/Contents.swift",
    "content": "/*\n Two-dimensional array with a fixed number of rows and columns.\n This is mostly handy for games that are played on a grid, such as chess.\n Performance is always O(1).\n */\npublic struct Array2D<T> {\n  public let columns: Int\n  public let rows: Int\n  fileprivate var array: [T]\n\n  public init(columns: Int, rows: Int, initialValue: T) {\n    self.columns = columns\n    self.rows = rows\n    array = .init(repeating: initialValue, count: rows*columns)\n  }\n\n  public subscript(column: Int, row: Int) -> T {\n    get {\n      precondition(column < columns, \"Column \\(column) Index is out of range. Array<T>(columns: \\(columns), rows:\\(rows))\")\n      precondition(row < rows, \"Row \\(row) Index is out of range. Array<T>(columns: \\(columns), rows:\\(rows))\")\n      return array[row*columns + column]\n    }\n    set {\n      precondition(column < columns, \"Column \\(column) Index is out of range. Array<T>(columns: \\(columns), rows:\\(rows))\")\n      precondition(row < rows, \"Row \\(row) Index is out of range. Array<T>(columns: \\(columns), rows:\\(rows))\")\n      array[row*columns + column] = newValue\n    }\n  }\n}\n\n// initialization\nvar matrix = Array2D(columns: 3, rows: 5, initialValue: 0)\n\n// makes an array of rows * columns elements all filled with zero\nprint(matrix.array)\n\n// setting numbers using subscript [x, y]\nmatrix[0, 0] = 1\nmatrix[1, 0] = 2\n\nmatrix[0, 1] = 3\nmatrix[1, 1] = 4\n\nmatrix[0, 2] = 5\nmatrix[1, 2] = 6\n\nmatrix[0, 3] = 7\nmatrix[1, 3] = 8\nmatrix[2, 3] = 9\n\n// now the numbers are set in the array\nprint(matrix.array)\n\n// print out the 2D array with a reference around the grid\nfor i in 0..<matrix.rows {\n  print(\"[\", terminator: \"\")\n  for j in 0..<matrix.columns {\n    if j == matrix.columns - 1 {\n      print(\"\\(matrix[j, i])\", terminator: \"\")\n    } else {\n      print(\"\\(matrix[j, i]) \", terminator: \"\")\n    }\n  }\n  print(\"]\")\n}\n"
  },
  {
    "path": "Array2D/Array2D.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Array2D/Array2D.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Array2D/Array2D.swift",
    "content": "/*\n  Two-dimensional array with a fixed number of rows and columns.\n  This is mostly handy for games that are played on a grid, such as chess.\n  Performance is always O(1).\n*/\npublic struct Array2D<T> {\n  public let columns: Int\n  public let rows: Int\n  fileprivate var array: [T]\n\n  public init(columns: Int, rows: Int, initialValue: T) {\n    self.columns = columns\n    self.rows = rows\n    array = .init(repeating: initialValue, count: rows*columns)\n  }\n\n  public subscript(column: Int, row: Int) -> T {\n    get {\n      precondition(column < columns, \"Column \\(column) Index is out of range. Array<T>(columns: \\(columns), rows:\\(rows))\")\n      precondition(row < rows, \"Row \\(row) Index is out of range. Array<T>(columns: \\(columns), rows:\\(rows))\")\n      return array[row*columns + column]\n    }\n    set {\n      precondition(column < columns, \"Column \\(column) Index is out of range. Array<T>(columns: \\(columns), rows:\\(rows))\")\n      precondition(row < rows, \"Row \\(row) Index is out of range. Array<T>(columns: \\(columns), rows:\\(rows))\")\n      array[row*columns + column] = newValue\n    }\n  }\n}\n"
  },
  {
    "path": "Array2D/README.markdown",
    "content": "# Array2D\n\nIn C and Objective-C, you can write the following line,\n\n\tint cookies[9][7];\n\t\nto make a 9x7 grid of cookies. This creates a two-dimensional array of 63 elements. To find the cookie at column 3 and row 6, you can write:\n\n\tmyCookie = cookies[3][6];\n\t\nThis statement is not acceptable in Swift. To create a multi-dimensional array in Swift, you can write:\n\n```swift\nvar cookies = [[Int]]()\nfor _ in 1...9 {\n  var row = [Int]()\n  for _ in 1...7 {\n    row.append(0)\n  }\n  cookies.append(row)\n}\n```\n\nThen, to find a cookie, you can write:\n\n```swift\nlet myCookie = cookies[3][6]\n```\n\nYou can also create the array in a single line of code:\n\n```swift\nvar cookies = [[Int]](repeating: [Int](repeating: 0, count: 7), count: 9)\n```\n\nThis looks complicated, but you can simplify it with a helper function:\n\n```swift\nfunc dim<T>(_ count: Int, _ value: T) -> [T] {\n  return [T](repeating: value, count: count)\n}\n```\n\nThen, you can create the array:\n\n```swift\nvar cookies = dim(9, dim(7, 0))\n```\n\nSwift infers that the datatype of the array must be `Int` because you specified `0` as the default value of the array elements. To use a string instead, you can write:\n\n```swift\nvar cookies = dim(9, dim(7, \"yum\"))\n```\n\nThe `dim()` function makes it easy to go into even more dimensions:\n\n```swift\nvar threeDimensions = dim(2, dim(3, dim(4, 0)))\n```\n\nThe downside of using multi-dimensional arrays or multiple nested arrays in this way is to lose track of what dimension represents what.\n\nInstead, you can create your own type that acts like a 2-D array which is more convenient to use:\n\n```swift\npublic struct Array2D<T> {\n  public let columns: Int\n  public let rows: Int\n  fileprivate var array: [T]\n  \n  public init(columns: Int, rows: Int, initialValue: T) {\n    self.columns = columns\n    self.rows = rows\n    array = .init(repeating: initialValue, count: rows*columns)\n  }\n  \n  public subscript(column: Int, row: Int) -> T {\n    get {\n      precondition(column < columns, \"Column \\(column) Index is out of range. Array<T>(columns: \\(columns), rows:\\(rows))\")\n      precondition(row < rows, \"Row \\(row) Index is out of range. Array<T>(columns: \\(columns), rows:\\(rows))\")\n      return array[row*columns + column]\n    }\n    set {\n      precondition(column < columns, \"Column \\(column) Index is out of range. Array<T>(columns: \\(columns), rows:\\(rows))\")\n      precondition(row < rows, \"Row \\(row) Index is out of range. Array<T>(columns: \\(columns), rows:\\(rows))\")\n      array[row*columns + column] = newValue\n    }\n  }\n}\n```\n\n`Array2D` is a generic type, so it can hold any kind of object, not just numbers.\n\nTo create an instance of `Array2D`, you can write:\n\n```swift\nvar cookies = Array2D(columns: 9, rows: 7, initialValue: 0)\n```\n\nBy using the `subscript` function, you can retrieve an object from the array:\n\n```swift\nlet myCookie = cookies[column, row]\n```\n\nOr, you can change it:\n\n```swift\ncookies[column, row] = newCookie\n```\n\nInternally, `Array2D` uses a single one-dimensional array to store the data. The index of an object in that array is given by `(row x numberOfColumns) + column`, but as a user of `Array2D`, you only need to think in terms of \"column\" and \"row\", and the details will be done by `Array2D`. This is the advantage of wrapping primitive types into a wrapper class or struct.\n\n*Written for Swift Algorithm Club by Matthijs Hollemans*\n"
  },
  {
    "path": "Array2D/Tests/Array2DTests.swift",
    "content": "//\n//  Array2DTest.swift\n//  algorithmclub\n//\n//  Created by Barbara Rodeker on 2/16/16.\n//  Copyright © 2016 Swift Algorithm Club. All rights reserved.\n//\n\nimport XCTest\n\nclass Array2DTest: XCTestCase {\n\n  override func setUp() {\n    super.setUp()\n  }\n\n  override func tearDown() {\n    super.tearDown()\n  }\n\n  func testIntegerArrayWithPositiveRowsAndColumns() {\n    let array = Array2D<Int>(columns: 3, rows: 2, initialValue: 0)\n\n    XCTAssertEqual(array.columns, 3, \"Column count setup failed\")\n    XCTAssertEqual(array.rows, 2, \"Rows count setup failed\")\n    XCTAssertEqual(array[2, 1], 0, \"Integer array: Initialization value is wrong\")\n  }\n\n  func testStringArrayWithPositiveRowsAndColumns() {\n    let array = Array2D<String>(columns: 3, rows: 2, initialValue: \"empty\")\n\n    XCTAssertEqual(array.columns, 3, \"Column count setup failed\")\n    XCTAssertEqual(array.rows, 2, \"Rows count setup failed\")\n    XCTAssertEqual(array[2, 1], \"empty\", \"String array: Initialization value is wrong\")\n  }\n\n  func testCustomClassArrayWithPositiveRowsAndColumns() {\n    let array = Array2D<TestElement>(columns: 3, rows: 2, initialValue: TestElement(identifier: \"pepe\"))\n\n    XCTAssertEqual(array.columns, 3, \"Column count setup failed\")\n    XCTAssertEqual(array.rows, 2, \"Rows count setup failed\")\n    XCTAssertEqual(array[2, 1], TestElement(identifier: \"pepe\"), \"Custom Class array: Initialization value is wrong\")\n  }\n\n  func testPerformanceOnSmallArray() {\n    self.measure {\n      self.printArrayWith(columns: 2, rows: 2, inititalValue: 1)\n    }\n  }\n\n  //    func testPerformanceOnLargeArray() {\n  //        self.measureBlock {\n  //            self.printArrayWith(columns: 2000, rows: 2000, inititalValue: 1)\n  //        }\n  //    }\n\n  fileprivate func printArrayWith(columns: Int, rows: Int, inititalValue: Int) {\n    let array = Array2D(columns: columns, rows: rows, initialValue: 4)\n    for r in 0..<array.rows {\n      for c in 0..<array.columns {\n        print(\"Array in [\\(r), \\(c)] value is: \\(array[c, r])\")\n      }\n    }\n  }\n\n}\n\nclass TestElement: Equatable {\n  let identifier: String\n\n  init(identifier: String) {\n    self.identifier = identifier\n  }\n}\n\nfunc == (lhs: TestElement, rhs: TestElement) -> Bool {\n  return lhs.identifier == rhs.identifier\n}\n"
  },
  {
    "path": "Array2D/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Array2D/Tests/Tests.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t7B2BBC901C779DAC0067B71D /* Array2DTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B2BBC8F1C779DAC0067B71D /* Array2DTests.swift */; };\n\t\t7B2BBC991C77A04F0067B71D /* Array2D.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B2BBC981C77A04F0067B71D /* Array2D.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t7B2BBC801C779D720067B71D /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7B2BBC8F1C779DAC0067B71D /* Array2DTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Array2DTests.swift; sourceTree = SOURCE_ROOT; };\n\t\t7B2BBC941C779E7B0067B71D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };\n\t\t7B2BBC981C77A04F0067B71D /* Array2D.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Array2D.swift; path = ../Array2D.swift; sourceTree = SOURCE_ROOT; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t7B2BBC7D1C779D720067B71D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t7B2BBC681C779D710067B71D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC831C779D720067B71D /* Tests */,\n\t\t\t\t7B2BBC721C779D710067B71D /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC721C779D710067B71D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC801C779D720067B71D /* Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC831C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC981C77A04F0067B71D /* Array2D.swift */,\n\t\t\t\t7B2BBC8F1C779DAC0067B71D /* Array2DTests.swift */,\n\t\t\t\t7B2BBC941C779E7B0067B71D /* Info.plist */,\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tpath = TestsTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t7B2BBC7F1C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t7B2BBC7C1C779D720067B71D /* Sources */,\n\t\t\t\t7B2BBC7D1C779D720067B71D /* Frameworks */,\n\t\t\t\t7B2BBC7E1C779D720067B71D /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tproductName = TestsTests;\n\t\t\tproductReference = 7B2BBC801C779D720067B71D /* Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t7B2BBC691C779D710067B71D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0720;\n\t\t\t\tLastUpgradeCheck = 0800;\n\t\t\t\tORGANIZATIONNAME = \"Swift Algorithm Club\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t7B2BBC7F1C779D720067B71D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2;\n\t\t\t\t\t\tLastSwiftMigration = 0800;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 7B2BBC681C779D710067B71D;\n\t\t\tproductRefGroup = 7B2BBC721C779D710067B71D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t7B2BBC7F1C779D720067B71D /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t7B2BBC7E1C779D720067B71D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t7B2BBC7C1C779D720067B71D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7B2BBC901C779DAC0067B71D /* Array2DTests.swift in Sources */,\n\t\t\t\t7B2BBC991C77A04F0067B71D /* Array2D.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t7B2BBC871C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC881C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t7B2BBC8D1C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC8E1C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC871C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC881C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC8D1C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC8E1C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 7B2BBC691C779D710067B71D /* Project object */;\n}\n"
  },
  {
    "path": "Array2D/Tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Tests.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Array2D/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0800\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "B-Tree/BTree.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\nimport Foundation\n\n// last checked with Xcode 10.0\n\nlet bTree = BTree<Int, Int>(order: 1)!\n\nbTree.insert(1, for: 1)\nbTree.insert(2, for: 2)\nbTree.insert(3, for: 3)\nbTree.insert(4, for: 4)\n\nbTree.value(for: 3)\nbTree[3]\n\nbTree.remove(2)\n\nbTree.traverseKeysInOrder { key in\n    print(key)\n}\n\nbTree.numberOfKeys\n\nbTree.order\n\nbTree.inorderArrayFromKeys\n"
  },
  {
    "path": "B-Tree/BTree.playground/Sources/BTree.swift",
    "content": "// The MIT License (MIT)\n\n// Copyright (c) 2016 Viktor Szilárd Simkó (aqviktor[at]gmail.com)\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n/*\n *  B-Tree\n *\n *  A B-Tree is a self-balancing search tree, in which nodes can have more than two children.\n */\n\n// MARK: - BTreeNode class\n\nclass BTreeNode<Key: Comparable, Value> {\n  /**\n   * The tree that owns the node.\n   */\n  unowned var owner: BTree<Key, Value>\n\n  fileprivate var keys = [Key]()\n  fileprivate var values = [Value]()\n  var children: [BTreeNode]?\n\n  var isLeaf: Bool {\n    return children == nil\n  }\n\n  var numberOfKeys: Int {\n    return keys.count\n  }\n\n  init(owner: BTree<Key, Value>) {\n    self.owner = owner\n  }\n\n  convenience init(owner: BTree<Key, Value>, keys: [Key],\n                   values: [Value], children: [BTreeNode]? = nil) {\n    self.init(owner: owner)\n    self.keys += keys\n    self.values += values\n    self.children = children\n  }\n}\n\n// MARK: BTreeNode extesnion: Searching\n\nextension BTreeNode {\n\n  /**\n   *  Returns the value for a given `key`, returns nil if the `key` is not found.\n   *  \n   *  - Parameters:\n   *    - key: the key of the value to be returned\n   */\n  func value(for key: Key) -> Value? {\n    var index = keys.startIndex\n\n    while (index + 1) < keys.endIndex && keys[index] < key {\n      index = (index + 1)\n    }\n\n    if key == keys[index] {\n      return values[index]\n    } else if key < keys[index] {\n      return children?[index].value(for: key)\n    } else {\n      return children?[(index + 1)].value(for: key)\n    }\n  }\n}\n\n// MARK: BTreeNode extension: Traversals\n\nextension BTreeNode {\n\n  /**\n   *  Traverses the keys in order, executes `process` for every key.\n   * \n   *  - Parameters:\n   *    - process: the closure to be executed for every key\n   */\n  func traverseKeysInOrder(_ process: (Key) -> Void) {\n    for i in 0..<numberOfKeys {\n      children?[i].traverseKeysInOrder(process)\n      process(keys[i])\n    }\n\n    children?.last?.traverseKeysInOrder(process)\n  }\n}\n\n// MARK: BTreeNode extension: Insertion\n\nextension BTreeNode {\n\n  /**\n   *  Inserts `value` for `key` to the node, or to one if its descendants.\n   *  \n   *  - Parameters:\n   *    - value: the value to be inserted for `key`\n   *    - key: the key for the `value`\n   */\n  func insert(_ value: Value, for key: Key) {\n    var index = keys.startIndex\n\n    while index < keys.endIndex && keys[index] < key {\n      index = (index + 1)\n    }\n\n    if index < keys.endIndex && keys[index] == key {\n      values[index] = value\n      return\n    }\n\n    if isLeaf {\n      keys.insert(key, at: index)\n      values.insert(value, at: index)\n      owner.numberOfKeys += 1\n    } else {\n      children![index].insert(value, for: key)\n      if children![index].numberOfKeys > owner.order * 2 {\n        split(child: children![index], atIndex: index)\n      }\n    }\n  }\n\n  /**\n   *  Splits `child` at `index`.\n   *  The key-value pair at `index` gets moved up to the parent node,\n   *  or if there is not an parent node, then a new parent node is created.\n   *  \n   *  - Parameters:\n   *    - child: the child to be split\n   *    - index: the index of the key, which will be moved up to the parent\n   */\n  private func split(child: BTreeNode, atIndex index: Int) {\n    let middleIndex = child.numberOfKeys / 2\n    keys.insert(child.keys[middleIndex], at: index)\n    values.insert(child.values[middleIndex], at: index)\n    child.keys.remove(at: middleIndex)\n    child.values.remove(at: middleIndex)\n\n    let rightSibling = BTreeNode(\n      owner: owner,\n      keys: Array(child.keys[child.keys.indices.suffix(from: middleIndex)]),\n      values: Array(child.values[child.values.indices.suffix(from: middleIndex)])\n    )\n    child.keys.removeSubrange(child.keys.indices.suffix(from: middleIndex))\n    child.values.removeSubrange(child.values.indices.suffix(from: middleIndex))\n\n    children!.insert(rightSibling, at: (index + 1))\n\n    if child.children != nil {\n      rightSibling.children = Array(\n        child.children![child.children!.indices.suffix(from: (middleIndex + 1))]\n      )\n      child.children!.removeSubrange(child.children!.indices.suffix(from: (middleIndex + 1)))\n    }\n  }\n}\n\n// MARK: BTreeNode extension: Removal\n\n/**\n *  An enumeration to indicate a node's position according to another node.\n *  \n *  Possible values:\n *    - left\n *    - right\n */\nprivate enum BTreeNodePosition {\n  case left\n  case right\n}\n\nextension BTreeNode {\n  private var inorderPredecessor: BTreeNode {\n    if isLeaf {\n      return self\n    } else {\n      return children!.last!.inorderPredecessor\n    }\n  }\n\n  /**\n   *  Removes `key` and the value associated with it from the node\n   *  or one of its descendants.\n   *  \n   *  - Parameters:\n   *    - key: the key to be removed\n   */\n  func remove(_ key: Key) {\n    var index = keys.startIndex\n\n    while (index + 1) < keys.endIndex && keys[index] < key {\n      index = (index + 1)\n    }\n\n    if keys[index] == key {\n      if isLeaf {\n        keys.remove(at: index)\n        values.remove(at: index)\n        owner.numberOfKeys -= 1\n      } else {\n        let predecessor = children![index].inorderPredecessor\n        keys[index] = predecessor.keys.last!\n        values[index] = predecessor.values.last!\n        children![index].remove(keys[index])\n        if children![index].numberOfKeys < owner.order {\n          fix(childWithTooFewKeys: children![index], atIndex: index)\n        }\n      }\n    } else if key < keys[index] {\n      // We should go to left child...\n\n      if let leftChild = children?[index] {\n        leftChild.remove(key)\n        if leftChild.numberOfKeys < owner.order {\n          fix(childWithTooFewKeys: leftChild, atIndex: index)\n        }\n      } else {\n        print(\"The key:\\(key) is not in the tree.\")\n      }\n    } else {\n      // We should go to right child...\n\n      if let rightChild = children?[(index + 1)] {\n        rightChild.remove(key)\n        if rightChild.numberOfKeys < owner.order {\n          fix(childWithTooFewKeys: rightChild, atIndex: (index + 1))\n        }\n      } else {\n        print(\"The key:\\(key) is not in the tree\")\n      }\n    }\n  }\n\n  /**\n   *  Fixes `childWithTooFewKeys` by either moving a key to it from \n   *  one of its neighbouring nodes, or by merging.\n   *\n   *  - Precondition:\n   *    `childWithTooFewKeys` must have less keys than the order of the tree.\n   *\n   *  - Parameters:\n   *    - child: the child to be fixed\n   *    - index: the index of the child to be fixed in the current node\n   */\n  private func fix(childWithTooFewKeys child: BTreeNode, atIndex index: Int) {\n\n    if (index - 1) >= 0 && children![(index - 1)].numberOfKeys > owner.order {\n      move(keyAtIndex: (index - 1), to: child, from: children![(index - 1)], at: .left)\n    } else if (index + 1) < children!.count && children![(index + 1)].numberOfKeys > owner.order {\n      move(keyAtIndex: index, to: child, from: children![(index + 1)], at: .right)\n    } else if (index - 1) >= 0 {\n      merge(child: child, atIndex: index, to: .left)\n    } else {\n      merge(child: child, atIndex: index, to: .right)\n    }\n  }\n\n  /**\n   *  Moves the key at the specified `index` from `node` to\n   *  the `targetNode` at `position`\n   *  \n   *  - Parameters:\n   *    - index: the index of the key to be moved in `node`\n   *    - targetNode: the node to move the key into\n   *    - node: the node to move the key from\n   *    - position: the position of the from node relative to the targetNode\n   */\n  private func move(keyAtIndex index: Int, to targetNode: BTreeNode,\n                                  from node: BTreeNode, at position: BTreeNodePosition) {\n    switch position {\n    case .left:\n      targetNode.keys.insert(keys[index], at: targetNode.keys.startIndex)\n      targetNode.values.insert(values[index], at: targetNode.values.startIndex)\n      keys[index] = node.keys.last!\n      values[index] = node.values.last!\n      node.keys.removeLast()\n      node.values.removeLast()\n      if !targetNode.isLeaf {\n        targetNode.children!.insert(node.children!.last!,\n                                    at: targetNode.children!.startIndex)\n        node.children!.removeLast()\n      }\n\n    case .right:\n      targetNode.keys.insert(keys[index], at: targetNode.keys.endIndex)\n      targetNode.values.insert(values[index], at: targetNode.values.endIndex)\n      keys[index] = node.keys.first!\n      values[index] = node.values.first!\n      node.keys.removeFirst()\n      node.values.removeFirst()\n      if !targetNode.isLeaf {\n        targetNode.children!.insert(node.children!.first!,\n                                    at: targetNode.children!.endIndex)\n        node.children!.removeFirst()\n      }\n    }\n  }\n\n  /**\n   *  Merges `child` at `position` to the node at the `position`.\n   *  \n   *  - Parameters:\n   *    - child: the child to be merged\n   *    - index: the index of the child in the current node\n   *    - position: the position of the node to merge into\n   */\n  private func merge(child: BTreeNode, atIndex index: Int, to position: BTreeNodePosition) {\n    switch position {\n    case .left:\n      // We can merge to the left sibling\n\n      children![(index - 1)].keys = children![(index - 1)].keys +\n        [keys[(index - 1)]] + child.keys\n\n      children![(index - 1)].values = children![(index - 1)].values +\n        [values[(index - 1)]] + child.values\n\n      keys.remove(at: (index - 1))\n      values.remove(at: (index - 1))\n\n      if !child.isLeaf {\n        children![(index - 1)].children =\n          children![(index - 1)].children! + child.children!\n      }\n\n    case .right:\n      // We should merge to the right sibling\n\n      children![(index + 1)].keys = child.keys + [keys[index]] +\n        children![(index + 1)].keys\n\n      children![(index + 1)].values = child.values + [values[index]] +\n        children![(index + 1)].values\n\n      keys.remove(at: index)\n      values.remove(at: index)\n\n      if !child.isLeaf {\n        children![(index + 1)].children =\n          child.children! + children![(index + 1)].children!\n      }\n    }\n    children!.remove(at: index)\n  }\n}\n\n// MARK: BTreeNode extension: Conversion\n\nextension BTreeNode {\n  /**\n   *  Returns an array which contains the keys from the current node\n   *  and its descendants in order.\n   */\n  var inorderArrayFromKeys: [Key] {\n    var array = [Key] ()\n\n    for i in 0..<numberOfKeys {\n      if let returnedArray = children?[i].inorderArrayFromKeys {\n        array += returnedArray\n      }\n      array += [keys[i]]\n    }\n\n    if let returnedArray = children?.last?.inorderArrayFromKeys {\n      array += returnedArray\n    }\n\n    return array\n  }\n}\n\n// MARK: BTreeNode extension: Description\n\nextension BTreeNode: CustomStringConvertible {\n  /**\n   *  Returns a String containing the preorder representation of the nodes.\n   */\n  var description: String {\n    var str = \"\\(keys)\"\n\n    if !isLeaf {\n      for child in children! {\n        str += child.description\n      }\n    }\n\n    return str\n  }\n}\n\n// MARK: - BTree class\n\npublic class BTree<Key: Comparable, Value> {\n  /**\n   *  The order of the B-Tree\n   *\n   *  The number of keys in every node should be in the [order, 2*order] range,\n   *  except the root node which is allowed to contain less keys than the value of order.\n   */\n  public let order: Int\n\n  /**\n   *  The root node of the tree\n   */\n  var rootNode: BTreeNode<Key, Value>!\n\n  fileprivate(set) public var numberOfKeys = 0\n\n  /**\n   *  Designated initializer for the tree\n   *\n   *  - Parameters:\n   *    - order: The order of the tree.\n   */\n  public init?(order: Int) {\n    guard order > 0 else {\n      print(\"Order has to be greater than 0.\")\n      return nil\n    }\n    self.order = order\n    rootNode = BTreeNode<Key, Value>(owner: self)\n  }\n}\n\n// MARK: BTree extension: Traversals\n\nextension BTree {\n  /**\n   *  Traverses the keys in order, executes `process` for every key.\n   *\n   *  - Parameters:\n   *    - process: the closure to be executed for every key\n   */\n  public func traverseKeysInOrder(_ process: (Key) -> Void) {\n    rootNode.traverseKeysInOrder(process)\n  }\n}\n\n// MARK: BTree extension: Subscript\n\nextension BTree {\n  /**\n   *  Returns the value for a given `key`, returns nil if the `key` is not found.\n   *\n   *  - Parameters:\n   *    - key: the key of the value to be returned\n   */\n  public subscript (key: Key) -> Value? {\n    return value(for: key)\n  }\n}\n\n// MARK: BTree extension: Value for Key\n\nextension BTree {\n  /**\n   *  Returns the value for a given `key`, returns nil if the `key` is not found.\n   *\n   *  - Parameters:\n   *    - key: the key of the value to be returned\n   */\n  public func value(for key: Key) -> Value? {\n    guard rootNode.numberOfKeys > 0 else {\n      return nil\n    }\n\n    return rootNode.value(for: key)\n  }\n}\n\n// MARK: BTree extension: Insertion\n\nextension BTree {\n  /**\n   *  Inserts the `value` for the `key` into the tree.\n   *\n   *  - Parameters:\n   *    - value: the value to be inserted for `key`\n   *    - key: the key for the `value`\n   */\n  public func insert(_ value: Value, for key: Key) {\n    rootNode.insert(value, for: key)\n\n    if rootNode.numberOfKeys > order * 2 {\n      splitRoot()\n    }\n  }\n\n  /**\n   *  Splits the root node of the tree.\n   *  \n   *  - Precondition:\n   *    The root node of the tree contains `order` * 2 keys.\n   */\n  private func splitRoot() {\n    let middleIndexOfOldRoot = rootNode.numberOfKeys / 2\n\n    let newRoot = BTreeNode<Key, Value>(\n      owner: self,\n      keys: [rootNode.keys[middleIndexOfOldRoot]],\n      values: [rootNode.values[middleIndexOfOldRoot]],\n      children: [rootNode]\n    )\n    rootNode.keys.remove(at: middleIndexOfOldRoot)\n    rootNode.values.remove(at: middleIndexOfOldRoot)\n\n    let newRightChild = BTreeNode<Key, Value>(\n      owner: self,\n      keys: Array(rootNode.keys[rootNode.keys.indices.suffix(from: middleIndexOfOldRoot)]),\n      values: Array(rootNode.values[rootNode.values.indices.suffix(from: middleIndexOfOldRoot)])\n    )\n    rootNode.keys.removeSubrange(rootNode.keys.indices.suffix(from: middleIndexOfOldRoot))\n    rootNode.values.removeSubrange(rootNode.values.indices.suffix(from: middleIndexOfOldRoot))\n\n    if rootNode.children != nil {\n      newRightChild.children = Array(\n        rootNode.children![rootNode.children!.indices.suffix(from: (middleIndexOfOldRoot + 1))]\n      )\n      rootNode.children!.removeSubrange(\n        rootNode.children!.indices.suffix(from: (middleIndexOfOldRoot + 1))\n      )\n    }\n\n    newRoot.children!.append(newRightChild)\n    rootNode = newRoot\n  }\n}\n\n// MARK: BTree extension: Removal\n\nextension BTree {\n  /**\n   *  Removes `key` and the value associated with it from the tree.\n   *  \n   *  - Parameters:\n   *    - key: the key to remove\n   */\n  public func remove(_ key: Key) {\n    guard rootNode.numberOfKeys > 0 else {\n      return\n    }\n\n    rootNode.remove(key)\n\n    if rootNode.numberOfKeys == 0 && !rootNode.isLeaf {\n      rootNode = rootNode.children!.first!\n    }\n  }\n}\n\n// MARK: BTree extension: Conversion\n\nextension BTree {\n  /**\n   *  The keys of the tree in order.\n   */\n  public var inorderArrayFromKeys: [Key] {\n    return rootNode.inorderArrayFromKeys\n  }\n}\n\n// MARK: BTree extension: Decription\n\nextension BTree: CustomStringConvertible {\n  /** \n   *  Returns a String containing the preorder representation of the nodes.\n   */\n  public var description: String {\n    return rootNode.description\n  }\n}\n"
  },
  {
    "path": "B-Tree/BTree.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "B-Tree/BTree.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "B-Tree/BTree.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "B-Tree/BTree.swift",
    "content": "// The MIT License (MIT)\n\n// Copyright (c) 2016 Viktor Szilárd Simkó (aqviktor[at]gmail.com)\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n/*\n *  B-Tree\n *\n *  A B-Tree is a self-balancing search tree, in which nodes can have more than two children.\n */\n\n// MARK: - BTreeNode class\n\nclass BTreeNode<Key: Comparable, Value> {\n  /**\n   * The tree that owns the node.\n   */\n  unowned var owner: BTree<Key, Value>\n\n  fileprivate var keys = [Key]()\n  fileprivate var values = [Value]()\n  var children: [BTreeNode]?\n\n  var isLeaf: Bool {\n    return children == nil\n  }\n\n  var numberOfKeys: Int {\n    return keys.count\n  }\n\n  init(owner: BTree<Key, Value>) {\n    self.owner = owner\n  }\n\n  convenience init(owner: BTree<Key, Value>, keys: [Key],\n                   values: [Value], children: [BTreeNode]? = nil) {\n    self.init(owner: owner)\n    self.keys += keys\n    self.values += values\n    self.children = children\n  }\n}\n\n// MARK: BTreeNode extesnion: Searching\n\nextension BTreeNode {\n\n  /**\n   *  Returns the value for a given `key`, returns nil if the `key` is not found.\n   *  \n   *  - Parameters:\n   *    - key: the key of the value to be returned\n   */\n  func value(for key: Key) -> Value? {\n    var index = keys.startIndex\n\n    while (index + 1) < keys.endIndex && keys[index] < key {\n      index = (index + 1)\n    }\n\n    if key == keys[index] {\n      return values[index]\n    } else if key < keys[index] {\n      return children?[index].value(for: key)\n    } else {\n      return children?[(index + 1)].value(for: key)\n    }\n  }\n}\n\n// MARK: BTreeNode extension: Travelsals\n\nextension BTreeNode {\n\n  /**\n   *  Traverses the keys in order, executes `process` for every key.\n   * \n   *  - Parameters:\n   *    - process: the closure to be executed for every key\n   */\n  func traverseKeysInOrder(_ process: (Key) -> Void) {\n    for i in 0..<numberOfKeys {\n      children?[i].traverseKeysInOrder(process)\n      process(keys[i])\n    }\n\n    children?.last?.traverseKeysInOrder(process)\n  }\n}\n\n// MARK: BTreeNode extension: Insertion\n\nextension BTreeNode {\n\n  /**\n   *  Inserts `value` for `key` to the node, or to one if its descendants.\n   *  \n   *  - Parameters:\n   *    - value: the value to be inserted for `key`\n   *    - key: the key for the `value`\n   */\n  func insert(_ value: Value, for key: Key) {\n    var index = keys.startIndex\n\n    while index < keys.endIndex && keys[index] < key {\n      index = (index + 1)\n    }\n\n    if index < keys.endIndex && keys[index] == key {\n      values[index] = value\n      return\n    }\n\n    if isLeaf {\n      keys.insert(key, at: index)\n      values.insert(value, at: index)\n      owner.numberOfKeys += 1\n    } else {\n      children![index].insert(value, for: key)\n      if children![index].numberOfKeys > owner.order * 2 {\n        split(child: children![index], atIndex: index)\n      }\n    }\n  }\n\n  /**\n   *  Splits `child` at `index`.\n   *  The key-value pair at `index` gets moved up to the parent node,\n   *  or if there is not an parent node, then a new parent node is created.\n   *  \n   *  - Parameters:\n   *    - child: the child to be split\n   *    - index: the index of the key, which will be moved up to the parent\n   */\n  private func split(child: BTreeNode, atIndex index: Int) {\n    let middleIndex = child.numberOfKeys / 2\n    keys.insert(child.keys[middleIndex], at: index)\n    values.insert(child.values[middleIndex], at: index)\n    child.keys.remove(at: middleIndex)\n    child.values.remove(at: middleIndex)\n\n    let rightSibling = BTreeNode(\n      owner: owner,\n      keys: Array(child.keys[child.keys.indices.suffix(from: middleIndex)]),\n      values: Array(child.values[child.values.indices.suffix(from: middleIndex)])\n    )\n    child.keys.removeSubrange(child.keys.indices.suffix(from: middleIndex))\n    child.values.removeSubrange(child.values.indices.suffix(from: middleIndex))\n\n    children!.insert(rightSibling, at: (index + 1))\n\n    if child.children != nil {\n      rightSibling.children = Array(\n        child.children![child.children!.indices.suffix(from: (middleIndex + 1))]\n      )\n      child.children!.removeSubrange(child.children!.indices.suffix(from: (middleIndex + 1)))\n    }\n  }\n}\n\n// MARK: BTreeNode extension: Removal\n\n/**\n *  An enumeration to indicate a node's position according to another node.\n *  \n *  Possible values:\n *    - left\n *    - right\n */\nprivate enum BTreeNodePosition {\n  case left\n  case right\n}\n\nextension BTreeNode {\n  private var inorderPredecessor: BTreeNode {\n    if isLeaf {\n      return self\n    } else {\n      return children!.last!.inorderPredecessor\n    }\n  }\n\n  /**\n   *  Removes `key` and the value associated with it from the node\n   *  or one of its descendants.\n   *  \n   *  - Parameters:\n   *    - key: the key to be removed\n   */\n  func remove(_ key: Key) {\n    var index = keys.startIndex\n\n    while (index + 1) < keys.endIndex && keys[index] < key {\n      index = (index + 1)\n    }\n\n    if keys[index] == key {\n      if isLeaf {\n        keys.remove(at: index)\n        values.remove(at: index)\n        owner.numberOfKeys -= 1\n      } else {\n        let predecessor = children![index].inorderPredecessor\n        keys[index] = predecessor.keys.last!\n        values[index] = predecessor.values.last!\n        children![index].remove(keys[index])\n        if children![index].numberOfKeys < owner.order {\n          fix(childWithTooFewKeys: children![index], atIndex: index)\n        }\n      }\n    } else if key < keys[index] {\n      // We should go to left child...\n\n      if let leftChild = children?[index] {\n        leftChild.remove(key)\n        if leftChild.numberOfKeys < owner.order {\n          fix(childWithTooFewKeys: leftChild, atIndex: index)\n        }\n      } else {\n        print(\"The key:\\(key) is not in the tree.\")\n      }\n    } else {\n      // We should go to right child...\n\n      if let rightChild = children?[(index + 1)] {\n        rightChild.remove(key)\n        if rightChild.numberOfKeys < owner.order {\n          fix(childWithTooFewKeys: rightChild, atIndex: (index + 1))\n        }\n      } else {\n        print(\"The key:\\(key) is not in the tree\")\n      }\n    }\n  }\n\n  /**\n   *  Fixes `childWithTooFewKeys` by either moving a key to it from \n   *  one of its neighbouring nodes, or by merging.\n   *\n   *  - Precondition:\n   *    `childWithTooFewKeys` must have less keys than the order of the tree.\n   *\n   *  - Parameters:\n   *    - child: the child to be fixed\n   *    - index: the index of the child to be fixed in the current node\n   */\n  private func fix(childWithTooFewKeys child: BTreeNode, atIndex index: Int) {\n\n    if (index - 1) >= 0 && children![(index - 1)].numberOfKeys > owner.order {\n      move(keyAtIndex: (index - 1), to: child, from: children![(index - 1)], at: .left)\n    } else if (index + 1) < children!.count && children![(index + 1)].numberOfKeys > owner.order {\n      move(keyAtIndex: index, to: child, from: children![(index + 1)], at: .right)\n    } else if (index - 1) >= 0 {\n      merge(child: child, atIndex: index, to: .left)\n    } else {\n      merge(child: child, atIndex: index, to: .right)\n    }\n  }\n\n  /**\n   *  Moves the key at the specified `index` from `node` to\n   *  the `targetNode` at `position`\n   *  \n   *  - Parameters:\n   *    - index: the index of the key to be moved in `node`\n   *    - targetNode: the node to move the key into\n   *    - node: the node to move the key from\n   *    - position: the position of the from node relative to the targetNode\n   */\n  private func move(keyAtIndex index: Int, to targetNode: BTreeNode,\n                                  from node: BTreeNode, at position: BTreeNodePosition) {\n    switch position {\n    case .left:\n      targetNode.keys.insert(keys[index], at: targetNode.keys.startIndex)\n      targetNode.values.insert(values[index], at: targetNode.values.startIndex)\n      keys[index] = node.keys.last!\n      values[index] = node.values.last!\n      node.keys.removeLast()\n      node.values.removeLast()\n      if !targetNode.isLeaf {\n        targetNode.children!.insert(node.children!.last!,\n                                    at: targetNode.children!.startIndex)\n        node.children!.removeLast()\n      }\n\n    case .right:\n      targetNode.keys.insert(keys[index], at: targetNode.keys.endIndex)\n      targetNode.values.insert(values[index], at: targetNode.values.endIndex)\n      keys[index] = node.keys.first!\n      values[index] = node.values.first!\n      node.keys.removeFirst()\n      node.values.removeFirst()\n      if !targetNode.isLeaf {\n        targetNode.children!.insert(node.children!.first!,\n                                    at: targetNode.children!.endIndex)\n        node.children!.removeFirst()\n      }\n    }\n  }\n\n  /**\n   *  Merges `child` at `position` to the node at the `position`.\n   *  \n   *  - Parameters:\n   *    - child: the child to be merged\n   *    - index: the index of the child in the current node\n   *    - position: the position of the node to merge into\n   */\n  private func merge(child: BTreeNode, atIndex index: Int, to position: BTreeNodePosition) {\n    switch position {\n    case .left:\n      // We can merge to the left sibling\n\n      children![(index - 1)].keys = children![(index - 1)].keys +\n        [keys[(index - 1)]] + child.keys\n\n      children![(index - 1)].values = children![(index - 1)].values +\n        [values[(index - 1)]] + child.values\n\n      keys.remove(at: (index - 1))\n      values.remove(at: (index - 1))\n\n      if !child.isLeaf {\n        children![(index - 1)].children =\n          children![(index - 1)].children! + child.children!\n      }\n\n    case .right:\n      // We should merge to the right sibling\n\n      children![(index + 1)].keys = child.keys + [keys[index]] +\n        children![(index + 1)].keys\n\n      children![(index + 1)].values = child.values + [values[index]] +\n        children![(index + 1)].values\n\n      keys.remove(at: index)\n      values.remove(at: index)\n\n      if !child.isLeaf {\n        children![(index + 1)].children =\n          child.children! + children![(index + 1)].children!\n      }\n    }\n    children!.remove(at: index)\n  }\n}\n\n// MARK: BTreeNode extension: Conversion\n\nextension BTreeNode {\n  /**\n   *  Returns an array which contains the keys from the current node\n   *  and its descendants in order.\n   */\n  var inorderArrayFromKeys: [Key] {\n    var array = [Key] ()\n\n    for i in 0..<numberOfKeys {\n      if let returnedArray = children?[i].inorderArrayFromKeys {\n        array += returnedArray\n      }\n      array += [keys[i]]\n    }\n\n    if let returnedArray = children?.last?.inorderArrayFromKeys {\n      array += returnedArray\n    }\n\n    return array\n  }\n}\n\n// MARK: BTreeNode extension: Description\n\nextension BTreeNode: CustomStringConvertible {\n  /**\n   *  Returns a String containing the preorder representation of the nodes.\n   */\n  var description: String {\n    var str = \"\\(keys)\"\n\n    if !isLeaf {\n      for child in children! {\n        str += child.description\n      }\n    }\n\n    return str\n  }\n}\n\n// MARK: - BTree class\n\npublic class BTree<Key: Comparable, Value> {\n  /**\n   *  The order of the B-Tree\n   *\n   *  The number of keys in every node should be in the [order, 2*order] range,\n   *  except the root node which is allowed to contain less keys than the value of order.\n   */\n  public let order: Int\n\n  /**\n   *  The root node of the tree\n   */\n  var rootNode: BTreeNode<Key, Value>!\n\n  fileprivate(set) public var numberOfKeys = 0\n\n  /**\n   *  Designated initializer for the tree\n   *\n   *  - Parameters:\n   *    - order: The order of the tree.\n   */\n  public init?(order: Int) {\n    guard order > 0 else {\n      print(\"Order has to be greater than 0.\")\n      return nil\n    }\n    self.order = order\n    rootNode = BTreeNode<Key, Value>(owner: self)\n  }\n}\n\n// MARK: BTree extension: Travelsals\n\nextension BTree {\n  /**\n   *  Traverses the keys in order, executes `process` for every key.\n   *\n   *  - Parameters:\n   *    - process: the closure to be executed for every key\n   */\n  public func traverseKeysInOrder(_ process: (Key) -> Void) {\n    rootNode.traverseKeysInOrder(process)\n  }\n}\n\n// MARK: BTree extension: Subscript\n\nextension BTree {\n  /**\n   *  Returns the value for a given `key`, returns nil if the `key` is not found.\n   *\n   *  - Parameters:\n   *    - key: the key of the value to be returned\n   */\n  public subscript (key: Key) -> Value? {\n    return value(for: key)\n  }\n}\n\n// MARK: BTree extension: Value for Key\n\nextension BTree {\n  /**\n   *  Returns the value for a given `key`, returns nil if the `key` is not found.\n   *\n   *  - Parameters:\n   *    - key: the key of the value to be returned\n   */\n  public func value(for key: Key) -> Value? {\n    guard rootNode.numberOfKeys > 0 else {\n      return nil\n    }\n\n    return rootNode.value(for: key)\n  }\n}\n\n// MARK: BTree extension: Insertion\n\nextension BTree {\n  /**\n   *  Inserts the `value` for the `key` into the tree.\n   *\n   *  - Parameters:\n   *    - value: the value to be inserted for `key`\n   *    - key: the key for the `value`\n   */\n  public func insert(_ value: Value, for key: Key) {\n    rootNode.insert(value, for: key)\n\n    if rootNode.numberOfKeys > order * 2 {\n      splitRoot()\n    }\n  }\n\n  /**\n   *  Splits the root node of the tree.\n   *  \n   *  - Precondition:\n   *    The root node of the tree contains `order` * 2 keys.\n   */\n  private func splitRoot() {\n    let middleIndexOfOldRoot = rootNode.numberOfKeys / 2\n\n    let newRoot = BTreeNode<Key, Value>(\n      owner: self,\n      keys: [rootNode.keys[middleIndexOfOldRoot]],\n      values: [rootNode.values[middleIndexOfOldRoot]],\n      children: [rootNode]\n    )\n    rootNode.keys.remove(at: middleIndexOfOldRoot)\n    rootNode.values.remove(at: middleIndexOfOldRoot)\n\n    let newRightChild = BTreeNode<Key, Value>(\n      owner: self,\n      keys: Array(rootNode.keys[rootNode.keys.indices.suffix(from: middleIndexOfOldRoot)]),\n      values: Array(rootNode.values[rootNode.values.indices.suffix(from: middleIndexOfOldRoot)])\n    )\n    rootNode.keys.removeSubrange(rootNode.keys.indices.suffix(from: middleIndexOfOldRoot))\n    rootNode.values.removeSubrange(rootNode.values.indices.suffix(from: middleIndexOfOldRoot))\n\n    if rootNode.children != nil {\n      newRightChild.children = Array(\n        rootNode.children![rootNode.children!.indices.suffix(from: (middleIndexOfOldRoot + 1))]\n      )\n      rootNode.children!.removeSubrange(\n        rootNode.children!.indices.suffix(from: (middleIndexOfOldRoot + 1))\n      )\n    }\n\n    newRoot.children!.append(newRightChild)\n    rootNode = newRoot\n  }\n}\n\n// MARK: BTree extension: Removal\n\nextension BTree {\n  /**\n   *  Removes `key` and the value associated with it from the tree.\n   *  \n   *  - Parameters:\n   *    - key: the key to remove\n   */\n  public func remove(_ key: Key) {\n    guard rootNode.numberOfKeys > 0 else {\n      return\n    }\n\n    rootNode.remove(key)\n\n    if rootNode.numberOfKeys == 0 && !rootNode.isLeaf {\n      rootNode = rootNode.children!.first!\n    }\n  }\n}\n\n// MARK: BTree extension: Conversion\n\nextension BTree {\n  /**\n   *  The keys of the tree in order.\n   */\n  public var inorderArrayFromKeys: [Key] {\n    return rootNode.inorderArrayFromKeys\n  }\n}\n\n// MARK: BTree extension: Decription\n\nextension BTree: CustomStringConvertible {\n  /** \n   *  Returns a String containing the preorder representation of the nodes.\n   */\n  public var description: String {\n    return rootNode.description\n  }\n}\n"
  },
  {
    "path": "B-Tree/README.md",
    "content": "# B-Tree\n\nA B-Tree is a self-balancing search tree, in which nodes can have more than two children.\n\n### Properties\n\nA B-Tree of order *n* satisfies the following properties:\n - Every node has at most *2n* keys.\n - Every node (except root) has at least *n* keys.\n - Every non-leaf node with *k* keys has *k+1* children.\n - The keys in all nodes are sorted in increasing order. \n - The subtree between two keys *k* and *l* of a non-leaf node contains all the keys between *k* and *l*.\n - All leaves appear at the same level.\n\nA second order B-Tree with keys from 1 to 20 looks like this:\n\n![A B-Tree with 20 keys.](Images/BTree20.png)\n\n### The representation of a B-Tree node in code\n\n```swift\nclass BTreeNode<Key: Comparable, Value> {\n  unowned var owner: BTree<Key, Value>\n  \n  fileprivate var keys = [Key]()\n  var children: [BTreeNode]?\n  \n  ...\n}\n```\n\nThe main parts of a node are two arrays:\n - An array containing the keys\n - An array containing the children\n\n![Node.](Images/Node.png)\n\nNodes also have a reference to the tree they belong to.  \nThis is necessary because nodes have to know the order of the tree.\n\n*Note: The array containing the children is an Optional, because leaf nodes don't have children.*\n\n## Searching\n\n1. Searching for a key `k` begins at the root node.\n2. We perform a linear search on the keys of the node, until we find a key `l` that is not less than `k`,  \n   or reach the end of the array.\n3. If `k == l` then we have found the key.\n4. If `k < l`: \n    - If the node we are on is not a leaf, then we go to the left child of `l`, and perform the steps 3 - 5 again.\n    - If we are on a leaf, then `k` is not in the tree.\n5. If we have reached the end of the array:\n    - If we are on a non-leaf node, then we go to the last child of the node, and perform the steps 3 - 5 again.\n    - If we are on a leaf, then `k` is not in the tree.\n\n### The code\n\n`value(for:)` method searches for the given key and if it's in the tree,  \nit returns the value associated with it, else it returns `nil`.\n\n## Insertion\n\nKeys can only be inserted to leaf nodes.\n\n1. Perform a search for the key `k` we want to insert.\n2. If we haven't found it and we are on a leaf node, we can insert it.\n - If after the search the key `l` which we are standing on is greater than `k`:  \n   We insert `k` to the position before `l`.\n - Else:  \n   We insert `k` to the position after `l`.\n\nAfter insertion we should check if the number of keys in the node is in the correct range.  \nIf there are more keys in the node than `order*2`, we need to split the node.\n\n#### Splitting a node\n\n1. Move up the middle key of the node we want to split, to its parent (if it has one).  \n2. If it hasn't got a parent(it is the root), then create a new root and insert to it.  \n   Also add the old root as the left child of the new root.\n3. Split the node into two by moving the keys (and children, if it's a non-leaf) that were after the middle key\n   to a new node.  \n4. Add the new node as a right child for the key that we have moved up.  \n\nAfter splitting a node it is possible that the parent node will also contain too many keys, so we need to split it also.  \nIn the worst case the splitting goes up to the root (in this case the height of the tree increases).\n\nAn insertion to a first order tree looks like this:\n\n![Splitting](Images/InsertionSplit.png)\n\n### The code\n\nThe method `insert(_:for:)` does the insertion.\nAfter it has inserted a key, as the recursion goes up every node checks the number of keys in its child.  \nif a node has too many keys, its parent calls the `split(child:atIndex:)` method on it.\n\nThe root node is checked by the tree itself.  \nIf the root has too many nodes after the insertion the tree calls the `splitRoot()` method.\n\n## Removal\n\nKeys can only be removed from leaf nodes.\n\n1. Perform a search for the key `k` we want to remove.\n2. If we have found it:\n   - If we are on a leaf node:  \n     We can remove the key.\n   - Else:  \n     We overwrite `k` with its inorder predecessor `p`, then we remove `p` from the leaf node.\n\nAfter a key have been removed from a node we should check that the node has enough keys.\nIf a node has fewer keys than the order of the tree, then we should move a key to it,  \nor merge it with one of its siblings.\n\n#### Moving a key to the child\n\nIf the problematic node has a nearest sibling that has more keys than the order of the tree,  \nwe should perform this operation on the tree, else we should merge the node with one of its siblings.\n\nLet's say the child we want to fix `c1` is at index `i` in its parent node's children array.\n\nIf the child `c2` at index `i-1` has more keys than the order of the tree:  \n\n1. We move the key at index `i-1` from the parent node to the child `c1`'s keys array at index `0`.\n2. We move the last key from `c2` to the parent's keys array at index `i-1`.\n3. (If `c1` is non-leaf) We move the last child from `c2` to `c1`'s children array at index 0.\n\nElse:  \n\n1. We move the key at index `i` from the parent node to the end of child `c1`'s keys array.\n2. We move the first key from `c2` to the parent's keys array at index `i`.\n3. (If `c1` isn't a leaf) We move the first child from `c2` to the end of `c1`'s children array. \n\n![Moving Key](Images/MovingKey.png)\n\n#### Merging two nodes\n\nLet's say we want to merge the child `c1` at index `i` in its parent's children array.\n\nIf `c1` has a left sibling `c2`:\n\n1. We move the key from the parent at index `i-1` to the end of `c2`'s keys array.\n2. We move the keys and the children(if it's a non-leaf) from `c1` to the end of `c2`'s keys and children array.\n3. We remove the child at index `i-1` from the parent node.\n\nElse if `c1` only has a right sibling `c2`:\n\n1. We move the key from the parent at index `i` to the beginning of `c2`'s keys array.\n2. We move the keys and the children(if it's a non-leaf) from `c1` to the beginning of `c2`'s keys and children array.\n3. We remove the child at index `i` from the parent node.\n\nAfter merging it is possible that now the parent node contains too few keys,  \nso in the worst case merging also can go up to the root, in which case the height of the tree decreases.\n\n![Merging Nodes](Images/MergingNodes.png)\n\n### The code\n\n- `remove(_:)` method removes the given key from the tree. After a key has been deleted,  \n  every node checks the number of keys in its child. If a child has less nodes than the order of the tree,\n  it calls the `fix(childWithTooFewKeys:atIndex:)` method.  \n\n- `fix(childWithTooFewKeys:atIndex:)` method decides which way to fix the child (by moving a key to it,\n  or by merging it), then calls `move(keyAtIndex:to:from:at:)` or \n  `merge(child:atIndex:to:)` method according to its choice.\n\n## See also\n\n[Wikipedia](https://en.wikipedia.org/wiki/B-tree)  \n[GeeksforGeeks](http://www.geeksforgeeks.org/b-tree-set-1-introduction-2/)\n\n*Written for Swift Algorithm Club by Viktor Szilárd Simkó*\n"
  },
  {
    "path": "B-Tree/Tests/Tests/BTreeNodeTests.swift",
    "content": "//\n//  BTreeNodeTests.swift\n//  BTree\n//\n//  Created by Viktor Szilárd Simkó on 13/06/16.\n//  Copyright © 2016 Viktor Szilárd Simkó. All rights reserved.\n//\n\nimport XCTest\n\nclass BTreeNodeTests: XCTestCase {\n    \n    let owner = BTree<Int, Int>(order: 2)!\n    var root: BTreeNode<Int, Int>!\n    var leftChild: BTreeNode<Int, Int>!\n    var rightChild: BTreeNode<Int, Int>!\n    func testSwift4() {\n        // last checked with Xcode 9.0b4\n        #if swift(>=4.0)\n            print(\"Hello, Swift 4!\")\n        #endif\n    }\n    override func setUp() {\n        super.setUp()\n        \n        root = BTreeNode(owner: owner)\n        leftChild = BTreeNode(owner: owner)\n        rightChild = BTreeNode(owner: owner)\n        \n        root.insert(1, for: 1)\n        root.children = [leftChild, rightChild]\n    }\n    \n    func testIsLeafRoot() {\n        XCTAssertFalse(root.isLeaf)\n    }\n    \n    func testIsLeafLeaf() {\n        XCTAssertTrue(leftChild.isLeaf)\n        XCTAssertTrue(rightChild.isLeaf)\n    }\n    \n    func testOwner() {\n        XCTAssert(root.owner === owner)\n        XCTAssert(leftChild.owner === owner)\n        XCTAssert(rightChild.owner === owner)\n    }\n    \n    func testNumberOfKeys() {\n        XCTAssertEqual(root.numberOfKeys, 1)\n        XCTAssertEqual(leftChild.numberOfKeys, 0)\n        XCTAssertEqual(rightChild.numberOfKeys, 0)\n    }\n    \n    func testChildren() {\n        XCTAssertEqual(root.children!.count, 2)\n    }\n}\n"
  },
  {
    "path": "B-Tree/Tests/Tests/BTreeTests.swift",
    "content": "//\n//  BTreeTests.swift\n//  BTreeTests\n//\n//  Created by Viktor Szilárd Simkó on 09/06/16.\n//  Copyright © 2016 Viktor Szilárd Simkó. All rights reserved.\n//\n\nimport XCTest\n\nclass BTreeTests: XCTestCase {\n  var bTree: BTree<Int, Int>!\n\n    func testSwift4() {\n        // last checked with Xcode 9.0b4\n        #if swift(>=4.0)\n            print(\"Hello, Swift 4!\")\n        #endif\n    }\n    \n  override func setUp() {\n    super.setUp()\n    bTree = BTree<Int, Int>(order: 3)!\n  }\n\n  // MARK: - Tests on empty tree\n\n  func testOrder() {\n    XCTAssertEqual(bTree.order, 3)\n  }\n\n  func testRootNode() {\n    XCTAssertNotNil(bTree.rootNode)\n  }\n\n  func testNumberOfNodesOnEmptyTree() {\n    XCTAssertEqual(bTree.numberOfKeys, 0)\n  }\n\n  func testInorderTraversalOfEmptyTree() {\n    bTree.traverseKeysInOrder { _ in\n      XCTFail(\"Inorder travelsal fail.\")\n    }\n  }\n\n  func testSubscriptOnEmptyTree() {\n    XCTAssertEqual(bTree[1], nil)\n  }\n\n  func testSearchEmptyTree() {\n    XCTAssertEqual(bTree.value(for: 1), nil)\n  }\n\n  func testInsertToEmptyTree() {\n    bTree.insert(1, for: 1)\n\n    XCTAssertEqual(bTree[1]!, 1)\n  }\n\n  func testRemoveFromEmptyTree() {\n    bTree.remove(1)\n    XCTAssertEqual(bTree.description, \"[]\")\n  }\n\n  func testInorderArrayFromEmptyTree() {\n    XCTAssertEqual(bTree.inorderArrayFromKeys, [Int]())\n  }\n\n  func testDescriptionOfEmptyTree() {\n    XCTAssertEqual(bTree.description, \"[]\")\n  }\n\n  // MARK: - Travelsal\n\n  func testInorderTravelsal() {\n    for i in 1...20 {\n      bTree.insert(i, for: i)\n    }\n\n    var j = 1\n\n    bTree.traverseKeysInOrder { i in\n      XCTAssertEqual(i, j)\n      j += 1\n    }\n  }\n\n  // MARK: - Searching\n\n  func testSearchForMaximum() {\n    for i in 1...20 {\n      bTree.insert(i, for: i)\n    }\n\n    XCTAssertEqual(bTree.value(for: 20)!, 20)\n  }\n\n  func testSearchForMinimum() {\n    for i in 1...20 {\n      bTree.insert(i, for: i)\n    }\n\n    XCTAssertEqual(bTree.value(for: 1)!, 1)\n  }\n\n  // MARK: - Insertion\n\n  func testInsertion() {\n    bTree.insertKeysUpTo(20)\n\n    XCTAssertEqual(bTree.numberOfKeys, 20)\n\n    for i in 1...20 {\n      XCTAssertNotNil(bTree[i])\n    }\n\n    do {\n      try bTree.checkBalance()\n    } catch {\n      XCTFail(\"BTree is not balanced\")\n    }\n  }\n\n  // MARK: - Removal\n\n  func testRemoveMaximum() {\n    for i in 1...20 {\n      bTree.insert(i, for: i)\n    }\n\n    bTree.remove(20)\n\n    XCTAssertNil(bTree[20])\n\n    do {\n      try bTree.checkBalance()\n    } catch {\n      XCTFail(\"BTree is not balanced\")\n    }\n  }\n\n  func testRemoveMinimum() {\n    bTree.insertKeysUpTo(20)\n\n    bTree.remove(1)\n\n    XCTAssertNil(bTree[1])\n\n    do {\n      try bTree.checkBalance()\n    } catch {\n      XCTFail(\"BTree is not balanced\")\n    }\n  }\n\n  func testRemoveSome() {\n    bTree.insertKeysUpTo(20)\n\n    bTree.remove(6)\n    bTree.remove(9)\n\n    XCTAssertNil(bTree[6])\n    XCTAssertNil(bTree[9])\n\n    do {\n      try bTree.checkBalance()\n    } catch {\n      XCTFail(\"BTree is not balanced\")\n    }\n  }\n\n  func testRemoveSomeFrom2ndOrder() {\n    bTree = BTree<Int, Int>(order: 2)!\n    bTree.insertKeysUpTo(20)\n\n    bTree.remove(6)\n    bTree.remove(9)\n\n    XCTAssertNil(bTree[6])\n    XCTAssertNil(bTree[9])\n\n    do {\n      try bTree.checkBalance()\n    } catch {\n      XCTFail(\"BTree is not balanced\")\n    }\n  }\n\n  func testRemoveAll() {\n    bTree.insertKeysUpTo(20)\n\n    XCTAssertEqual(bTree.numberOfKeys, 20)\n\n    for i in (1...20).reversed() {\n      bTree.remove(i)\n    }\n\n    do {\n      try bTree.checkBalance()\n    } catch {\n      XCTFail(\"BTree is not balanced\")\n    }\n\n    XCTAssertEqual(bTree.numberOfKeys, 0)\n  }\n\n  // MARK: - InorderArray\n\n\tfunc testInorderArray() {\n    bTree.insertKeysUpTo(20)\n\n\t\tlet returnedArray = bTree.inorderArrayFromKeys\n\t\tlet targetArray = Array<Int>(1...20)\n\n\t\tXCTAssertEqual(returnedArray, targetArray)\n\t}\n}\n\nenum BTreeError: Error {\n  case tooManyNodes\n  case tooFewNodes\n}\n\nextension BTreeNode {\n  func checkBalance(isRoot root: Bool) throws {\n    if numberOfKeys > owner.order * 2 {\n      throw BTreeError.tooManyNodes\n    } else if !root && numberOfKeys < owner.order {\n      throw BTreeError.tooFewNodes\n    }\n\n    if !isLeaf {\n      for child in children! {\n        try child.checkBalance(isRoot: false)\n      }\n    }\n  }\n}\n\nextension BTree where Key: SignedInteger, Value: SignedInteger {\n  func insertKeysUpTo(_ to: Int) {\n    var k: Key = 1\n    var v: Value = 1\n\n    for _ in 1...to {\n      insert(v, for: k)\n      k = k + 1\n      v = v + 1\n    }\n  }\n\n  func checkBalance() throws {\n    try rootNode.checkBalance(isRoot: true)\n  }\n}\n"
  },
  {
    "path": "B-Tree/Tests/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "B-Tree/Tests/Tests.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\tC66702821D0EEE5F008CD769 /* BTreeNodeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C66702801D0EEE5F008CD769 /* BTreeNodeTests.swift */; };\n\t\tC66702831D0EEE5F008CD769 /* BTreeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C66702811D0EEE5F008CD769 /* BTreeTests.swift */; };\n\t\tC66702851D0EEE99008CD769 /* BTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = C66702841D0EEE99008CD769 /* BTree.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\tC66702781D0EEE25008CD769 /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tC667027C1D0EEE25008CD769 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tC66702801D0EEE5F008CD769 /* BTreeNodeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BTreeNodeTests.swift; sourceTree = \"<group>\"; };\n\t\tC66702811D0EEE5F008CD769 /* BTreeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BTreeTests.swift; sourceTree = \"<group>\"; };\n\t\tC66702841D0EEE99008CD769 /* BTree.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BTree.swift; path = ../../BTree.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\tC66702751D0EEE25008CD769 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\tC66702611D0EEE0D008CD769 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tC66702791D0EEE25008CD769 /* Tests */,\n\t\t\t\tC667026B1D0EEE0D008CD769 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tC667026B1D0EEE0D008CD769 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tC66702781D0EEE25008CD769 /* Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tC66702791D0EEE25008CD769 /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tC66702841D0EEE99008CD769 /* BTree.swift */,\n\t\t\t\tC66702801D0EEE5F008CD769 /* BTreeNodeTests.swift */,\n\t\t\t\tC66702811D0EEE5F008CD769 /* BTreeTests.swift */,\n\t\t\t\tC667027C1D0EEE25008CD769 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = Tests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\tC66702771D0EEE25008CD769 /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = C667027D1D0EEE25008CD769 /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tC66702741D0EEE25008CD769 /* Sources */,\n\t\t\t\tC66702751D0EEE25008CD769 /* Frameworks */,\n\t\t\t\tC66702761D0EEE25008CD769 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tproductName = Tests;\n\t\t\tproductReference = C66702781D0EEE25008CD769 /* Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\tC66702621D0EEE0D008CD769 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0730;\n\t\t\t\tLastUpgradeCheck = 1000;\n\t\t\t\tORGANIZATIONNAME = \"Viktor Szilárd Simkó\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\tC66702771D0EEE25008CD769 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.3.1;\n\t\t\t\t\t\tLastSwiftMigration = 1000;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = C66702651D0EEE0D008CD769 /* Build configuration list for PBXProject \"Tests\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t);\n\t\t\tmainGroup = C66702611D0EEE0D008CD769;\n\t\t\tproductRefGroup = C667026B1D0EEE0D008CD769 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\tC66702771D0EEE25008CD769 /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\tC66702761D0EEE25008CD769 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\tC66702741D0EEE25008CD769 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tC66702831D0EEE5F008CD769 /* BTreeTests.swift in Sources */,\n\t\t\t\tC66702821D0EEE5F008CD769 /* BTreeNodeTests.swift in Sources */,\n\t\t\t\tC66702851D0EEE99008CD769 /* BTree.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\tC667026F1D0EEE0D008CD769 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tC66702701D0EEE0D008CD769 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tC667027E1D0EEE25008CD769 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Tests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = viktorsimko.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tC667027F1D0EEE25008CD769 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Tests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = viktorsimko.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\tC66702651D0EEE0D008CD769 /* Build configuration list for PBXProject \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tC667026F1D0EEE0D008CD769 /* Debug */,\n\t\t\t\tC66702701D0EEE0D008CD769 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tC667027D1D0EEE25008CD769 /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tC667027E1D0EEE25008CD769 /* Debug */,\n\t\t\t\tC667027F1D0EEE25008CD769 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = C66702621D0EEE0D008CD769 /* Project object */;\n}\n"
  },
  {
    "path": "B-Tree/Tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Tests.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "B-Tree/Tests/Tests.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "B-Tree/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1000\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"C66702771D0EEE25008CD769\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"C66702771D0EEE25008CD769\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"C66702771D0EEE25008CD769\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"C66702771D0EEE25008CD769\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"C66702771D0EEE25008CD769\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Big-O Notation.markdown",
    "content": "# A note on Big-O notation\n\nIt's useful to know how fast an algorithm is and how much space it needs. This allows you to pick the right algorithm for the job.\n\nBig-O notation gives you a rough indication of the running time of an algorithm and the amount of memory it uses. When someone says, \"This algorithm has worst-case running time of **O(n^2)** and uses **O(n)** space,\" they mean it's kinda slow but doesn't need lots of extra memory.\n\nFiguring out the Big-O of an algorithm is usually done through mathematical analysis. We're skipping the math here, but it's useful to know what the different values mean, so here's a handy table. **n** refers to the number of data items that you're processing. For example, when sorting an array of 100 items, **n = 100**.\n\nBig-O | Name | Description\n------| ---- | -----------\n**O(1)** | constant | **This is the best.** The algorithm always takes the same amount of time, regardless of how much data there is. Example: looking up an element of an array by its index.\n**O(log n)** | logarithmic | **Pretty great.** These kinds of algorithms halve the amount of data with each iteration. If you have 100 items, it takes about 7 steps to find the answer. With 1,000 items, it takes 10 steps. And 1,000,000 items only take 20 steps. This is super fast even for large amounts of data. Example: binary search.\n**O(n)** | linear | **Good performance.** If you have 100 items, this does 100 units of work. Doubling the number of items makes the algorithm take exactly twice as long (200 units of work). Example: sequential search.\n**O(n log n)** | \"linearithmic\" | **Decent performance.** This is slightly worse than linear but not too bad. Example: the fastest general-purpose sorting algorithms.\n**O(n^2)** | quadratic | **Kinda slow.** If you have 100 items, this does 100^2 = 10,000 units of work. Doubling the number of items makes it four times slower (because 2 squared equals 4). Example: algorithms using nested loops, such as insertion sort.\n**O(n^3)** | cubic | **Poor performance.** If you have 100 items, this does 100^3 = 1,000,000 units of work. Doubling the input size makes it eight times slower. Example: matrix multiplication.\n**O(2^n)** | exponential | **Very poor performance.** You want to avoid these kinds of algorithms, but sometimes you have no choice. Adding just one bit to the input doubles the running time. Example: traveling salesperson problem.\n**O(n!)** | factorial | **Intolerably slow.** It literally takes a million years to do anything.  \n\n\n\n![Comparison of Big O computations](https://upload.wikimedia.org/wikipedia/commons/7/7e/Comparison_computational_complexity.svg)\n\n\n\nBelow are some examples for each category of performance:\n\n**O(1)**\n\n  The most common example with O(1) complexity is accessing an array index.\n\n  ```swift\n  let value = array[5]\n  ```\n\n  Another example of O(1) is pushing and popping from Stack.\n\n\n**O(log n)**\n\n  ```swift\n  var j = 1\n  while j < n {\n    // do constant time stuff\n    j *= 2\n  }\n  ```  \n\n  Instead of simply incrementing, 'j' is increased by 2 times itself in each run.\n\n  Binary Search Algorithm is an example of O(log n) complexity.\n\n\n**O(n)**\n\n  ```swift\n  for i in stride(from: 0, to: n, by: 1) {\n    print(array[i])\n  }\n  ```\n\n  Array Traversal and Linear Search are examples of O(n) complexity.  \n\n\n**O(n log n)**\n\n  ```swift\n  for i in stride(from: 0, to: n, by: 1) {\n  var j = 1\n    while j < n {\n      j *= 2\n      // do constant time stuff\n    }\n  }\n  ```\n\n  OR\n\n  ```swift\n  for i in stride(from: 0, to: n, by: 1) {\n    func index(after i: Int) -> Int? { // multiplies `i` by 2 until `i` >= `n`\n      return i < n ? i * 2 : nil\n    }\n    for j in sequence(first: 1, next: index(after:)) {\n      // do constant time stuff\n    }\n  }\n  ```\n\n  Merge Sort and Heap Sort are examples of O(n log n) complexity.  \n\n\n**O(n^2)**\n\n  ```swift\n  for i  in stride(from: 0, to: n, by: 1) {\n    for j in stride(from: 1, to: n, by: 1) {\n      // do constant time stuff\n    }\n  }\n  ```\n\n  Traversing a simple 2-D array and Bubble Sort are examples of O(n^2) complexity.\n\n\n**O(n^3)**\n\n  ```swift\n  for i in stride(from: 0, to: n, by: 1) {\n    for j in stride(from: 1, to: n, by: 1) {\n      for k in stride(from: 1, to: n, by: 1) {\n        // do constant time stuff\n      }\n    }\n  }\n  ```  \n\n**O(2^n)**\n\n  Algorithms with running time O(2^N) are often recursive algorithms that solve a problem of size N by recursively solving two smaller problems of size N-1.\n  The following example prints all the moves necessary to solve the famous \"Towers of Hanoi\" problem for N disks.\n\n  ```swift\n  func solveHanoi(n: Int, from: String, to: String, spare: String) {\n    guard n >= 1 else { return }\n    if n > 1 {\n        solveHanoi(n: n - 1, from: from, to: spare, spare: to)\n        solveHanoi(n: n - 1, from: spare, to: to, spare: from)\n    }\n  }\n  ```\n\n\n**O(n!)**\n\n  The most trivial example of function that takes O(n!) time is given below.\n\n  ```swift\n  func nFactFunc(n: Int) {\n    for i in stride(from: 0, to: n, by: 1) {\n      nFactFunc(n: n - 1)\n    }\n  }\n  ```\n\nOften you don't need math to figure out what the Big-O of an algorithm is but you can simply use your intuition. If your code uses a single loop that looks at all **n** elements of your input, the algorithm is **O(n)**. If the code has two nested loops, it is **O(n^2)**. Three nested loops gives **O(n^3)**, and so on.\n\nNote that Big-O notation is an estimate and is only really useful for large values of **n**. For example, the worst-case running time for the [insertion sort](Insertion%20Sort/) algorithm is **O(n^2)**. In theory that is worse than the running time for [merge sort](Merge%20Sort/), which is **O(n log n)**. But for small amounts of data, insertion sort is actually faster, especially if the array is partially sorted already!\n\nIf you find this confusing, don't let this Big-O stuff bother you too much. It's mostly useful when comparing two algorithms to figure out which one is better. But in the end you still want to test in practice which one really is the best. And if the amount of data is relatively small, then even a slow algorithm will be fast enough for practical use.\n"
  },
  {
    "path": "Binary Search/BinarySearch.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\n// An unsorted array of numbers\nlet numbers = [11, 59, 3, 2, 53, 17, 31, 7, 19, 67, 47, 13, 37, 61, 29, 43, 5, 41, 23]\n\n// Binary search requires that the array is sorted from low to high\nlet sorted = numbers.sorted()\n\n// Using recursive solution\nbinarySearch(sorted, key: 2, range: 0 ..< sorted.count)   // gives 0\nbinarySearch(sorted, key: 67, range: 0 ..< sorted.count)  // gives 18\nbinarySearch(sorted, key: 43, range: 0 ..< sorted.count)  // gives 13\nbinarySearch(sorted, key: 42, range: 0 ..< sorted.count)  // nil\n\n// Using iterative solution\nbinarySearch(sorted, key: 2)   // gives 0\nbinarySearch(sorted, key: 67)  // gives 18\nbinarySearch(sorted, key: 43)  // gives 13\nbinarySearch(sorted, key: 42)  // nil\n"
  },
  {
    "path": "Binary Search/BinarySearch.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx' last-migration='1000'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Binary Search/BinarySearch.swift",
    "content": "/**\n Binary Search\n \n Recursively splits the array in half until the value is found.\n \n If there is more than one occurrence of the search key in the array, then\n there is no guarantee which one it finds.\n \n Note: The array must be sorted!\n **/\n\nimport Foundation\n\n// The recursive version of binary search.\n\npublic func binarySearch<T: Comparable>(_ a: [T], key: T, range: Range<Int>) -> Int? {\n    if range.lowerBound >= range.upperBound {\n        return nil\n    } else {\n        let midIndex = range.lowerBound + (range.upperBound - range.lowerBound) / 2\n        if a[midIndex] > key {\n            return binarySearch(a, key: key, range: range.lowerBound ..< midIndex)\n        } else if a[midIndex] < key {\n            return binarySearch(a, key: key, range: midIndex + 1 ..< range.upperBound)\n        } else {\n            return midIndex\n        }\n    }\n}\n\n/**\n The iterative version of binary search.\n \n Notice how similar these functions are. The difference is that this one\n uses a while loop, while the other calls itself recursively.\n **/\n\npublic func binarySearch<T: Comparable>(_ a: [T], key: T) -> Int? {\n    var lowerBound = 0\n    var upperBound = a.count\n    while lowerBound < upperBound {\n        let midIndex = lowerBound + (upperBound - lowerBound) / 2\n        if a[midIndex] == key {\n            return midIndex\n        } else if a[midIndex] < key {\n            lowerBound = midIndex + 1\n        } else {\n            upperBound = midIndex\n        }\n    }\n    return nil\n}\n"
  },
  {
    "path": "Binary Search/README.markdown",
    "content": "# Binary Search\n\nGoal: Quickly find an element in an array.\n\nLet's say you have an array of numbers and you want to determine whether a specific number is in that array, and if so, at which index.\n\nIn most cases, Swift's `Collection.index(of:)` function is good enough for that:\n\n```swift\nlet numbers = [11, 59, 3, 2, 53, 17, 31, 7, 19, 67, 47, 13, 37, 61, 29, 43, 5, 41, 23]\n\nnumbers.index(of: 43)  // returns 15\n```\n\nThe built-in `Collection.index(of:)` function performs a [linear search](../Linear%20Search/). In code that looks something like this:\n\n```swift\nfunc linearSearch<T: Equatable>(_ a: [T], _ key: T) -> Int? {\n    for i in 0 ..< a.count {\n        if a[i] == key {\n            return i\n        }\n    }\n    return nil\n}\n```\n\nAnd you'd use it like this:\n\n```swift\nlinearSearch(numbers, 43)  // returns 15\n```\n\nSo what's the problem? `linearSearch()` loops through the entire array from the beginning, until it finds the element you're looking for. In the worst case, the value isn't even in the array and all that work is done for nothing.\n\nOn average, the linear search algorithm needs to look at half the values in the array. If your array is large enough, this starts to become very slow!\n\n## Divide and conquer\n\nThe classic way to speed this up is to use a *binary search*. The trick is to keep splitting the array in half until the value is found.\n\nFor an array of size `n`, the performance is not **O(n)** as with linear search but only **O(log n)**. To put that in perspective, binary search on an array with 1,000,000 elements only takes about 20 steps to find what you're looking for, because `log_2(1,000,000) = 19.9`. And for an array with a billion elements it only takes 30 steps. (Then again, when was the last time you used an array with a billion items?)\n\nSounds great, but there is a downside to using binary search: the array must be sorted. In practice, this usually isn't a problem.\n\nHere's how binary search works:\n\n- Split the array in half and determine whether the thing you're looking for, known as the *search key*, is in the left half or in the right half.\n- How do you determine in which half the search key is? This is why you sorted the array first, so you can do a simple `<` or `>` comparison.\n- If the search key is in the left half, you repeat the process there: split the left half into two even smaller pieces and look in which piece the search key must lie. (Likewise for when it's the right half.)\n- This repeats until the search key is found. If the array cannot be split up any further, you must regrettably conclude that the search key is not present in the array.\n\nNow you know why it's called a \"binary\" search: in every step it splits the array into two halves. This process of *divide-and-conquer* is what allows it to quickly narrow down where the search key must be.\n\n## The code\n\nHere is a recursive implementation of binary search in Swift:\n\n```swift\nfunc binarySearch<T: Comparable>(_ a: [T], key: T, range: Range<Int>) -> Int? {\n    if range.lowerBound >= range.upperBound {\n        // If we get here, then the search key is not present in the array.\n        return nil\n\n    } else {\n        // Calculate where to split the array.\n        let midIndex = range.lowerBound + (range.upperBound - range.lowerBound) / 2\n\n        // Is the search key in the left half?\n        if a[midIndex] > key {\n            return binarySearch(a, key: key, range: range.lowerBound ..< midIndex)\n\n        // Is the search key in the right half?\n        } else if a[midIndex] < key {\n            return binarySearch(a, key: key, range: midIndex + 1 ..< range.upperBound)\n\n        // If we get here, then we've found the search key!\n        } else {\n            return midIndex\n        }\n    }\n}\n```\n\nTo try this out, copy the code to a playground and do:\n\n```swift\nlet numbers = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67]\n\nbinarySearch(numbers, key: 43, range: 0 ..< numbers.count)  // gives 13\n```\n\nNote that the `numbers` array is sorted. The binary search algorithm does not work otherwise!\n\nI said that binary search works by splitting the array in half, but we don't actually create two new arrays. Instead, we keep track of these splits using a Swift `Range` object. Initially, this range covers the entire array, `0 ..< numbers.count`.  As we split the array, the range becomes smaller and smaller.\n\n> **Note:** One thing to be aware of is that `range.upperBound` always points one beyond the last element. In the example, the range is `0..<19` because there are 19 numbers in the array, and so `range.lowerBound = 0` and `range.upperBound = 19`. But in our array the last element is at index 18, not 19, since we start counting from 0. Just keep this in mind when working with ranges: the `upperBound` is always one more than the index of the last element.\n\n## Stepping through the example\n\nIt might be useful to look at how the algorithm works in detail.\n\nThe array from the above example consists of 19 numbers and looks like this when sorted:\n\n\t[ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67 ]\n\nWe're trying to determine if the number `43` is in this array.\n\nTo split the array in half, we need to know the index of the object in the middle. That's determined by this line:\n\n```swift\nlet midIndex = range.lowerBound + (range.upperBound - range.lowerBound) / 2\n```\n\nInitially, the range has `lowerBound = 0` and `upperBound = 19`. Filling in these values, we find that `midIndex` is `0 + (19 - 0)/2 = 19/2 = 9`. It's actually `9.5` but because we're using integers, the answer is rounded down.\n\nIn the next figure, the `*` shows the middle item. As you can see, the number of items on each side is the same, so we're split right down the middle.\n\n\t[ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67 ]\n                                      *\n\nNow binary search will determine which half to use. The relevant section from the code is:\n\n```swift\nif a[midIndex] > key {\n    // use left half\n} else if a[midIndex] < key {\n    // use right half\n} else {\n    return midIndex\n}\n```\n\nIn this case, `a[midIndex] = 29`. That's less than the search key, so we can safely conclude that the search key will never be in the left half of the array. After all, the left half only contains numbers smaller than `29`. Hence, the search key must be in the right half somewhere (or not in the array at all).\n\nNow we can simply repeat the binary search, but on the array interval from `midIndex + 1` to `range.upperBound`:\n\n\t[ x, x, x, x, x, x, x, x, x, x | 31, 37, 41, 43, 47, 53, 59, 61, 67 ]\n\nSince we no longer need to concern ourselves with the left half of the array, I've marked that with `x`'s. From now on we'll only look at the right half, which starts at array index 10.\n\nWe calculate the index of the new middle element: `midIndex = 10 + (19 - 10)/2 = 14`, and split the array down the middle again.\n\n\t[ x, x, x, x, x, x, x, x, x, x | 31, 37, 41, 43, 47, 53, 59, 61, 67 ]\n\t                                                 *\n\nAs you can see, `a[14]` is indeed the middle element of the array's right half.\n\nIs the search key greater or smaller than `a[14]`? It's smaller because `43 < 47`. This time we're taking the left half and ignore the larger numbers on the right:\n\n\t[ x, x, x, x, x, x, x, x, x, x | 31, 37, 41, 43 | x, x, x, x, x ]\n\nThe new `midIndex` is here:\n\n\t[ x, x, x, x, x, x, x, x, x, x | 31, 37, 41, 43 | x, x, x, x, x ]\n\t                                     *\n\nThe search key is greater than `37`, so continue with the right side:\n\n\t[ x, x, x, x, x, x, x, x, x, x | x, x | 41, 43 | x, x, x, x, x ]\n\t                                        *\n\nAgain, the search key is greater, so split once more and take the right side:\n\n\t[ x, x, x, x, x, x, x, x, x, x | x, x | x | 43 | x, x, x, x, x ]\n\t                                            *\n\nAnd now we're done. The search key equals the array element we're looking at, so we've finally found what we were searching for: number `43` is at array index `13`. w00t!\n\nIt may have seemed like a lot of work, but in reality it only took four steps to find the search key in the array, which sounds about right because `log_2(19) = 4.23`. With a linear search, it would have taken 14 steps.\n\nWhat would happen if we were to search for `42` instead of `43`? In that case, we can't split up the array any further. The `range.upperBound` becomes smaller than `range.lowerBound`. That tells the algorithm the search key is not in the array and it returns `nil`.\n\n> **Note:** Many implementations of binary search calculate `midIndex = (lowerBound + upperBound) / 2`. This contains a subtle bug that only appears with very large arrays, because `lowerBound + upperBound` may overflow the maximum number an integer can hold. This situation is unlikely to happen on a 64-bit CPU, but it definitely can on 32-bit machines.\n\n## Iterative vs recursive\n\nBinary search is recursive in nature because you apply the same logic over and over again to smaller and smaller subarrays. However, that does not mean you must implement `binarySearch()` as a recursive function. It's often more efficient to convert a recursive algorithm into an iterative version, using a simple loop instead of lots of recursive function calls.\n\nHere is an iterative implementation of binary search in Swift:\n\n```swift\nfunc binarySearch<T: Comparable>(_ a: [T], key: T) -> Int? {\n    var lowerBound = 0\n    var upperBound = a.count\n    while lowerBound < upperBound {\n        let midIndex = lowerBound + (upperBound - lowerBound) / 2\n        if a[midIndex] == key {\n            return midIndex\n        } else if a[midIndex] < key {\n            lowerBound = midIndex + 1\n        } else {\n            upperBound = midIndex\n        }\n    }\n    return nil\n}\n```\n\nAs you can see, the code is very similar to the recursive version. The main difference is in the use of the `while` loop.\n\nUse it like this:\n\n```swift\nlet numbers = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67]\n\nbinarySearch(numbers, key: 43)  // gives 13\n```\n\n## The end\n\nIs it a problem that the array must be sorted first? It depends. Keep in mind that sorting takes time -- the combination of binary search plus sorting may be slower than doing a simple linear search. Binary search shines in situations where you sort just once and then do many searches.\n\nSee also [Wikipedia](https://en.wikipedia.org/wiki/Binary_search_algorithm).\n\n*Written for Swift Algorithm Club by Matthijs Hollemans*\n"
  },
  {
    "path": "Binary Search/Tests/BinarySearchTests.swift",
    "content": "import Foundation\nimport XCTest\n\nclass BinarySearchTest: XCTestCase {\n  var searchList = [Int]()\n\n  override func setUp() {\n    super.setUp()\n    for number in 1...500 {\n      searchList.append(number)\n    }\n  }\n\n  func testEmptyArray() {\n    let array = [Int]()\n    let index = binarySearch(array, key: 123)\n    XCTAssertNil(index)\n  }\n\n  func testBinarySearch() {\n    for i in 1...100 {\n      var array = [Int]()\n      for number in 1...i {\n        array.append(number)\n      }\n      let randomIndex = Int(arc4random_uniform(UInt32(i)))\n      let testValue = array[randomIndex]\n\n      let index = binarySearch(array, key: testValue)\n      XCTAssertNotNil(index)\n      XCTAssertEqual(index!, randomIndex)\n      XCTAssertEqual(array[index!], testValue)\n    }\n  }\n\n  func testLowerBound() {\n    let index = binarySearch(searchList, key: 1)\n    XCTAssertNotNil(index)\n    XCTAssertEqual(index!, 0)\n    XCTAssertEqual(searchList[index!], 1)\n  }\n\n  func testUpperBound() {\n    let index = binarySearch(searchList, key: 500)\n    XCTAssertNotNil(index)\n    XCTAssertEqual(index!, 499)\n    XCTAssertEqual(searchList[index!], 500)\n  }\n\n  func testOutOfLowerBound() {\n    let index = binarySearch(searchList, key: 0)\n    XCTAssertNil(index)\n  }\n\n  func testOutOfUpperBound() {\n    let index = binarySearch(searchList, key: 501)\n    XCTAssertNil(index)\n  }\n}\n"
  },
  {
    "path": "Binary Search/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Binary Search/Tests/Tests.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t7B80C3CE1C77A256003CECC7 /* BinarySearchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C3CD1C77A256003CECC7 /* BinarySearchTests.swift */; };\n\t\t7B80C3D01C77A263003CECC7 /* BinarySearch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C3CF1C77A263003CECC7 /* BinarySearch.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t7B2BBC801C779D720067B71D /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7B2BBC941C779E7B0067B71D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };\n\t\t7B80C3CD1C77A256003CECC7 /* BinarySearchTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BinarySearchTests.swift; sourceTree = SOURCE_ROOT; };\n\t\t7B80C3CF1C77A263003CECC7 /* BinarySearch.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BinarySearch.swift; path = ../BinarySearch.swift; sourceTree = SOURCE_ROOT; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t7B2BBC7D1C779D720067B71D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t7B2BBC681C779D710067B71D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC831C779D720067B71D /* Tests */,\n\t\t\t\t7B2BBC721C779D710067B71D /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC721C779D710067B71D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC801C779D720067B71D /* Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC831C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B80C3CF1C77A263003CECC7 /* BinarySearch.swift */,\n\t\t\t\t7B80C3CD1C77A256003CECC7 /* BinarySearchTests.swift */,\n\t\t\t\t7B2BBC941C779E7B0067B71D /* Info.plist */,\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tpath = TestsTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t7B2BBC7F1C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t7B2BBC7C1C779D720067B71D /* Sources */,\n\t\t\t\t7B2BBC7D1C779D720067B71D /* Frameworks */,\n\t\t\t\t7B2BBC7E1C779D720067B71D /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tproductName = TestsTests;\n\t\t\tproductReference = 7B2BBC801C779D720067B71D /* Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t7B2BBC691C779D710067B71D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0720;\n\t\t\t\tLastUpgradeCheck = 0800;\n\t\t\t\tORGANIZATIONNAME = \"Swift Algorithm Club\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t7B2BBC7F1C779D720067B71D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2;\n\t\t\t\t\t\tLastSwiftMigration = 0800;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 7B2BBC681C779D710067B71D;\n\t\t\tproductRefGroup = 7B2BBC721C779D710067B71D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t7B2BBC7F1C779D720067B71D /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t7B2BBC7E1C779D720067B71D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t7B2BBC7C1C779D720067B71D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7B80C3D01C77A263003CECC7 /* BinarySearch.swift in Sources */,\n\t\t\t\t7B80C3CE1C77A256003CECC7 /* BinarySearchTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t7B2BBC871C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC881C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t7B2BBC8D1C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 3.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC8E1C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 3.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC871C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC881C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC8D1C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC8E1C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 7B2BBC691C779D710067B71D /* Project object */;\n}\n"
  },
  {
    "path": "Binary Search/Tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Tests.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Binary Search/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0800\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Binary Search Tree/README.markdown",
    "content": "# Binary Search Tree (BST)\n\n> This topic has been tutorialized [here](https://www.raywenderlich.com/139821/swift-algorithm-club-swift-binary-search-tree-data-structure)\n\n\nA binary search tree is a special kind of [binary tree](../Binary%20Tree/) (a tree in which each node has at most two children) that performs insertions and deletions such that the tree is always sorted.\n\nFor more information about a tree, [read this first](../Tree/).\n\n## \"Always sorted\" property\n\nHere is an example of a valid binary search tree:\n\n![A binary search tree](Images/Tree1.png)\n\nNotice how each left child is smaller than its parent node, and each right child is greater than its parent node. This is the key feature of a binary search tree.\n\nFor example, `2` is smaller than `7`, so it goes on the left; `5` is greater than `2`, so it goes on the right.\n\n## Inserting new nodes\n\nWhen performing an insertion, we first compare the new value to the root node. If the new value is smaller, we take the *left* branch; if greater, we take the *right* branch. We work our way down the tree this way until we find an empty spot where we can insert the new value.\n\nSuppose we want to insert the new value `9`:\n\n- We start at the root of the tree (the node with the value `7`) and compare it to the new value `9`.\n- `9 > 7`, so we go down the right branch and repeat the same procedure but this time on node `10`.\n- Because `9 < 10`, we go down the left branch.\n- We now arrived at a point where there are no more values to compare with. A new node for `9` is inserted at that location.\n\nHere is the tree after inserting the new value `9`:\n\n![After adding 9](Images/Tree2.png)\n\nThere is only one possible place where the new element can be inserted in the tree. Finding this place is usually quick. It takes **O(h)** time, where **h** is the height of the tree.\n\n> **Note:** The *height* of a node is the number of steps it takes to go from that node to its lowest leaf. The height of the entire tree is the distance from the root to the lowest leaf. Many of the operations on a binary search tree are expressed in terms of the tree's height.\n\nBy following this simple rule -- smaller values on the left, larger values on the right -- we keep the tree sorted, so whenever we query it, we can check if a value is in the tree.\n\n## Searching the tree\n\nTo find a value in the tree, we perform the same steps as with insertion:\n\n- If the value is less than the current node, then take the left branch.\n- If the value is greater than the current node, take the right branch.\n- If the value is equal to the current node, we've found it!\n\nLike most tree operations, this is performed recursively until either we find what we are looking for or run out of nodes to look at.\n\nHere is an example for searching the value `5`:\n\n![Searching the tree](Images/Searching.png)\n\nSearching is fast using the structure of the tree. It runs in **O(h)** time. If you have a well-balanced tree with a million nodes, it only takes about 20 steps to find anything in this tree. (The idea is very similar to [binary search](../Binary%20Search) in an array.)\n\n## Traversing the tree\n\nSometimes you need to look at all nodes rather than only one.\n\nThere are three ways to traverse a binary tree:\n\n1. *In-order* (or *depth-first*): first look at the left child of a node then at the node itself and finally at its right child.\n2. *Pre-order*: first look at a node then its left and right children.\n3. *Post-order*: first look at the left and right children and process the node itself last.\n\nTraversing the tree also happens recursively.\n\nIf you traverse a binary search tree in-order, it looks at all the nodes as if they were sorted from low to high. For the example tree, it would print `1, 2, 5, 7, 9, 10`:\n\n![Traversing the tree](Images/Traversing.png)\n\n## Deleting nodes\n\nRemoving nodes is easy. After removing a node, we replace the node with either its biggest child on the left or its smallest child on the right. That way the tree is still sorted after the removal. In the following example, 10 is removed and replaced with either 9 (Figure 2) or 11 (Figure 3).\n\n![Deleting a node with two children](Images/DeleteTwoChildren.png)\n\nNote the replacement needs to happen when the node has at least one child. If it has no child, you just disconnect it from its parent:\n\n![Deleting a leaf node](Images/DeleteLeaf.png)\n\n\n## The code (solution 1)\n\nSo much for the theory. Let's see how we can implement a binary search tree in Swift. There are different approaches you can take. First, I will show you how to make a class-based version, but we will also look at how to make one using enums.\n\nHere is an example for a `BinarySearchTree` class:\n\n```swift\npublic class BinarySearchTree<T: Comparable> {\n  private(set) public var value: T\n  private(set) public var parent: BinarySearchTree?\n  private(set) public var left: BinarySearchTree?\n  private(set) public var right: BinarySearchTree?\n\n  public init(value: T) {\n    self.value = value\n  }\n\n  public var isRoot: Bool {\n    return parent == nil\n  }\n\n  public var isLeaf: Bool {\n    return left == nil && right == nil\n  }\n\n  public var isLeftChild: Bool {\n    return parent?.left === self\n  }\n\n  public var isRightChild: Bool {\n    return parent?.right === self\n  }\n\n  public var hasLeftChild: Bool {\n    return left != nil\n  }\n\n  public var hasRightChild: Bool {\n    return right != nil\n  }\n\n  public var hasAnyChild: Bool {\n    return hasLeftChild || hasRightChild\n  }\n\n  public var hasBothChildren: Bool {\n    return hasLeftChild && hasRightChild\n  }\n\n  public var count: Int {\n    return (left?.count ?? 0) + 1 + (right?.count ?? 0)\n  }\n}\n```\n\nThis class describes just a single node not the entire tree. It is a generic type, so the node can store any kind of data. It also has references to its `left` and `right` child nodes and a `parent` node.\n\nHere is how you can use it:\n\n```swift\nlet tree = BinarySearchTree<Int>(value: 7)\n```\n\nThe `count` property determines how many nodes are in the subtree described by this node. This does not just count the node's immediate children but also their children and their children's children, and so on. If this particular object is the root node, then it counts how many nodes are in the entire tree. Initially, `count = 0`.\n\n> **Note:** Because `left`, `right`, and `parent` are optional, we can make good use of Swift's optional chaining (`?`) and nil-coalescing operators (`??`). You could also write this sort of thing with `if let`, but that is less concise.\n\n### Inserting nodes\n\nA tree node by itself is useless, so here is how you would add new nodes to the tree:\n\n```swift\n  public func insert(value: T) {\n    if value < self.value {\n      if let left = left {\n        left.insert(value: value)\n      } else {\n        left = BinarySearchTree(value: value)\n        left?.parent = self\n      }\n    } else {\n      if let right = right {\n        right.insert(value: value)\n      } else {\n        right = BinarySearchTree(value: value)\n        right?.parent = self\n      }\n    }\n  }\n```\n\nLike so many other tree operations, insertion is easiest to implement with recursion. We compare the new value to the values of the existing nodes and decide whether to add it to the left branch or the right branch.\n\nIf there is no more left or right child to look at, we create a `BinarySearchTree` object for the new node and connect it to the tree by setting its `parent` property.\n\n> **Note:** Because the whole point of a binary search tree is to have smaller nodes on the left and larger ones on the right, you should always insert elements at the root to make sure this remains a valid binary tree!\n\nTo build the complete tree from the example you can do:\n\n```swift\nlet tree = BinarySearchTree<Int>(value: 7)\ntree.insert(2)\ntree.insert(5)\ntree.insert(10)\ntree.insert(9)\ntree.insert(1)\n```\n\n> **Note:** For reasons that will become clear later, you should insert the numbers in a random order. If you insert them in a sorted order, the tree will not have the right shape.\n\nFor convenience, let's add an init method that calls `insert()` for all the elements in an array:\n\n```swift\n  public convenience init(array: [T]) {\n    precondition(array.count > 0)\n    self.init(value: array.first!)\n    for v in array.dropFirst() {\n      insert(value: v)\n    }\n  }\n```\n\nNow you can simply do this:\n\n```swift\nlet tree = BinarySearchTree<Int>(array: [7, 2, 5, 10, 9, 1])\n```\n\nThe first value in the array becomes the root of the tree.\n\n### Debug output\n\nWhen working with complicated data structures, it is useful to have human-readable debug output.\n\n```swift\nextension BinarySearchTree: CustomStringConvertible {\n  public var description: String {\n    var s = \"\"\n    if let left = left {\n      s += \"(\\(left.description)) <- \"\n    }\n    s += \"\\(value)\"\n    if let right = right {\n      s += \" -> (\\(right.description))\"\n    }\n    return s\n  }\n}\n```\n\nWhen you do a `print(tree)`, you should get something like this:\n\n\t((1) <- 2 -> (5)) <- 7 -> ((9) <- 10)\n\nThe root node is in the middle. With some imagination, you should see that this indeed corresponds to the following tree:\n\n![The tree](Images/Tree2.png)\n\nYou may be wondering what happens when you insert duplicate items? We always insert those in the right branch. Try it out!\n\n### Searching\n\nWhat do we do now that we have some values in our tree? Search for them, of course! To find items quickly is the main purpose of a binary search tree. :-)\n\nHere is the implementation of `search()`:\n\n```swift\n  public func search(value: T) -> BinarySearchTree? {\n    if value < self.value {\n      return left?.search(value)\n    } else if value > self.value {\n      return right?.search(value)\n    } else {\n      return self  // found it!\n    }\n  }\n```\n\nI hope the logic is clear: this starts at the current node (usually the root) and compares the values. If the search value is less than the node's value, we continue searching in the left branch; if the search value is greater, we dive into the right branch.\n\nIf there are no more nodes to look at -- when `left` or `right` is nil -- then we return `nil` to indicate the search value is not in the tree.\n\n> **Note:** In Swift, that is conveniently done with optional chaining; when you write `left?.search(value)` it automatically returns nil if `left` is nil. There is no need to explicitly check for this with an `if` statement.\n\nSearching is a recursive process, but you can also implement it with a simple loop instead:\n\n```swift\n  public func search(_ value: T) -> BinarySearchTree? {\n    var node: BinarySearchTree? = self\n    while let n = node {\n      if value < n.value {\n        node = n.left\n      } else if value > n.value {\n        node = n.right\n      } else {\n        return node\n      }\n    }\n    return nil\n  }\n```\n\nVerify that you understand these two implementations are equivalent. Personally, I prefer to use iterative code over recursive code, but your opinion may differ. ;-)\n\nHere is how to test searching:\n\n```swift\ntree.search(5)\ntree.search(2)\ntree.search(7)\ntree.search(6)   // nil\n```\n\nThe first three lines return the corresponding `BinaryTreeNode` object. The last line returns `nil` because there is no node with value `6`.\n\n> **Note:** If there are duplicate items in the tree, `search()` returns the \"highest\" node. That makes sense, because we start searching from the root downwards.\n\n### Traversal\n\nRemember there are 3 different ways to look at all nodes in the tree? Here they are:\n\n```swift\n  public func traverseInOrder(process: (T) -> Void) {\n    left?.traverseInOrder(process: process)\n    process(value)\n    right?.traverseInOrder(process: process)\n  }\n\n  public func traversePreOrder(process: (T) -> Void) {\n    process(value)\n    left?.traversePreOrder(process: process)\n    right?.traversePreOrder(process: process)\n  }\n\n  public func traversePostOrder(process: (T) -> Void) {\n    left?.traversePostOrder(process: process)\n    right?.traversePostOrder(process: process)\n    process(value)\n  }\n```\n\nThey all work the same but in different orders. Notice that all the work is done recursively. The Swift's optional chaining makes it clear that the calls to `traverseInOrder()` etc are ignored when there is no left or right child.\n\nTo print out all the values of the tree sorted from low to high you can write:\n\n```swift\ntree.traverseInOrder { value in print(value) }\n```\n\nThis prints the following:\n\n\t1\n\t2\n\t5\n\t7\n\t9\n\t10\n\nYou can also add things like `map()` and `filter()` to the tree. For example, here is an implementation of map:\n\n```swift\n\n  public func map(formula: (T) -> T) -> [T] {\n    var a = [T]()\n    if let left = left { a += left.map(formula: formula) }\n    a.append(formula(value))\n    if let right = right { a += right.map(formula: formula) }\n    return a\n  }\n```\n\nThis calls the `formula` closure on each node in the tree and collects the results in an array. `map()` works by traversing the tree in-order.\n\nAn extremely simple example of how to use `map()`:\n\n```swift\n  public func toArray() -> [T] {\n    return map { $0 }\n  }\n```\n\nThis turns the contents of the tree back into a sorted array. Try it out in the playground:\n\n```swift\ntree.toArray()   // [1, 2, 5, 7, 9, 10]\n```\n\nAs an exercise, see if you can implement filter and reduce.\n\n### Deleting nodes\n\nWe can make the code more readable by defining some helper functions.\n\n```swift\n  private func reconnectParentTo(node: BinarySearchTree?) {\n    if let parent = parent {\n      if isLeftChild {\n        parent.left = node\n      } else {\n        parent.right = node\n      }\n    }\n    node?.parent = parent\n  }\n```\n\nMaking changes to the tree involves changing a bunch of `parent` and `left` and `right` pointers. This function helps with this implementation. It takes the parent of the current node -- that is `self` -- and connects it to another node which will be one of the children of `self`.\n\nWe also need a function that returns the minimum and maximum of a node:\n\n```swift\n  public func minimum() -> BinarySearchTree {\n    var node = self\n    while let next = node.left {\n      node = next\n    }\n    return node\n  }\n\n  public func maximum() -> BinarySearchTree {\n    var node = self\n    while let next = node.right {\n      node = next\n    }\n    return node\n  }\n\n```\n\nThe rest of the code is self-explanatory:\n\n```swift\n  @discardableResult public func remove() -> BinarySearchTree? {\n    let replacement: BinarySearchTree?\n\n    // Replacement for current node can be either biggest one on the left or\n    // smallest one on the right, whichever is not nil\n    if let right = right {\n      replacement = right.minimum()\n    } else if let left = left {\n      replacement = left.maximum()\n    } else {\n      replacement = nil\n    }\n\n    replacement?.remove()\n\n    // Place the replacement on current node's position\n    replacement?.right = right\n    replacement?.left = left\n    right?.parent = replacement\n    left?.parent = replacement\n    reconnectParentTo(node:replacement)\n\n    // The current node is no longer part of the tree, so clean it up.\n    parent = nil\n    left = nil\n    right = nil\n\n    return replacement\n  }\n```\n\n### Depth and height\n\nRecall that the height of a node is the distance to its lowest leaf. We can calculate that with the following function:\n\n```swift\n  public func height() -> Int {\n    if isLeaf {\n      return 0\n    } else {\n      return 1 + max(left?.height() ?? 0, right?.height() ?? 0)\n    }\n  }\n```\n\nWe look at the heights of the left and right branches and take the highest one. Again, this is a recursive procedure. Since this looks at all children of this node, performance is **O(n)**.\n\n> **Note:** Swift's null-coalescing operator is used as shorthand to deal with `left` or `right` pointers that are nil. You could write this with `if let`, but this is more concise.\n\nTry it out:\n\n```swift\ntree.height()  // 2\n```\n\nYou can also calculate the *depth* of a node, which is the distance to the root. Here is the code:\n\n```swift\n  public func depth() -> Int {\n    var node = self\n    var edges = 0\n    while let parent = node.parent {\n      node = parent\n      edges += 1\n    }\n    return edges\n  }\n```\n\nIt steps upwards through the tree, following the `parent` pointers until we reach the root node (whose `parent` is nil). This takes **O(h)** time. Here is an example:\n\n```swift\nif let node9 = tree.search(9) {\n  node9.depth()   // returns 2\n}\n```\n\n### Predecessor and successor\n\nThe binary search tree is always \"sorted\" but that does not mean that consecutive numbers are actually next to each other in the tree.\n\n![Example](Images/Tree2.png)\n\nNote that you cannot find the number that comes before `7` by just looking at its left child node. The left child is `2`, not `5`. Likewise for the number that comes after `7`.\n\nThe `predecessor()` function returns the node whose value precedes the current value in sorted order:\n\n```swift\n  public func predecessor() -> BinarySearchTree<T>? {\n    if let left = left {\n      return left.maximum()\n    } else {\n      var node = self\n      while let parent = node.parent {\n        if parent.value < value { return parent }\n        node = parent\n      }\n      return nil\n    }\n  }\n```\n\nIt is easy if we have a left subtree. In that case, the immediate predecessor is the maximum value in that subtree. You can verify in the above picture that `5` is indeed the maximum value in `7`'s left branch.\n\nIf there is no left subtree, then we have to look at our parent nodes until we find a smaller value. If we want to know what the predecessor is of node `9`, we keep going up until we find the first parent with a smaller value, which is `7`.\n\nThe code for `successor()` works the same way but mirrored:\n\n```swift\n  public func successor() -> BinarySearchTree<T>? {\n    if let right = right {\n      return right.minimum()\n    } else {\n      var node = self\n      while let parent = node.parent {\n        if parent.value > value { return parent }\n        node = parent\n      }\n      return nil\n    }\n  }\n```\n\nBoth these methods run in **O(h)** time.\n\n> **Note:** There is a variation called a [\"threaded\" binary tree](../Threaded%20Binary%20Tree) where \"unused\" left and right pointers are repurposed to make direct links between predecessor and successor nodes. Very clever!\n\n### Is the search tree valid?\n\nIf you were intent on sabotage you could turn the binary search tree into an invalid tree by calling `insert()` on a node that is not the root. Here is an example:\n\n```swift\nif let node1 = tree.search(1) {\n  node1.insert(100)\n}\n```\n\nThe value of the root node is `7`, so a node with value `100`must be in the tree's right branch. However, you are not inserting at the root but at a leaf node in the tree's left branch. So the new `100` node is in the wrong place in the tree!\n\nAs a result, doing `tree.search(100)` gives nil.\n\nYou can check whether a tree is a valid binary search tree with the following method:\n\n```swift\n  public func isBST(minValue: T, maxValue: T) -> Bool {\n    if value < minValue || value > maxValue { return false }\n    let leftBST = left?.isBST(minValue: minValue, maxValue: value) ?? true\n    let rightBST = right?.isBST(minValue: value, maxValue: maxValue) ?? true\n    return leftBST && rightBST\n  }\n```\n\nThis verifies the left branch contains values that are less than the current node's value, and that the right branch only contains values that are larger.\n\nCall it as follows:\n\n```swift\nif let node1 = tree.search(1) {\n  tree.isBST(minValue: Int.min, maxValue: Int.max)  // true\n  node1.insert(100)                                 // EVIL!!!\n  tree.search(100)                                  // nil\n  tree.isBST(minValue: Int.min, maxValue: Int.max)  // false\n}\n```\n\n## The code (solution 2)\n\nWe have implemented the binary tree node as a class, but you can also use an enum.\n\nThe difference is reference semantics versus value semantics. Making a change to the class-based tree will update that same instance in memory, but the enum-based tree is immutable -- any insertions or deletions will give you an entirely new copy of the tree. Which one is best, totally depends on what you want to use it for.\n\nHere is how you can make a binary search tree using an enum:\n\n```swift\npublic enum BinarySearchTree<T: Comparable> {\n  case Empty\n  case Leaf(T)\n  indirect case Node(BinarySearchTree, T, BinarySearchTree)\n}\n```\n\nThe enum has three cases:\n\n- `Empty` to mark the end of a branch (the class-based version used `nil` references for this).\n- `Leaf` for a leaf node that has no children.\n- `Node` for a node that has one or two children. This is marked `indirect` so that it can hold `BinarySearchTree` values. Without `indirect` you can't make recursive enums.\n\n> **Note:** The nodes in this binary tree do not have a reference to their parent node. It is not a major impediment, but it will make certain operations more cumbersome to implement.\n\nThis implementation is recursive, and each case of the enum will be treated differently. For example, this is how you can calculate the number of nodes in the tree and the height of the tree:\n\n```swift\n  public var count: Int {\n    switch self {\n    case .Empty: return 0\n    case .Leaf: return 1\n    case let .Node(left, _, right): return left.count + 1 + right.count\n    }\n  }\n\n  public var height: Int {\n    switch self {\n    case .Empty: return -1\n    case .Leaf: return 0\n    case let .Node(left, _, right): return 1 + max(left.height, right.height)\n    }\n  }\n```\n\nInserting new nodes looks like this:\n\n```swift\n  public func insert(newValue: T) -> BinarySearchTree {\n    switch self {\n    case .Empty:\n      return .Leaf(newValue)\n\n    case .Leaf(let value):\n      if newValue < value {\n        return .Node(.Leaf(newValue), value, .Empty)\n      } else {\n        return .Node(.Empty, value, .Leaf(newValue))\n      }\n\n    case .Node(let left, let value, let right):\n      if newValue < value {\n        return .Node(left.insert(newValue), value, right)\n      } else {\n        return .Node(left, value, right.insert(newValue))\n      }\n    }\n  }\n```\n\nTry it out in a playground:\n\n```swift\nvar tree = BinarySearchTree.Leaf(7)\ntree = tree.insert(2)\ntree = tree.insert(5)\ntree = tree.insert(10)\ntree = tree.insert(9)\ntree = tree.insert(1)\n```\n\nNotice that for each insertion, you get back a new tree object, so you need to assign the result back to the `tree` variable.\n\nHere is the all-important search function:\n\n```swift\n  public func search(x: T) -> BinarySearchTree? {\n    switch self {\n    case .Empty:\n      return nil\n    case .Leaf(let y):\n      return (x == y) ? self : nil\n    case let .Node(left, y, right):\n      if x < y {\n        return left.search(x)\n      } else if y < x {\n        return right.search(x)\n      } else {\n        return self\n      }\n    }\n  }\n```\n\nMost of these functions have the same structure.\n\nTry it out in a playground:\n\n```swift\ntree.search(10)\ntree.search(1)\ntree.search(11)   // nil\n```\n\nTo print the tree for debug purposes, you can use this method:\n\n```swift\nextension BinarySearchTree: CustomDebugStringConvertible {\n  public var debugDescription: String {\n    switch self {\n    case .Empty: return \".\"\n    case .Leaf(let value): return \"\\(value)\"\n    case .Node(let left, let value, let right):\n      return \"(\\(left.debugDescription) <- \\(value) -> \\(right.debugDescription))\"\n    }\n  }\n}\n```\n\nWhen you do `print(tree)`, it will look like this:\n\n\t((1 <- 2 -> 5) <- 7 -> (9 <- 10 -> .))\n\nThe root node is in the middle, and a dot means there is no child at that position.\n\n## When the tree becomes unbalanced...\n\nA binary search tree is *balanced* when its left and right subtrees contain the same number of nodes. In that case, the height of the tree is *log(n)*, where *n* is the number of nodes. That is the ideal situation.\n\nIf one branch is significantly longer than the other, searching becomes very slow. We end up checking more values than we need. In the worst case, the height of the tree can become *n*. Such a tree acts like a [linked list](../Linked%20List/) than a binary search tree, with performance degrading to **O(n)**. Not good!\n\nOne way to make the binary search tree balanced is to insert the nodes in a totally random order. On average that should balance out the tree well, but it not guaranteed, nor is it always practical.\n\nThe other solution is to use a *self-balancing* binary tree. This type of data structure adjusts the tree to keep it balanced after you insert or delete nodes. To see examples, check [AVL tree](../AVL%20Tree) and [red-black tree](../Red-Black%20Tree).\n\n## See also\n\n[Binary Search Tree on Wikipedia](https://en.wikipedia.org/wiki/Binary_search_tree)\n\n*Written for the Swift Algorithm Club by [Nicolas Ameghino](http://www.github.com/nameghino) and Matthijs Hollemans*\n"
  },
  {
    "path": "Binary Search Tree/Solution 1/BinarySearchTree.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\nlet tree = BinarySearchTree<Int>(value: 7)\ntree.insert(value: 2)\ntree.insert(value: 5)\ntree.insert(value: 10)\ntree.insert(value: 9)\ntree.insert(value: 1)\n\nlet toDelete = tree.search(value: 1)\ntoDelete?.remove()\ntree\n\nlet tree2 = BinarySearchTree<Int>(array: [7, 2, 5, 10, 9, 1])\n\ntree.search(value: 5)\ntree.search(value: 2)\ntree.search(value: 7)\ntree.search(value: 6)\n\ntree.traverseInOrder { value in print(value) }\n\ntree.toArray()\n\ntree.minimum()\ntree.maximum()\n\nif let node2 = tree.search(value: 2) {\n  node2.remove()\n  node2\n  print(tree)\n}\n\ntree.height()\ntree.predecessor()\ntree.successor()\n\nif let node10 = tree.search(value: 10) {\n  node10.depth()        // 1\n  node10.height()       // 1\n  node10.predecessor()\n  node10.successor()    // nil\n}\n\nif let node9 = tree.search(value: 9) {\n  node9.depth()        // 2\n  node9.height()       // 0\n  node9.predecessor()\n  node9.successor()\n}\n\nif let node1 = tree.search(value: 1) {\n  // This makes it an invalid binary search tree because 100 is greater\n  // than the root, 7, and so must be in the right branch not in the left.\n  tree.isBST(minValue: Int.min, maxValue: Int.max)  // true\n  node1.insert(value: 100)\n  tree.search(value: 100)                                  // nil\n  tree.isBST(minValue: Int.min, maxValue: Int.max)  // false\n}\n"
  },
  {
    "path": "Binary Search Tree/Solution 1/BinarySearchTree.playground/Sources/BinarySearchTree.swift",
    "content": "/*\n  A binary search tree.\n\n  Each node stores a value and two children. The left child contains a smaller\n  value; the right a larger (or equal) value.\n\n  This tree allows duplicate elements.\n\n  This tree does not automatically balance itself. To make sure it is balanced,\n  you should insert new values in randomized order, not in sorted order.\n*/\npublic class BinarySearchTree<T: Comparable> {\n  fileprivate(set) public var value: T\n  fileprivate(set) public var parent: BinarySearchTree?\n  fileprivate(set) public var left: BinarySearchTree?\n  fileprivate(set) public var right: BinarySearchTree?\n\n  public init(value: T) {\n    self.value = value\n  }\n\n  public convenience init(array: [T]) {\n    precondition(array.count > 0)\n    self.init(value: array.first!)\n    for v in array.dropFirst() {\n      insert(value: v)\n    }\n  }\n\n  public var isRoot: Bool {\n    return parent == nil\n  }\n\n  public var isLeaf: Bool {\n    return left == nil && right == nil\n  }\n\n  public var isLeftChild: Bool {\n    return parent?.left === self\n  }\n\n  public var isRightChild: Bool {\n    return parent?.right === self\n  }\n\n  public var hasLeftChild: Bool {\n    return left != nil\n  }\n\n  public var hasRightChild: Bool {\n    return right != nil\n  }\n\n  public var hasAnyChild: Bool {\n    return hasLeftChild || hasRightChild\n  }\n\n  public var hasBothChildren: Bool {\n    return hasLeftChild && hasRightChild\n  }\n\n  /* How many nodes are in this subtree. Performance: O(n). */\n  public var count: Int {\n    return (left?.count ?? 0) + 1 + (right?.count ?? 0)\n  }\n}\n\n// MARK: - Adding items\n\nextension BinarySearchTree {\n  /*\n    Inserts a new element into the tree. You should only insert elements\n    at the root, to make to sure this remains a valid binary tree!\n    Performance: runs in O(h) time, where h is the height of the tree.\n  */\n  public func insert(value: T) {\n    if value < self.value {\n      if let left = left {\n        left.insert(value: value)\n      } else {\n        left = BinarySearchTree(value: value)\n        left?.parent = self\n      }\n    } else {\n      if let right = right {\n        right.insert(value: value)\n      } else {\n        right = BinarySearchTree(value: value)\n        right?.parent = self\n      }\n    }\n  }\n}\n\n// MARK: - Deleting items\n\nextension BinarySearchTree {\n  /*\n    Deletes a node from the tree.\n\n    Returns the node that has replaced this removed one (or nil if this was a\n    leaf node). That is primarily useful for when you delete the root node, in\n    which case the tree gets a new root.\n\n    Performance: runs in O(h) time, where h is the height of the tree.\n  */\n  @discardableResult public func remove() -> BinarySearchTree? {\n    let replacement: BinarySearchTree?\n\n    // Replacement for current node can be either biggest one on the left or\n    // smallest one on the right, whichever is not nil\n    if let right = right {\n      replacement = right.minimum()\n    } else if let left = left {\n      replacement = left.maximum()\n    } else {\n      replacement = nil\n    }\n\n    replacement?.remove()\n\n    // Place the replacement on current node's position\n    replacement?.right = right\n    replacement?.left = left\n    right?.parent = replacement\n    left?.parent = replacement\n    reconnectParentTo(node:replacement)\n\n    // The current node is no longer part of the tree, so clean it up.\n    parent = nil\n    left = nil\n    right = nil\n\n    return replacement\n  }\n\n  private func reconnectParentTo(node: BinarySearchTree?) {\n    if let parent = parent {\n      if isLeftChild {\n        parent.left = node\n      } else {\n        parent.right = node\n      }\n    }\n    node?.parent = parent\n  }\n}\n\n// MARK: - Searching\n\nextension BinarySearchTree {\n  /*\n    Finds the \"highest\" node with the specified value.\n    Performance: runs in O(h) time, where h is the height of the tree.\n  */\n  public func search(value: T) -> BinarySearchTree? {\n    var node: BinarySearchTree? = self\n    while let n = node {\n      if value < n.value {\n        node = n.left\n      } else if value > n.value {\n        node = n.right\n      } else {\n        return node\n      }\n    }\n    return nil\n  }\n\n  /*\n  // Recursive version of search\n  public func search(value: T) -> BinarySearchTree? {\n    if value < self.value {\n      return left?.search(value)\n    } else if value > self.value {\n      return right?.search(value)\n    } else {\n      return self  // found it!\n    }\n  }\n  */\n\n  public func contains(value: T) -> Bool {\n    return search(value: value) != nil\n  }\n\n  /*\n    Returns the leftmost descendent. O(h) time.\n  */\n  public func minimum() -> BinarySearchTree {\n    var node = self\n    while let next = node.left {\n      node = next\n    }\n    return node\n  }\n\n  /*\n    Returns the rightmost descendent. O(h) time.\n  */\n  public func maximum() -> BinarySearchTree {\n    var node = self\n    while let next = node.right {\n      node = next\n    }\n    return node\n  }\n\n  /*\n    Calculates the depth of this node, i.e. the distance to the root.\n    Takes O(h) time.\n  */\n  public func depth() -> Int {\n    var node = self\n    var edges = 0\n    while let parent = node.parent {\n      node = parent\n      edges += 1\n    }\n    return edges\n  }\n\n  /*\n    Calculates the height of this node, i.e. the distance to the lowest leaf.\n    Since this looks at all children of this node, performance is O(n).\n  */\n  public func height() -> Int {\n    if isLeaf {\n      return 0\n    } else {\n      return 1 + max(left?.height() ?? 0, right?.height() ?? 0)\n    }\n  }\n\n  /*\n    Finds the node whose value precedes our value in sorted order.\n  */\n  public func predecessor() -> BinarySearchTree? {\n    if let left = left {\n      return left.maximum()\n    } else {\n      var node = self\n      while let parent = node.parent {\n        if parent.value < value { return parent }\n        node = parent\n      }\n      return nil\n    }\n  }\n\n  /*\n    Finds the node whose value succeeds our value in sorted order.\n  */\n  public func successor() -> BinarySearchTree? {\n    if let right = right {\n      return right.minimum()\n    } else {\n      var node = self\n      while let parent = node.parent {\n        if parent.value > value { return parent }\n        node = parent\n      }\n      return nil\n    }\n  }\n}\n\n// MARK: - Traversal\n\nextension BinarySearchTree {\n  public func traverseInOrder(process: (T) -> Void) {\n    left?.traverseInOrder(process: process)\n    process(value)\n    right?.traverseInOrder(process: process)\n  }\n\n  public func traversePreOrder(process: (T) -> Void) {\n    process(value)\n    left?.traversePreOrder(process: process)\n    right?.traversePreOrder(process: process)\n  }\n\n  public func traversePostOrder(process: (T) -> Void) {\n    left?.traversePostOrder(process: process)\n    right?.traversePostOrder(process: process)\n    process(value)\n  }\n\n  /*\n    Performs an in-order traversal and collects the results in an array.\n  */\n  public func map(formula: (T) -> T) -> [T] {\n    var a = [T]()\n    if let left = left { a += left.map(formula: formula) }\n    a.append(formula(value))\n    if let right = right { a += right.map(formula: formula) }\n    return a\n  }\n}\n\n/*\n  Is this binary tree a valid binary search tree?\n*/\nextension BinarySearchTree {\n  public func isBST(minValue: T, maxValue: T) -> Bool {\n    if value < minValue || value > maxValue { return false }\n    let leftBST = left?.isBST(minValue: minValue, maxValue: value) ?? true\n    let rightBST = right?.isBST(minValue: value, maxValue: maxValue) ?? true\n    return leftBST && rightBST\n  }\n}\n\n// MARK: - Debugging\n\nextension BinarySearchTree: CustomStringConvertible {\n  public var description: String {\n    var s = \"\"\n    if let left = left {\n      s += \"(\\(left.description)) <- \"\n    }\n    s += \"\\(value)\"\n    if let right = right {\n      s += \" -> (\\(right.description))\"\n    }\n    return s\n  }\n\n   public func toArray() -> [T] {\n      return map { $0 }\n   }\n\n}\n\n//extension BinarySearchTree: CustomDebugStringConvertible {\n//  public var debugDescription: String {\n//   var s = \"\"\n//   if let left = left {\n//      s += \"(\\(left.description)) <- \"\n//   }\n//   s += \"\\(value)\"\n//   if let right = right {\n//      s += \" -> (\\(right.description))\"\n//   }\n//   return s\n//  }\n//}\n"
  },
  {
    "path": "Binary Search Tree/Solution 1/BinarySearchTree.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Binary Search Tree/Solution 1/BinarySearchTree.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Binary Search Tree/Solution 1/BinarySearchTree.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Binary Search Tree/Solution 1/Tests/BinarySearchTreeTests.swift",
    "content": "import Foundation\nimport XCTest\n\nclass BinarySearchTreeTest: XCTestCase {\n  func testRootNode() {\n    let tree = BinarySearchTree(value: 8)\n    XCTAssertEqual(tree.count, 1)\n    XCTAssertEqual(tree.minimum().value, 8)\n    XCTAssertEqual(tree.maximum().value, 8)\n    XCTAssertEqual(tree.height(), 0)\n    XCTAssertEqual(tree.depth(), 0)\n    XCTAssertEqual(tree.toArray(), [8])\n  }\n\n  func testCreateFromArray() {\n    let tree = BinarySearchTree(array: [8, 5, 10, 3, 12, 9, 6, 16])\n    XCTAssertEqual(tree.count, 8)\n    XCTAssertEqual(tree.toArray(), [3, 5, 6, 8, 9, 10, 12, 16])\n\n    XCTAssertEqual(tree.search(value: 9)!.value, 9)\n    XCTAssertNil(tree.search(value: 99))\n\n    XCTAssertEqual(tree.minimum().value, 3)\n    XCTAssertEqual(tree.maximum().value, 16)\n\n    XCTAssertEqual(tree.height(), 3)\n    XCTAssertEqual(tree.depth(), 0)\n\n    let node1 = tree.search(value: 16)\n    XCTAssertNotNil(node1)\n    XCTAssertEqual(node1!.height(), 0)\n    XCTAssertEqual(node1!.depth(), 3)\n\n    let node2 = tree.search(value: 12)\n    XCTAssertNotNil(node2)\n    XCTAssertEqual(node2!.height(), 1)\n    XCTAssertEqual(node2!.depth(), 2)\n\n    let node3 = tree.search(value: 10)\n    XCTAssertNotNil(node3)\n    XCTAssertEqual(node3!.height(), 2)\n    XCTAssertEqual(node3!.depth(), 1)\n  }\n\n  func testInsert() {\n    let tree = BinarySearchTree(value: 8)\n\n    tree.insert(value: 5)\n    XCTAssertEqual(tree.count, 2)\n    XCTAssertEqual(tree.height(), 1)\n    XCTAssertEqual(tree.depth(), 0)\n\n    let node1 = tree.search(value: 5)\n    XCTAssertNotNil(node1)\n    XCTAssertEqual(node1!.height(), 0)\n    XCTAssertEqual(node1!.depth(), 1)\n\n    tree.insert(value: 10)\n    XCTAssertEqual(tree.count, 3)\n    XCTAssertEqual(tree.height(), 1)\n    XCTAssertEqual(tree.depth(), 0)\n\n    let node2 = tree.search(value: 10)\n    XCTAssertNotNil(node2)\n    XCTAssertEqual(node2!.height(), 0)\n    XCTAssertEqual(node2!.depth(), 1)\n\n    tree.insert(value: 3)\n    XCTAssertEqual(tree.count, 4)\n    XCTAssertEqual(tree.height(), 2)\n    XCTAssertEqual(tree.depth(), 0)\n\n    let node3 = tree.search(value: 3)\n    XCTAssertNotNil(node3)\n    XCTAssertEqual(node3!.height(), 0)\n    XCTAssertEqual(node3!.depth(), 2)\n    XCTAssertEqual(node1!.height(), 1)\n    XCTAssertEqual(node1!.depth(), 1)\n\n    XCTAssertEqual(tree.minimum().value, 3)\n    XCTAssertEqual(tree.maximum().value, 10)\n    XCTAssertEqual(tree.toArray(), [3, 5, 8, 10])\n  }\n\n  func testInsertDuplicates() {\n    let tree = BinarySearchTree(array: [8, 5, 10])\n    tree.insert(value: 8)\n    tree.insert(value: 5)\n    tree.insert(value: 10)\n    XCTAssertEqual(tree.count, 6)\n    XCTAssertEqual(tree.toArray(), [5, 5, 8, 8, 10, 10])\n  }\n\n  func testTraversing() {\n    let tree = BinarySearchTree(array: [8, 5, 10, 3, 12, 9, 6, 16])\n\n    var inOrder = [Int]()\n    tree.traverseInOrder { inOrder.append($0) }\n    XCTAssertEqual(inOrder, [3, 5, 6, 8, 9, 10, 12, 16])\n\n    var preOrder = [Int]()\n    tree.traversePreOrder { preOrder.append($0) }\n    XCTAssertEqual(preOrder, [8, 5, 3, 6, 10, 9, 12, 16])\n\n    var postOrder = [Int]()\n    tree.traversePostOrder { postOrder.append($0) }\n    XCTAssertEqual(postOrder, [3, 6, 5, 9, 16, 12, 10, 8])\n  }\n\n  func testInsertSorted() {\n    let tree = BinarySearchTree(array: [8, 5, 10, 3, 12, 9, 6, 16].sorted(by: <))\n    XCTAssertEqual(tree.count, 8)\n    XCTAssertEqual(tree.toArray(), [3, 5, 6, 8, 9, 10, 12, 16])\n\n    XCTAssertEqual(tree.minimum().value, 3)\n    XCTAssertEqual(tree.maximum().value, 16)\n\n    XCTAssertEqual(tree.height(), 7)\n    XCTAssertEqual(tree.depth(), 0)\n\n    let node1 = tree.search(value: 16)\n    XCTAssertNotNil(node1)\n    XCTAssertEqual(node1!.height(), 0)\n    XCTAssertEqual(node1!.depth(), 7)\n  }\n\n  func testRemoveLeaf() {\n    let tree = BinarySearchTree(array: [8, 5, 10, 4])\n\n    let node10 = tree.search(value: 10)!\n    XCTAssertNil(node10.left)\n    XCTAssertNil(node10.right)\n    XCTAssertTrue(tree.right === node10)\n\n    let node5 = tree.search(value: 5)!\n    XCTAssertTrue(tree.left === node5)\n\n    let node4 = tree.search(value: 4)!\n    XCTAssertTrue(node5.left === node4)\n    XCTAssertNil(node5.right)\n\n    let replacement1 = node4.remove()\n    XCTAssertNil(node5.left)\n    XCTAssertNil(replacement1)\n\n    let replacement2 = node5.remove()\n    XCTAssertNil(tree.left)\n    XCTAssertNil(replacement2)\n\n    let replacement3 = node10.remove()\n    XCTAssertNil(tree.right)\n    XCTAssertNil(replacement3)\n\n    XCTAssertEqual(tree.count, 1)\n    XCTAssertEqual(tree.toArray(), [8])\n  }\n\n  func testRemoveOneChildLeft() {\n    let tree = BinarySearchTree(array: [8, 5, 10, 4, 9])\n\n    let node4 = tree.search(value: 4)!\n    let node5 = tree.search(value: 5)!\n    XCTAssertTrue(node5.left === node4)\n    XCTAssertTrue(node5 === node4.parent)\n\n    node5.remove()\n    XCTAssertTrue(tree.left === node4)\n    XCTAssertTrue(tree === node4.parent)\n    XCTAssertNil(node4.left)\n    XCTAssertNil(node4.right)\n    XCTAssertEqual(tree.count, 4)\n    XCTAssertEqual(tree.toArray(), [4, 8, 9, 10])\n\n    let node9 = tree.search(value: 9)!\n    let node10 = tree.search(value: 10)!\n    XCTAssertTrue(node10.left === node9)\n    XCTAssertTrue(node10 === node9.parent)\n\n    node10.remove()\n    XCTAssertTrue(tree.right === node9)\n    XCTAssertTrue(tree === node9.parent)\n    XCTAssertNil(node9.left)\n    XCTAssertNil(node9.right)\n    XCTAssertEqual(tree.count, 3)\n    XCTAssertEqual(tree.toArray(), [4, 8, 9])\n  }\n\n  func testRemoveOneChildRight() {\n    let tree = BinarySearchTree(array: [8, 5, 10, 6, 11])\n\n    let node6 = tree.search(value: 6)!\n    let node5 = tree.search(value: 5)!\n    XCTAssertTrue(node5.right === node6)\n    XCTAssertTrue(node5 === node6.parent)\n\n    node5.remove()\n    XCTAssertTrue(tree.left === node6)\n    XCTAssertTrue(tree === node6.parent)\n    XCTAssertNil(node6.left)\n    XCTAssertNil(node6.right)\n    XCTAssertEqual(tree.count, 4)\n    XCTAssertEqual(tree.toArray(), [6, 8, 10, 11])\n\n    let node11 = tree.search(value: 11)!\n    let node10 = tree.search(value: 10)!\n    XCTAssertTrue(node10.right === node11)\n    XCTAssertTrue(node10 === node11.parent)\n\n    node10.remove()\n    XCTAssertTrue(tree.right === node11)\n    XCTAssertTrue(tree === node11.parent)\n    XCTAssertNil(node11.left)\n    XCTAssertNil(node11.right)\n    XCTAssertEqual(tree.count, 3)\n    XCTAssertEqual(tree.toArray(), [6, 8, 11])\n  }\n\n  func testRemoveTwoChildrenSimple() {\n    let tree = BinarySearchTree(array: [8, 5, 10, 4, 6, 9, 11])\n\n    let node4 = tree.search(value: 4)!\n    let node5 = tree.search(value: 5)!\n    let node6 = tree.search(value: 6)!\n    XCTAssertTrue(node5.left === node4)\n    XCTAssertTrue(node5.right === node6)\n    XCTAssertTrue(node5 === node4.parent)\n    XCTAssertTrue(node5 === node6.parent)\n\n    let replacement1 = node5.remove()\n    XCTAssertTrue(replacement1 === node6)\n    XCTAssertTrue(tree.left === node6)\n    XCTAssertTrue(tree === node6.parent)\n    XCTAssertTrue(node6.left === node4)\n    XCTAssertTrue(node6 === node4.parent)\n    XCTAssertNil(node5.left)\n    XCTAssertNil(node5.right)\n    XCTAssertNil(node5.parent)\n    XCTAssertNil(node4.left)\n    XCTAssertNil(node4.right)\n    XCTAssertNotNil(node4.parent)\n    XCTAssertEqual(tree.count, 6)\n    XCTAssertEqual(tree.toArray(), [4, 6, 8, 9, 10, 11])\n\n    let node9 = tree.search(value: 9)!\n    let node10 = tree.search(value: 10)!\n    let node11 = tree.search(value: 11)!\n    XCTAssertTrue(node10.left === node9)\n    XCTAssertTrue(node10.right === node11)\n    XCTAssertTrue(node10 === node9.parent)\n    XCTAssertTrue(node10 === node11.parent)\n\n    let replacement2 = node10.remove()\n    XCTAssertTrue(replacement2 === node11)\n    XCTAssertTrue(tree.right === node11)\n    XCTAssertTrue(tree === node11.parent)\n    XCTAssertTrue(node11.left === node9)\n    XCTAssertTrue(node11 === node9.parent)\n    XCTAssertNil(node10.left)\n    XCTAssertNil(node10.right)\n    XCTAssertNil(node10.parent)\n    XCTAssertNil(node9.left)\n    XCTAssertNil(node9.right)\n    XCTAssertNotNil(node9.parent)\n    XCTAssertEqual(tree.count, 5)\n    XCTAssertEqual(tree.toArray(), [4, 6, 8, 9, 11])\n  }\n\n  func testRemoveTwoChildrenComplex() {\n    let tree = BinarySearchTree(array: [8, 5, 10, 4, 9, 20, 11, 15, 13])\n\n    let node9 = tree.search(value: 9)!\n    let node10 = tree.search(value: 10)!\n    let node11 = tree.search(value: 11)!\n    let node13 = tree.search(value: 13)!\n    let node15 = tree.search(value: 15)!\n    let node20 = tree.search(value: 20)!\n    XCTAssertTrue(node10.left === node9)\n    XCTAssertTrue(node10 === node9.parent)\n    XCTAssertTrue(node10.right === node20)\n    XCTAssertTrue(node10 === node20.parent)\n    XCTAssertTrue(node20.left === node11)\n    XCTAssertTrue(node20 === node11.parent)\n    XCTAssertTrue(node11.right === node15)\n    XCTAssertTrue(node11 === node15.parent)\n\n    let replacement = node10.remove()\n    XCTAssertTrue(replacement === node11)\n    XCTAssertTrue(tree.right === node11)\n    XCTAssertTrue(tree === node11.parent)\n    XCTAssertTrue(node11.left === node9)\n    XCTAssertTrue(node11 === node9.parent)\n    XCTAssertTrue(node11.right === node20)\n    XCTAssertTrue(node11 === node20.parent)\n    XCTAssertTrue(node20.left === node13)\n    XCTAssertTrue(node20 === node13.parent)\n    XCTAssertNil(node20.right)\n    XCTAssertNil(node10.left)\n    XCTAssertNil(node10.right)\n    XCTAssertNil(node10.parent)\n    XCTAssertEqual(tree.count, 8)\n    XCTAssertEqual(tree.toArray(), [4, 5, 8, 9, 11, 13, 15, 20])\n  }\n\n  func testRemoveRoot() {\n    let tree = BinarySearchTree(array: [8, 5, 10, 4, 9, 20, 11, 15, 13])\n\n    let node9 = tree.search(value: 9)!\n\n    let newRoot = tree.remove()\n    XCTAssertTrue(newRoot === node9)\n    XCTAssertEqual(newRoot!.value, 9)\n    XCTAssertEqual(newRoot!.count, 8)\n    XCTAssertEqual(newRoot!.toArray(), [4, 5, 9, 10, 11, 13, 15, 20])\n\n    // The old root is a subtree of a single element.\n    XCTAssertEqual(tree.value, 8)\n    XCTAssertEqual(tree.count, 1)\n    XCTAssertEqual(tree.toArray(), [8])\n  }\n\n  func testPredecessor() {\n    let tree = BinarySearchTree(array: [3, 1, 2, 5, 4])\n    let node = tree.search(value: 5)\n\n    XCTAssertEqual(node!.value, 5)\n    XCTAssertEqual(node!.predecessor()!.value, 4)\n    XCTAssertEqual(node!.predecessor()!.predecessor()!.value, 3)\n    XCTAssertEqual(node!.predecessor()!.predecessor()!.predecessor()!.value, 2)\n    XCTAssertEqual(node!.predecessor()!.predecessor()!.predecessor()!.predecessor()!.value, 1)\n    XCTAssertNil(node!.predecessor()!.predecessor()!.predecessor()!.predecessor()!.predecessor())\n  }\n\n  func testSuccessor() {\n    let tree = BinarySearchTree(array: [3, 1, 2, 5, 4])\n    let node = tree.search(value: 1)\n\n    XCTAssertEqual(node!.value, 1)\n    XCTAssertEqual(node!.successor()!.value, 2)\n    XCTAssertEqual(node!.successor()!.successor()!.value, 3)\n    XCTAssertEqual(node!.successor()!.successor()!.successor()!.value, 4)\n    XCTAssertEqual(node!.successor()!.successor()!.successor()!.successor()!.value, 5)\n    XCTAssertNil(node!.successor()!.successor()!.successor()!.successor()!.successor())\n  }\n}\n"
  },
  {
    "path": "Binary Search Tree/Solution 1/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Binary Search Tree/Solution 1/Tests/Tests.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t7B80C3DA1C77A323003CECC7 /* BinarySearchTreeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C3D91C77A323003CECC7 /* BinarySearchTreeTests.swift */; };\n\t\t9E5A58B91E304C3100DAB3BB /* BinarySearchTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E5A58B81E304C3100DAB3BB /* BinarySearchTree.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t7B2BBC801C779D720067B71D /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7B2BBC941C779E7B0067B71D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };\n\t\t7B80C3D91C77A323003CECC7 /* BinarySearchTreeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BinarySearchTreeTests.swift; sourceTree = SOURCE_ROOT; };\n\t\t9E5A58B81E304C3100DAB3BB /* BinarySearchTree.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BinarySearchTree.swift; path = ../BinarySearchTree.playground/Sources/BinarySearchTree.swift; sourceTree = SOURCE_ROOT; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t7B2BBC7D1C779D720067B71D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t7B2BBC681C779D710067B71D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC831C779D720067B71D /* Tests */,\n\t\t\t\t7B2BBC721C779D710067B71D /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC721C779D710067B71D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC801C779D720067B71D /* Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC831C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9E5A58B81E304C3100DAB3BB /* BinarySearchTree.swift */,\n\t\t\t\t7B80C3D91C77A323003CECC7 /* BinarySearchTreeTests.swift */,\n\t\t\t\t7B2BBC941C779E7B0067B71D /* Info.plist */,\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tpath = TestsTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t7B2BBC7F1C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t7B2BBC7C1C779D720067B71D /* Sources */,\n\t\t\t\t7B2BBC7D1C779D720067B71D /* Frameworks */,\n\t\t\t\t7B2BBC7E1C779D720067B71D /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tproductName = TestsTests;\n\t\t\tproductReference = 7B2BBC801C779D720067B71D /* Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t7B2BBC691C779D710067B71D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0720;\n\t\t\t\tLastUpgradeCheck = 1000;\n\t\t\t\tORGANIZATIONNAME = \"Swift Algorithm Club\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t7B2BBC7F1C779D720067B71D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2;\n\t\t\t\t\t\tLastSwiftMigration = 1000;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 7B2BBC681C779D710067B71D;\n\t\t\tproductRefGroup = 7B2BBC721C779D710067B71D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t7B2BBC7F1C779D720067B71D /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t7B2BBC7E1C779D720067B71D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t7B2BBC7C1C779D720067B71D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7B80C3DA1C77A323003CECC7 /* BinarySearchTreeTests.swift in Sources */,\n\t\t\t\t9E5A58B91E304C3100DAB3BB /* BinarySearchTree.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t7B2BBC871C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC881C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t7B2BBC8D1C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Default;\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC8E1C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Default;\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC871C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC881C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC8D1C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC8E1C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 7B2BBC691C779D710067B71D /* Project object */;\n}\n"
  },
  {
    "path": "Binary Search Tree/Solution 1/Tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Tests.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Binary Search Tree/Solution 1/Tests/Tests.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Binary Search Tree/Solution 1/Tests/Tests.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Binary Search Tree/Solution 1/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1000\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Binary Search Tree/Solution 2/BinarySearchTree.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\n// Each time you insert something, you get back a completely new tree.\nvar tree = BinarySearchTree.leaf(7)\ntree = tree.insert(newValue: 2)\ntree = tree.insert(newValue: 5)\ntree = tree.insert(newValue: 10)\ntree = tree.insert(newValue: 9)\ntree = tree.insert(newValue: 1)\nprint(tree)\n\ntree.search(x: 10)\ntree.search(x: 1)\ntree.search(x: 11)\n"
  },
  {
    "path": "Binary Search Tree/Solution 2/BinarySearchTree.playground/Sources/BinarySearchTree.swift",
    "content": "/*\n  Binary search tree using value types\n\n  The tree is immutable. Any insertions or deletions will create a new tree.\n*/\npublic enum BinarySearchTree<T: Comparable> {\n  case empty\n  case leaf(T)\n  indirect case node(BinarySearchTree, T, BinarySearchTree)\n\n  /* How many nodes are in this subtree. Performance: O(n). */\n  public var count: Int {\n    switch self {\n    case .empty: return 0\n    case .leaf: return 1\n    case let .node(left, _, right): return left.count + 1 + right.count\n    }\n  }\n\n  /* Distance of this node to its lowest leaf. Performance: O(n). */\n  public var height: Int {\n    switch self {\n    case .empty: return 0\n    case .leaf: return 1\n    case let .node(left, _, right): return 1 + max(left.height, right.height)\n    }\n  }\n\n  /*\n    Inserts a new element into the tree.\n    Performance: runs in O(h) time, where h is the height of the tree.\n  */\n  public func insert(newValue: T) -> BinarySearchTree {\n    switch self {\n    case .empty:\n      return .leaf(newValue)\n\n    case .leaf(let value):\n      if newValue < value {\n        return .node(.leaf(newValue), value, .empty)\n      } else {\n        return .node(.empty, value, .leaf(newValue))\n      }\n\n    case .node(let left, let value, let right):\n      if newValue < value {\n        return .node(left.insert(newValue: newValue), value, right)\n      } else {\n        return .node(left, value, right.insert(newValue: newValue))\n      }\n    }\n  }\n\n  /*\n    Finds the \"highest\" node with the specified value.\n    Performance: runs in O(h) time, where h is the height of the tree.\n  */\n  public func search(x: T) -> BinarySearchTree? {\n    switch self {\n    case .empty:\n      return nil\n    case .leaf(let y):\n      return (x == y) ? self : nil\n    case let .node(left, y, right):\n      if x < y {\n        return left.search(x: x)\n      } else if y < x {\n        return right.search(x: x)\n      } else {\n        return self\n      }\n    }\n  }\n\n  public func contains(x: T) -> Bool {\n    return search(x: x) != nil\n  }\n\n  /*\n    Returns the leftmost descendent. O(h) time.\n  */\n  public func minimum() -> BinarySearchTree {\n    var node = self\n    var prev = node\n    while case let .node(next, _, _) = node {\n      prev = node\n      node = next\n    }\n    if case .leaf = node {\n      return node\n    }\n    return prev\n  }\n\n  /*\n    Returns the rightmost descendent. O(h) time.\n  */\n  public func maximum() -> BinarySearchTree {\n    var node = self\n    var prev = node\n    while case let .node(_, _, next) = node {\n      prev = node\n      node = next\n    }\n    if case .leaf = node {\n      return node\n    }\n    return prev\n  }\n}\n\nextension BinarySearchTree: CustomDebugStringConvertible {\n  public var debugDescription: String {\n    switch self {\n    case .empty: return \".\"\n    case .leaf(let value): return \"\\(value)\"\n    case .node(let left, let value, let right):\n      return \"(\\(left.debugDescription) <- \\(value) -> \\(right.debugDescription))\"\n    }\n  }\n}\n"
  },
  {
    "path": "Binary Search Tree/Solution 2/BinarySearchTree.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Binary Search Tree/Solution 2/BinarySearchTree.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Binary Search Tree/Solution 2/BinarySearchTree.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Binary Search Tree/Solution 2/BinarySearchTree.swift",
    "content": "/*\n  Binary search tree using value types\n\n  The tree is immutable. Any insertions or deletions will create a new tree.\n*/\npublic enum BinarySearchTree<T: Comparable> {\n  case empty\n  case leaf(T)\n  indirect case node(BinarySearchTree, T, BinarySearchTree)\n\n  /* How many nodes are in this subtree. Performance: O(n). */\n  public var count: Int {\n    switch self {\n    case .empty: return 0\n    case .leaf: return 1\n    case let .node(left, _, right): return left.count + 1 + right.count\n    }\n  }\n\n  /* Distance of this node to its lowest leaf. Performance: O(n). */\n  public var height: Int {\n    switch self {\n    case .empty: return -1\n    case .leaf: return 0\n    case let .node(left, _, right): return 1 + max(left.height, right.height)\n    }\n  }\n\n  /*\n    Inserts a new element into the tree.\n    Performance: runs in O(h) time, where h is the height of the tree.\n  */\n  public func insert(newValue: T) -> BinarySearchTree {\n    switch self {\n    case .empty:\n      return .leaf(newValue)\n\n    case .leaf(let value):\n      if newValue < value {\n        return .node(.leaf(newValue), value, .empty)\n      } else {\n        return .node(.empty, value, .leaf(newValue))\n      }\n\n    case .node(let left, let value, let right):\n      if newValue < value {\n        return .node(left.insert(newValue), value, right)\n      } else {\n        return .node(left, value, right.insert(newValue))\n      }\n    }\n  }\n\n  /*\n    Finds the \"highest\" node with the specified value.\n    Performance: runs in O(h) time, where h is the height of the tree.\n  */\n  public func search(x: T) -> BinarySearchTree? {\n    switch self {\n    case .empty:\n      return nil\n    case .leaf(let y):\n      return (x == y) ? self : nil\n    case let .node(left, y, right):\n      if x < y {\n        return left.search(x)\n      } else if y < x {\n        return right.search(x)\n      } else {\n        return self\n      }\n    }\n  }\n\n  public func contains(x: T) -> Bool {\n    return search(x) != nil\n  }\n\n  /*\n    Returns the leftmost descendent. O(h) time.\n  */\n  public func minimum() -> BinarySearchTree {\n    var node = self\n    var prev = node\n    while case let .node(next, _, _) = node {\n      prev = node\n      node = next\n    }\n    if case .leaf = node {\n      return node\n    }\n    return prev\n  }\n\n  /*\n    Returns the rightmost descendent. O(h) time.\n  */\n  public func maximum() -> BinarySearchTree {\n    var node = self\n    var prev = node\n    while case let .node(_, _, next) = node {\n      prev = node\n      node = next\n    }\n    if case .leaf = node {\n      return node\n    }\n    return prev\n  }\n}\n\nextension BinarySearchTree: CustomDebugStringConvertible {\n  public var debugDescription: String {\n    switch self {\n    case .empty: return \".\"\n    case .leaf(let value): return \"\\(value)\"\n    case .node(let left, let value, let right):\n      return \"(\\(left.debugDescription) <- \\(value) -> \\(right.debugDescription))\"\n    }\n  }\n}\n"
  },
  {
    "path": "Binary Tree/BinaryTree.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\npublic indirect enum BinaryTree<T> {\n  case node(BinaryTree<T>, T, BinaryTree<T>)\n  case empty\n\n  public var count: Int {\n    switch self {\n    case let .node(left, _, right):\n      return left.count + 1 + right.count\n    case .empty:\n      return 0\n    }\n  }\n}\n\nextension BinaryTree: CustomStringConvertible {\n  public var description: String {\n    switch self {\n    case let .node(left, value, right):\n      return \"value: \\(value), left = [\\(left.description)], right = [\\(right.description)]\"\n    case .empty:\n      return \"\"\n    }\n  }\n}\n\n// leaf nodes\nlet node5 = BinaryTree.node(.empty, \"5\", .empty)\nlet nodeA = BinaryTree.node(.empty, \"a\", .empty)\nlet node10 = BinaryTree.node(.empty, \"10\", .empty)\nlet node4 = BinaryTree.node(.empty, \"4\", .empty)\nlet node3 = BinaryTree.node(.empty, \"3\", .empty)\nlet nodeB = BinaryTree.node(.empty, \"b\", .empty)\n\n// intermediate nodes on the left\nlet aMinus10 = BinaryTree.node(nodeA, \"-\", node10)\nlet timesLeft = BinaryTree.node(node5, \"*\", aMinus10)\n\n// intermediate nodes on the right\nlet minus4 = BinaryTree.node(.empty, \"-\", node4)\nlet divide3andB = BinaryTree.node(node3, \"/\", nodeB)\nlet timesRight = BinaryTree.node(minus4, \"*\", divide3andB)\n\n// root node\nlet tree = BinaryTree.node(timesLeft, \"+\", timesRight)\n\nprint(tree)\ntree.count  // 12\n\nextension BinaryTree {\n  public func traverseInOrder(process: (T) -> Void) {\n    if case let .node(left, value, right) = self {\n      left.traverseInOrder(process: process)\n      process(value)\n      right.traverseInOrder(process: process)\n    }\n  }\n\n  public func traversePreOrder(process: (T) -> Void) {\n    if case let .node(left, value, right) = self {\n      process(value)\n      left.traversePreOrder(process: process)\n      right.traversePreOrder(process: process)\n    }\n  }\n\n  public func traversePostOrder(process: (T) -> Void) {\n    if case let .node(left, value, right) = self {\n      left.traversePostOrder(process: process)\n      right.traversePostOrder(process: process)\n      process(value)\n    }\n  }\n}\n\n//tree.traverseInOrder { s in print(s) }\n//tree.traversePreOrder { s in print(s) }\ntree.traversePostOrder { s in print(s) }\n"
  },
  {
    "path": "Binary Tree/BinaryTree.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx' last-migration='1000'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Binary Tree/BinaryTree.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Binary Tree/BinaryTree.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Binary Tree/BinaryTree.swift",
    "content": "/*\n  A general-purpose binary tree.\n\n  Nodes don't have a reference to their parent.\n*/\npublic indirect enum BinaryTree<T> {\n  case node(BinaryTree<T>, T, BinaryTree<T>)\n  case empty\n\n  public var count: Int {\n    switch self {\n    case let .node(left, _, right):\n      return left.count + 1 + right.count\n    case .empty:\n      return 0\n    }\n  }\n}\n\nextension BinaryTree: CustomStringConvertible {\n  public var description: String {\n    switch self {\n    case let .node(left, value, right):\n      return \"value: \\(value), left = [\\(left.description)], right = [\\(right.description)]\"\n    case .empty:\n      return \"\"\n    }\n  }\n}\n\nextension BinaryTree {\n  public func traverseInOrder(process: (T) -> Void) {\n    if case let .node(left, value, right) = self {\n      left.traverseInOrder(process: process)\n      process(value)\n      right.traverseInOrder(process: process)\n    }\n  }\n\n  public func traversePreOrder(process: (T) -> Void) {\n    if case let .node(left, value, right) = self {\n      process(value)\n      left.traversePreOrder(process: process)\n      right.traversePreOrder(process: process)\n    }\n  }\n\n  public func traversePostOrder(process: (T) -> Void) {\n    if case let .node(left, value, right) = self {\n      left.traversePostOrder(process: process)\n      right.traversePostOrder(process: process)\n      process(value)\n    }\n  }\n}\n\nextension BinaryTree {\n  func invert() -> BinaryTree {\n    if case let .node(left, value, right) = self {\n      return .node(right.invert(), value, left.invert())\n    } else {\n      return .empty\n    }\n  }\n}\n"
  },
  {
    "path": "Binary Tree/README.markdown",
    "content": "# Binary Tree\n\nA binary tree is a [tree](../Tree/) where each node has 0, 1, or 2 children. This is a binary tree:\n\n![A binary tree](Images/BinaryTree.png)\n\nThe child nodes are usually called the *left* child and the *right* child. If a node doesn't have any children, it's called a *leaf* node. The *root* is the node at the very top of the tree (programmers like their trees upside down).\n\nOften nodes will have a link back to their parent but this is not strictly necessary.\n\nBinary trees are often used as [binary search trees](../Binary%20Search%20Tree/). In that case, the nodes must be in a specific order (smaller values on the left, larger values on the right). But this is not a requirement for all binary trees.\n\nFor example, here is a binary tree that represents a sequence of arithmetical operations, `(5 * (a - 10)) + (-4 * (3 / b))`:\n\n![A binary tree](Images/Operations.png)\n\n## The code\n\nHere's how you could implement a general-purpose binary tree in Swift:\n\n```swift\npublic indirect enum BinaryTree<T> {\n  case node(BinaryTree<T>, T, BinaryTree<T>)\n  case empty\n}\n```\n\nAs an example of how to use this, let's build that tree of arithmetic operations:\n\n```swift\n// leaf nodes\nlet node5 = BinaryTree.node(.empty, \"5\", .empty)\nlet nodeA = BinaryTree.node(.empty, \"a\", .empty)\nlet node10 = BinaryTree.node(.empty, \"10\", .empty)\nlet node4 = BinaryTree.node(.empty, \"4\", .empty)\nlet node3 = BinaryTree.node(.empty, \"3\", .empty)\nlet nodeB = BinaryTree.node(.empty, \"b\", .empty)\n\n// intermediate nodes on the left\nlet Aminus10 = BinaryTree.node(nodeA, \"-\", node10)\nlet timesLeft = BinaryTree.node(node5, \"*\", Aminus10)\n\n// intermediate nodes on the right\nlet minus4 = BinaryTree.node(.empty, \"-\", node4)\nlet divide3andB = BinaryTree.node(node3, \"/\", nodeB)\nlet timesRight = BinaryTree.node(minus4, \"*\", divide3andB)\n\n// root node\nlet tree = BinaryTree.node(timesLeft, \"+\", timesRight)\n```\n\nYou need to build up the tree in reverse, starting with the leaf nodes and working your way up to the top.\n\nIt will be useful to add a `description` method so you can print the tree:\n\n```swift\nextension BinaryTree: CustomStringConvertible {\n  public var description: String {\n    switch self {\n    case let .node(left, value, right):\n      return \"value: \\(value), left = [\\(left.description)], right = [\\(right.description)]\"\n    case .empty:\n      return \"\"\n    }\n  }\n}\n```\n\nIf you `print(tree)` you should see something like this:\n\n\tvalue: +, left = [value: *, left = [value: 5, left = [], right = []], right = [value: -, left = [value: a, left = [], right = []], right = [value: 10, left = [], right = []]]], right = [value: *, left = [value: -, left = [], right = [value: 4, left = [], right = []]], right = [value: /, left = [value: 3, left = [], right = []], right = [value: b, left = [], right = []]]]\n\nWith a bit of imagination, you can see the tree structure. ;-) It helps if you indent it:\n\n\tvalue: +, \n\t\tleft = [value: *, \n\t\t\tleft = [value: 5, left = [], right = []], \n\t\t\tright = [value: -, \n\t\t\t\tleft = [value: a, left = [], right = []], \n\t\t\t\tright = [value: 10, left = [], right = []]]], \n\t\tright = [value: *, \n\t\t\tleft = [value: -, \n\t\t\t\tleft = [], \n\t\t\t\tright = [value: 4, left = [], right = []]], \n\t\t\tright = [value: /, \n\t\t\t\tleft = [value: 3, left = [], right = []], \n\t\t\t\tright = [value: b, left = [], right = []]]]\n\nAnother useful method is counting the number of nodes in the tree:\n\n```swift\n  public var count: Int {\n    switch self {\n    case let .node(left, _, right):\n      return left.count + 1 + right.count\n    case .empty:\n      return 0\n    }\n  }\n```\n\nOn the tree from the example, `tree.count` should be 12.\n\nSomething you often need to do with trees is traverse them, i.e. look at all the nodes in some order. There are three ways to traverse a binary tree:\n\n1. *In-order* (or *depth-first*): first look at the left child of a node, then at the node itself, and finally at its right child.\n2. *Pre-order*: first look at a node, then at its left and right children. \n3. *Post-order*: first look at the left and right children and process the node itself last.\n\nHere is how you'd implement that:\n\n```swift\n  public func traverseInOrder(process: (T) -> Void) {\n    if case let .node(left, value, right) = self {\n      left.traverseInOrder(process: process)\n      process(value)\n      right.traverseInOrder(process: process)\n    }\n  }\n  \n  public func traversePreOrder(process: (T) -> Void) {\n    if case let .node(left, value, right) = self {\n      process(value)\n      left.traversePreOrder(process: process)\n      right.traversePreOrder(process: process)\n    }\n  }\n  \n  public func traversePostOrder(process: (T) -> Void) {\n    if case let .node(left, value, right) = self {\n      left.traversePostOrder(process: process)\n      right.traversePostOrder(process: process)\n      process(value)\n    }\n  }\n```\n\nAs is common when working with tree structures, these functions call themselves recursively.\n\nFor example, if you traverse the tree of arithmetic operations in post-order, you'll see the values in this order:\n\n\t5\n\ta\n\t10\n\t-\n\t*\n\t4\n\t-\n\t3\n\tb\n\t/\n\t*\n\t+\n\nThe leaves appear first. The root node appears last.\n\nYou can use a stack machine to evaluate these expressions, something like the following pseudocode:\n\n```swift\ntree.traversePostOrder { s in \n  switch s {\n  case this is a numeric literal, such as 5:\n    push it onto the stack\n  case this is a variable name, such as a:\n    look up the value of a and push it onto the stack\n  case this is an operator, such as *:\n    pop the two top-most items off the stack, multiply them,\n    and push the result back onto the stack\n  }\n  the result is in the top-most item on the stack\n}\n```\n\n*Written for Swift Algorithm Club by Matthijs Hollemans*\n"
  },
  {
    "path": "Bit Set/BitSet.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\n// Create a bit set that stores 140 bits\nvar bits = BitSet(size: 140)\n\n// Initially, it looks like all zeros:\n// 0000000000000000000000000000000000000000000000000000000000000000\n// 0000000000000000000000000000000000000000000000000000000000000000\n// 0000000000000000000000000000000000000000000000000000000000000000\nprint(bits)\n\nbits[2] = true\nbits[99] = true\nbits[128] = true\nbits.cardinality  // 3\n\n// 0010000000000000000000000000000000000000000000000000000000000000\n// 0000000000000000000000000000000000010000000000000000000000000000\n// 1000000000000000000000000000000000000000000000000000000000000000\nprint(bits)\n\nbits.setAll()\nbits.cardinality  // 140\n\n// 1111111111111111111111111111111111111111111111111111111111111111\n// 1111111111111111111111111111111111111111111111111111111111111111\n// 1111111111110000000000000000000000000000000000000000000000000000\nprint(bits)\n\nprint(\"\")\n\n// Bitwise operations\n\nvar a = BitSet(size: 4)\nvar b = BitSet(size: 8)\n\na.setAll()\na.cardinality  // 4\n\na[1] = false\na[2] = false\na[3] = false\n\nb[2] = true\nb[6] = true\nb[7] = true\n\nprint(a)   // 1000000000000000000000000000000000000000000000000000000000000000\nprint(b)   // 0010001100000000000000000000000000000000000000000000000000000000\n\nlet c = a | b\nc.size         // 8\n\nprint(c)   // 1010001100000000000000000000000000000000000000000000000000000000\n\na.cardinality  // 1\nb.cardinality  // 3\nc.cardinality  // 4\n\nprint(\"\")\nprint(~a)  // 0111000000000000000000000000000000000000000000000000000000000000\nprint(~b)  // 1101110000000000000000000000000000000000000000000000000000000000\nprint(~c)  // 0101110000000000000000000000000000000000000000000000000000000000\n\n(~a).cardinality  // 3\n(~b).cardinality  // 5\n(~c).cardinality  // 4\n\nvar z = BitSet(size: 66)\nz.all0()        // true\nz.all1()        // false\n\nz[45] = true\nz.any1()        // true\nz.all0()        // false\n\nz[45] = false\nz.any1()        // false\nz.all0()        // true\n\nz[65] = true\nz.any1()        // true\n\nz.setAll()\nz.all1()        // true\n\nz[65] = false\nz.all1()        // false\n\n//var bigBits = BitSet(size: 10000)\n//print(bigBits)\n\nvar smallBitSet = BitSet(size: 16)\nsmallBitSet[5] = true\nsmallBitSet[10] = true\nprint(smallBitSet >> 3)\nprint(smallBitSet << 6) // one bit shifts off the end\n\nvar bigBitSet = BitSet( size: 120 )\nbigBitSet[1] = true\nbigBitSet[3] = true\nbigBitSet[7] = true\nbigBitSet[32] = true\nbigBitSet[55] = true\nbigBitSet[64] = true\nbigBitSet[80] = true\nprint(bigBitSet)\nprint(bigBitSet << 32)\nprint(bigBitSet << 64)\nprint(bigBitSet >> 32)\nprint(bigBitSet >> 64)\n"
  },
  {
    "path": "Bit Set/BitSet.playground/Sources/BitSet.swift",
    "content": "/*\n  A fixed-size sequence of n bits. Bits have indices 0 to n-1.\n*/\npublic struct BitSet {\n  /* How many bits this object can hold. */\n  private(set) public var size: Int\n\n  /*\n    We store the bits in a list of unsigned 64-bit integers.\n    The first entry, `words[0]`, is the least significant word.\n  */\n  fileprivate let N = 64\n  public typealias Word = UInt64\n  fileprivate(set) public var words: [Word]\n\n  private let allOnes = ~Word()\n\n  /* Creates a bit set that can hold `size` bits. All bits are initially 0. */\n  public init(size: Int) {\n    precondition(size > 0)\n    self.size = size\n\n    // Round up the count to the next multiple of 64.\n    let n = (size + (N-1)) / N\n    words = [Word](repeating: 0, count: n)\n  }\n\n  /* Converts a bit index into an array index and a mask inside the word. */\n  private func indexOf(_ i: Int) -> (Int, Word) {\n    precondition(i >= 0)\n    precondition(i < size)\n    let o = i / N\n    let m = Word(i - o*N)\n    return (o, 1 << m)\n  }\n\n  /* Returns a mask that has 1s for all bits that are in the last word. */\n  private func lastWordMask() -> Word {\n    let diff = words.count*N - size\n    if diff > 0 {\n      // Set the highest bit that's still valid.\n      let mask = 1 << Word(63 - diff)\n      // Subtract 1 to turn it into a mask, and add the high bit back in.\n      return (Word)(mask | (mask - 1))\n    } else {\n      return allOnes\n    }\n  }\n\n  /*\n    If the size is not a multiple of N, then we have to clear out the bits\n    that we're not using, or bitwise operations between two differently sized\n    BitSets will go wrong.\n  */\n  fileprivate mutating func clearUnusedBits() {\n    words[words.count - 1] &= lastWordMask()\n  }\n\n  /* So you can write bitset[99] = ... */\n  public subscript(i: Int) -> Bool {\n    get { return isSet(i) }\n    set { if newValue { set(i) } else { clear(i) } }\n  }\n\n  /* Sets the bit at the specified index to 1. */\n  public mutating func set(_ i: Int) {\n    let (j, m) = indexOf(i)\n    words[j] |= m\n  }\n\n  /* Sets all the bits to 1. */\n  public mutating func setAll() {\n    for i in 0..<words.count {\n      words[i] = allOnes\n    }\n    clearUnusedBits()\n  }\n\n  /* Sets the bit at the specified index to 0. */\n  public mutating func clear(_ i: Int) {\n    let (j, m) = indexOf(i)\n    words[j] &= ~m\n  }\n\n  /* Sets all the bits to 0. */\n  public mutating func clearAll() {\n    for i in 0..<words.count {\n      words[i] = 0\n    }\n  }\n\n  /* Changes 0 into 1 and 1 into 0. Returns the new value of the bit. */\n  public mutating func flip(_ i: Int) -> Bool {\n    let (j, m) = indexOf(i)\n    words[j] ^= m\n    return (words[j] & m) != 0\n  }\n\n  /* Determines whether the bit at the specific index is 1 (true) or 0 (false). */\n  public func isSet(_ i: Int) -> Bool {\n    let (j, m) = indexOf(i)\n    return (words[j] & m) != 0\n  }\n\n  /*\n    Returns the number of bits that are 1. Time complexity is O(s) where s is\n    the number of 1-bits.\n  */\n  public var cardinality: Int {\n    var count = 0\n    for var x in words {\n      while x != 0 {\n        let y = x & ~(x - 1)  // find lowest 1-bit\n        x = x ^ y             // and erase it\n        count += 1\n      }\n    }\n    return count\n  }\n\n  /* Checks if all the bits are set. */\n  public func all1() -> Bool {\n    for i in 0..<words.count - 1 {\n      if words[i] != allOnes { return false }\n    }\n    return words[words.count - 1] == lastWordMask()\n  }\n\n  /* Checks if any of the bits are set. */\n  public func any1() -> Bool {\n    for x in words {\n      if x != 0 { return true }\n    }\n    return false\n  }\n\n  /* Checks if none of the bits are set. */\n  public func all0() -> Bool {\n    for x in words {\n      if x != 0 { return false }\n    }\n    return true\n  }\n}\n\n// MARK: - Equality\n\nextension BitSet: Equatable {\n}\n\npublic func == (lhs: BitSet, rhs: BitSet) -> Bool {\n  return lhs.words == rhs.words\n}\n\n// MARK: - Hashing\n\nextension BitSet: Hashable {\n  /* Based on the hashing code from Java's BitSet. */\n  public var hashValue: Int {\n    var h = Word(1234)\n    for i in stride(from: words.count, to: 0, by: -1) {\n      h ^= words[i - 1] &* Word(i)\n    }\n    return Int((h >> 32) ^ h)\n  }\n}\n\n// MARK: - Bitwise operations\n\nextension BitSet {\n  public static var allZeros: BitSet {\n    return BitSet(size: 64)\n  }\n}\n\nprivate func copyLargest(_ lhs: BitSet, _ rhs: BitSet) -> BitSet {\n  return (lhs.words.count > rhs.words.count) ? lhs : rhs\n}\n\n/*\n  Note: In all of these bitwise operations, lhs and rhs are allowed to have a\n  different number of bits. The new BitSet always has the larger size.\n  The extra bits that get added to the smaller BitSet are considered to be 0.\n  That will strip off the higher bits from the larger BitSet when doing &.\n*/\n\npublic func & (lhs: BitSet, rhs: BitSet) -> BitSet {\n  let m = max(lhs.size, rhs.size)\n  var out = BitSet(size: m)\n  let n = min(lhs.words.count, rhs.words.count)\n  for i in 0..<n {\n    out.words[i] = lhs.words[i] & rhs.words[i]\n  }\n  return out\n}\n\npublic func | (lhs: BitSet, rhs: BitSet) -> BitSet {\n  var out = copyLargest(lhs, rhs)\n  let n = min(lhs.words.count, rhs.words.count)\n  for i in 0..<n {\n    out.words[i] = lhs.words[i] | rhs.words[i]\n  }\n  return out\n}\n\npublic func ^ (lhs: BitSet, rhs: BitSet) -> BitSet {\n  var out = copyLargest(lhs, rhs)\n  let n = min(lhs.words.count, rhs.words.count)\n  for i in 0..<n {\n    out.words[i] = lhs.words[i] ^ rhs.words[i]\n  }\n  return out\n}\n\nprefix public func ~ (rhs: BitSet) -> BitSet {\n  var out = BitSet(size: rhs.size)\n  for i in 0..<rhs.words.count {\n    out.words[i] = ~rhs.words[i]\n  }\n  out.clearUnusedBits()\n  return out\n}\n\n// MARK: - Bit shift operations\n\n/*\n Note: For bitshift operations, the assumption is that any bits that are\n shifted off the end of the end of the declared size are not still set.\n In other words, we are maintaining the original number of bits.\n */\n\npublic func << (lhs: BitSet, numBitsLeft: Int) -> BitSet {\n    var out = lhs\n    let offset = numBitsLeft / lhs.N\n    let shift = numBitsLeft % lhs.N\n    for i in 0..<lhs.words.count {\n        out.words[i] = 0\n        if (i - offset >= 0) {\n            out.words[i] = lhs.words[i - offset] << shift\n        }\n        if (i - offset - 1 >= 0) {\n            out.words[i] |= lhs.words[i - offset - 1] >> (lhs.N - shift)\n        }\n    }\n    \n    out.clearUnusedBits()\n    return out\n}\n\npublic func >> (lhs: BitSet, numBitsRight: Int) -> BitSet {\n    var out = lhs\n    let offset = numBitsRight / lhs.N\n    let shift = numBitsRight % lhs.N\n    for i in 0..<lhs.words.count {\n        out.words[i] = 0\n        if (i + offset < lhs.words.count) {\n            out.words[i] = lhs.words[i + offset] >> shift\n        }\n        if (i + offset + 1 < lhs.words.count) {\n            out.words[i] |= lhs.words[i + offset + 1] << (lhs.N - shift)\n        }\n    }\n    \n    out.clearUnusedBits()\n    return out\n}\n\n// MARK: - Debugging\n\nextension UInt64 {\n  /* Writes the bits in little-endian order, LSB first. */\n  public func bitsToString() -> String {\n    var s = \"\"\n    var n = self\n    for _ in 1...64 {\n      s += ((n & 1 == 1) ? \"1\" : \"0\")\n      n >>= 1\n    }\n    return s\n  }\n}\n\nextension BitSet: CustomStringConvertible {\n  public var description: String {\n    var s = \"\"\n    for x in words {\n      s += x.bitsToString() + \" \"\n    }\n    return s\n  }\n}\n"
  },
  {
    "path": "Bit Set/BitSet.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx' last-migration='1000'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Bit Set/BitSet.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Bit Set/BitSet.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Bit Set/README.markdown",
    "content": "# Bit Set\n\nA fixed-size sequence of *n* bits. Also known as bit array or bit vector.\n\nTo store whether something is true or false you use a `Bool`. Every programmer knows that... But what if you need to remember whether 10,000 things are true or not?\n\nYou could make an array of 10,000 booleans but you can also go hardcore and use 10,000 bits instead. That's a lot more compact because 10,000 bits fit in less than 160 `Int`s on a 64-bit CPU.\n\nSince manipulating individual bits is a little tricky, you can use `BitSet` to hide the dirty work.\n\n## The code\n\nA bit set is simply a wrapper around an array. The array doesn't store individual bits but larger integers called the \"words\". The main job of `BitSet` is to map the bits to the right word.\n\n```swift\npublic struct BitSet {\n  private(set) public var size: Int\n\n  private let N = 64\n  public typealias Word = UInt64\n  fileprivate(set) public var words: [Word]\n\n  public init(size: Int) {\n    precondition(size > 0)\n    self.size = size\n\n    // Round up the count to the next multiple of 64.\n    let n = (size + (N-1)) / N\n    words = [Word](repeating: 0, count: n)\n  }\n```\n\n`N` is the bit size of the words. It is 64 because we store the bits in a list of unsigned 64-bit integers. (It's fairly easy to change `BitSet` to use 32-bit words instead.)\n\nIf you write,\n\n```swift\nvar bits = BitSet(size: 140)\n```\n\nthen the `BitSet` allocates an array of three words. Each word has 64 bits and therefore three words can hold 192 bits. We only use 140 of those bits so we're wasting a bit of space (but of course we can never use less than a whole word).\n\n> **Note:** The first entry in the `words` array is the least-significant word, so these words are stored in little endian order in the array.\n\n## Looking up the bits\n\nMost of the operations on `BitSet` take the index of the bit as a parameter, so it's useful to have a way to find which word contains that bit.\n\n```swift\n  private func indexOf(_ i: Int) -> (Int, Word) {\n    precondition(i >= 0)\n    precondition(i < size)\n    let o = i / N\n    let m = Word(i - o*N)\n    return (o, 1 << m)\n  }\n```\n\nThe `indexOf()` function returns the array index of the word, as well as a \"mask\" that shows exactly where the bit sits inside that word.\n\nFor example, `indexOf(2)` returns the tuple `(0, 4)` because bit 2 is in the first word (index 0). The mask is 4. In binary the mask looks like the following:\n\n\t0010000000000000000000000000000000000000000000000000000000000000\n\nThat 1 points at the second bit in the word.\n\n> **Note:** Remember that everything is shown in little-endian order, including the bits themselves. Bit 0 is on the left, bit 63 on the right.\n\nAnother example: `indexOf(127)` returns the tuple `(1, 9223372036854775808)`. It is the last bit of the second word. The mask is:\n\n\t0000000000000000000000000000000000000000000000000000000000000001\n\nNote that the mask is always 64 bits because we look at the data one word at a time.\n\n## Setting and getting bits\n\nNow that we know where to find a bit, setting it to 1 is easy:\n\n```swift\n  public mutating func set(_ i: Int) {\n    let (j, m) = indexOf(i)\n    words[j] |= m\n  }\n```\n\nThis looks up the word index and the mask, then performs a bitwise OR between that word and the mask. If the bit was 0 it becomes 1. If it was already set, then it remains set.\n\nClearing the bit -- i.e. changing it to 0 -- is just as easy:\n\n```swift\n  public mutating func clear(_ i: Int) {\n    let (j, m) = indexOf(i)\n    words[j] &= ~m\n  }\n```\n\nInstead of a bitwise OR we now do a bitwise AND with the inverse of the mask. So if the mask was `00100000...0`, then the inverse is `11011111...1`. All the bits are 1, except for the bit we want to set to 0. Due to the way `&` works, this leaves all other bits alone and only changes that single bit to 0.\n\nTo see if a bit is set we also use the bitwise AND but without inverting:\n\n```swift\n  public func isSet(_ i: Int) -> Bool {\n    let (j, m) = indexOf(i)\n    return (words[j] & m) != 0\n  }\n```\n\nWe can add a subscript function to make this all very natural to express:\n\n```swift\n  public subscript(i: Int) -> Bool {\n    get { return isSet(i) }\n    set { if newValue { set(i) } else { clear(i) } }\n  }\n```\n\nNow you can write things like:\n\n```swift\nvar bits = BitSet(size: 140)\nbits[2] = true\nbits[99] = true\nbits[128] = true\nprint(bits)\n```\n\nThis will print the three words that the 140-bit `BitSet` uses to store everything:\n\n```swift\n0010000000000000000000000000000000000000000000000000000000000000\n0000000000000000000000000000000000010000000000000000000000000000\n1000000000000000000000000000000000000000000000000000000000000000\n```\n\nSomething else that's fun to do with bits is flipping them. This changes 0 into 1 and 1 into 0. Here's `flip()`:\n\n```swift\n  public mutating func flip(_ i: Int) -> Bool {\n    let (j, m) = indexOf(i)\n    words[j] ^= m\n    return (words[j] & m) != 0\n  }\n```\n\nThis uses the remaining bitwise operator, exclusive-OR, to do the flipping. The function also returns the new value of the bit.\n\n## Ignoring the unused bits\n\nA lot of the `BitSet` functions are quite easy to implement. For example, `clearAll()`, which resets all the bits to 0:\n\n```swift\n  public mutating func clearAll() {\n    for i in 0..<words.count {\n      words[i] = 0\n    }\n  }\n```\n\nThere is also `setAll()` to make all the bits 1. However, this has to deal with a subtle issue.\n\n```swift\n  public mutating func setAll() {\n    for i in 0..<words.count {\n      words[i] = allOnes\n    }\n    clearUnusedBits()\n  }\n```\n\nFirst, we copy ones into all the words in our array. The array is now:\n\n```swift\n1111111111111111111111111111111111111111111111111111111111111111\n1111111111111111111111111111111111111111111111111111111111111111\n1111111111111111111111111111111111111111111111111111111111111111\n```\n\nBut this is incorrect... Since we don't use most of the last word, we should leave those bits at 0:\n\n```swift\n1111111111111111111111111111111111111111111111111111111111111111\n1111111111111111111111111111111111111111111111111111111111111111\n1111111111110000000000000000000000000000000000000000000000000000\n```\n\nInstead of 192 one-bits we now have only 140 one-bits. The fact that the last word may not be completely filled up means that we always have to treat this last word specially.\n\nSetting those \"leftover\" bits to 0 is what the `clearUnusedBits()` helper function does. If the `BitSet`'s size is not a multiple of `N` (i.e. 64), then we have to clear out the bits that we're not using. If we don't do this, bitwise operations between two differently sized `BitSet`s will go wrong (an example follows).\n\nThis uses some advanced bit manipulation, so pay close attention:\n\n```swift\n  private func lastWordMask() -> Word {\n    let diff = words.count*N - size       // 1\n    if diff > 0 {\n      let mask = 1 << Word(63 - diff)     // 2\n      return mask | (mask - 1)            // 3\n    } else {\n      return ~Word()\n    }\n  }\n\n  private mutating func clearUnusedBits() {\n    words[words.count - 1] &= lastWordMask()   // 4\n  }  \n```\n\nHere's what it does, step-by-step:\n\n1) `diff` is the number of \"leftover\" bits. In the above example that is 52 because `3*64 - 140 = 52`.\n\n2) Create a mask that is all 0's, except the highest bit that's still valid is a 1. In our example, that would be:\n\n\t0000000000010000000000000000000000000000000000000000000000000000\n\n3) Subtract 1 to turn it into:\n\n\t1111111111100000000000000000000000000000000000000000000000000000\n\nand add the high bit back in to get:\n\n\t1111111111110000000000000000000000000000000000000000000000000000\n\nThere are now 12 one-bits in this word because `140 - 2*64 = 12`.\n\n4) Finally, turn all the higher bits off. Any leftover bits in the last word are now all 0.\n\nAn example of where this is important is when you combine two `BitSet`s of different sizes. For the sake of illustration, let's take the bitwise OR between two 8-bit values:\n\n\t10001111  size=4\n\t00100011  size=8\n\nThe first one only uses the first 4 bits; the second one uses 8 bits. The first one should really be `10000000` but let's pretend we forgot to clear out those 1's at the end. Then a bitwise OR between the two results in:\n\n\t10001111  \n\t00100011  \n\t-------- OR\n\t10101111\n\nThat is wrong since two of those 1-bits aren't supposed to be here. The correct way to do it is:\n\n\t10000000       unused bits set to 0 first!\n\t00100011  \n\t-------- OR\n\t10100011\n\nHere's how the `|` operator is implemented:\n\n```swift\npublic func |(lhs: BitSet, rhs: BitSet) -> BitSet {\n  var out = copyLargest(lhs, rhs)\n  let n = min(lhs.words.count, rhs.words.count)\n  for i in 0..<n {\n    out.words[i] = lhs.words[i] | rhs.words[i]\n  }\n  return out\n}\n```\n\nNote that we `|` entire words together, not individual bits. That would be way too slow! We also need to do some extra work if the left-hand side and right-hand side have a different number of bits: we copy the largest of the two `BitSet`s into the `out` variable and then combine it with the words from the smaller `BitSet`.\n\nExample:\n\n```swift\nvar a = BitSet(size: 4)\na.setAll()\na[1] = false\na[2] = false\na[3] = false\nprint(a)\n\nvar b = BitSet(size: 8)\nb[2] = true\nb[6] = true\nb[7] = true\nprint(b)\n\nlet c = a | b\nprint(c)        // 1010001100000000...0\n```\n\nBitwise AND (`&`), exclusive-OR (`^`), and inversion (`~`) are implemented in a similar manner.\n\n## Counting the number of 1-bits\n\nTo count the number of bits that are set to 1 we could scan through the entire array -- an **O(n)** operation -- but there's a more clever method:\n\n```swift\n  public var cardinality: Int {\n    var count = 0\n    for var x in words {\n      while x != 0 {\n        let y = x & ~(x - 1)  // find lowest 1-bit\n        x = x ^ y             // and erase it\n        ++count\n      }\n    }\n    return count\n  }\n```\n\nWhen you write `x & ~(x - 1)`, it gives you a new value with only a single bit set. This is the lowest bit that is one. For example take this 8-bit value (again, I'm showing this with the least significant bit on the left):\n\n\t00101101\n\nFirst we subtract 1 to get:\n\n\t11001101\n\nThen we invert it, flipping all the bits:\n\n\t00110010\n\nAnd take the bitwise AND with the original value:\n\n\t00101101\n\t00110010\n\t-------- AND\n\t00100000\n\nThe only value they have in common is the lowest (or least significant) 1-bit. Then we erase that from the original value using exclusive-OR:\n\n\t00101101\n\t00100000\n\t-------- XOR\n\t00001101\n\nThis is the original value but with the lowest 1-bit removed.\n\nWe keep repeating this process until the value consists of all zeros. The time complexity is **O(s)** where **s** is the number of 1-bits.\n\n## Bit Shift Operations\n\nBit shifts are a common and very useful mechanism when dealing with bitsets. Here is the right-shift function:\n\n```\npublic func >> (lhs: BitSet, numBitsRight: Int) -> BitSet {\n    var out = lhs\n    let offset = numBitsRight / lhs.N\n    let shift = numBitsRight % lhs.N\n    for i in 0..<lhs.words.count {\n        out.words[i] = 0\n        \n        if (i + offset < lhs.words.count) {\n            out.words[i] = lhs.words[i + offset] >> shift\n        }\n        \n        if (i + offset + 1 < lhs.words.count) {\n            out.words[i] |= lhs.words[i + offset + 1] << (lhs.N - shift)\n        }\n    }\n\n    out.clearUnusedBits()\n    return out\n}\n```\n\nLet's start with this line:\n\n```swift\nfor i in 0..<lhs.words.count {\n```\n\nThis indicates our strategy: we want to go through each word of the result and assign the correct bits.\n\nThe two internal if-statements inside this loop are assigning some bits from one place in the source number and bitwise OR-ing them with some bits from a second place in the source number. The key insight here is that the bits for any one word of the result comes from at most two source words in the input. So the only remaining trick is to calculate which ones. For this, we need these two numbers:\n\n```swift\nlet offset = numBitsRight / lhs.N\nlet shift = numBitsRight % lhs.N\n```\n\nOffset gives us how many words away from the source word we start getting our bits (with the remainder coming from it's neighbour). Shift gives us how many bits we need to shift within that word. Note that both of these are calcuated using the word size `lhs.N`.\n\nAll that's left if a little bit of protection against reading outside the bounds of the input. So these two if conditions protect against that:\n```swift\nif (i + offset < lhs.words.count) {\n```\nand\n```swift\nif (i + offset + 1 < lhs.words.count) {\n```\n\nLet's work through an example. Suppose our word length has been reduced to 8 bits, and we'd like to right-shift the following number by 10 bits:\n\n    01000010 11000000 00011100      >> 10\n\nI've grouped each part of the number by word to make it easier to see what happens. The for-loop goes from least significant word to most significant. So for index zero we're want to know what bits will make up our least significant word. Let's calculate our offset and shift values:\n\n    offset = 10 / 8 = 1     (remember this is integer division)\n    shift = 10 % 8 = 2\n\nSo we consult the word at offset 1 to get some of our bits:\n\n    11000000 >> 2 = 00110000\n\nAnd we get the rest of them from the word one further away:\n\n    01000010 << (8 - 2) = 10000000\n    \nAnd we bitwise OR these together to get our least significant term\n\n    00110000\n    10000000\n    -------- OR\n    10110000\n\nWe repeat this for the 2nd least significant term and obtain:\n\n    00010000\n\nThe last term can't get any bits because they are past the end of our number so those are all zeros. Our result is:\n\n    00000000 00010000 10110000\n\n## See also\n\n[Bit Twiddling Hacks](http://graphics.stanford.edu/~seander/bithacks.html)\n\n*Written for Swift Algorithm Club by Matthijs Hollemans*\n"
  },
  {
    "path": "Bloom Filter/BloomFilter.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\npublic class BloomFilter<T> {\n  fileprivate var array: [Bool]\n  private var hashFunctions: [(T) -> Int]\n\n  public init(size: Int = 1024, hashFunctions: [(T) -> Int]) {\n    self.array = [Bool](repeating: false, count: size)\n    self.hashFunctions = hashFunctions\n  }\n\n  private func computeHashes(_ value: T) -> [Int] {\n    return hashFunctions.map { hashFunc in abs(hashFunc(value) % array.count) }\n  }\n\n  public func insert(_ element: T) {\n    for hashValue in computeHashes(element) {\n      array[hashValue] = true\n    }\n  }\n\n  public func insert(_ values: [T]) {\n    for value in values {\n      insert(value)\n    }\n  }\n\n  public func query(_ value: T) -> Bool {\n    let hashValues = computeHashes(value)\n\n    // Map hashes to indices in the Bloom Filter\n    let results = hashValues.map { hashValue in array[hashValue] }\n\n    // All values must be 'true' for the query to return true\n\n    // This does NOT imply that the value is in the Bloom filter,\n    // only that it may be. If the query returns false, however,\n    // you can be certain that the value was not added.\n\n    let exists = results.reduce(true, { $0 && $1 })\n    return exists\n  }\n\n  public func isEmpty() -> Bool {\n    // As soon as the reduction hits a 'true' value, the && condition will fail.\n    return array.reduce(true) { prev, next in prev && !next }\n  }\n}\n\n/* Two hash functions, adapted from http://www.cse.yorku.ca/~oz/hash.html */\n\nfunc djb2(x: String) -> Int {\n  var hash = 5381\n  for char in x {\n    hash = ((hash << 5) &+ hash) &+ char.hashValue\n  }\n  return Int(hash)\n}\n\nfunc sdbm(x: String) -> Int {\n  var hash = 0\n  for char in x {\n    hash = char.hashValue &+ (hash << 6) &+ (hash << 16) &- hash\n  }\n  return Int(hash)\n}\n\n/* A simple test */\n\nlet bloom = BloomFilter<String>(size: 17, hashFunctions: [djb2, sdbm])\n\nbloom.insert(\"Hello world!\")\nprint(bloom.array)\n\nbloom.query(\"Hello world!\")    // true\nbloom.query(\"Hello WORLD\")     // false\n\nbloom.insert(\"Bloom Filterz\")\nprint(bloom.array)\n\nbloom.query(\"Bloom Filterz\")   // true\nbloom.query(\"Hello WORLD\")     // false or true: It may return true due to a false positive, but it's not guaranteed.\n"
  },
  {
    "path": "Bloom Filter/BloomFilter.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Bloom Filter/BloomFilter.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Bloom Filter/BloomFilter.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Bloom Filter/BloomFilter.swift",
    "content": "public class BloomFilter<T> {\n  private var array: [Bool]\n  private var hashFunctions: [(T) -> Int]\n\n  public init(size: Int = 1024, hashFunctions: [(T) -> Int]) {\n    self.array = [Bool](repeating: false, count: size)\n    self.hashFunctions = hashFunctions\n  }\n\n  private func computeHashes(_ value: T) -> [Int] {\n    return hashFunctions.map { hashFunc in abs(hashFunc(value) % array.count) }\n  }\n\n  public func insert(_ element: T) {\n    for hashValue in computeHashes(element) {\n      array[hashValue] = true\n    }\n  }\n\n  public func insert(_ values: [T]) {\n    for value in values {\n      insert(value)\n    }\n  }\n\n  public func query(_ value: T) -> Bool {\n    let hashValues = computeHashes(value)\n\n    // Map hashes to indices in the Bloom Filter\n    let results = hashValues.map { hashValue in array[hashValue] }\n\n    // All values must be 'true' for the query to return true\n\n    // This does NOT imply that the value is in the Bloom filter,\n    // only that it may be. If the query returns false, however,\n    // you can be certain that the value was not added.\n\n    let exists = results.reduce(true, { $0 && $1 })\n    return exists\n  }\n\n  public func isEmpty() -> Bool {\n    // As soon as the reduction hits a 'true' value, the && condition will fail.\n    return array.reduce(true) { prev, next in prev && !next }\n  }\n}\n"
  },
  {
    "path": "Bloom Filter/README.markdown",
    "content": "# Bloom Filter\n\n## Introduction\n\nA Bloom Filter is a space-efficient data structure that tells you whether or not an element is present in a set.\n\nThis is a probabilistic data structure: a query to a Bloom filter either returns `false`, meaning the element is definitely not in the set, or `true`, meaning that the element *might* be in the set.\n\nThere is a small probability of false positives, where the element isn't actually in the set even though the query returned `true`. But there will never any false negatives: you're guaranteed that if the query returns `false`, then the element really isn't in the set.\n\nSo a Bloom Filter tells you, \"definitely not\" or \"probably yes\".\n\nAt first, this may not seem too useful. However, it's important in applications like cache filtering and data synchronization.\n\nAn advantage of the Bloom Filter over a hash table is that the former maintains constant memory usage and constant-time insert and search. For sets with a large number of elements, the performance difference between a hash table and a Bloom Filter is significant, and it is a viable option if you do not need the guarantee of no false positives.\n\n> **Note:** Unlike a hash table, the Bloom Filter does not store the actual objects. It just remembers what objects you’ve seen (with a degree of uncertainty) and which ones you haven’t.\n\n## Inserting objects into the set\n\nA Bloom Filter is essentially a fixed-length [bit vector](../Bit%20Set/), an array of bits. When we insert objects, we set some of these bits to `1`, and when we query for objects we check if certain bits are `0` or `1`. Both operations use hash functions.\n\nTo insert an element in the filter, the element is hashed with several different hash functions. Each hash function returns a value that we map to an index in the array. We then set the bits at these indices to `1` or true.\n\nFor example, let's say this is our array of bits. We have 17 bits and initially they are all `0` or false:\n\n\t[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]\n\nNow we want to insert the string `\"Hello world!\"` into the Bloom Filter. We apply two hash functions to this string. The first one gives the value 1999532104120917762. We map this hash value to an index into our array by taking the modulo of the array length: `1999532104120917762 % 17 = 4`. This means we set the bit at index 4 to `1` or true:\n\n\t[ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]\n\nThen we hash the original string again but this time with a different hash function. It gives the hash value 9211818684948223801. Modulo 17 that is 12, and we set the bit at index 12 to `1` as well:\n\n\t[ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 ]\n\nThese two 1-bits are enough to tell the Bloom Filter that it now contains the string `\"Hello world!\"`. Of course, it doesn't contain the actual string, so you can't ask the Bloom Filter, \"give me a list of all the objects you contain\". All it has is a bunch of ones and zeros.\n\n## Querying the set\n\nQuerying, similarly to inserting, is accomplished by first hashing the expected value, which gives several array indices, and then checking to see if all of the bits at those indices are `1`. If even one of the bits is not `1`, the element could not have been inserted and the query returns `false`. If all the bits are `1`, the query returns `true`.\n\nFor example, if we query for the string `\"Hello WORLD\"`, then the first hash function returns 5383892684077141175, which modulo 17 is 12. That bit is `1`. But the second hash function gives 5625257205398334446, which maps to array index 9. That bit is `0`. This means the string `\"Hello WORLD\"` is not in the filter and the query returns `false`.\n\nThe fact that the first hash function mapped to a `1` bit is a coincidence (it has nothing to do with the fact that both strings start with `\"Hello \"`). Too many such coincidences can lead to \"collisions\". If there are collisions, the query may erroneously return `true` even though the element was not inserted -- bringing about the issue with false positives mentioned earlier.\n\nLet's say we insert some other element, `\"Bloom Filterz\"`, which sets bits 7 and 9. Now the array looks like this:\n\n\t[ 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0 ]\n\nIf you query for `\"Hello WORLD\"` again, the filter sees that bit 12 is true and bit 9 is now true as well. It reports that `\"Hello WORLD\"` is indeed present in the set, even though it isn't... because we never inserted that particular string. It's a false positive. This example shows why a Bloom Filter will never say, \"definitely yes\", only \"probably yes\".\n\nYou can fix such issues by using an array with more bits and using additional hash functions. Of course, the more hash functions you use the slower the Bloom Filter will be. So you have to strike a balance.\n\nDeletion is not possible with a Bloom Filter, since any one bit might belong to multiple elements. Once you add an element, it's in there for good.\n\nPerformance of a Bloom Filter is **O(k)** where **k** is the number of hashing functions.\n\n## The code\n\nThe code is quite straightforward. The internal bit array is set to a fixed length on initialization, which cannot be mutated once it is initialized.\n\n```swift\npublic init(size: Int = 1024, hashFunctions: [(T) -> Int]) {\n\tself.array = [Bool](repeating: false, count: size)\n  self.hashFunctions = hashFunctions\n}\n```\n\nSeveral hash functions should be specified at initialization. Which hash functions you use will depend on the datatypes of the elements you'll be adding to the set. You can see some examples in the playground and the tests -- the `djb2` and `sdbm` hash functions for strings.\n\nInsertion just flips the required bits to `true`:\n\n```swift\npublic func insert(_ element: T) {\n  for hashValue in computeHashes(element) {\n    array[hashValue] = true\n  }\n}\n```\n\nThis uses the `computeHashes()` function, which loops through the specified `hashFunctions` and returns an array of indices:\n\n```swift\nprivate func computeHashes(_ value: T) -> [Int] {\n  return hashFunctions.map() { hashFunc in abs(hashFunc(value) % array.count) }\n}\n```\n\nAnd querying checks to make sure the bits at the hashed values are `true`:\n\n```swift\npublic func query(_ value: T) -> Bool {\n  let hashValues = computeHashes(value)\n  let results = hashValues.map() { hashValue in array[hashValue] }\n\tlet exists = results.reduce(true, { $0 && $1 })\n  return exists\n}\n```\n\nIf you're coming from another imperative language, you might notice the unusual syntax in the `exists` assignment. Swift makes use of functional paradigms when it makes code more consise and readable, and in this case `reduce` is a much more consise way to check if all the required bits are `true` than a `for` loop.\n\n## Another approach\n\nIn the previous section, you learnt about how using multiple different hash functions can help reduce the chance of collisions in the bloom filter. However, good hash functions are difficult to design. A simple alternative to multiple hash functions is to use a set of random numbers.\n\nAs an example, let's say a bloom filter wants to hash each element 15 times during insertion. Instead of using 15 different hash functions, you can rely on just one hash function. The hash value can then be combined with 15 different values to form the indices for flipping. This bloom filter would initialize a set of 15 random numbers ahead of time and use these values during each insertion.\n\n```\nhash(\"Hello world!\") >> hash(987654321) // would flip bit 8\nhash(\"Hello world!\") >> hash(123456789) // would flip bit 2\n```\n\nSince Swift 4.2, `Hasher` is now included in the Standard library, which is designed to reduce multiple hashes to a single hash in an efficient manner. This makes combining the hashes trivial.\n\n```\nprivate func computeHashes(_ value: T) -> [Int] {\n  return randomSeeds.map() { seed in\n\t\tlet hasher = Hasher()\n\t\thasher.combine(seed)\n\t\thasher.combine(value)\n\t\tlet hashValue = hasher.finalize()\n\t\treturn abs(hashValue % array.count)\n\t}\n}\n```\n\nIf you want to learn more about this approach, you can read about the [Hasher documentation](https://developer.apple.com/documentation/swift/hasher) or Soroush Khanlou's [Swift 4.2 Bloom filter](http://khanlou.com/2018/09/bloom-filters/) implementation.\n\n*Written for Swift Algorithm Club by Jamil Dhanani. Edited by Matthijs Hollemans. Updated by Bruno Scheele.*\n"
  },
  {
    "path": "Bloom Filter/Tests/BloomFilterTests.swift",
    "content": "import XCTest\n\n/* Two hash functions, adapted from\n http://www.cse.yorku.ca/~oz/hash.html */\n\nfunc djb2(_ x: String) -> Int {\n  var hash = 5381\n\n  for char in x {\n    hash = ((hash << 5) &+ hash) &+ char.hashValue\n  }\n\n  return Int(hash)\n}\n\nfunc sdbm(_ x: String) -> Int {\n  var hash = 0\n\n  for char in x {\n    hash = char.hashValue &+ (hash << 6) &+ (hash << 16) &- hash\n  }\n\n  return Int(hash)\n}\n\nclass BloomFilterTests: XCTestCase {\n    func testSwift4(){\n        // last checked with Xcode 9.0b4\n        #if swift(>=4.0)\n            print(\"Hello, Swift 4!\")\n        #endif\n    }\n  func testSingleHashFunction() {\n    let bloom = BloomFilter<String>(hashFunctions: [djb2])\n\n    bloom.insert(\"Hello world!\")\n\n    let result_good = bloom.query(\"Hello world!\")\n    let result_bad = bloom.query(\"Hello world\")\n\n    XCTAssertTrue(result_good)\n    XCTAssertFalse(result_bad)\n  }\n\n  func testEmptyFilter() {\n    let bloom = BloomFilter<String>(hashFunctions: [djb2])\n\n    let empty = bloom.isEmpty()\n\n    XCTAssertTrue(empty)\n  }\n\n  func testMultipleHashFunctions() {\n    let bloom = BloomFilter<String>(hashFunctions: [djb2, sdbm])\n\n    bloom.insert(\"Hello world!\")\n\n    let result_good = bloom.query(\"Hello world!\")\n    let result_bad = bloom.query(\"Hello world\")\n\n    XCTAssertTrue(result_good)\n    XCTAssertFalse(result_bad)\n  }\n\n  func testFalsePositive() {\n    let bloom = BloomFilter<String>(size: 5, hashFunctions: [djb2, sdbm])\n\n    bloom.insert([\"hello\", \"elloh\", \"llohe\", \"lohel\", \"ohell\"])\n\n    print(\"Inserted\")\n\n    let query = bloom.query(\"This wasn't inserted!\")\n\n    // This is true even though we did not insert the value in the Bloom filter;\n    // the Bloom filter is capable of producing false positives but NOT\n    // false negatives.\n\n    XCTAssertTrue(query)\n  }\n}\n"
  },
  {
    "path": "Bloom Filter/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Bloom Filter/Tests/Tests.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t7B80C3D01C77A263003CECC7 /* BloomFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C3CF1C77A263003CECC7 /* BloomFilter.swift */; };\n\t\t7B95D1E41C861DAA00760793 /* BloomFilterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B95D1E31C861DAA00760793 /* BloomFilterTests.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t7B2BBC801C779D720067B71D /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7B2BBC941C779E7B0067B71D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };\n\t\t7B80C3CF1C77A263003CECC7 /* BloomFilter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BloomFilter.swift; path = ../BloomFilter.swift; sourceTree = SOURCE_ROOT; };\n\t\t7B95D1E31C861DAA00760793 /* BloomFilterTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BloomFilterTests.swift; sourceTree = SOURCE_ROOT; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t7B2BBC7D1C779D720067B71D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t7B2BBC681C779D710067B71D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC831C779D720067B71D /* Tests */,\n\t\t\t\t7B2BBC721C779D710067B71D /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC721C779D710067B71D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC801C779D720067B71D /* Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC831C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B80C3CF1C77A263003CECC7 /* BloomFilter.swift */,\n\t\t\t\t7B95D1E31C861DAA00760793 /* BloomFilterTests.swift */,\n\t\t\t\t7B2BBC941C779E7B0067B71D /* Info.plist */,\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tpath = TestsTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t7B2BBC7F1C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t7B2BBC7C1C779D720067B71D /* Sources */,\n\t\t\t\t7B2BBC7D1C779D720067B71D /* Frameworks */,\n\t\t\t\t7B2BBC7E1C779D720067B71D /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tproductName = TestsTests;\n\t\t\tproductReference = 7B2BBC801C779D720067B71D /* Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t7B2BBC691C779D710067B71D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0720;\n\t\t\t\tLastUpgradeCheck = 1000;\n\t\t\t\tORGANIZATIONNAME = \"Swift Algorithm Club\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t7B2BBC7F1C779D720067B71D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2;\n\t\t\t\t\t\tLastSwiftMigration = 1000;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 7B2BBC681C779D710067B71D;\n\t\t\tproductRefGroup = 7B2BBC721C779D710067B71D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t7B2BBC7F1C779D720067B71D /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t7B2BBC7E1C779D720067B71D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t7B2BBC7C1C779D720067B71D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7B80C3D01C77A263003CECC7 /* BloomFilter.swift in Sources */,\n\t\t\t\t7B95D1E41C861DAA00760793 /* BloomFilterTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t7B2BBC871C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC881C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t7B2BBC8D1C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC8E1C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC871C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC881C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC8D1C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC8E1C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 7B2BBC691C779D710067B71D /* Project object */;\n}\n"
  },
  {
    "path": "Bloom Filter/Tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Tests.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Bloom Filter/Tests/Tests.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Bloom Filter/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1000\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Bounded Priority Queue/BoundedPriorityQueue.playground/Contents.swift",
    "content": "struct Message: Comparable, CustomStringConvertible {\n  let name: String\n  let priority: Int\n\n  var description: String {\n    return \"\\(name):\\(priority)\"\n  }\n}\n\nfunc == (m1: Message, m2: Message) -> Bool {\n  return m1.priority == m2.priority\n}\n\nfunc < (m1: Message, m2: Message) -> Bool {\n  return m1.priority < m2.priority\n}\n\nlet queue = BoundedPriorityQueue<Message>(maxElements: 5)\nqueue.count\n\nqueue.enqueue(Message(name: \"hello\", priority: 100))\nqueue.count\nqueue.peek()\nprint(queue)\n\nqueue.enqueue(Message(name: \"there\", priority: 99))\nqueue.count\nqueue.peek()\nprint(queue)\n\nqueue.enqueue(Message(name: \"world\", priority: 150))\nqueue.count\nqueue.peek()\nprint(queue)\n\nqueue.enqueue(Message(name: \"swift\", priority: 110))\nqueue.count\nqueue.peek()\nprint(queue)\n\nqueue.enqueue(Message(name: \"is\", priority: 30))\nqueue.count\nqueue.peek()\nprint(queue)\n\n// At this point, the queue is:\n// <world:150, swift:110, hello:100, there:99, is:30, >\n\n// Try to insert an item with a really low priority. This should not get added.\nqueue.enqueue(Message(name: \"very\", priority: -1))\nqueue.count    // 5\nqueue.peek()\nprint(queue)   // still same as before\n\n// Try to insert an item with medium priority. This gets added and the lowest\n// priority item is removed.\nqueue.enqueue(Message(name: \"cool\", priority: 120))\nqueue.count\nqueue.peek()\nprint(queue)\n\n// Try to insert an item with very high priority. This gets added and the\n// lowest priority item is removed.\nqueue.enqueue(Message(name: \"!!!\", priority: 500))\nqueue.count\nqueue.peek()\nprint(queue)\n\n// Test dequeuing\nqueue.dequeue()\nqueue.count\nqueue.peek()\nprint(queue)\n\nqueue.dequeue()\nqueue.count\nqueue.peek()\nprint(queue)\n\nqueue.dequeue()\nqueue.count\nqueue.peek()\nprint(queue)\n\nqueue.dequeue()\nqueue.count\nqueue.peek()\nprint(queue)\n\nqueue.dequeue()\nqueue.count\nqueue.peek()\nprint(queue)\n\nqueue.dequeue()\nqueue.count\nqueue.peek()\nprint(queue)\n"
  },
  {
    "path": "Bounded Priority Queue/BoundedPriorityQueue.playground/Sources/BoundedPriorityQueue.swift",
    "content": "public class LinkedListNode<T: Comparable> {\n  var value: T\n  var next: LinkedListNode?\n  var previous: LinkedListNode?\n\n  public init(value: T) {\n    self.value = value\n  }\n}\n\npublic class BoundedPriorityQueue<T: Comparable> {\n  fileprivate typealias Node = LinkedListNode<T>\n\n  private(set) public var count = 0\n  fileprivate var head: Node?\n  private var tail: Node?\n  private var maxElements: Int\n\n  public init(maxElements: Int) {\n    self.maxElements = maxElements\n  }\n\n  public var isEmpty: Bool {\n    return count == 0\n  }\n\n  public func peek() -> T? {\n    return head?.value\n  }\n\n  public func enqueue(_ value: T) {\n    if let node = insert(value, after: findInsertionPoint(value)) {\n      // If the newly inserted node is the last one in the list, then update\n      // the tail pointer.\n      if node.next == nil {\n        tail = node\n      }\n\n      // If the queue is full, then remove an element from the back.\n      count += 1\n      if count > maxElements {\n        removeLeastImportantElement()\n      }\n    }\n  }\n\n  private func insert(_ value: T, after: Node?) -> Node? {\n    if let previous = after {\n\n      // If the queue is full and we have to insert at the end of the list,\n      // then there's no reason to insert the new value.\n      if count == maxElements && previous.next == nil {\n        print(\"Queue is full and priority of new object is too small\")\n        return nil\n      }\n\n      // Put the new node in between previous and previous.next (if exists).\n      let node = Node(value: value)\n      node.next = previous.next\n      previous.next?.previous = node\n      previous.next = node\n      node.previous = previous\n      return node\n\n    } else if let first = head {\n      // Have to insert at the head, so shift the existing head up once place.\n      head = Node(value: value)\n      head!.next = first\n      first.previous = head\n      return head\n\n    } else {\n      // This is the very first item in the queue.\n      head = Node(value: value)\n      return head\n    }\n  }\n\n  /* Find the node after which to insert the new value. If this returns nil,\n     the new value should be inserted at the head of the list. */\n  private func findInsertionPoint(_ value: T) -> Node? {\n    var node = head\n    var prev: Node? = nil\n\n    while let current = node, value < current.value {\n      prev = node\n      node = current.next\n    }\n    return prev\n  }\n\n  private func removeLeastImportantElement() {\n    if let last = tail {\n      tail = last.previous\n      tail?.next = nil\n      count -= 1\n    }\n\n    // Note: Instead of using a tail pointer, we could just scan from the new\n    // node until the end. Then nodes also don't need a previous pointer. But\n    // this is much slower on large lists.\n  }\n\n  public func dequeue() -> T? {\n    if let first = head {\n      count -= 1\n      if count == 0 {\n        head = nil\n        tail = nil\n      } else {\n        head = first.next\n        head!.previous = nil\n      }\n      return first.value\n    } else {\n      return nil\n    }\n  }\n}\n\nextension LinkedListNode: CustomStringConvertible {\n  public var description: String {\n    return \"\\(value)\"\n  }\n}\n\nextension BoundedPriorityQueue: CustomStringConvertible {\n  public var description: String {\n    var s = \"<\"\n    var node = head\n    while let current = node {\n      s += \"\\(current), \"\n      node = current.next\n    }\n    return s + \">\"\n  }\n}\n"
  },
  {
    "path": "Bounded Priority Queue/BoundedPriorityQueue.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx' last-migration='1000'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Bounded Priority Queue/BoundedPriorityQueue.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Bounded Priority Queue/BoundedPriorityQueue.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Bounded Priority Queue/BoundedPriorityQueue.swift",
    "content": "open class LinkedListNode<T: Comparable> {\n  var value: T\n  var next: LinkedListNode?\n  var previous: LinkedListNode?\n\n  public init(value: T) {\n    self.value = value\n  }\n}\n\nopen class BoundedPriorityQueue<T: Comparable> {\n  fileprivate typealias Node = LinkedListNode<T>\n\n  fileprivate(set) open var count = 0\n  fileprivate var head: Node?\n  fileprivate var tail: Node?\n  fileprivate var maxElements: Int\n\n  public init(maxElements: Int) {\n    self.maxElements = maxElements\n  }\n\n  open var isEmpty: Bool {\n    return count == 0\n  }\n\n  open func peek() -> T? {\n    return head?.value\n  }\n\n  open func enqueue(_ value: T) {\n    if let node = insert(value, after: findInsertionPoint(value)) {\n      // If the newly inserted node is the last one in the list, then update\n      // the tail pointer.\n      if node.next == nil {\n        tail = node\n      }\n\n      // If the queue is full, then remove an element from the back.\n      count += 1\n      if count > maxElements {\n        removeLeastImportantElement()\n      }\n    }\n  }\n\n  fileprivate func insert(_ value: T, after: Node?) -> Node? {\n    if let previous = after {\n\n      // If the queue is full and we have to insert at the end of the list,\n      // then there's no reason to insert the new value.\n      if count == maxElements && previous.next == nil {\n        print(\"Queue is full and priority of new object is too small\")\n        return nil\n      }\n\n      // Put the new node in between previous and previous.next (if exists).\n      let node = Node(value: value)\n      node.next = previous.next\n      previous.next?.previous = node\n      previous.next = node\n      node.previous = previous\n      return node\n\n    } else if let first = head {\n      // Have to insert at the head, so shift the existing head up once place.\n      head = Node(value: value)\n      head!.next = first\n      first.previous = head\n      return head\n\n    } else {\n      // This is the very first item in the queue.\n      head = Node(value: value)\n      return head\n    }\n  }\n\n  /* Find the node after which to insert the new value. If this returns nil,\n   the new value should be inserted at the head of the list. */\n  fileprivate func findInsertionPoint(_ value: T) -> Node? {\n    var node = head\n    var prev: Node? = nil\n\n    while let current = node, value < current.value {\n      prev = node\n      node = current.next\n    }\n    return prev\n  }\n\n  fileprivate func removeLeastImportantElement() {\n    if let last = tail {\n      tail = last.previous\n      tail?.next = nil\n      count -= 1\n    }\n\n    // Note: Instead of using a tail pointer, we could just scan from the new\n    // node until the end. Then nodes also don't need a previous pointer. But\n    // this is much slower on large lists.\n  }\n\n  open func dequeue() -> T? {\n    if let first = head {\n      count -= 1\n      if count == 0 {\n        head = nil\n        tail = nil\n      } else {\n        head = first.next\n        head!.previous = nil\n      }\n      return first.value\n    } else {\n      return nil\n    }\n  }\n}\n\nextension LinkedListNode: CustomStringConvertible {\n  public var description: String {\n    return \"\\(value)\"\n  }\n}\n\nextension BoundedPriorityQueue: CustomStringConvertible {\n  public var description: String {\n    var s = \"<\"\n    var node = head\n    while let current = node {\n      s += \"\\(current), \"\n      node = current.next\n    }\n    return s + \">\"\n  }\n}\n"
  },
  {
    "path": "Bounded Priority Queue/README.markdown",
    "content": "# Bounded Priority queue\n\nA bounded priority queue is similar to a regular [priority queue](../Priority%20Queue/), except that there is a fixed upper bound on the number of elements that can be stored. When a new element is added to the queue while the queue is at capacity, the element with the highest priority value is ejected from the queue.\n\n## Example\n\nSuppose we have a bounded-priority-queue with maximum size 5 that has the following values and priorities:\n\n```\nValue:    [ A,   B,   C,    D,    E   ]\nPriority: [ 4.6, 3.2, 1.33, 0.25, 0.1 ]\n```\n\nHere, we consider the object with the highest priority value to be the most important (so this is a *max-priority* queue). The larger the priority value, the more we care about the object. So `A` is more important than `B`, `B` is more important than `C`, and so on.\n\nNow we want to insert the element `F` with priority `0.4` into this bounded priority queue. Because the queue has maximum size 5, this will insert the element `F` but then evict the lowest-priority element (`E`), yielding the updated queue:\n\n```\nValue:    [ A,   B,   C,    F,   D    ]\nPriority: [ 4.6, 3.2, 1.33, 0.4, 0.25 ]\n```\n\n`F` is inserted between `C` and `D` because of its priority value. It's less important than `C` but more important than `D`.\n\nSuppose that we wish to insert the element `G` with priority 0.1 into this BPQ. Because `G`'s priority value is less than the minimum-priority element in the queue, upon inserting `G` it will immediately be evicted. In other words, inserting an element into a BPQ with priority less than the minimum-priority element of the BPQ has no effect.\n\n## Implementation\n\nWhile a [heap](../Heap/) may be a really simple implementation for a priority queue, a sorted [linked list](../Linked%20List/) allows for **O(k)** insertion and **O(1)** deletion, where **k** is the bounding number of elements.\n\nHere's how you could implement it in Swift:\n\n```swift\npublic class BoundedPriorityQueue<T: Comparable> {\n  private typealias Node = LinkedListNode<T>\n\n  private(set) public var count = 0\n  fileprivate var head: Node?\n  private var tail: Node?\n  private var maxElements: Int\n\n  public init(maxElements: Int) {\n    self.maxElements = maxElements\n  }\n\n  public var isEmpty: Bool {\n    return count == 0\n  }\n\n  public func peek() -> T? {\n    return head?.value\n  }\n```\n\nThe `BoundedPriorityQueue` class contains a doubly linked list of `LinkedListNode` objects. Nothing special here yet. The fun stuff happens in the `enqueue()` method:\n\n```swift\npublic func enqueue(_ value: T) {\n  if let node = insert(value, after: findInsertionPoint(value)) {\n    // If the newly inserted node is the last one in the list, then update\n    // the tail pointer.\n    if node.next == nil {\n      tail = node\n    }\n\n    // If the queue is full, then remove an element from the back.\n    count += 1\n    if count > maxElements {\n      removeLeastImportantElement()\n    }\n  }\n}\n\nprivate func insert(_ value: T, after: Node?) -> Node? {\n  if let previous = after {\n\n    // If the queue is full and we have to insert at the end of the list,\n    // then there's no reason to insert the new value.\n    if count == maxElements && previous.next == nil {\n      print(\"Queue is full and priority of new object is too small\")\n      return nil\n    }\n\n    // Put the new node in between previous and previous.next (if exists).\n    let node = Node(value: value)\n    node.next = previous.next\n    previous.next?.previous = node\n    previous.next = node\n    node.previous = previous\n    return node\n\n  } else if let first = head {\n    // Have to insert at the head, so shift the existing head up once place.\n    head = Node(value: value)\n    head!.next = first\n    first.previous = head\n    return head\n\n  } else {\n    // This is the very first item in the queue.\n    head = Node(value: value)\n    return head\n  }\n}\n\n/* Find the node after which to insert the new value. If this returns nil,\n   the new value should be inserted at the head of the list. */\nprivate func findInsertionPoint(_ value: T) -> Node? {\n  var node = head\n  var prev: Node? = nil\n\n  while let current = node where value < current.value {\n    prev = node\n    node = current.next\n  }\n  return prev\n}\n\nprivate func removeLeastImportantElement() {\n  if let last = tail {\n    tail = last.previous\n    tail?.next = nil\n    count -= 1\n  }\n\n  // Note: Instead of using a tail pointer, we could just scan from the new\n  // node until the end. Then nodes also don't need a previous pointer. But\n  // this is much slower on large lists.\n}\n```\n\nWe first check if the queue already has the maximum number of elements. If so, and the new priority value is less than the `tail` element's priority value, then there is no room for this new element and we return without inserting it.\n\nIf the new value is acceptable, then we search through the list to find the proper insertion location and update the `next` and `previous` pointers.\n\nLastly, if the queue has now reached the maximum number of elements, then we `dequeue()` the one with the largest priority value.\n\nBy keeping the most important element at the front of the list, it makes dequeueing very easy:\n\n```swift\npublic func dequeue() -> T? {\n  if let first = head {\n    count -= 1\n    if count == 0 {\n      head = nil\n      tail = nil\n    } else {\n      head = first.next\n      head!.previous = nil\n    }\n    return first.value\n  } else {\n    return nil\n  }\n}\n```\n\nThis simply removes the `head` element from the list and returns it.\n\n*Written for Swift Algorithm Club by John Gill and Matthijs Hollemans*\n"
  },
  {
    "path": "Bounded Priority Queue/Tests/BoundedPriorityQueueTests.swift",
    "content": "//\n//  BoundedPriorityQueueTests.swift\n//\n//  Created by John Gill on 2/28/16.\n//\n\nimport Foundation\nimport XCTest\n\nprivate struct Message: Comparable {\n  let name: String\n  let priority: Int\n}\n\nprivate func == (m1: Message, m2: Message) -> Bool {\n  return m1.priority == m2.priority\n}\n\nprivate func < (m1: Message, m2: Message) -> Bool {\n  return m1.priority < m2.priority\n}\n\nprivate func > (m1: Message, m2: Message) -> Bool {\n  return m1.priority > m2.priority\n}\n\nclass BoundedPriorityQueueTest: XCTestCase {\n  func testEmpty() {\n    let queue = BoundedPriorityQueue<Message>(maxElements: 5)\n    XCTAssertTrue(queue.isEmpty)\n    XCTAssertEqual(queue.count, 0)\n    XCTAssertNil(queue.dequeue())\n  }\n\n  func testOneElement() {\n    let queue = BoundedPriorityQueue<Message>(maxElements: 5)\n\n    queue.enqueue(Message(name: \"hello\", priority: 100))\n    XCTAssertFalse(queue.isEmpty)\n    XCTAssertEqual(queue.count, 1)\n\n    let result = queue.dequeue()\n    XCTAssertEqual(result!.priority, 100)\n    XCTAssertTrue(queue.isEmpty)\n    XCTAssertEqual(queue.count, 0)\n  }\n\n  func testMaxElements() {\n    let queue = BoundedPriorityQueue<Message>(maxElements: 5)\n    XCTAssertTrue(queue.isEmpty)\n\n    queue.enqueue(Message(name: \"john\", priority: 100))\n    XCTAssertEqual(queue.count, 1)\n    XCTAssertEqual(queue.peek()?.priority, 100)\n\n    queue.enqueue(Message(name: \"james\", priority: 200))\n    XCTAssertEqual(queue.count, 2)\n    XCTAssertEqual(queue.peek()?.priority, 200)\n\n    queue.enqueue(Message(name: \"mark\", priority: 300))\n    XCTAssertEqual(queue.count, 3)\n    XCTAssertEqual(queue.peek()?.priority, 300)\n\n    queue.enqueue(Message(name: \"ken\", priority: 400))\n    XCTAssertEqual(queue.count, 4)\n    XCTAssertEqual(queue.peek()?.priority, 400)\n\n    queue.enqueue(Message(name: \"thomas\", priority: 500))\n    XCTAssertEqual(queue.count, 5)\n    XCTAssertEqual(queue.peek()?.priority, 500)\n\n    queue.enqueue(Message(name: \"melanie\", priority: 550))\n    XCTAssertEqual(queue.count, 5)\n    XCTAssertEqual(queue.peek()?.priority, 550)\n\n    queue.enqueue(Message(name: \"lily\", priority: 450))\n    XCTAssertEqual(queue.count, 5)\n    XCTAssertEqual(queue.peek()?.priority, 550)\n\n    queue.enqueue(Message(name: \"fred\", priority: 350))\n    XCTAssertEqual(queue.count, 5)\n    XCTAssertEqual(queue.peek()?.priority, 550)\n\n    queue.enqueue(Message(name: \"rachel\", priority: 50))\n    XCTAssertEqual(queue.count, 5)\n    XCTAssertEqual(queue.peek()?.priority, 550)\n\n    var result = queue.dequeue()\n    XCTAssertEqual(result!.priority, 550)\n    XCTAssertEqual(queue.count, 4)\n\n    result = queue.dequeue()\n    XCTAssertEqual(result!.priority, 500)\n    XCTAssertEqual(queue.count, 3)\n\n    result = queue.dequeue()\n    XCTAssertEqual(result!.priority, 450)\n    XCTAssertEqual(queue.count, 2)\n\n    queue.enqueue(Message(name: \"ryan\", priority: 150))\n    XCTAssertEqual(queue.count, 3)\n    XCTAssertEqual(queue.peek()?.priority, 400)\n\n    result = queue.dequeue()\n    XCTAssertEqual(result!.priority, 400)\n    XCTAssertEqual(queue.count, 2)\n\n    result = queue.dequeue()\n    XCTAssertEqual(result!.priority, 350)\n    XCTAssertEqual(queue.count, 1)\n\n    result = queue.dequeue()\n    XCTAssertEqual(result!.priority, 150)\n    XCTAssertEqual(queue.count, 0)\n\n    result = queue.dequeue()\n    XCTAssertNil(result)\n    XCTAssertEqual(queue.count, 0)\n    XCTAssertTrue(queue.isEmpty)\n  }\n}\n"
  },
  {
    "path": "Bounded Priority Queue/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Bounded Priority Queue/Tests/Tests.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\tB810B5B11C83E3B200450324 /* BoundedPriorityQueueTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B810B5B01C83E3B200450324 /* BoundedPriorityQueueTests.swift */; };\n\t\tB8F635A81C83E4270060805E /* BoundedPriorityQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8F635A71C83E4270060805E /* BoundedPriorityQueue.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\tB80004B31C83E342001FE2D7 /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tB80004B81C83E342001FE2D7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };\n\t\tB810B5B01C83E3B200450324 /* BoundedPriorityQueueTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoundedPriorityQueueTests.swift; sourceTree = SOURCE_ROOT; };\n\t\tB8F635A71C83E4270060805E /* BoundedPriorityQueue.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BoundedPriorityQueue.swift; path = ../BoundedPriorityQueue.swift; sourceTree = SOURCE_ROOT; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\tB80004B01C83E342001FE2D7 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\tB80004A81C83E324001FE2D7 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tB80004B51C83E342001FE2D7 /* Tests */,\n\t\t\t\tB80004B41C83E342001FE2D7 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB80004B41C83E342001FE2D7 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tB80004B31C83E342001FE2D7 /* Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB80004B51C83E342001FE2D7 /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tB8F635A71C83E4270060805E /* BoundedPriorityQueue.swift */,\n\t\t\t\tB810B5B01C83E3B200450324 /* BoundedPriorityQueueTests.swift */,\n\t\t\t\tB80004B81C83E342001FE2D7 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = Tests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\tB80004B21C83E342001FE2D7 /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = B80004B91C83E342001FE2D7 /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tB80004AF1C83E342001FE2D7 /* Sources */,\n\t\t\t\tB80004B11C83E342001FE2D7 /* Resources */,\n\t\t\t\tB80004B01C83E342001FE2D7 /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tproductName = Tests;\n\t\t\tproductReference = B80004B31C83E342001FE2D7 /* Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\tB80004A91C83E324001FE2D7 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0720;\n\t\t\t\tLastUpgradeCheck = 0820;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\tB80004B21C83E342001FE2D7 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2.1;\n\t\t\t\t\t\tLastSwiftMigration = 1000;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = B80004AC1C83E324001FE2D7 /* Build configuration list for PBXProject \"Tests\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t);\n\t\t\tmainGroup = B80004A81C83E324001FE2D7;\n\t\t\tproductRefGroup = B80004B41C83E342001FE2D7 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\tB80004B21C83E342001FE2D7 /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\tB80004B11C83E342001FE2D7 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\tB80004AF1C83E342001FE2D7 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tB810B5B11C83E3B200450324 /* BoundedPriorityQueueTests.swift in Sources */,\n\t\t\t\tB8F635A81C83E4270060805E /* BoundedPriorityQueue.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\tB80004AD1C83E324001FE2D7 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tB80004AE1C83E324001FE2D7 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tB80004BA1C83E342001FE2D7 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.alvahouse322.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tB80004BB1C83E342001FE2D7 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.alvahouse322.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\tB80004AC1C83E324001FE2D7 /* Build configuration list for PBXProject \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tB80004AD1C83E324001FE2D7 /* Debug */,\n\t\t\t\tB80004AE1C83E324001FE2D7 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tB80004B91C83E342001FE2D7 /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tB80004BA1C83E342001FE2D7 /* Debug */,\n\t\t\t\tB80004BB1C83E342001FE2D7 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = B80004A91C83E324001FE2D7 /* Project object */;\n}\n"
  },
  {
    "path": "Bounded Priority Queue/Tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Bounded Priority Queue/Tests/Tests.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Bounded Priority Queue/Tests/Tests.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Bounded Priority Queue/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0820\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"B80004B21C83E342001FE2D7\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"B80004B21C83E342001FE2D7\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"B80004B21C83E342001FE2D7\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"B80004B21C83E342001FE2D7\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Boyer-Moore-Horspool/BoyerMooreHorspool.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\n/*\n  Boyer-Moore string search\n\n  This code is based on the article \"Faster String Searches\" by Costas Menico\n  from Dr Dobb's magazine, July 1989.\n  http://www.drdobbs.com/database/faster-string-searches/184408171\n*/\nextension String {\n    func index(of pattern: String, usingHorspoolImprovement: Bool = false) -> Index? {\n        // Cache the length of the search pattern because we're going to\n        // use it a few times and it's expensive to calculate.\n        let patternLength = pattern.count\n        guard patternLength > 0, patternLength <= self.count else { return nil }\n\n        // Make the skip table. This table determines how far we skip ahead\n        // when a character from the pattern is found.\n        var skipTable = [Character: Int]()\n        for (i, c) in pattern.enumerated() {\n            skipTable[c] = patternLength - i - 1\n        }\n\n        // This points at the last character in the pattern.\n        let p = pattern.index(before: pattern.endIndex)\n        let lastChar = pattern[p]\n\n        // The pattern is scanned right-to-left, so skip ahead in the string by\n        // the length of the pattern. (Minus 1 because startIndex already points\n        // at the first character in the source string.)\n        var i = index(startIndex, offsetBy: patternLength - 1)\n\n        // This is a helper function that steps backwards through both strings\n        // until we find a character that doesn’t match, or until we’ve reached\n        // the beginning of the pattern.\n        func backwards() -> Index? {\n            var q = p\n            var j = i\n            while q > pattern.startIndex {\n                j = index(before: j)\n                q = index(before: q)\n                if self[j] != pattern[q] { return nil }\n            }\n            return j\n        }\n\n        // The main loop. Keep going until the end of the string is reached.\n        while i < endIndex {\n            let c = self[i]\n\n            // Does the current character match the last character from the pattern?\n            if c == lastChar {\n\n                // There is a possible match. Do a brute-force search backwards.\n                if let k = backwards() { return k }\n\n                if !usingHorspoolImprovement {\n                    // If no match, we can only safely skip one character ahead.\n                    i = index(after: i)\n                } else {\n                    // Ensure to jump at least one character (this is needed because the first\n                    // character is in the skipTable, and `skipTable[lastChar] = 0`)\n                    let jumpOffset = max(skipTable[c] ?? patternLength, 1)\n                    i = index(i, offsetBy: jumpOffset, limitedBy: endIndex) ?? endIndex\n                }\n            } else {\n                // The characters are not equal, so skip ahead. The amount to skip is\n                // determined by the skip table. If the character is not present in the\n                // pattern, we can skip ahead by the full pattern length. However, if\n                // the character *is* present in the pattern, there may be a match up\n                // ahead and we can't skip as far.\n                i = index(i, offsetBy: skipTable[c] ?? patternLength, limitedBy: endIndex) ?? endIndex\n            }\n        }\n        return nil\n    }\n}\n\n// A few simple tests\n\nlet str = \"Hello, World\"\nstr.index(of: \"World\")  // 7\n\nlet animals = \"🐶🐔🐷🐮🐱\"\nanimals.index(of: \"🐮\")  // 6\n\nlet lorem = \"Lorem ipsum dolor sit amet\"\nlorem.index(of: \"sit\", usingHorspoolImprovement: true)  // 18\n"
  },
  {
    "path": "Boyer-Moore-Horspool/BoyerMooreHorspool.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Boyer-Moore-Horspool/BoyerMooreHorspool.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Boyer-Moore-Horspool/BoyerMooreHorspool.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Boyer-Moore-Horspool/BoyerMooreHorspool.playground/timeline.xctimeline",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Timeline\n   version = \"3.0\">\n   <TimelineItems>\n      <LoggerValueHistoryTimelineItem\n         documentLocation = \"file:///Users/neifmetus/Documents/Projects/swift-algorithm-club/Boyer-Moore-Horspool/BoyerMooreHorspool.playground#CharacterRangeLen=0&amp;CharacterRangeLoc=75&amp;EndingColumnNumber=21&amp;EndingLineNumber=2&amp;StartingColumnNumber=21&amp;StartingLineNumber=2&amp;Timestamp=560891520.806637\"\n         selectedRepresentationIndex = \"0\"\n         shouldTrackSuperviewWidth = \"NO\">\n      </LoggerValueHistoryTimelineItem>\n      <LoggerValueHistoryTimelineItem\n         documentLocation = \"file:///Users/neifmetus/Documents/Projects/swift-algorithm-club/Boyer-Moore-Horspool/BoyerMooreHorspool.playground#CharacterRangeLen=0&amp;CharacterRangeLoc=75&amp;EndingColumnNumber=21&amp;EndingLineNumber=2&amp;StartingColumnNumber=21&amp;StartingLineNumber=2&amp;Timestamp=560891520.806855\"\n         selectedRepresentationIndex = \"0\"\n         shouldTrackSuperviewWidth = \"NO\">\n      </LoggerValueHistoryTimelineItem>\n      <LoggerValueHistoryTimelineItem\n         documentLocation = \"file:///Users/neifmetus/Documents/Projects/swift-algorithm-club/Boyer-Moore-Horspool/BoyerMooreHorspool.playground#CharacterRangeLen=0&amp;CharacterRangeLoc=75&amp;EndingColumnNumber=21&amp;EndingLineNumber=2&amp;StartingColumnNumber=21&amp;StartingLineNumber=2&amp;Timestamp=560891520.807023\"\n         selectedRepresentationIndex = \"0\"\n         shouldTrackSuperviewWidth = \"NO\">\n      </LoggerValueHistoryTimelineItem>\n   </TimelineItems>\n</Timeline>\n"
  },
  {
    "path": "Boyer-Moore-Horspool/BoyerMooreHorspool.swift",
    "content": "/*\n  Boyer-Moore string search\n\n  This code is based on the article \"Faster String Searches\" by Costas Menico\n  from Dr Dobb's magazine, July 1989.\n  http://www.drdobbs.com/database/faster-string-searches/184408171\n*/\nextension String {\n    func index(of pattern: String, usingHorspoolImprovement: Bool = false) -> Index? {\n        // Cache the length of the search pattern because we're going to\n        // use it a few times and it's expensive to calculate.\n        let patternLength = pattern.count\n        guard patternLength > 0, patternLength <= self.count else { return nil }\n      \n        // Make the skip table. This table determines how far we skip ahead\n        // when a character from the pattern is found.\n        var skipTable = [Character: Int]()\n        for (i, c) in pattern.enumerated() {\n            skipTable[c] = patternLength - i - 1\n        }\n\n        // This points at the last character in the pattern.\n        let p = pattern.index(before: pattern.endIndex)\n        let lastChar = pattern[p]\n\n        // The pattern is scanned right-to-left, so skip ahead in the string by\n        // the length of the pattern. (Minus 1 because startIndex already points\n        // at the first character in the source string.)\n        var i = index(startIndex, offsetBy: patternLength - 1)\n\n        // This is a helper function that steps backwards through both strings\n        // until we find a character that doesn’t match, or until we’ve reached\n        // the beginning of the pattern.\n        func backwards() -> Index? {\n            var q = p\n            var j = i\n            while q > pattern.startIndex {\n                j = index(before: j)\n                q = index(before: q)\n                if self[j] != pattern[q] { return nil }\n            }\n            return j\n        }\n\n        // The main loop. Keep going until the end of the string is reached.\n        while i < endIndex {\n            let c = self[i]\n\n            // Does the current character match the last character from the pattern?\n            if c == lastChar {\n\n                // There is a possible match. Do a brute-force search backwards.\n                if let k = backwards() { return k }\n\n                if !usingHorspoolImprovement {\n                    // If no match, we can only safely skip one character ahead.\n                    i = index(after: i)\n                } else {\n                    // Ensure to jump at least one character (this is needed because the first\n                    // character is in the skipTable, and `skipTable[lastChar] = 0`)\n                    let jumpOffset = max(skipTable[c] ?? patternLength, 1)\n                    i = index(i, offsetBy: jumpOffset, limitedBy: endIndex) ?? endIndex\n                }\n            } else {\n                // The characters are not equal, so skip ahead. The amount to skip is\n                // determined by the skip table. If the character is not present in the\n                // pattern, we can skip ahead by the full pattern length. However, if\n                // the character *is* present in the pattern, there may be a match up\n                // ahead and we can't skip as far.\n                i = index(i, offsetBy: skipTable[c] ?? patternLength, limitedBy: endIndex) ?? endIndex\n            }\n        }\n        return nil\n    }\n}\n"
  },
  {
    "path": "Boyer-Moore-Horspool/README.markdown",
    "content": "# Boyer-Moore String Search\n\n> This topic has been tutorialized [here](https://www.raywenderlich.com/163964/swift-algorithm-club-booyer-moore-string-search-algorithm)\n\n\nGoal: Write a string search algorithm in pure Swift without importing Foundation or using `NSString`'s `rangeOfString()` method.\n\nIn other words, we want to implement an `indexOf(pattern: String)` extension on `String` that returns the `String.Index` of the first occurrence of the search pattern, or `nil` if the pattern could not be found inside the string.\n\nFor example:\n\n```swift\n// Input:\nlet s = \"Hello, World\"\ns.indexOf(pattern: \"World\")\n\n// Output:\n<String.Index?> 7\n\n// Input:\nlet animals = \"🐶🐔🐷🐮🐱\"\nanimals.indexOf(pattern: \"🐮\")\n\n// Output:\n<String.Index?> 6\n```\n\n> **Note:** The index of the cow is 6, not 3 as you might expect, because the string uses more storage per character for emoji. The actual value of the `String.Index` is not so important, just that it points at the right character in the string.\n\nThe [brute-force approach](../Brute-Force%20String%20Search/) works OK, but it's not very efficient, especially on large chunks of text. As it turns out, you don't need to look at _every_ character from the source string -- you can often skip ahead multiple characters.\n\nThe skip-ahead algorithm is called [Boyer-Moore](https://en.wikipedia.org/wiki/Boyer–Moore_string_search_algorithm) and it has been around for a long time. It is considered the benchmark for all string search algorithms.\n\nHere's how you could write it in Swift:\n\n```swift\nextension String {\n    func index(of pattern: String) -> Index? {\n        // Cache the length of the search pattern because we're going to\n        // use it a few times and it's expensive to calculate.\n        let patternLength = pattern.count\n        guard patternLength > 0, patternLength <= count else { return nil }\n\n        // Make the skip table. This table determines how far we skip ahead\n        // when a character from the pattern is found.\n        var skipTable = [Character: Int]()\n        for (i, c) in pattern.enumerated() {\n            skipTable[c] = patternLength - i - 1\n        }\n\n        // This points at the last character in the pattern.\n        let p = pattern.index(before: pattern.endIndex)\n        let lastChar = pattern[p]\n\n        // The pattern is scanned right-to-left, so skip ahead in the string by\n        // the length of the pattern. (Minus 1 because startIndex already points\n        // at the first character in the source string.)\n        var i = index(startIndex, offsetBy: patternLength - 1)\n\n        // This is a helper function that steps backwards through both strings\n        // until we find a character that doesn’t match, or until we’ve reached\n        // the beginning of the pattern.\n        func backwards() -> Index? {\n            var q = p\n            var j = i\n            while q > pattern.startIndex {\n                j = index(before: j)\n                q = index(before: q)\n                if self[j] != pattern[q] { return nil }\n            }\n            return j\n        }\n\n        // The main loop. Keep going until the end of the string is reached.\n        while i < endIndex {\n            let c = self[i]\n\n            // Does the current character match the last character from the pattern?\n            if c == lastChar {\n\n                // There is a possible match. Do a brute-force search backwards.\n                if let k = backwards() { return k }\n\n                // If no match, we can only safely skip one character ahead.\n                i = index(after: i)\n            } else {\n                // The characters are not equal, so skip ahead. The amount to skip is\n                // determined by the skip table. If the character is not present in the\n                // pattern, we can skip ahead by the full pattern length. However, if\n                // the character *is* present in the pattern, there may be a match up\n                // ahead and we can't skip as far.\n                i = index(i, offsetBy: skipTable[c] ?? patternLength, limitedBy: endIndex) ?? endIndex\n            }\n        }\n        return nil\n    }\n}\n```\n\nThe algorithm works as follows. You line up the search pattern with the source string and see what character from the string matches the _last_ character of the search pattern:\n\n```\nsource string:  Hello, World\nsearch pattern: World\n                    ^\n```\n\nThere are three possibilities:\n\n1. The two characters are equal. You've found a possible match.\n\n2. The characters are not equal, but the source character does appear in the search pattern elsewhere.\n\n3. The source character does not appear in the search pattern at all.\n\nIn the example, the characters `o` and `d` do not match, but `o` does appear in the search pattern. That means we can skip ahead several positions:\n\n```\nsource string:  Hello, World\nsearch pattern:    World\n                       ^\n```\n\nNote how the two `o` characters line up now. Again you compare the last character of the search pattern with the search text: `W` vs `d`. These are not equal but the `W` does appear in the pattern. So skip ahead again to line up those two `W` characters:\n\n```\nsource string:  Hello, World\nsearch pattern:        World\n                           ^\n```\n\nThis time the two characters are equal and there is a possible match. To verify the match you do a brute-force search, but backwards, from the end of the search pattern to the beginning. And that's all there is to it.\n\nThe amount to skip ahead at any given time is determined by the \"skip table\", which is a dictionary of all the characters in the search pattern and the amount to skip by. The skip table in the example looks like:\n\n```\nW: 4\no: 3\nr: 2\nl: 1\nd: 0\n```\n\nThe closer a character is to the end of the pattern, the smaller the skip amount. If a character appears more than once in the pattern, the one nearest to the end of the pattern determines the skip value for that character.\n\n> **Note:** If the search pattern consists of only a few characters, it's faster to do a brute-force search. There's a trade-off between the time it takes to build the skip table and doing brute-force for short patterns.\n\nCredits: This code is based on the article [\"Faster String Searches\" by Costas Menico](http://www.drdobbs.com/database/faster-string-searches/184408171) from Dr Dobb's magazine, July 1989 -- Yes, 1989! Sometimes it's useful to keep those old magazines around.\n\nSee also: [a detailed analysis](http://www.inf.fh-flensburg.de/lang/algorithmen/pattern/bmen.htm) of the algorithm.\n\n## Boyer-Moore-Horspool algorithm\n\nA variation on the above algorithm is the [Boyer-Moore-Horspool algorithm](https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore%E2%80%93Horspool_algorithm).\n\nLike the regular Boyer-Moore algorithm, it uses the `skipTable` to skip ahead a number of characters. The difference is in how we check partial matches. In the above version, if a partial match is found but it's not a complete match, we skip ahead by just one character. In this revised version, we also use the skip table in that situation.\n\nHere's an implementation of the Boyer-Moore-Horspool algorithm:\n\n```swift\nextension String {\n    func index(of pattern: String) -> Index? {\n        // Cache the length of the search pattern because we're going to\n        // use it a few times and it's expensive to calculate.\n        let patternLength = pattern.count\n        guard patternLength > 0, patternLength <= characters.count else { return nil }\n\n        // Make the skip table. This table determines how far we skip ahead\n        // when a character from the pattern is found.\n        var skipTable = [Character: Int]()\n        for (i, c) in pattern.enumerated() {\n            skipTable[c] = patternLength - i - 1\n        }\n\n        // This points at the last character in the pattern.\n        let p = pattern.index(before: pattern.endIndex)\n        let lastChar = pattern[p]\n\n        // The pattern is scanned right-to-left, so skip ahead in the string by\n        // the length of the pattern. (Minus 1 because startIndex already points\n        // at the first character in the source string.)\n        var i = index(startIndex, offsetBy: patternLength - 1)\n\n        // This is a helper function that steps backwards through both strings\n        // until we find a character that doesn’t match, or until we’ve reached\n        // the beginning of the pattern.\n        func backwards() -> Index? {\n            var q = p\n            var j = i\n            while q > pattern.startIndex {\n                j = index(before: j)\n                q = index(before: q)\n                if self[j] != pattern[q] { return nil }\n            }\n            return j\n        }\n\n        // The main loop. Keep going until the end of the string is reached.\n        while i < endIndex {\n            let c = self[i]\n\n            // Does the current character match the last character from the pattern?\n            if c == lastChar {\n\n                // There is a possible match. Do a brute-force search backwards.\n                if let k = backwards() { return k }\n\n                // Ensure to jump at least one character (this is needed because the first\n                // character is in the skipTable, and `skipTable[lastChar] = 0`)\n                let jumpOffset = max(skipTable[c] ?? patternLength, 1)\n                i = index(i, offsetBy: jumpOffset, limitedBy: endIndex) ?? endIndex\n            } else {\n                // The characters are not equal, so skip ahead. The amount to skip is\n                // determined by the skip table. If the character is not present in the\n                // pattern, we can skip ahead by the full pattern length. However, if\n                // the character *is* present in the pattern, there may be a match up\n                // ahead and we can't skip as far.\n                i = index(i, offsetBy: skipTable[c] ?? patternLength, limitedBy: endIndex) ?? endIndex\n            }\n        }\n        return nil\n    }\n}\n```\n\nIn practice, the Horspool version of the algorithm tends to perform a little better than the original. However, it depends on the tradeoffs you're willing to make.\n\nCredits: This code is based on the paper: [R. N. Horspool (1980). \"Practical fast searching in strings\". Software - Practice & Experience 10 (6): 501–506.](http://www.cin.br/~paguso/courses/if767/bib/Horspool_1980.pdf)\n\n_Written for Swift Algorithm Club by Matthijs Hollemans, updated by Andreas Neusüß_, [Matías Mazzei](https://github.com/mmazzei).\n"
  },
  {
    "path": "Boyer-Moore-Horspool/Tests/BoyerMooreHorspoolTests.swift",
    "content": "//\n//  BoyerMooreHorspoolTests.swift\n//  Tests\n//\n//  Created by Matias Mazzei on 12/24/16.\n//  Copyright © 2016 Swift Algorithm Club. All rights reserved.\n//\n\nclass BoyerMooreHorspoolTests: BoyerMooreTest {\n    override func setUp() {\n        super.setUp()\n        useHorspoolImprovement = false\n    }\n}\n"
  },
  {
    "path": "Boyer-Moore-Horspool/Tests/BoyerMooreTests.swift",
    "content": "//\n//  BoyerMooreHorspoolTests.swift\n//  Tests\n//\n//  Created by Matias Mazzei on 12/24/16.\n//  Copyright © 2016 Swift Algorithm Club. All rights reserved.\n//\n\nimport Foundation\nimport XCTest\n\nclass BoyerMooreTest: XCTestCase {\n    var useHorspoolImprovement = false\n\n    override func setUp() {\n        super.setUp()\n    }\n\n    func assert(pattern: String, doesNotExistsIn string: String) {\n        let index = string.index(of: pattern, usingHorspoolImprovement: useHorspoolImprovement)\n        XCTAssertNil(index)\n    }\n\n    func assert(pattern: String, existsIn string: String) {\n        let index = string.index(of: pattern, usingHorspoolImprovement: useHorspoolImprovement)\n        XCTAssertNotNil(index)\n\n        let startIndex = index!\n        let endIndex = string.index(index!, offsetBy: pattern.count)\n        let match = String(string[startIndex..<endIndex])\n        XCTAssertEqual(match, pattern)\n    }\n\n    func testSearchPatternInEmptyString() {\n        let string = \"\"\n        let pattern = \"ABCDEF\"\n        assert(pattern: pattern, doesNotExistsIn: string)\n    }\n\n    func testSearchEmptyPatternString() {\n        let string = \"ABCDEF\"\n        let pattern = \"\"\n        assert(pattern: pattern, doesNotExistsIn: string)\n    }\n\n    func testSearchPatternLongerThanString() {\n        let string = \"ABC\"\n        let pattern = \"ABCDEF\"\n        assert(pattern: pattern, doesNotExistsIn: string)\n    }\n\n    func testSearchTheSameString() {\n        let string = \"ABCDEF\"\n        let pattern = \"ABCDEF\"\n        assert(pattern: pattern, existsIn: string)\n    }\n\n    func testSearchAPreffix() {\n        let string = \"ABCDEFGHIJK\"\n        let pattern = \"ABCDEF\"\n        assert(pattern: pattern, existsIn: string)\n    }\n\n    func testSearchASuffix() {\n        let string = \"ABCDEFGHIJK\"\n        let pattern = \"HIJK\"\n        assert(pattern: pattern, existsIn: string)\n    }\n\n    func testSearchAStringFromTheMiddle() {\n        let string = \"ABCDEFGHIJK\"\n        let pattern = \"EFG\"\n        assert(pattern: pattern, existsIn: string)\n    }\n\n    func testSearchInvalidPattern() {\n        let string = \"ABCDEFGHIJK\"\n        let pattern = \"AEF\"\n        assert(pattern: pattern, doesNotExistsIn: string)\n    }\n\n    func testSearchPatternWithDuplicatedCharacter() {\n        let string = \"Goal: Write a string search algorithm in pure Swift \"\n                     + \"without importing Foundation or using NSString's rangeOfString() method.\"\n        let pattern = \"NSS\"\n        assert(pattern: pattern, existsIn: string)\n    }\n\n    func testSearchInvalidPatternWithDuplicatedCharacter() {\n        let string = \"Goal: Write a string search algorithm in pure Swift \"\n            + \"without importing Foundation or using NSString's rangeOfString() method.\"\n        let pattern = \"nss\"\n        assert(pattern: pattern, doesNotExistsIn: string)\n    }\n}\n"
  },
  {
    "path": "Boyer-Moore-Horspool/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Boyer-Moore-Horspool/Tests/Tests.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t7B80C3CE1C77A256003CECC7 /* BoyerMooreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C3CD1C77A256003CECC7 /* BoyerMooreTests.swift */; };\n\t\t8ED7591C1F9A064A00440D89 /* BoyerMooreHorspool.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8ED7591B1F9A064A00440D89 /* BoyerMooreHorspool.swift */; };\n\t\t9AED56801E0EE60B00958DCC /* BoyerMooreHorspoolTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AED567F1E0EE60B00958DCC /* BoyerMooreHorspoolTests.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t7B2BBC801C779D720067B71D /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7B2BBC941C779E7B0067B71D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };\n\t\t7B80C3CD1C77A256003CECC7 /* BoyerMooreTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoyerMooreTests.swift; sourceTree = SOURCE_ROOT; };\n\t\t8ED7591B1F9A064A00440D89 /* BoyerMooreHorspool.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BoyerMooreHorspool.swift; path = ../BoyerMooreHorspool.swift; sourceTree = \"<group>\"; };\n\t\t9AED567F1E0EE60B00958DCC /* BoyerMooreHorspoolTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoyerMooreHorspoolTests.swift; sourceTree = SOURCE_ROOT; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t7B2BBC7D1C779D720067B71D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t7B2BBC681C779D710067B71D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8ED7591B1F9A064A00440D89 /* BoyerMooreHorspool.swift */,\n\t\t\t\t7B80C3CD1C77A256003CECC7 /* BoyerMooreTests.swift */,\n\t\t\t\t7B2BBC941C779E7B0067B71D /* Info.plist */,\n\t\t\t\t9AED567F1E0EE60B00958DCC /* BoyerMooreHorspoolTests.swift */,\n\t\t\t\t7B2BBC721C779D710067B71D /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC721C779D710067B71D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC801C779D720067B71D /* Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t7B2BBC7F1C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t9AED56811E0EEA5B00958DCC /* ShellScript */,\n\t\t\t\t7B2BBC7C1C779D720067B71D /* Sources */,\n\t\t\t\t7B2BBC7D1C779D720067B71D /* Frameworks */,\n\t\t\t\t7B2BBC7E1C779D720067B71D /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tproductName = TestsTests;\n\t\t\tproductReference = 7B2BBC801C779D720067B71D /* Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t7B2BBC691C779D710067B71D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0720;\n\t\t\t\tLastUpgradeCheck = 1000;\n\t\t\t\tORGANIZATIONNAME = \"Swift Algorithm Club\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t7B2BBC7F1C779D720067B71D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2;\n\t\t\t\t\t\tLastSwiftMigration = \"\";\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 7B2BBC681C779D710067B71D;\n\t\t\tproductRefGroup = 7B2BBC721C779D710067B71D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t7B2BBC7F1C779D720067B71D /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t7B2BBC7E1C779D720067B71D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t9AED56811E0EEA5B00958DCC /* ShellScript */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"if which swiftlint >/dev/null; then\\nswiftlint\\nelse\\necho \\\"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\\\"\\nfi\";\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t7B2BBC7C1C779D720067B71D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8ED7591C1F9A064A00440D89 /* BoyerMooreHorspool.swift in Sources */,\n\t\t\t\t9AED56801E0EE60B00958DCC /* BoyerMooreHorspoolTests.swift in Sources */,\n\t\t\t\t7B80C3CE1C77A256003CECC7 /* BoyerMooreTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t7B2BBC871C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Default;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC881C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Default;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t7B2BBC8D1C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC8E1C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC871C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC881C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC8D1C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC8E1C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 7B2BBC691C779D710067B71D /* Project object */;\n}\n"
  },
  {
    "path": "Boyer-Moore-Horspool/Tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Tests.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Boyer-Moore-Horspool/Tests/Tests.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Boyer-Moore-Horspool/Tests/Tests.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Boyer-Moore-Horspool/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1000\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Breadth-First Search/BreadthFirstSearch.playground/Pages/Simple example.xcplaygroundpage/Contents.swift",
    "content": "\nfunc breadthFirstSearch(_ graph: Graph, source: Node) -> [String] {\n  var queue = Queue<Node>()\n  queue.enqueue(source)\n\n  var nodesExplored = [source.label]\n  source.visited = true\n\n  while let node = queue.dequeue() {\n    for edge in node.neighbors {\n      let neighborNode = edge.neighbor\n      if !neighborNode.visited {\n        queue.enqueue(neighborNode)\n        neighborNode.visited = true\n        nodesExplored.append(neighborNode.label)\n      }\n    }\n  }\n\n  return nodesExplored\n}\n\nlet graph = Graph()\n\nlet nodeA = graph.addNode(\"a\")\nlet nodeB = graph.addNode(\"b\")\nlet nodeC = graph.addNode(\"c\")\nlet nodeD = graph.addNode(\"d\")\nlet nodeE = graph.addNode(\"e\")\nlet nodeF = graph.addNode(\"f\")\nlet nodeG = graph.addNode(\"g\")\nlet nodeH = graph.addNode(\"h\")\n\ngraph.addEdge(nodeA, neighbor: nodeB)\ngraph.addEdge(nodeA, neighbor: nodeC)\ngraph.addEdge(nodeB, neighbor: nodeD)\ngraph.addEdge(nodeB, neighbor: nodeE)\ngraph.addEdge(nodeC, neighbor: nodeF)\ngraph.addEdge(nodeC, neighbor: nodeG)\ngraph.addEdge(nodeE, neighbor: nodeH)\ngraph.addEdge(nodeE, neighbor: nodeF)\ngraph.addEdge(nodeF, neighbor: nodeG)\n\nlet nodesExplored = breadthFirstSearch(graph, source: nodeA)\nprint(nodesExplored)\n"
  },
  {
    "path": "Breadth-First Search/BreadthFirstSearch.playground/Sources/Edge.swift",
    "content": "public class Edge: Equatable {\n  public var neighbor: Node\n\n  public init(_ neighbor: Node) {\n    self.neighbor = neighbor\n  }\n}\n\npublic func == (_ lhs: Edge, rhs: Edge) -> Bool {\n  return lhs.neighbor == rhs.neighbor\n}\n"
  },
  {
    "path": "Breadth-First Search/BreadthFirstSearch.playground/Sources/Graph.swift",
    "content": "public class Graph: CustomStringConvertible, Equatable {\n  public private(set) var nodes: [Node]\n\n  public init() {\n    self.nodes = []\n  }\n\n  @discardableResult public func addNode(_ label: String) -> Node {\n    let node = Node(label)\n    nodes.append(node)\n    return node\n  }\n\n  public func addEdge(_ source: Node, neighbor: Node) {\n    let edge = Edge(neighbor)\n    source.neighbors.append(edge)\n  }\n\n  public var description: String {\n    var description = \"\"\n\n    for node in nodes {\n      if !node.neighbors.isEmpty {\n        description += \"[node: \\(node.label) edges: \\(node.neighbors.map { $0.neighbor.label})]\"\n      }\n    }\n    return description\n  }\n\n  public func findNodeWithLabel(_ label: String) -> Node {\n    return nodes.filter { $0.label == label }.first!\n  }\n\n  public func duplicate() -> Graph {\n    let duplicated = Graph()\n\n    for node in nodes {\n      duplicated.addNode(node.label)\n    }\n\n    for node in nodes {\n      for edge in node.neighbors {\n        let source = duplicated.findNodeWithLabel(node.label)\n        let neighbour = duplicated.findNodeWithLabel(edge.neighbor.label)\n        duplicated.addEdge(source, neighbor: neighbour)\n      }\n    }\n\n    return duplicated\n  }\n}\n\npublic func == (_ lhs: Graph, rhs: Graph) -> Bool {\n  return lhs.nodes == rhs.nodes\n}\n"
  },
  {
    "path": "Breadth-First Search/BreadthFirstSearch.playground/Sources/Node.swift",
    "content": "public class Node: CustomStringConvertible, Equatable {\n  public var neighbors: [Edge]\n\n  public private(set) var label: String\n  public var distance: Int?\n  public var visited: Bool\n\n  public init(_ label: String) {\n    self.label = label\n    neighbors = []\n    visited = false\n  }\n\n  public var description: String {\n    if let distance = distance {\n      return \"Node(label: \\(label), distance: \\(distance))\"\n    }\n    return \"Node(label: \\(label), distance: infinity)\"\n  }\n\n  public var hasDistance: Bool {\n    return distance != nil\n  }\n\n  public func remove(_ edge: Edge) {\n    neighbors.remove(at: neighbors.index { $0 === edge }!)\n  }\n}\n\npublic func == (_ lhs: Node, rhs: Node) -> Bool {\n  return lhs.label == rhs.label && lhs.neighbors == rhs.neighbors\n}\n"
  },
  {
    "path": "Breadth-First Search/BreadthFirstSearch.playground/Sources/Queue.swift",
    "content": "public struct Queue<T> {\n  private var array: [T]\n\n  public init() {\n    array = []\n  }\n\n  public var isEmpty: Bool {\n    return array.isEmpty\n  }\n\n  public var count: Int {\n    return array.count\n  }\n\n  public mutating func enqueue(_ element: T) {\n    array.append(element)\n  }\n\n  public mutating func dequeue() -> T? {\n    if isEmpty {\n      return nil\n    } else {\n      return array.removeFirst()\n    }\n  }\n\n  public func peek() -> T? {\n    return array.first\n  }\n}\n"
  },
  {
    "path": "Breadth-First Search/BreadthFirstSearch.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='6.0' target-platform='ios' display-mode='raw' last-migration='1000'/>"
  },
  {
    "path": "Breadth-First Search/BreadthFirstSearch.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Breadth-First Search/BreadthFirstSearch.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Breadth-First Search/BreadthFirstSearch.swift",
    "content": "func breadthFirstSearch(_ graph: Graph, source: Node) -> [String] {\n  var queue = Queue<Node>()\n  queue.enqueue(source)\n\n  var nodesExplored = [source.label]\n  source.visited = true\n\n  while let current = queue.dequeue() {\n    for edge in current.neighbors {\n      let neighborNode = edge.neighbor\n      if !neighborNode.visited {\n        queue.enqueue(neighborNode)\n        neighborNode.visited = true\n        nodesExplored.append(neighborNode.label)\n      }\n    }\n  }\n\n  return nodesExplored\n}\n"
  },
  {
    "path": "Breadth-First Search/README.markdown",
    "content": "# Breadth-First Search\n\n> This topic has been tutorialized [here](https://www.raywenderlich.com/155801/swift-algorithm-club-swift-breadth-first-search)\n\n\nBreadth-first search (BFS) is an algorithm for traversing or searching [tree](../Tree/) or [graph](../Graph/) data structures. It starts at a source node and explores the immediate neighbor nodes first, before moving to the next level neighbors.\n\nBreadth-first search can be used on both directed and undirected graphs.\n\n## Animated example\n\nHere's how breadth-first search works on a graph:\n\n![Animated example of a breadth-first search](Images/AnimatedExample.gif)\n\nWhen we visit a node, we color it black. We also put its neighbor nodes into a [queue](../Queue/). In the animation the nodes that are enqueued but not visited yet are shown in gray.\n\nLet's follow the animated example. We start with the source node `A` and add it to a queue. In the animation this is shown as node `A` becoming gray.\n\n```swift\nqueue.enqueue(A)\n```\n\nThe queue is now `[ A ]`. The idea is that, as long as there are nodes in the queue, we visit the node that's at the front of the queue, and enqueue its immediate neighbor nodes if they have not been visited yet.\n\nTo start traversing the graph, we pull the first node off the queue, `A`, and color it black. Then we enqueue its two neighbor nodes `B` and `C`. This colors them gray.\n\n```swift\nqueue.dequeue()   // A\nqueue.enqueue(B)\nqueue.enqueue(C)\n```\n\nThe queue is now `[ B, C ]`. We dequeue `B`, and enqueue `B`'s neighbor nodes `D` and `E`.\n\n```swift\nqueue.dequeue()   // B\nqueue.enqueue(D)\nqueue.enqueue(E)\n```\n\nThe queue is now `[ C, D, E ]`. Dequeue `C`, and enqueue `C`'s neighbor nodes `F` and `G`.\n\n```swift\nqueue.dequeue()   // C\nqueue.enqueue(F)\nqueue.enqueue(G)\n```\n\nThe queue is now `[ D, E, F, G ]`. Dequeue `D`, which has no neighbor nodes.\n\n```swift\nqueue.dequeue()   // D\n```\n\nThe queue is now `[ E, F, G ]`. Dequeue `E` and enqueue its single neighbor node `H`. Note that `B` is also a neighbor for `E` but we've already visited `B`, so we're not adding it to the queue again.\n\n```swift\nqueue.dequeue()   // E\nqueue.enqueue(H)\n```\n\nThe queue is now `[ F, G, H ]`. Dequeue `F`, which has no unvisited neighbor nodes.\n\n```swift\nqueue.dequeue()   // F\n```\n\nThe queue is now `[ G, H ]`. Dequeue `G`, which has no unvisited neighbor nodes.\n\n```swift\nqueue.dequeue()   // G\n```\n\nThe queue is now `[ H ]`. Dequeue `H`, which has no unvisited neighbor nodes.\n\n```swift\nqueue.dequeue()   // H\n```\n\nThe queue is now empty, meaning that all nodes have been explored. The order in which the nodes were explored is `A`, `B`, `C`, `D`, `E`, `F`, `G`, `H`.\n\nWe can show this as a tree:\n\n![The BFS tree](Images/TraversalTree.png)\n\nThe parent of a node is the one that \"discovered\" that node. The root of the tree is the node you started the breadth-first search from.\n\nFor an unweighted graph, this tree defines a shortest path from the starting node to every other node in the tree. So breadth-first search is one way to find the shortest path between two nodes in a graph.\n\n## The code\n\nSimple implementation of breadth-first search using a queue:\n\n```swift\nfunc breadthFirstSearch(_ graph: Graph, source: Node) -> [String] {\n  var queue = Queue<Node>()\n  queue.enqueue(source)\n\n  var nodesExplored = [source.label]\n  source.visited = true\n\n  while let node = queue.dequeue() {\n    for edge in node.neighbors {\n      let neighborNode = edge.neighbor\n      if !neighborNode.visited {\n        queue.enqueue(neighborNode)\n        neighborNode.visited = true\n        nodesExplored.append(neighborNode.label)\n      }\n    }\n  }\n\n  return nodesExplored\n}\n```\n\nWhile there are nodes in the queue, we visit the first one and then enqueue its immediate neighbors if they haven't been visited yet.\n\nPut this code in a playground and test it like so:\n\n```swift\nlet graph = Graph()\n\nlet nodeA = graph.addNode(\"a\")\nlet nodeB = graph.addNode(\"b\")\nlet nodeC = graph.addNode(\"c\")\nlet nodeD = graph.addNode(\"d\")\nlet nodeE = graph.addNode(\"e\")\nlet nodeF = graph.addNode(\"f\")\nlet nodeG = graph.addNode(\"g\")\nlet nodeH = graph.addNode(\"h\")\n\ngraph.addEdge(nodeA, neighbor: nodeB)\ngraph.addEdge(nodeA, neighbor: nodeC)\ngraph.addEdge(nodeB, neighbor: nodeD)\ngraph.addEdge(nodeB, neighbor: nodeE)\ngraph.addEdge(nodeC, neighbor: nodeF)\ngraph.addEdge(nodeC, neighbor: nodeG)\ngraph.addEdge(nodeE, neighbor: nodeH)\ngraph.addEdge(nodeE, neighbor: nodeF)\ngraph.addEdge(nodeF, neighbor: nodeG)\n\nlet nodesExplored = breadthFirstSearch(graph, source: nodeA)\nprint(nodesExplored)\n```\n\nThis will output: `[\"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\"]`\n   \n## What is BFS good for?\n\nBreadth-first search can be used to solve many problems. A small selection:\n\n* Computing the [shortest path](../Shortest%20Path%20(Unweighted)/) between a source node and each of the other nodes (only for unweighted graphs).\n* Calculating the [minimum spanning tree](../Minimum%20Spanning%20Tree%20(Unweighted)/) on an unweighted graph.\n\n*Written by [Chris Pilcher](https://github.com/chris-pilcher) and Matthijs Hollemans*\n"
  },
  {
    "path": "Breadth-First Search/Tests/BreadthFirstSearchTests.swift",
    "content": "import XCTest\n\nclass BreadthFirstSearchTests: XCTestCase {\n\n  func testExploringTree() {\n    let tree = Graph()\n\n    let nodeA = tree.addNode(\"a\")\n    let nodeB = tree.addNode(\"b\")\n    let nodeC = tree.addNode(\"c\")\n    let nodeD = tree.addNode(\"d\")\n    let nodeE = tree.addNode(\"e\")\n    let nodeF = tree.addNode(\"f\")\n    let nodeG = tree.addNode(\"g\")\n    let nodeH = tree.addNode(\"h\")\n\n    tree.addEdge(nodeA, neighbor: nodeB)\n    tree.addEdge(nodeA, neighbor: nodeC)\n    tree.addEdge(nodeB, neighbor: nodeD)\n    tree.addEdge(nodeB, neighbor: nodeE)\n    tree.addEdge(nodeC, neighbor: nodeF)\n    tree.addEdge(nodeC, neighbor: nodeG)\n    tree.addEdge(nodeE, neighbor: nodeH)\n\n    let nodesExplored = breadthFirstSearch(tree, source: nodeA)\n\n    XCTAssertEqual(nodesExplored, [\"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\"])\n  }\n\n  func testExploringGraph() {\n    let graph = Graph()\n\n    let nodeA = graph.addNode(\"a\")\n    let nodeB = graph.addNode(\"b\")\n    let nodeC = graph.addNode(\"c\")\n    let nodeD = graph.addNode(\"d\")\n    let nodeE = graph.addNode(\"e\")\n    let nodeF = graph.addNode(\"f\")\n    let nodeG = graph.addNode(\"g\")\n    let nodeH = graph.addNode(\"h\")\n    let nodeI = graph.addNode(\"i\")\n\n    graph.addEdge(nodeA, neighbor: nodeB)\n    graph.addEdge(nodeA, neighbor: nodeH)\n    graph.addEdge(nodeB, neighbor: nodeA)\n    graph.addEdge(nodeB, neighbor: nodeC)\n    graph.addEdge(nodeB, neighbor: nodeH)\n    graph.addEdge(nodeC, neighbor: nodeB)\n    graph.addEdge(nodeC, neighbor: nodeD)\n    graph.addEdge(nodeC, neighbor: nodeF)\n    graph.addEdge(nodeC, neighbor: nodeI)\n    graph.addEdge(nodeD, neighbor: nodeC)\n    graph.addEdge(nodeD, neighbor: nodeE)\n    graph.addEdge(nodeD, neighbor: nodeF)\n    graph.addEdge(nodeE, neighbor: nodeD)\n    graph.addEdge(nodeE, neighbor: nodeF)\n    graph.addEdge(nodeF, neighbor: nodeC)\n    graph.addEdge(nodeF, neighbor: nodeD)\n    graph.addEdge(nodeF, neighbor: nodeE)\n    graph.addEdge(nodeF, neighbor: nodeG)\n    graph.addEdge(nodeG, neighbor: nodeF)\n    graph.addEdge(nodeG, neighbor: nodeH)\n    graph.addEdge(nodeG, neighbor: nodeI)\n    graph.addEdge(nodeH, neighbor: nodeA)\n    graph.addEdge(nodeH, neighbor: nodeB)\n    graph.addEdge(nodeH, neighbor: nodeG)\n    graph.addEdge(nodeH, neighbor: nodeI)\n    graph.addEdge(nodeI, neighbor: nodeC)\n    graph.addEdge(nodeI, neighbor: nodeG)\n    graph.addEdge(nodeI, neighbor: nodeH)\n\n    let nodesExplored = breadthFirstSearch(graph, source: nodeA)\n\n    XCTAssertEqual(nodesExplored, [\"a\", \"b\", \"h\", \"c\", \"g\", \"i\", \"d\", \"f\", \"e\"])\n  }\n\n  func testExploringGraphWithASingleNode() {\n    let graph = Graph()\n    let node = graph.addNode(\"a\")\n\n    let nodesExplored = breadthFirstSearch(graph, source: node)\n\n    XCTAssertEqual(nodesExplored, [\"a\"])\n  }\n}\n"
  },
  {
    "path": "Breadth-First Search/Tests/Graph.swift",
    "content": "// MARK: - Edge\n\npublic class Edge: Equatable {\n  public var neighbor: Node\n\n  public init(neighbor: Node) {\n    self.neighbor = neighbor\n  }\n}\n\npublic func == (lhs: Edge, rhs: Edge) -> Bool {\n  return lhs.neighbor == rhs.neighbor\n}\n\n// MARK: - Node\n\npublic class Node: CustomStringConvertible, Equatable {\n  public var neighbors: [Edge]\n\n  public private(set) var label: String\n  public var distance: Int?\n  public var visited: Bool\n\n  public init(label: String) {\n    self.label = label\n    neighbors = []\n    visited = false\n  }\n\n  public var description: String {\n    if let distance = distance {\n      return \"Node(label: \\(label), distance: \\(distance))\"\n    }\n    return \"Node(label: \\(label), distance: infinity)\"\n  }\n\n  public var hasDistance: Bool {\n    return distance != nil\n  }\n\n  public func remove(edge: Edge) {\n    neighbors.remove(at: neighbors.index { $0 === edge }!)\n  }\n}\n\npublic func == (lhs: Node, rhs: Node) -> Bool {\n  return lhs.label == rhs.label && lhs.neighbors == rhs.neighbors\n}\n\n// MARK: - Graph\n\npublic class Graph: CustomStringConvertible, Equatable {\n  public private(set) var nodes: [Node]\n\n  public init() {\n    self.nodes = []\n  }\n\n  public func addNode(_ label: String) -> Node {\n    let node = Node(label: label)\n    nodes.append(node)\n    return node\n  }\n\n  public func addEdge(_ source: Node, neighbor: Node) {\n    let edge = Edge(neighbor: neighbor)\n    source.neighbors.append(edge)\n  }\n\n  public var description: String {\n    var description = \"\"\n\n    for node in nodes {\n      if !node.neighbors.isEmpty {\n        description += \"[node: \\(node.label) edges: \\(node.neighbors.map { $0.neighbor.label})]\"\n      }\n    }\n    return description\n  }\n\n  public func findNodeWithLabel(_ label: String) -> Node {\n    return nodes.filter { $0.label == label }.first!\n  }\n\n  public func duplicate() -> Graph {\n    let duplicated = Graph()\n\n    for node in nodes {\n      _ = duplicated.addNode(node.label)\n    }\n\n    for node in nodes {\n      for edge in node.neighbors {\n        let source = duplicated.findNodeWithLabel(node.label)\n        let neighbour = duplicated.findNodeWithLabel(edge.neighbor.label)\n        duplicated.addEdge(source, neighbor: neighbour)\n      }\n    }\n\n    return duplicated\n  }\n}\n\npublic func == (lhs: Graph, rhs: Graph) -> Bool {\n  return lhs.nodes == rhs.nodes\n}\n"
  },
  {
    "path": "Breadth-First Search/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Breadth-First Search/Tests/Queue.swift",
    "content": "public struct Queue<T> {\n  private var array: [T]\n\n  public init() {\n    array = []\n  }\n\n  public var isEmpty: Bool {\n    return array.isEmpty\n  }\n\n  public var count: Int {\n    return array.count\n  }\n\n  public mutating func enqueue(_ element: T) {\n    array.append(element)\n  }\n\n  public mutating func dequeue() -> T? {\n    if isEmpty {\n      return nil\n    } else {\n      return array.removeFirst()\n    }\n  }\n\n  public func peek() -> T? {\n    return array.first\n  }\n}\n"
  },
  {
    "path": "Breadth-First Search/Tests/Tests.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t83F9C9681C84437C00B3A87F /* BreadthFirstSearch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83F9C9651C84437C00B3A87F /* BreadthFirstSearch.swift */; };\n\t\t83F9C96C1C8443E800B3A87F /* BreadthFirstSearchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83F9C96B1C8443E800B3A87F /* BreadthFirstSearchTests.swift */; };\n\t\t83F9C9721C84449D00B3A87F /* Graph.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83F9C96E1C84449D00B3A87F /* Graph.swift */; };\n\t\t83F9C9741C84449D00B3A87F /* Queue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83F9C9701C84449D00B3A87F /* Queue.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t7B2BBC801C779D720067B71D /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7B2BBC941C779E7B0067B71D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };\n\t\t83F9C9651C84437C00B3A87F /* BreadthFirstSearch.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BreadthFirstSearch.swift; path = ../BreadthFirstSearch.swift; sourceTree = SOURCE_ROOT; };\n\t\t83F9C96B1C8443E800B3A87F /* BreadthFirstSearchTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BreadthFirstSearchTests.swift; sourceTree = SOURCE_ROOT; };\n\t\t83F9C96E1C84449D00B3A87F /* Graph.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Graph.swift; sourceTree = SOURCE_ROOT; };\n\t\t83F9C9701C84449D00B3A87F /* Queue.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Queue.swift; sourceTree = SOURCE_ROOT; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t7B2BBC7D1C779D720067B71D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t7B2BBC681C779D710067B71D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC831C779D720067B71D /* Tests */,\n\t\t\t\t7B2BBC721C779D710067B71D /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC721C779D710067B71D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC801C779D720067B71D /* Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC831C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t83F9C9651C84437C00B3A87F /* BreadthFirstSearch.swift */,\n\t\t\t\t83F9C96B1C8443E800B3A87F /* BreadthFirstSearchTests.swift */,\n\t\t\t\t83F9C96E1C84449D00B3A87F /* Graph.swift */,\n\t\t\t\t83F9C9701C84449D00B3A87F /* Queue.swift */,\n\t\t\t\t7B2BBC941C779E7B0067B71D /* Info.plist */,\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t7B2BBC7F1C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t7B2BBC7C1C779D720067B71D /* Sources */,\n\t\t\t\t7B2BBC7D1C779D720067B71D /* Frameworks */,\n\t\t\t\t7B2BBC7E1C779D720067B71D /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tproductName = TestsTests;\n\t\t\tproductReference = 7B2BBC801C779D720067B71D /* Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t7B2BBC691C779D710067B71D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0720;\n\t\t\t\tLastUpgradeCheck = 1000;\n\t\t\t\tORGANIZATIONNAME = \"Swift Algorithm Club\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t7B2BBC7F1C779D720067B71D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2;\n\t\t\t\t\t\tLastSwiftMigration = 1000;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 7B2BBC681C779D710067B71D;\n\t\t\tproductRefGroup = 7B2BBC721C779D710067B71D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t7B2BBC7F1C779D720067B71D /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t7B2BBC7E1C779D720067B71D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t7B2BBC7C1C779D720067B71D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t83F9C9721C84449D00B3A87F /* Graph.swift in Sources */,\n\t\t\t\t83F9C9681C84437C00B3A87F /* BreadthFirstSearch.swift in Sources */,\n\t\t\t\t83F9C9741C84449D00B3A87F /* Queue.swift in Sources */,\n\t\t\t\t83F9C96C1C8443E800B3A87F /* BreadthFirstSearchTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t7B2BBC871C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC881C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t7B2BBC8D1C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC8E1C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC871C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC881C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC8D1C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC8E1C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 7B2BBC691C779D710067B71D /* Project object */;\n}\n"
  },
  {
    "path": "Breadth-First Search/Tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Breadth-First Search/Tests/Tests.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Breadth-First Search/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1000\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Brute-Force String Search/BruteForceStringSearch.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\n// last checked with Xcode 9.0b4\n#if swift(>=4.0)\nprint(\"Hello, Swift 4!\")\n#endif\n\nextension String {\n  func indexOf(_ pattern: String) -> String.Index? {\n\n    for i in self.characters.indices {\n      var j = i\n      var found = true\n      for p in pattern.characters.indices {\n        if j == self.characters.endIndex || self[j] != pattern[p] {\n          found = false\n          break\n        } else {\n            j = self.characters.index(after: j)\n        }\n      }\n      if found {\n        return i\n      }\n    }\n    return nil\n  }\n}\n\n// A few simple tests\n\nlet s = \"Hello, World\"\ns.indexOf(\"World\")  // 7\n\nlet animals = \"🐶🐔🐷🐮🐱\"\nanimals.indexOf(\"🐮\")  // 6\n"
  },
  {
    "path": "Brute-Force String Search/BruteForceStringSearch.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Brute-Force String Search/BruteForceStringSearch.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Brute-Force String Search/BruteForceStringSearch.swift",
    "content": "/*\n  Brute-force string search\n*/\nextension String {\n  func indexOf(_ pattern: String) -> String.Index? {\n    for i in self.characters.indices {\n        var j = i\n        var found = true\n        for p in pattern.characters.indices {\n            if j == self.characters.endIndex || self[j] != pattern[p] {\n                found = false\n                break\n            } else {\n                j = self.characters.index(after: j)\n            }\n        }\n        if found {\n            return i\n        }\n    }\n    return nil\n  }\n}\n"
  },
  {
    "path": "Brute-Force String Search/README.markdown",
    "content": "# Brute-Force String Search\n\nHow would you go about writing a string search algorithm in pure Swift if you were not allowed to import Foundation and could not use `NSString`'s `rangeOfString()` method?\n\nThe goal is to implement an `indexOf(pattern: String)` extension on `String` that returns the `String.Index` of the first occurrence of the search pattern, or `nil` if the pattern could not be found inside the string.\n \nFor example:\n\n```swift\n// Input: \nlet s = \"Hello, World\"\ns.indexOf(\"World\")\n\n// Output:\n<String.Index?> 7\n\n// Input:\nlet animals = \"🐶🐔🐷🐮🐱\"\nanimals.indexOf(\"🐮\")\n\n// Output:\n<String.Index?> 6\n```\n\n> **Note:** The index of the cow is 6, not 3 as you might expect, because the string uses more storage per character for emoji. The actual value of the `String.Index` is not so important, just that it points at the right character in the string.\n\nHere is a brute-force solution:\n\n```swift\nextension String {\n  func indexOf(_ pattern: String) -> String.Index? {\n    for i in self.characters.indices {\n        var j = i\n        var found = true\n        for p in pattern.characters.indices{\n            if j == self.characters.endIndex || self[j] != pattern[p] {\n                found = false\n                break\n            } else {\n                j = self.characters.index(after: j)\n            }\n        }\n        if found {\n            return i\n        }\n    }\n    return nil\n  }\n}\n```\n\nThis looks at each character in the source string in turn. If the character equals the first character of the search pattern, then the inner loop checks whether the rest of the pattern matches. If no match is found, the outer loop continues where it left off. This repeats until a complete match is found or the end of the source string is reached.\n\nThe brute-force approach works OK, but it's not very efficient (or pretty). It should work fine on small strings, though. For a smarter algorithm that works better with large chunks of text, check out [Boyer-Moore](../Boyer-Moore-Horspool) string search.\n\n*Written for Swift Algorithm Club by Matthijs Hollemans*\n"
  },
  {
    "path": "Bubble Sort/MyPlayground.playground/Contents.swift",
    "content": "import Foundation\n\nvar array = [4,2,1,3]\n\nprint(\"before:\",array)\nprint(\"after:\", bubbleSort(array))\nprint(\"after:\", bubbleSort(array, <))\nprint(\"after:\", bubbleSort(array, >))\n"
  },
  {
    "path": "Bubble Sort/MyPlayground.playground/Sources/BubbleSort.swift",
    "content": "//\n//  BubbleSort.swift\n//\n//  Created by Julio Brazil on 1/10/18.\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and\n//  associated documentation files (the \"Software\"), to deal in the Software without restriction, including\n//  without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the\n//  following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT\n//  LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO\n//  EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN\n//  AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE\n//  OR OTHER DEALINGS IN THE SOFTWARE.\n//\n\nimport Foundation\n\n/// Performs the bubble sort algorithm in the array\n///\n/// - Parameter elements: a array of elements that implement the Comparable protocol\n/// - Returns: an array with the same elements but in order\npublic func bubbleSort<T> (_ elements: [T]) -> [T] where T: Comparable {\n  return bubbleSort(elements, <)\n}\n\npublic func bubbleSort<T> (_ elements: [T], _ comparison: (T,T) -> Bool) -> [T]  {\n  var array = elements\n  \n  for i in 0..<array.count {\n    for j in 1..<array.count-i {\n      if comparison(array[j], array[j-1]) {\n        let tmp = array[j-1]\n        array[j-1] = array[j]\n        array[j] = tmp\n      }\n    }\n  }\n  \n  return array\n}\n"
  },
  {
    "path": "Bubble Sort/MyPlayground.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios' executeOnSourceChanges='false'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Bubble Sort/MyPlayground.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Bubble Sort/MyPlayground.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Bubble Sort/README.markdown",
    "content": "# Bubble Sort\n\nBubble sort is a sorting algorithm that is implemented by starting in the beginning of the array and swapping the first two elements only if the first element is greater than the second element. This comparison is then moved onto the next pair and so on and so forth. This is done until the array is completely sorted. The smaller items slowly “bubble” up to the beginning of the array. Sometimes this algorithm is refered as Sinking sort, due to the larger, or heavier elements sinking to the end of the array.\n\n##### Runtime:\n- Average: O(N^2)\n- Worst: O(N^2)\n\n##### Memory:\n- O(1)\n\n### Implementation:\n\nThe implementation will not be shown as the average and worst runtimes show that this is a very inefficient algorithm. However, having a grasp of the concept will help you understand the basics of simple sorting algorithms.\n\nBubble sort is a very simple sorting algorithm, it consists in comparing pairs of adjacent elements in the array, if the first element is larger, swap them, otherwise, you do nothing and go for the next comparison.\nThis is accomplished by looking through the array `n` times, `n` being the amount of elements in the array.\n\n![animated gif of the bubble sort algorithm](https://s3.amazonaws.com/codecademy-content/programs/tdd-js/articles/BubbleSort.gif)\n\nThis GIF shows a inverted implementation than \n\n#### Example\nLet us take the array `[5, 1, 4, 2, 8]`, and sort the array from lowest number to greatest number using bubble sort. In each step, elements written in bold are being compared. Three passes will be required.\n\n##### First Pass\n[ **5 1** 4 2 8 ] -> [ **1 5** 4 2 8 ], Here, algorithm compares the first two elements, and swaps since 5 > 1.\n\n[ 1 **5 4** 2 8 ] -> [ 1 **4 5** 2 8 ], Swap since 5 > 4 \n\n[ 1 4 **5 2** 8 ] -> [ 1 4 **2 5** 8 ], Swap since 5 > 2 \n\n[ 1 4 2 **5 8** ] -> [ 1 4 2 **5 8** ], Now, since these elements are already in order (8 > 5), algorithm does not swap them.\n\n##### Second Pass\n[ **1 4** 2 5 8 ] -> [ **1 4** 2 5 8 ]\n\n[ 1 **4 2** 5 8 ] -> [ 1 **2 4** 5 8 ], Swap since 4 > 2 \n\n[ 1 2 **4 5** 8 ] -> [ 1 2 **4 5** 8 ]\n\n[ 1 2 4 **5 8** ] -> [ 1 2 4 **5 8** ]\nNow, the array is already sorted, but the algorithm does not know if it is completed. The algorithm needs one whole pass without any swap to know it is sorted.\n\n##### Third Pass\n[ **1 2** 4 5 8 ] -> [ **1 2** 4 5 8 ]\n\n[ 1 **2 4** 5 8 ] -> [ 1 **2 4** 5 8 ]\n\n[ 1 2 **4 5** 8 ] -> [ 1 2 **4 5** 8 ]\n\n[ 1 2 4 **5 8** ] -> [ 1 2 4 **5 8** ]\n\nThis is the same for the forth and fifth passes.\n\n#### Code\n```swift\nfor i in 0..<array.count {\n  for j in 1..<array.count {\n    if array[j] < array[j-1] {\n      let tmp = array[j-1]\n      array[j-1] = array[j]\n      array[j] = tmp\n    }\n  }\n}\nreturn array\n```\n\n#### Optimization\nThe bubble sort algorithm can be easily optimized by observing that the `n-th` pass finds the `n-th` largest element and puts it into its final place. So, the inner loop can avoid looking at the last `n-1` items when running for the `n-th` time:\n\n```swift\nfor i in 0..<array.count {\n  for j in 1..<array.count - i {\n    if array[j] < array[j-1] {\n      let tmp = array[j-1]\n      array[j-1] = array[j]\n      array[j] = tmp\n    }\n  }\n}\nreturn array\n```\n\nThe only change made was on the second line, changing the interval from `1..<array.count` to `1..<array.count - i`, effectively cutting the number of comparisons by half.\n\nThe ordering with the optimized code would look something like this for the array  `[5, 1, 4, 2, 8]`:\n\n##### First Pass\n[ **5 1** 4 2 8 ] -> [ **1 5** 4 2 8 ], Swaps since 5 > 1\n\n[ 1 **5 4** 2 8 ] -> [ 1 **4 5** 2 8 ], Swap since 5 > 4 \n\n[ 1 4 **5 2** 8 ] -> [ 1 4 **2 5** 8 ], Swap since 5 > 2 \n\n[ 1 4 2 **5 8** ] -> [ 1 4 2 **5 8** ], Now, since these elements are already in order (8 > 5), algorithm does not swap them. \n\n*by the end of the first pass, the last element is guaranteed to be the largest*\n\n##### Second Pass\n[ **1 4** 2 5 8 ] -> [ **1 4** 2 5 8 ]\n\n[ 1 **4 2** 5 8 ] -> [ 1 **2 4** 5 8 ], Swap since 4 > 2 \n\n[ 1 2 **4 5** 8 ] -> [ 1 2 **4 5** 8 ], As the first loop has occured once, the inner loop stops here, not comparing 5 with 8\n\n##### Third Pass\n[ **1 2** 4 5 8 ] -> [ **1 2** 4 5 8 ]\n\n[ 1 **2 4** 5 8 ] -> [ 1 **2 4** 5 8 ] again, stoping one comparison short\n\n##### Fourth Pass\n[ **1 2** 4 5 8 ] -> [ **1 2** 4 5 8 ]\n\nThere is no Fifth pass\n\n#### Conclusion\n\nEven with the proposed optimizations, this is still a terribly inefficient sorting algorithm. A good alternative is [Merge Sort](https://github.com/raywenderlich/swift-algorithm-club/tree/master/Merge%20Sort), that not only is better performing, has a similar degree of dificulty to implement.\n\n*Updated for the Swift Algorithm Club by Julio Brazil*\n\n##### Supporting Links\n[Code Pumpkin](https://codepumpkin.com/bubble-sort/)\n[Wikipedia](https://en.wikipedia.org/wiki/Bubble_sort)\n[GeeksforGeeks](https://www.geeksforgeeks.org/bubble-sort/)\n"
  },
  {
    "path": "Bucket Sort/BucketSort.playground/Contents.swift",
    "content": "//\n//  BucketSort.playground\n//\n//  Created by Barbara Rodeker on 4/4/16.\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and\n//  associated documentation files (the \"Software\"), to deal in the Software without restriction, including\n//  without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the\n//  following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT\n//  LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO\n//  EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN\n//  AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE\n//  OR OTHER DEALINGS IN THE SOFTWARE.\n//\n//\n\n//////////////////////////////////////\n// MARK: Extensions\n//////////////////////////////////////\n\nextension Int: IntConvertible, Sortable {\n    public func toInt() -> Int {\n        return self\n    }\n}\n\n//////////////////////////////////////\n// MARK: Playing code\n//////////////////////////////////////\n\nlet input = [1, 2, 4, 6, 10, 5]\nvar buckets = [Bucket<Int>(capacity: 15), Bucket<Int>(capacity: 15), Bucket<Int>(capacity: 15)]\n\nlet sortedElements = bucketSort(input, distributor: RangeDistributor(), sorter: InsertionSorter(), buckets: buckets)\n\nprint(sortedElements)\n"
  },
  {
    "path": "Bucket Sort/BucketSort.playground/Sources/BucketSort.swift",
    "content": "//\n//  BucketSort.swift\n//\n//  Created by Barbara Rodeker on 4/4/16.\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and\n//  associated documentation files (the \"Software\"), to deal in the Software without restriction, including\n//  without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the\n//  following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT\n//  LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO\n//  EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN\n//  AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE\n//  OR OTHER DEALINGS IN THE SOFTWARE.\n//\n//\n\n//////////////////////////////////////\n// MARK: Main algorithm\n//////////////////////////////////////\n\n/**\n Performs bucket sort algorithm on the given input elements.\n [Bucket Sort Algorithm Reference](https://en.wikipedia.org/wiki/Bucket_sort)\n \n - Parameter elements:     Array of Sortable elements\n - Parameter distributor:  Performs the distribution of each element of a bucket\n - Parameter sorter:       Performs the sorting inside each bucket, after all the elements are distributed\n - Parameter buckets:      An array of buckets\n \n - Returns: A new array with sorted elements\n */\n\npublic func bucketSort<T>(_ elements: [T], distributor: Distributor, sorter: Sorter, buckets: [Bucket<T>]) -> [T] {\n    precondition(allPositiveNumbers(elements))\n    precondition(enoughSpaceInBuckets(buckets, elements: elements))\n    \n    var bucketsCopy = buckets\n    for elem in elements {\n        distributor.distribute(elem, buckets: &bucketsCopy)\n    }\n    \n    var results = [T]()\n    \n    for bucket in bucketsCopy {\n        results += bucket.sort(sorter)\n    }\n    \n    return results\n}\n\nprivate func allPositiveNumbers<T: Sortable>(_ array: [T]) -> Bool {\n    return array.filter { $0.toInt() >= 0 }.count > 0\n}\n\nprivate func enoughSpaceInBuckets<T>(_ buckets: [Bucket<T>], elements: [T]) -> Bool {\n    let maximumValue = elements.max()?.toInt()\n    let totalCapacity = buckets.count * (buckets.first?.capacity)!\n    \n    guard let max = maximumValue else {\n        return false\n    }\n    \n    return totalCapacity >= max\n}\n\n//////////////////////////////////////\n// MARK: Distributor\n//////////////////////////////////////\n\npublic protocol Distributor {\n    func distribute<T>(_ element: T, buckets: inout [Bucket<T>])\n}\n\n/*\n * An example of a simple distribution function that send every elements to\n * the bucket representing the range in which it fits.An\n *\n * If the range of values to sort is 0..<49 i.e, there could be 5 buckets of capacity = 10\n * So every element will be classified by the ranges:\n *\n * -  0 ..< 10\n * - 10 ..< 20\n * - 20 ..< 30\n * - 30 ..< 40\n * - 40 ..< 50\n *\n * By following the formula: element / capacity = #ofBucket\n */\npublic struct RangeDistributor: Distributor {\n    \n    public init() {}\n    \n    public func distribute<T>(_ element: T, buckets: inout [Bucket<T>]) {\n        let value = element.toInt()\n        let bucketCapacity = buckets.first!.capacity\n        \n        let bucketIndex = value / bucketCapacity\n        buckets[bucketIndex].add(element)\n    }\n}\n\n//////////////////////////////////////\n// MARK: Sortable\n//////////////////////////////////////\n\npublic protocol IntConvertible {\n    func toInt() -> Int\n}\n\npublic protocol Sortable: IntConvertible, Comparable {\n}\n\n//////////////////////////////////////\n// MARK: Sorter\n//////////////////////////////////////\n\npublic protocol Sorter {\n    func sort<T: Sortable>(_ items: [T]) -> [T]\n}\n\npublic struct InsertionSorter: Sorter {\n    \n    public init() {}\n    \n    public func sort<T: Sortable>(_ items: [T]) -> [T] {\n        var results = items\n        for i in 0 ..< results.count {\n            var j = i\n            while j > 0 && results[j-1] > results[j] {\n                \n                let auxiliar = results[j-1]\n                results[j-1] = results[j]\n                results[j] = auxiliar\n                \n                j -= 1\n            }\n        }\n        return results\n    }\n}\n\n//////////////////////////////////////\n// MARK: Bucket\n//////////////////////////////////////\n\npublic struct Bucket<T: Sortable> {\n    var elements: [T]\n    let capacity: Int\n    \n    public init(capacity: Int) {\n        self.capacity = capacity\n        elements = [T]()\n    }\n    \n    public mutating func add(_ item: T) {\n        if elements.count < capacity {\n            elements.append(item)\n        }\n    }\n    \n    public func sort(_ algorithm: Sorter) -> [T] {\n        return algorithm.sort(elements)\n    }\n}\n\n"
  },
  {
    "path": "Bucket Sort/BucketSort.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios' executeOnSourceChanges='false'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Bucket Sort/BucketSort.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Bucket Sort/BucketSort.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Bucket Sort/BucketSort.swift",
    "content": "//\n//  BucketSort.swift\n//\n//  Created by Barbara Rodeker on 4/4/16.\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and\n//  associated documentation files (the \"Software\"), to deal in the Software without restriction, including\n//  without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the\n//  following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in all copies or substantial\n//  portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT\n//  LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO\n//  EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN\n//  AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE\n//  OR OTHER DEALINGS IN THE SOFTWARE.\n//\n//\n\n//////////////////////////////////////\n// MARK: Main algorithm\n//////////////////////////////////////\n\n/**\n    Performs bucket sort algorithm on the given input elements.\n    [Bucket Sort Algorithm Reference](https://en.wikipedia.org/wiki/Bucket_sort)\n\n    - Parameter elements:     Array of Sortable elements\n    - Parameter distributor:  Performs the distribution of each element of a bucket\n    - Parameter sorter:       Performs the sorting inside each bucket, after all the elements are distributed\n    - Parameter buckets:      An array of buckets\n\n    - Returns: A new array with sorted elements\n */\n\npublic func bucketSort<T>(_ elements: [T], distributor: Distributor, sorter: Sorter, buckets: [Bucket<T>]) -> [T] {\n    precondition(allPositiveNumbers(elements))\n    precondition(enoughSpaceInBuckets(buckets, elements: elements))\n\n    var bucketsCopy = buckets\n    for elem in elements {\n        distributor.distribute(elem, buckets: &bucketsCopy)\n    }\n\n    var results = [T]()\n\n    for bucket in bucketsCopy {\n        results += bucket.sort(sorter)\n    }\n\n    return results\n}\n\nprivate func allPositiveNumbers<T: Sortable>(_ array: [T]) -> Bool {\n    return array.filter { $0.toInt() >= 0 }.count > 0\n}\n\nprivate func enoughSpaceInBuckets<T>(_ buckets: [Bucket<T>], elements: [T]) -> Bool {\n    let maximumValue = elements.max()?.toInt()\n    let totalCapacity = buckets.count * (buckets.first?.capacity)!\n\n    guard let max = maximumValue else {\n        return false\n    }\n    \n    return totalCapacity >= max\n}\n\n//////////////////////////////////////\n// MARK: Distributor\n//////////////////////////////////////\n\npublic protocol Distributor {\n    func distribute<T>(_ element: T, buckets: inout [Bucket<T>])\n}\n\n/*\n * An example of a simple distribution function that send every elements to\n * the bucket representing the range in which it fits.An\n *\n * If the range of values to sort is 0..<49 i.e, there could be 5 buckets of capacity = 10\n * So every element will be classified by the ranges:\n *\n * -  0 ..< 10\n * - 10 ..< 20\n * - 20 ..< 30\n * - 30 ..< 40\n * - 40 ..< 50\n *\n * By following the formula: element / capacity = #ofBucket\n */\npublic struct RangeDistributor: Distributor {\n\n    public init() {}\n\n    public func distribute<T>(_ element: T, buckets: inout [Bucket<T>]) {\n        let value = element.toInt()\n        let bucketCapacity = buckets.first!.capacity\n\n        let bucketIndex = value / bucketCapacity\n        buckets[bucketIndex].add(element)\n    }\n}\n\n//////////////////////////////////////\n// MARK: Sortable\n//////////////////////////////////////\n\npublic protocol IntConvertible {\n    func toInt() -> Int\n}\n\npublic protocol Sortable: IntConvertible, Comparable {\n}\n\n//////////////////////////////////////\n// MARK: Sorter\n//////////////////////////////////////\n\npublic protocol Sorter {\n    func sort<T: Sortable>(_ items: [T]) -> [T]\n}\n\npublic struct InsertionSorter: Sorter {\n\n    public init() {}\n\n    public func sort<T: Sortable>(_ items: [T]) -> [T] {\n        var results = items\n        for i in 0 ..< results.count {\n            var j = i\n            while j > 0 && results[j-1] > results[j] {\n\n                let auxiliar = results[j-1]\n                results[j-1] = results[j]\n                results[j] = auxiliar\n\n                j -= 1\n            }\n        }\n        return results\n    }\n}\n\n//////////////////////////////////////\n// MARK: Bucket\n//////////////////////////////////////\n\npublic struct Bucket<T: Sortable> {\n    var elements: [T]\n    let capacity: Int\n\n    public init(capacity: Int) {\n        self.capacity = capacity\n        elements = [T]()\n    }\n\n    public mutating func add(_ item: T) {\n        if elements.count < capacity {\n            elements.append(item)\n        }\n    }\n\n    public func sort(_ algorithm: Sorter) -> [T] {\n        return algorithm.sort(elements)\n    }\n}\n"
  },
  {
    "path": "Bucket Sort/README.markdown",
    "content": "# Bucket Sort\n\nBucket Sort, also known as Bin Sort, is a distributed sorting algorithm, which sort elements from an array by performing these steps:  \n\n1) Distribute the elements into buckets or bins.  \n2) Sort each bucket individually.  \n3) Merge the buckets in order to produce a sorted array as the result.\n\nSee the algorithm in action [here](https://www.cs.usfca.edu/~galles/visualization/BucketSort.html) and [here](http://www.algostructure.com/sorting/bucketsort.php).\n\nThe performance for execution time is:  \n\n| Case  | Performance |\n|:-------------: |:---------------:|\n| Worst       |  O(n^2) |\n| Best      | \tOmega(n + k)        |\n|  Average | \tTheta(n + k)       |\n\nWhere **n** = the number of elements and **k** is the number of buckets.\n\nIn the *best case*, the algorithm distributes the elements uniformly between buckets, a few elements are placed on each bucket and sorting the buckets is **O(1)**. Rearranging the elements is one more run through the initial list.  \n\nIn the *worst case*, the elements are sent all to the same bucket, making the process take **O(n^2)**.\n\n## Pseudocode\n\nA [pseudocode](https://en.wikipedia.org/wiki/Bucket_sort#Pseudocode) of the algorithm can be as follows:  \n\n    function bucketSort(array, n) is\n        buckets ← new array of n empty lists\n        for i = 0 to (length(array)-1) do\n            insert array[i] into buckets[msbits(array[i], k)]\n        for i = 0 to n - 1 do\n            nextSort(buckets[i]);\n        return the concatenation of buckets[0], ...., buckets[n-1]\n\n\n## Graphically explained\n\n1) Distribute elements in buckets:\n\n![distribution step](https://upload.wikimedia.org/wikipedia/commons/6/61/Bucket_sort_1.png)\n\n2) Sorting inside every bucket and merging:\n\n![sorting each bucket and merge](https://upload.wikimedia.org/wikipedia/commons/3/39/Bucket_sort_2.png)\n\n## An example\n\n### Input  \n\nSuppose we have the following list of elements: `[2, 56, 4, 77, 26, 98, 55]`. Let's use 10 buckets. To determine the capacity of each bucket we need to know the *maximum element value*, in this case `98`.  \n\nSo the buckets are:    \n\n* `bucket 1`: from 0 to 9\n* `bucket 2`: from 10 to 19\n* `bucket 3`: from 20 to 29\n*  and so on.\n\n### Distribution\n\nNow we need to choose a distribution function.  \n\n`bucketNumber = (elementValue / totalNumberOfBuckets) + 1`  \n\nSuch that by applying that function we distribute all the elements in the buckets.  \n\nIn our example it is like the following:  \n\n1. Apply the distribution function to `2`. `bucketNumber = (2 / 10) + 1 = 1`\n2. Apply the distribution function to `56`. `bucketNumber = (56 / 10) + 1 = 6`\n3. Apply the distribution function to `4`. `bucketNumber = (4 / 10) + 1 = 1`\n4. Apply the distribution function to `77`. `bucketNumber = (77 / 10) + 1 = 8`\n5. Apply the distribution function to `26`. `bucketNumber = (26 / 10) + 1 = 3`\n6. Apply the distribution function to `98`. `bucketNumber = (98 / 10) + 1 = 10`\n7. Apply the distribution function to `55`. `bucketNumber = (55 / 10) + 1 = 6`\n\nOur buckets will be filled now:  \n\n**1**  <img src=\"https://pixabay.com/static/uploads/photo/2014/03/24/17/21/pail-295491_960_720.png\" width=\"40\">: `[2, 4]`  \n**2**  <img src=\"https://pixabay.com/static/uploads/photo/2014/03/24/17/21/pail-295491_960_720.png\" width=\"40\">: `[]`  \n**3**  <img src=\"https://pixabay.com/static/uploads/photo/2014/03/24/17/21/pail-295491_960_720.png\" width=\"40\">: `[26]`  \n**4**  <img src=\"https://pixabay.com/static/uploads/photo/2014/03/24/17/21/pail-295491_960_720.png\" width=\"40\">: `[]`  \n**5**  <img src=\"https://pixabay.com/static/uploads/photo/2014/03/24/17/21/pail-295491_960_720.png\" width=\"40\">: `[]`  \n**6**  <img src=\"https://pixabay.com/static/uploads/photo/2014/03/24/17/21/pail-295491_960_720.png\" width=\"40\">: `[55, 56]`  \n**7**  <img src=\"https://pixabay.com/static/uploads/photo/2014/03/24/17/21/pail-295491_960_720.png\" width=\"40\">: `[]`  \n**8**  <img src=\"https://pixabay.com/static/uploads/photo/2014/03/24/17/21/pail-295491_960_720.png\" width=\"40\">: `[77]`  \n**9**  <img src=\"https://pixabay.com/static/uploads/photo/2014/03/24/17/21/pail-295491_960_720.png\" width=\"40\">: `[]`  \n**10** <img src=\"https://pixabay.com/static/uploads/photo/2014/03/24/17/21/pail-295491_960_720.png\" width=\"40\">: `[98]`  \n\nWe can choose to insert the elements in every bucket in order, or sort every bucket after distributing all the elements.  \n\n### Put the elements back in the list\n\nFinally we go through all the buckets and put the elements back in the list:  \n\n  `[2,  4,  26,  55,  56,  77,  98]`  \n\n\n## Swift implementation\n\nHere is a diagram that shows the functions, data structures and protocols for our bucker sort implementation:\n\n![classes](Docs/BucketSort.png)\n\n#### Main function\n\n`bucketSort()` is a generic function that can apply the algorithm to any element of type `T`, as long as `T` is `Sortable`.\n\n```swift\npublic func bucketSort<T:Sortable>(elements: [T],\n                                distributor: Distributor,\n                                     sorter: Sorter,\n                                    buckets: [Bucket<T>]) -> [T] {\n\tprecondition(allPositiveNumbers(elements))\n\tprecondition(enoughSpaceInBuckets(buckets, elements: elements))\n\n\tvar bucketsCopy = buckets\n\tfor elem in elements {\n\t\tdistributor.distribute(elem, buckets: &bucketsCopy)\n\t}\n\n\tvar results = [T]()\n\n\tfor bucket in bucketsCopy {\n\t\tresults += bucket.sort(sorter)\n\t}\n\n\treturn results\n}\n```\n\n#### Bucket\n\n```swift\npublic struct Bucket<T:Sortable> {\n\tvar elements: [T]\n\tlet capacity: Int\n\n\tpublic init(capacity: Int) {\n\t\tself.capacity = capacity\n\t\telements = [T]()\n\t}\n\n\tpublic mutating func add(item: T) {\n\t\tif (elements.count < capacity) {\n\t\t\telements.append(item)\n\t\t}\n\t}\n\n\tpublic func sort(algorithm: Sorter) -> [T] {\n\t\treturn algorithm.sort(elements)\n\t}\n}\n```\n\n#### Sortable\n\n```swift\npublic protocol Sortable: IntConvertible, Comparable {\n}\n```\n\n#### IntConvertible\n\nThe algorithm is designed to sort integers, so all the elements to be sorted should be mapped to an integer value.\n\n```swift\npublic protocol IntConvertible {\n\tfunc toInt() -> Int\n}\n```\n\n#### Sorter\n\n```swift\npublic protocol Sorter {\n\tfunc sort<T:Sortable>(items: [T]) -> [T]\n}\n```\n\n#### Distributor\n\n```swift\npublic protocol Distributor {\n\tfunc distribute<T:Sortable>(element: T, inout buckets: [Bucket<T>])\n}\n```\n\n### Custom Sorter and Distributor\n\nThe current implementation make use of the following implementations for *Sorter* and *Distributor*.  \n\n*Sorter*  \n\n```swift\npublic struct InsertionSorter: Sorter {\n\tpublic func sort<T:Sortable>(items: [T]) -> [T] {\n\t\tvar results = items\n\t\tfor i in 0 ..< results.count {\n\t\t\tvar j = i\n\t\t\twhile ( j > 0 && results[j-1] > results[j]) {\n\n\t\t\t\tlet auxiliar = results[j-1]\n\t\t\t\tresults[j-1] = results[j]\n\t\t\t\tresults[j] = auxiliar\n\n\t\t\t\tj -= 1\n\t\t\t}\n\t\t}\n\t\treturn results\n\t}\n}\n```\n\n*Distributor*  \n\n```swift\n/*\n * An example of a simple distribution function that send every elements to\n * the bucket representing the range in which it fits.\n *\n * If the range of values to sort is 0..<49 i.e, there could be 5 buckets of capacity = 10\n * So every element will be classified by the ranges:\n *\n * -  0 ..< 10\n * - 10 ..< 20\n * - 20 ..< 30\n * - 30 ..< 40\n * - 40 ..< 50\n *\n * By following the formula: element / capacity = #ofBucket\n */\npublic struct RangeDistributor: Distributor {\n\t public func distribute<T:Sortable>(element: T, inout buckets: [Bucket<T>]) {\n\t let value = element.toInt()\n\t let bucketCapacity = buckets.first!.capacity\n\n\t let bucketIndex = value / bucketCapacity\n\t buckets[bucketIndex].add(element)\n\t}\n}\n```\n\n### Make your own version\n\nBy reusing this code and implementing your own *Sorter* and *Distributor* you can experiment with different versions.\n\n## Other variations of Bucket Sort\n\nThe following are some of the variation to the general [Bucket Sort](https://en.wikipedia.org/wiki/Bucket_sort) implemented here:\n\n- [Proxmap Sort](https://en.wikipedia.org/wiki/Bucket_sort#ProxmapSort)\n- [Histogram Sort](https://en.wikipedia.org/wiki/Bucket_sort#Histogram_sort)\n- [Postman Sort](https://en.wikipedia.org/wiki/Bucket_sort#Postman.27s_sort)\n- [Shuffle Sort](https://en.wikipedia.org/wiki/Bucket_sort#Shuffle_sort)\n\n*Written for Swift Algorithm Club by Barbara Rodeker. Images from Wikipedia. Updated by Bruno Scheele.*\n"
  },
  {
    "path": "Bucket Sort/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Bucket Sort/Tests/Tests.swift",
    "content": "//\n//  TestTests.swift\n//  TestTests\n//\n//  Created by Barbara Rodeker on 4/5/16.\n//  Copyright © 2016 Barbara M. Rodeker. All rights reserved.\n//\n\nimport XCTest\n\nclass TestTests: XCTestCase {\n\n    var smallArray: [Int]?\n\n    let total = 400\n    let maximum = 1000\n    var largeArray: [Int]?\n\n    var sparsedArray: [Int]?\n\n    override func setUp() {\n        super.setUp()\n\n        smallArray = [8, 3, 33, 0, 12, 8, 2, 18]\n\n        largeArray = [Int]()\n        for _ in 0..<total {\n            largeArray!.append( Int(arc4random_uniform( UInt32( maximum ) ) ) )\n        }\n\n        sparsedArray = [Int]()\n        sparsedArray = [10, 400, 1500, 500]\n    }\n\n    override func tearDown() {\n        // Put teardown code here. This method is called after the invocation of each test method in the class.\n        super.tearDown()\n    }\n\n    func testSmallArray() {\n\n        let results = performBucketSort(smallArray!, totalBuckets: 3)\n        XCTAssert(isSorted(results))\n    }\n\n    func testBigArray() {\n\n        let results = performBucketSort(largeArray!, totalBuckets: 8)\n        XCTAssert(isSorted(results))\n    }\n\n    func testSparsedArray() {\n\n        let results = performBucketSort(sparsedArray!, totalBuckets: 3)\n        XCTAssert(isSorted(results))\n    }\n\n    // MARK: Private functions\n\n    fileprivate func performBucketSort(_ elements: [Int], totalBuckets: Int) -> [Int] {\n\n        let value = (elements.max()?.toInt())! + 1\n        let capacityRequired = Int( ceil( Double(value) / Double(totalBuckets) ) )\n\n        var buckets = [Bucket<Int>]()\n        for _ in 0..<totalBuckets {\n            buckets.append(Bucket<Int>(capacity: capacityRequired))\n        }\n\n        let results = bucketSort(smallArray!, distributor: RangeDistributor(), sorter: InsertionSorter(), buckets: buckets)\n        return results\n    }\n\n    func isSorted(_ array: [Int]) -> Bool {\n\n        var index = 0\n        var sorted = true\n        while index < (array.count - 1) && sorted {\n            if array[index] > array[index+1] {\n                sorted = false\n            }\n            index += 1\n        }\n\n        return sorted\n    }\n}\n\n//////////////////////////////////////\n// MARK: Extensions\n//////////////////////////////////////\n\nextension Int: IntConvertible, Sortable {\n    public func toInt() -> Int {\n        return self\n    }\n}\n"
  },
  {
    "path": "Bucket Sort/Tests/Tests.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t76E90BEB1CBFB317009E04FE /* Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76E90BEA1CBFB317009E04FE /* Tests.swift */; };\n\t\t76E90BED1CBFB322009E04FE /* BucketSort.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76E90BEC1CBFB322009E04FE /* BucketSort.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t76E90BEA1CBFB317009E04FE /* Tests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Tests.swift; sourceTree = SOURCE_ROOT; };\n\t\t76E90BEC1CBFB322009E04FE /* BucketSort.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BucketSort.swift; path = ../BucketSort.swift; sourceTree = SOURCE_ROOT; };\n\t\t7B2BBC801C779D720067B71D /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7B2BBC941C779E7B0067B71D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t7B2BBC7D1C779D720067B71D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t7B2BBC681C779D710067B71D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC831C779D720067B71D /* Tests */,\n\t\t\t\t7B2BBC721C779D710067B71D /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC721C779D710067B71D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC801C779D720067B71D /* Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC831C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t76E90BEA1CBFB317009E04FE /* Tests.swift */,\n\t\t\t\t76E90BEC1CBFB322009E04FE /* BucketSort.swift */,\n\t\t\t\t7B2BBC941C779E7B0067B71D /* Info.plist */,\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tpath = TestsTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t7B2BBC7F1C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t7B2BBC7C1C779D720067B71D /* Sources */,\n\t\t\t\t7B2BBC7D1C779D720067B71D /* Frameworks */,\n\t\t\t\t7B2BBC7E1C779D720067B71D /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tproductName = TestsTests;\n\t\t\tproductReference = 7B2BBC801C779D720067B71D /* Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t7B2BBC691C779D710067B71D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0730;\n\t\t\t\tLastUpgradeCheck = 1000;\n\t\t\t\tORGANIZATIONNAME = \"Swift Algorithm Club\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t7B2BBC7F1C779D720067B71D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2;\n\t\t\t\t\t\tLastSwiftMigration = 0900;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 7B2BBC681C779D710067B71D;\n\t\t\tproductRefGroup = 7B2BBC721C779D710067B71D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t7B2BBC7F1C779D720067B71D /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t7B2BBC7E1C779D720067B71D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t7B2BBC7C1C779D720067B71D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t76E90BEB1CBFB317009E04FE /* Tests.swift in Sources */,\n\t\t\t\t76E90BED1CBFB322009E04FE /* BucketSort.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t7B2BBC871C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC881C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t7B2BBC8D1C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Default;\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC8E1C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Default;\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC871C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC881C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC8D1C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC8E1C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 7B2BBC691C779D710067B71D /* Project object */;\n}\n"
  },
  {
    "path": "Bucket Sort/Tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Bucket Sort/Tests/Tests.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Bucket Sort/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1000\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Closest Pair/ClosestPair.playground/Contents.swift",
    "content": "//Created by Ahmed Nader (github: AhmedNader42) on 4/4/18.\n\nfunc ClosestPairOf(points: [Point]) -> (minimum:Double, firstPoint:Point, secondPoint:Point) {\n    var innerPoints = mergeSort(points, sortAccording : true)\n    let result = ClosestPair(&innerPoints, innerPoints.count)\n    return (result.minValue, result.firstPoint, result.secondPoint)\n}\n\nfunc ClosestPair(_ p : inout [Point],_ n : Int) -> (minValue: Double,firstPoint: Point,secondPoint: Point)\n{\n    // Brute force if only 3 points (To end recursion)\n    if n <= 3\n    {\n        var i=0, j = i+1\n        var minDist = Double.infinity\n        var newFirst:Point? = nil\n        var newSecond:Point? = nil\n        while i<n\n        {\n            j = i+1\n            while j < n\n            {\n                if dist(p[i], p[j]) <= minDist\n                {\n                    minDist = dist(p[i], p[j])\n                    newFirst = p[i]\n                    newSecond = p[j]\n                }\n                j+=1\n            }\n            i+=1\n            \n        }\n        return (minDist, newFirst ?? Point(0,0), newSecond ?? Point(0,0))\n    }\n    \n    \n    \n    let mid:Int = n/2\n    let line:Double = (p[mid].x + p[mid+1].x)/2\n    \n    // Split the array.\n    var leftSide = [Point]()\n    var rightSide = [Point]()\n    for s in 0..<mid\n    {\n        leftSide.append(p[s])\n    }\n    for s in mid..<p.count\n    {\n        rightSide.append(p[s])\n    }\n    \n    \n    // Recurse on the left and right part of the array.\n    let valueFromLeft = ClosestPair(&leftSide, mid)\n    let minLeft:Double = valueFromLeft.minValue\n    let valueFromRight = ClosestPair(&rightSide, n-mid)\n    let minRight:Double = valueFromRight.minValue\n    \n    // Starting current min must be the largest possible to not affect the real calculations.\n    var min = Double.infinity\n    \n    var first:Point\n    var second:Point\n    \n    // Get the minimum between the left and the right.\n    if minLeft < minRight {\n        min = minLeft\n        first = valueFromLeft.firstPoint\n        second = valueFromLeft.secondPoint\n    }\n    else {\n        min = minRight\n        first = valueFromRight.firstPoint\n        second = valueFromRight.secondPoint\n    }\n    \n    // Sort the array according to Y.\n    p = mergeSort(p, sortAccording: false)\n    \n    \n    var strip = [Point]()\n    \n    // If the value is less than the min distance away in X from the line then take it into consideration.\n    var i=0, j = 0\n    while i<n\n    {\n        if abs(p[i].x - line) < min\n        {\n            strip.append(p[i])\n            j+=1\n        }\n        i+=1\n    }\n    \n    \n    i=0\n    var x = i+1\n    var temp = min\n    var tempFirst:Point = Point(0,0)\n    var tempSecond:Point = Point(0,0)\n    // Get the values between the points in the strip but only if it is less min dist in Y.\n    while i<j\n    {\n        x = i+1\n        while x < j\n        {\n            if (abs(strip[x].y - strip[i].y)) > min { break }\n            if dist(strip[i], strip[x]) < temp\n            {\n                temp = dist(strip[i], strip[x])\n                tempFirst = strip[i]\n                tempSecond = strip[x]\n            }\n            x+=1\n        }\n        i+=1\n    }\n    \n    if temp < min\n    {\n        min = temp;\n        first = tempFirst\n        second = tempSecond\n    }\n    return (min, first, second)\n}\n\n\n\n\n// MergeSort the array (Taken from Swift Algorithms Club with\n// minor addition)\n// sortAccodrding : true -> x, false -> y.\nfunc mergeSort(_ array: [Point], sortAccording : Bool) -> [Point] {\n    guard array.count > 1 else { return array }\n    let middleIndex = array.count / 2\n    let leftArray = mergeSort(Array(array[0..<middleIndex]), sortAccording: sortAccording)\n    let rightArray = mergeSort(Array(array[middleIndex..<array.count]), sortAccording: sortAccording)\n    return merge(leftPile: leftArray, rightPile: rightArray, sortAccording: sortAccording)\n}\n\n\nprivate func merge(leftPile: [Point], rightPile: [Point], sortAccording: Bool) -> [Point] {\n    \n    var compare : (Point, Point) -> Bool\n    \n    // Choose to compare with X or Y.\n    if sortAccording\n    {\n        compare = { p1,p2 in\n            return p1.x < p2.x\n        }\n    }\n    else\n    {\n        compare = { p1, p2 in\n            return p1.y < p2.y\n        }\n    }\n    \n    var leftIndex = 0\n    var rightIndex = 0\n    var orderedPile = [Point]()\n    if orderedPile.capacity < leftPile.count + rightPile.count {\n        orderedPile.reserveCapacity(leftPile.count + rightPile.count)\n    }\n    \n    while true {\n        guard leftIndex < leftPile.endIndex else {\n            orderedPile.append(contentsOf: rightPile[rightIndex..<rightPile.endIndex])\n            break\n        }\n        guard rightIndex < rightPile.endIndex else {\n            orderedPile.append(contentsOf: leftPile[leftIndex..<leftPile.endIndex])\n            break\n        }\n        \n        if compare(leftPile[leftIndex], rightPile[rightIndex]) {\n            orderedPile.append(leftPile[leftIndex])\n            leftIndex += 1\n        } else {\n            orderedPile.append(rightPile[rightIndex])\n            rightIndex += 1\n        }\n    }\n    return orderedPile\n}\n\n\n// Structure to represent a point.\nstruct Point\n{\n    var x: Double\n    var y: Double\n    \n    init(_ x:Double,_ y:Double) {\n        self.x = x\n        self.y = y\n    }\n}\n// Get the distance between two points a, b.\nfunc dist(_ a: Point,_ b: Point) -> Double\n{\n    let equation:Double = (((a.x-b.x)*(a.x-b.x))) + (((a.y-b.y)*(a.y-b.y)))\n    return equation.squareRoot()\n}\n\n\nvar a = Point(0,2)\nvar b = Point(6,67)\nvar c = Point(43,71)\nvar d = Point(1000,1000)\nvar e = Point(39,107)\nvar f = Point(2000,2000)\nvar g = Point(3000,3000)\nvar h = Point(4000,4000)\n\n\nvar points = [a,b,c,d,e,f,g,h]\nlet endResult = ClosestPairOf(points: points)\nprint(\"Minimum Distance : \\(endResult.minimum), The two points : (\\(endResult.firstPoint.x ),\\(endResult.firstPoint.y)), (\\(endResult.secondPoint.x),\\(endResult.secondPoint.y))\")\n\n"
  },
  {
    "path": "Closest Pair/ClosestPair.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='macos' executeOnSourceChanges='false'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Closest Pair/ClosestPair.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Closest Pair/ClosestPair.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Closest Pair/README.markdown",
    "content": "# ClosestPair\n\nClosest Pair is an algorithm that finds the closest pair of a given array of points By utilizing the Divide and Conquer methodology of solving problems so that it reaches the correct solution with O(nlogn) complexity.\n\n![Given points and we're required to find the two red ones](Images/1200px-Closest_pair_of_points.png)\n\nAs we see in the above image there are an array of points and we need to find the closest two, But how do we do that without having to compare each two points which results in a whopping O(n^2) complexity?\n\nHere is the main algorithm (Steps) we'll follow.\n\n- Sort the array according to their position on the X-axis so that they are sorted in the array as they are naturally in math.\n\n```swift\nvar innerPoints = mergeSort(points, sortAccording : true)\n```\n\n- Divide the points into two arrays Left, Right and keep dividing until you reach to only having 3 points in your array.\n\n- The base case is you have less than 3 points compare those against each other (Brute force) then return the minimum distance you found and the two points.\n\n- Now we get the first observation in the below image, There could be 2 points both very close to each other and indeed those two are the closest pair but since our algorithm so far divides from the middle\n \n```swift\nlet line:Double = (p[mid].x + p[mid+1].x)/2\n```\n\nand just recursively calls itself until it reaches the base case we don't detect those points.\n\n![ Points lying near the division line](Images/Case.png)\n\n- To solve this we start by sorting the array on the Y-axis to get the points in their natural order and then we start getting the difference between the X position of the point and the line we drew to divide and if it is less than the min we got so far from the recursion we add it to the strip \n\n```swift\nvar strip = [Point]()   \nvar i=0, j = 0\nwhile i<n\n{\n\tif abs(p[i].x - line) < min\n\t{\n\t\tstrip.append(p[i])\n\t\tj+=1\n\t}\n\ti+=1\n}\n```\n\n- After you insert the points that could possibly give you a better min distance we get to another observation in the image below.\n\n![The strip with 4 points shown](Images/Strip.png)\n\n- Searching the strip is a brute force loop (But doesn't that just destroy everything we did? You ask) but it has an advantage it could never iterate on more than 8 points (worst case).\n\n- The reason is that the strip is constructed as a rectangle with sides of length = min that we got from the recursion and we ignore any points that have a Y difference bigger than min distance so to be able to place them ALL inside the rectangle with these conditions they'll have to be in the shape above with each one of them EXACTLY min distance away from the other which gives us 4 possible points for each one and 8 in total.\n\n```swift\nwhile i<j\n    {\n        x = i+1\n        while x < j\n        {\n            if (abs(strip[x].y - strip[i].y)) > min { break }\n            if dist(strip[i], strip[x]) < temp\n            {\n                temp = dist(strip[i], strip[x])\n                tempFirst = strip[i]\n                tempSecond = strip[x]\n            }\n            x+=1\n        }\n        i+=1\n    }\n```\n\n- Of course not every time you end up with the same shape but this is the worst case and it's rare to happen so in reality you end up with far less points valid for comparison and this is why the algorithm gets performance in addition to the sorting tricks we did.\n\n- Compare the points in the strip and if you find a smaller distance replace the current one with it.\n\n\nSo this is the rundown of how the algorithm works and you could see the fun little math tricks used to optimize this and we end up with O(nlogn) complexity mainly because of the sorting.\n\n\n## See also\n\nSee the playground to play around with the implementation of the algorithm\n\n[Wikipedia](https://en.wikipedia.org/wiki/Closest_pair_of_points_problem)\n\n*Written for Swift Algorithm Club by [Ahmed Nader](https://github.com/ahmednader42)*\n"
  },
  {
    "path": "Comb Sort/Comb Sort.playground/Contents.swift",
    "content": "// Comb Sort Function\n// Created by Stephen Rutstein\n// 7-16-2016\n\nimport Foundation\n\n// Test Comb Sort with small array of ten values\nlet array = [2, 32, 9, -1, 89, 101, 55, -10, -12, 67]\ncombSort(array)\n\n// Test Comb Sort with large array of 1000 random values\nvar bigArray = [Int](repeating: 0, count: 1000)\nvar i = 0\nwhile i < 1000 {\n  bigArray[i] = Int(arc4random_uniform(1000) + 1)\n  i += 1\n}\ncombSort(bigArray)\n"
  },
  {
    "path": "Comb Sort/Comb Sort.playground/Sources/Comb Sort.swift",
    "content": "//  Comb Sort.swift\n//  Comb Sort\n//\n//  Created by Stephen.Rutstein on 7/16/16.\n//  Copyright © 2016 Stephen.Rutstein. All rights reserved.\n//\n\nimport Foundation\n\npublic func combSort<T: Comparable>(_ input: [T]) -> [T] {\n    var copy: [T] = input\n    var gap = copy.count\n    let shrink = 1.3\n\n    while gap > 1 {\n        gap = (Int)(Double(gap) / shrink)\n        if gap < 1 {\n            gap = 1\n        }\n\n        var index = 0\n        while !(index + gap >= copy.count) {\n            if copy[index] > copy[index + gap] {\n               copy.swapAt(index, index + gap)\n            }\n            index += 1\n        }\n    }\n    return copy\n}\n\nfileprivate func swap<T: Comparable>(a: inout T, b: inout T) {\n    let temp = a\n    a = b\n    b = temp\n}\n"
  },
  {
    "path": "Comb Sort/Comb Sort.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Comb Sort/Comb Sort.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Comb Sort/Comb Sort.swift",
    "content": "//  Comb Sort.swift\n//  Comb Sort\n//\n//  Created by Stephen.Rutstein on 7/16/16.\n//  Copyright © 2016 Stephen.Rutstein. All rights reserved.\n//\n\nimport Foundation\n\npublic func combSort<T: Comparable>(_ input: [T]) -> [T] {\n    var copy: [T] = input\n    var gap = copy.count\n    let shrink = 1.3\n    \n    while gap > 1 {\n        gap = (Int)(Double(gap) / shrink)\n        if gap < 1 {\n            gap = 1\n        }\n        \n        var index = 0\n        while !(index + gap >= copy.count) {\n            if copy[index] > copy[index + gap] {\n                copy.swapAt(index, index + gap)\n            }\n            index += 1\n        }\n    }\n    return copy\n}\n\nfileprivate func swap<T: Comparable>(a: inout T, b: inout T) {\n    let temp = a\n    a = b\n    b = temp\n}\n"
  },
  {
    "path": "Comb Sort/README.markdown",
    "content": "# Comb Sort\n\nA common issue for Bubble Sort is when small values are located near the end of an array. \nThis problem severely slows down Bubble Sort, as it must move the small value -- or _turtle_ -- \nthrough nearly the entire array. Bubble Sort works by checking the current index of an array \nagainst the next index, and when those two values are unsorted, they are swapped into place. \nAs a result, the values bubble into their rightful place within the array. \n\nComb Sort improves upon Bubble Sort by dealing with these turtles near the end of the array. \nThe value of the current index of the array is compared against one a set distance away. This \nremoves a worst-case scenario of Bubble Sort, and greatly improves on the time complexity of Bubble Sort. \n\n## Example \n\nA step-by-step example of how Comb Sort works, and differs from Bubble Sort, can be seen [here](http://www.exforsys.com/tutorials/c-algorithms/comb-sort.html). \n\nHere is a visual to see Comb Sort in effect: \n\n![](https://upload.wikimedia.org/wikipedia/commons/4/46/Comb_sort_demo.gif)\n\n## Algorithm \n\nSimilar to Bubble Sort, two values within an array are compared. When the lower index value \nis larger than the higher index value, and thus out of place within the array, they are \nswapped. Unlike Bubble Sort, the value being compared against is a set distance away. This \nvalue -- the _gap_ -- is slowly decreased through iterations. \n\n## The Code \n\nHere is a Swift implementation of Comb Sort: \n\n```swift\nfunc combSort (input: [Int]) -> [Int] {\n    var copy: [Int] = input\n    var gap = copy.count\n    let shrink = 1.3\n\n    while gap > 1 {\n        gap = (Int)(Double(gap) / shrink)\n        if gap < 1 {\n            gap = 1\n        }\n    \n        var index = 0\n        while !(index + gap >= copy.count) {\n            if copy[index] > copy[index + gap] {\n                swap(&copy[index], &copy[index + gap])\n            }\n            index += 1\n        }\n    }\n    return copy\n}\n```\n\nThis code can be tested in a playground by calling this method with a paramaterized array to sort: \n\n```swift\ncombSort(example_array_of_values)\n```\n\nThis will sort the values of the array into ascending order -- increasing in value.  \n\n## Performance\n\nComb Sort was created to improve upon the worst case time complexity of Bubble Sort. With Comb \nSort, the worst case scenario for performance is polynomial -- O(n^2). At best though, Comb Sort \nperforms at O(n logn) time complexity -- loglinear. This creates a drastic improvement over Bubble Sort's performance. \n\nSimilar to Bubble Sort, the space complexity for Comb Sort is constant -- O(1). \nThis is extremely space efficient as it sorts the array in place. \n\n\n## Additional Resources\n\n[Comb Sort Wikipedia](https://en.wikipedia.org/wiki/Comb_sort)\n\n\n*Written for the _Swift Algorithm Club_ by [Stephen Rutstein](https://github.com/srutstein21)*\n"
  },
  {
    "path": "Comb Sort/Tests/CombSortTests.swift",
    "content": "//\n//  CombSortTests.swift\n//  Tests\n//\n//  Created by theng on 2017-01-09.\n//  Copyright © 2017 Swift Algorithm Club. All rights reserved.\n//\n\nimport XCTest\n\nclass CombSortTests: XCTestCase {\n  var sequence: [Int]!\n  let expectedSequence: [Int] = [-12, -10, -1, 2, 9, 32, 55, 67, 89, 101]\n    \n  override func setUp() {\n    super.setUp()\n    sequence = [2, 32, 9, -1, 89, 101, 55, -10, -12, 67]\n  }\n\n  override func tearDown() {\n    super.tearDown()\n  }\n\n  func testCombSort() {\n    let sortedSequence = combSort(sequence)\n    XCTAssertEqual(sortedSequence, expectedSequence)\n  }\n}\n"
  },
  {
    "path": "Comb Sort/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Comb Sort/Tests/Tests.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t056E927E1E24852900B30F52 /* CombSortTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 056E927D1E24852900B30F52 /* CombSortTests.swift */; };\n\t\t056E92841E248A4000B30F52 /* Comb Sort.swift in Sources */ = {isa = PBXBuildFile; fileRef = 056E92831E248A4000B30F52 /* Comb Sort.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t056E92751E2483D300B30F52 /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t056E92791E2483D300B30F52 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t056E927D1E24852900B30F52 /* CombSortTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CombSortTests.swift; sourceTree = \"<group>\"; };\n\t\t056E92831E248A4000B30F52 /* Comb Sort.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = \"Comb Sort.swift\"; path = \"../Comb Sort.swift\"; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t056E92721E2483D300B30F52 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t056E92581E24836C00B30F52 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t056E92761E2483D300B30F52 /* Tests */,\n\t\t\t\t056E92621E24836C00B30F52 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t056E92621E24836C00B30F52 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t056E92751E2483D300B30F52 /* Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t056E92761E2483D300B30F52 /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t056E92831E248A4000B30F52 /* Comb Sort.swift */,\n\t\t\t\t056E92791E2483D300B30F52 /* Info.plist */,\n\t\t\t\t056E927D1E24852900B30F52 /* CombSortTests.swift */,\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tsourceTree = SOURCE_ROOT;\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t056E92741E2483D300B30F52 /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 056E927A1E2483D300B30F52 /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t056E92711E2483D300B30F52 /* Sources */,\n\t\t\t\t056E92721E2483D300B30F52 /* Frameworks */,\n\t\t\t\t056E92731E2483D300B30F52 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tproductName = Tests;\n\t\t\tproductReference = 056E92751E2483D300B30F52 /* Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t056E92591E24836C00B30F52 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0820;\n\t\t\t\tLastUpgradeCheck = 1000;\n\t\t\t\tORGANIZATIONNAME = \"Swift Algorithm Club\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t056E92741E2483D300B30F52 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.2;\n\t\t\t\t\t\tLastSwiftMigration = 0820;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 056E925C1E24836C00B30F52 /* Build configuration list for PBXProject \"Tests\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 056E92581E24836C00B30F52;\n\t\t\tproductRefGroup = 056E92621E24836C00B30F52 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t056E92741E2483D300B30F52 /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t056E92731E2483D300B30F52 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t056E92711E2483D300B30F52 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t056E927E1E24852900B30F52 /* CombSortTests.swift in Sources */,\n\t\t\t\t056E92841E248A4000B30F52 /* Comb Sort.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t056E926C1E24836C00B30F52 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t056E926D1E24836C00B30F52 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t056E927B1E2483D300B30F52 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"Swift-Algorithm-Club.Tests\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t056E927C1E2483D300B30F52 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"Swift-Algorithm-Club.Tests\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t056E925C1E24836C00B30F52 /* Build configuration list for PBXProject \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t056E926C1E24836C00B30F52 /* Debug */,\n\t\t\t\t056E926D1E24836C00B30F52 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t056E927A1E2483D300B30F52 /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t056E927B1E2483D300B30F52 /* Debug */,\n\t\t\t\t056E927C1E2483D300B30F52 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 056E92591E24836C00B30F52 /* Project object */;\n}\n"
  },
  {
    "path": "Comb Sort/Tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Tests.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Comb Sort/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1000\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"056E92741E2483D300B30F52\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"056E92741E2483D300B30F52\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"056E92741E2483D300B30F52\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"056E92741E2483D300B30F52\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"056E92741E2483D300B30F52\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Combinatorics/Combinatorics.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\n// last checked with Xcode 9.0b4\n#if swift(>=4.0)\nprint(\"Hello, Swift 4!\")\n#endif\n\n/* Calculates n! */\nfunc factorial(_ n: Int) -> Int {\n  var n = n\n  var result = 1\n  while n > 1 {\n    result *= n\n    n -= 1\n  }\n  return result\n}\n\nfactorial(5)\nfactorial(20)\n\n/*\n Calculates P(n, k), the number of permutations of n distinct symbols\n in groups of size k.\n */\nfunc permutations(_ n: Int, _ k: Int) -> Int {\n  var n = n\n  var answer = n\n  for _ in 1..<k {\n    n -= 1\n    answer *= n\n  }\n  return answer\n}\n\npermutations(5, 3)\npermutations(50, 6)\npermutations(9, 4)\n\n/*\n Prints out all the permutations of the given array.\n Original algorithm by Niklaus Wirth.\n See also Dr.Dobb's Magazine June 1993, Algorithm Alley\n */\nfunc permuteWirth<T>(_ a: [T], _ n: Int) {\n  if n == 0 {\n    print(a)   // display the current permutation\n  } else {\n    var a = a\n    permuteWirth(a, n - 1)\n    for i in 0..<n {\n      a.swapAt(i, n)\n      permuteWirth(a, n - 1)\n      a.swapAt(i, n)\n    }\n  }\n}\n\nlet letters = [\"a\", \"b\", \"c\", \"d\", \"e\"]\nprint(\"Permutations of \\(letters):\")\npermuteWirth(letters, letters.count - 1)\n\nlet xyz = [ \"x\", \"y\", \"z\" ]\nprint(\"\\nPermutations of \\(xyz):\")\npermuteWirth(xyz, 2)\n\n/*\n Prints out all the permutations of an n-element collection.\n\n The initial array must be initialized with all zeros. The algorithm\n uses 0 as a flag that indicates more work to be done on each level\n of the recursion.\n\n Original algorithm by Robert Sedgewick.\n See also Dr.Dobb's Magazine June 1993, Algorithm Alley\n */\nfunc permuteSedgewick(_ a: [Int], _ n: Int, _ pos: inout Int) {\n  var a = a\n  pos += 1\n  a[n] = pos\n  if pos == a.count - 1 {\n    print(a)              // display the current permutation\n  } else {\n    for i in 0..<a.count {\n      if a[i] == 0 {\n        permuteSedgewick(a, i, &pos)\n      }\n    }\n  }\n  pos -= 1\n  a[n] = 0\n}\n\nprint(\"\\nSedgewick permutations:\")\nlet numbers = [0, 0, 0, 0]  // must be all zeros\nvar pos = -1\npermuteSedgewick(numbers, 0, &pos)\n\n/*\n Calculates C(n, k), or \"n-choose-k\", i.e. how many different selections\n of size k out of a total number of distinct elements (n) you can make.\n */\nfunc combinations(_ n: Int, choose k: Int) -> Int {\n  return permutations(n, k) / factorial(k)\n}\n\ncombinations(3, choose: 2)\ncombinations(28, choose: 5)\n\nprint(\"\\nCombinations:\")\nfor i in 1...20 {\n    print(\"\\(20)-choose-\\(i) = \\(combinations(20, choose: i))\")\n}\n\n/*\n Calculates C(n, k), or \"n-choose-k\", i.e. the number of ways to choose\n k things out of n possibilities.\n */\nfunc quickBinomialCoefficient(_ n: Int, choose k: Int) -> Int {\n  var result = 1\n\n  for i in 0..<k {\n    result *= (n - i)\n    result /= (i + 1)\n  }\n  return result\n}\n\nquickBinomialCoefficient(8, choose: 2)\nquickBinomialCoefficient(30, choose: 15)\n\n/* Supporting code because Swift doesn't have a built-in 2D array. */\nstruct Array2D<T> {\n  let columns: Int\n  let rows: Int\n  private var array: [T]\n\n  init(columns: Int, rows: Int, initialValue: T) {\n    self.columns = columns\n    self.rows = rows\n    array = Array(repeating: initialValue, count: rows*columns)\n  }\n\n  subscript(column: Int, row: Int) -> T {\n    get { return array[row*columns + column] }\n    set { array[row*columns + column] = newValue }\n  }\n}\n\n/*\n Calculates C(n, k), or \"n-choose-k\", i.e. the number of ways to choose\n k things out of n possibilities.\n\n Thanks to the dynamic programming, this algorithm from Skiena allows for\n the calculation of much larger numbers, at the cost of temporary storage\n space for the cached values.\n */\n\nfunc binomialCoefficient(_ n: Int, choose k: Int) -> Int {\n  var bc = Array(repeating: Array(repeating: 0, count: n + 1), count: n + 1)\n\n  for i in 0...n {\n    bc[i][0] = 1\n    bc[i][i] = 1\n  }\n\n  if n > 0 {\n    for i in 1...n {\n      for j in 1..<i {\n        bc[i][j] = bc[i - 1][j - 1] + bc[i - 1][j]\n      }\n    }\n  }\n\n  return bc[n][k]\n}\n\nbinomialCoefficient(30, choose: 15)\nbinomialCoefficient(66, choose: 33)\n"
  },
  {
    "path": "Combinatorics/Combinatorics.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Combinatorics/Combinatorics.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Combinatorics/README.markdown",
    "content": "# Permutations\n\nA *permutation* is a certain arrangement of the objects from a collection. For example, if we have the first five letters from the alphabet, then this is a permutation:\n\n\ta, b, c, d, e\n\nThis is another permutation:\n\n\tb, e, d, a, c\n\nFor a collection of `n` objects, there are `n!` possible permutations, where `!` is the \"factorial\" function. So for our collection of five letters, the total number of permutations you can make is:\n\n\t5! = 5 * 4 * 3 * 2 * 1 = 120\n\nA collection of six items has `6! = 720` permutations. For ten items, it is `10! = 3,628,800`. That adds up quick!\n\nWhere does this `n!` come from? The logic is as follows: we have a collection of five letters that we want to put in some order. To do this, you need to pick up these letters one-by-one. Initially, you have the choice of five letters: `a, b, c, d, e`. That gives 5 possibilities.\n\nAfter picking the first letter, you only have four letters left to choose from. That gives `5 * 4 = 20` possibilities:\n\n\ta+b    b+a    c+a    d+a    e+a\n\ta+c    b+c    c+b    d+b    e+b\n\ta+d    b+d    c+d    d+c    e+c\n\ta+e    b+e    c+e    d+e    e+d\n\nAfter picking the second letter, there are only three letters left to choose from. And so on... When you get to the last letter, you don't have any choice because there is only one letter left. That's why the total number of possibilities is `5 * 4 * 3 * 2 * 1`.\n\nTo calculate the factorial in Swift:\n\n```swift\nfunc factorial(_ n: Int) -> Int {\n  var n = n\n  var result = 1\n  while n > 1 {\n    result *= n\n    n -= 1\n  }\n  return result\n}\n```\n\nTry it out in a playground:\n\n```swift\nfactorial(5)   // returns 120\n```\n\nNote that `factorial(20)` is the largest number you can calculate with this function, or you'll get integer overflow.\n\nLet's say that from that collection of five letters you want to choose only 3 elements. How many possible ways can you do this? Well, that works the same way as before, except that you stop after the third letter. So now the number of possibilities is `5 * 4 * 3 = 60`.\n\nThe formula for this is:\n\n\t             n!\n\tP(n, k) = --------\n\t          (n - k)!\n\nwhere `n` is the size of your collection and `k` is the size of the group that you're selecting. In our example, `P(5, 3) = 5! / (5 - 3)! = 120 / 2 = 60`.\n\nYou could implement this in terms of the `factorial()` function from earlier, but there's a problem. Remember that `factorial(20)` is the largest possible number it can handle, so you could never calculate `P(21, 3)`, for example.\n\nHere is an algorithm that can deal with larger numbers:\n\n```swift\nfunc permutations(_ n: Int, _ k: Int) -> Int {\n  var n = n\n  var answer = n\n  for _ in 1..<k {\n    n -= 1\n    answer *= n\n  }\n  return answer\n}\n```\n\nTry it out:\n\n```swift\npermutations(5, 3)   // returns 60\npermutations(50, 6)  // returns 11441304000\npermutations(9, 4)   // returns 3024\n```\n\nThis function takes advantage of the following algebra fact:\n\n\t          9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1\n\tP(9, 4) = --------------------------------- = 9 * 8 * 7 * 6 = 3024\n\t                          5 * 4 * 3 * 2 * 1\n\nThe denominator cancels out part of the numerator, so there's no need to perform a division and you're not dealing with intermediate results that are potentially too large.\n\nHowever, there are still limits to what you can calculate; for example the number of groups of size 15 that you can make from a collection of 30 objects -- i.e. `P(30, 15)` -- is ginormous and breaks Swift. Huh, you wouldn't think it would be so large but combinatorics is funny that way.\n\n## Generating the permutations\n\nSo far we've counted how many permutations exist for a given collection, but how can we actually create a list of all these permutations?\n\nHere's a recursive algorithm by Niklaus Wirth:\n\n```swift\nfunc permuteWirth<T>(_ a: [T], _ n: Int) {\n    if n == 0 {\n        print(a)   // display the current permutation\n    } else {\n        var a = a\n        permuteWirth(a, n - 1)\n        for i in 0..<n {\n            a.swapAt(i, n)\n            permuteWirth(a, n - 1)\n            a.swapAt(i, n)\n        }\n    }\n}\n```\n\nUse it as follows:\n\n```swift\nlet letters = [\"a\", \"b\", \"c\", \"d\", \"e\"]\npermuteWirth(letters, letters.count - 1)\n```\n\nThis prints all the permutations of the input array to the debug output:\n\n```swift\n[\"a\", \"b\", \"c\", \"d\", \"e\"]\n[\"b\", \"a\", \"c\", \"d\", \"e\"]\n[\"c\", \"b\", \"a\", \"d\", \"e\"]\n[\"b\", \"c\", \"a\", \"d\", \"e\"]\n[\"a\", \"c\", \"b\", \"d\", \"e\"]\n...\n```\n\nAs we've seen before, there will be 120 of them.\n\nHow does the algorithm work? Good question! Let's step through a simple example with just three elements. The input array is:\n\n\t[ \"x\", \"y\", \"z\" ]\n\nWe're calling it like so:\n\n```swift\npermuteWirth([ \"x\", \"y\", \"z\" ], 2)\n```\n\nNote that the `n` parameter is one less than the number of elements in the array!\n\nAfter calling `permuteWirth()` it immediately calls itself recursively with `n = 1`. And that immediately calls itself recursively again with `n = 0`. The call tree looks like this:\n\n```swift\npermuteWirth([ \"x\", \"y\", \"z\" ], 2)\n\tpermuteWirth([ \"x\", \"y\", \"z\" ], 1)\n\t\tpermuteWirth([ \"x\", \"y\", \"z\" ], 0)   // prints [\"x\", \"y\", \"z\"]\n```\n\nWhen `n` is equal to 0, we print out the current array, which is still unchanged at this point. The recursion has reached the base case, so now we go back up one level and enter the `for` loop.\n\n```swift\npermuteWirth([ \"x\", \"y\", \"z\" ], 2)\n\tpermuteWirth([ \"x\", \"y\", \"z\" ], 1)   <--- back to this level\n\t    swap a[0] with a[1]\n        permuteWirth([ \"y\", \"x\", \"z\" ], 0)   // prints [\"y\", \"x\", \"z\"]\n\t    swap a[0] and a[1] back\n```\n\nThis swapped `\"y\"` and `\"x\"` and printed the result. We're done at this level of the recursion and go back to the top. This time we do two iterations of the `for` loop because `n = 2` here. The first iteration looks like this:\n\n```swift\npermuteWirth([ \"x\", \"y\", \"z\" ], 2)   <--- back to this level\n    swap a[0] with a[2]\n\tpermuteWirth([ \"z\", \"y\", \"x\" ], 1)\n        permuteWirth([ \"z\", \"y\", \"x\" ], 0)   // prints [\"z\", \"y\", \"x\"]\n\t    swap a[0] with a[1]\n        permuteWirth([ \"y\", \"z\", \"x\" ], 0)   // prints [\"y\", \"z\", \"x\"]\n\t    swap a[0] and a[1] back\n    swap a[0] and a[2] back\n```\n\nAnd the second iteration:\n\n```swift\npermuteWirth([ \"x\", \"y\", \"z\" ], 2)\n    swap a[1] with a[2]                 <--- second iteration of the loop\n\tpermuteWirth([ \"x\", \"z\", \"y\" ], 1)\n        permuteWirth([ \"x\", \"z\", \"y\" ], 0)   // prints [\"x\", \"z\", \"y\"]\n\t    swap a[0] with a[1]\n        permuteWirth([ \"z\", \"x\", \"y\" ], 0)   // prints [\"z\", \"x\", \"y\"]\n\t    swap a[0] and a[1] back\n    swap a[1] and a[2] back\n```\n\nTo summarize, first it swaps these items:\n\n\t[ 2, 1, - ]\n\nThen it swaps these:\n\n\t[ 3, -, 1 ]\n\nRecursively, it swaps the first two again:\n\n\t[ 2, 3, - ]\n\nThen it goes back up one step and swaps these:\n\n\t[ -, 3, 2 ]\n\nAnd finally the first two again:\n\n\t[ 3, 1, - ]\n\nOf course, the larger your array is, the more swaps it performs and the deeper the recursion gets.\n\nIf the above is still not entirely clear, then I suggest you give it a go in the playground. That's what playgrounds are great for. :-)\n\nFor fun, here is an alternative algorithm, by Robert Sedgewick:\n\n```swift\nfunc permuteSedgewick(_ a: [Int], _ n: Int, _ pos: inout Int) {\n  var a = a\n  pos += 1\n  a[n] = pos\n  if pos == a.count - 1 {\n    print(a)              // display the current permutation\n  } else {\n    for i in 0..<a.count {\n      if a[i] == 0 {\n        permuteSedgewick(a, i, &pos)\n      }\n    }\n  }\n  pos -= 1\n  a[n] = 0\n}\n```\n\nYou use it like this:\n\n```swift\nlet numbers = [0, 0, 0, 0]\nvar pos = -1\npermuteSedgewick(numbers, 0, &pos)\n```\n\nThe array must initially contain all zeros. 0 is used as a flag that indicates more work needs to be done on each level of the recursion.\n\nThe output of the Sedgewick algorithm is:\n\n```swift\n[1, 2, 3, 0]\n[1, 2, 0, 3]\n[1, 3, 2, 0]\n[1, 0, 2, 3]\n[1, 3, 0, 2]\n...\n```\n\nIt can only deal with numbers, but these can serve as indices into the actual array you're trying to permute, so it's just as powerful as Wirth's algorithm.\n\nTry to figure out for yourself how this algorithm works!\n\n## Combinations\n\nA combination is like a permutation where the order does not matter. The following are six different permutations of the letters `k` `l` `m` but they all count as the same combination:\n\n\tk, l, m      k, m, l      m, l, k\n\tl, m, k      l, k, m      m, k, l\n\nSo there is only one combination of size 3. However, if we're looking for combinations of size 2, we can make three:\n\n\tk, l      (is the same as l, k)\n\tl, m      (is the same as m, l)\n\tk, m      (is the same as m, k)\n\nThe `C(n, k)` function counts the number of ways to choose `k` things out of `n` possibilities. That's why it's also called \"n-choose-k\". (A fancy mathematical term for this number is \"binomial coefficient\".)\n\nThe formula for `C(n, k)` is:\n\n\t               n!         P(n, k)\n\tC(n, k) = ------------- = --------\n\t          (n - k)! * k!      k!\n\nAs you can see, you can derive it from the formula for `P(n, k)`. There are always more permutations than combinations. You divide the number of permutations by `k!` because a total of `k!` of these permutations give the same combination.\n\nAbove I showed that the number of permutations of `k` `l` `m` is 6, but if you pick only two of those letters the number of combinations is 3. If we use the formula we should get the same answer. We want to calculate `C(3, 2)` because we choose 2 letters out of a collection of 3.\n\n\t          3 * 2 * 1    6\n\tC(3, 2) = --------- = --- = 3\n\t           1! * 2!     2\n\nHere's a simple function to calculate `C(n, k)`:\n\n```swift\nfunc combinations(_ n: Int, choose k: Int) -> Int {\n  return permutations(n, k) / factorial(k)\n}\n```\n\nUse it like this:\n\n```swift\ncombinations(28, choose: 5)    // prints 98280\n```\n\nBecause this uses the `permutations()` and `factorial()` functions under the hood, you're still limited by how large these numbers can get. For example, `combinations(30, 15)` is \"only\" `155,117,520` but because the intermediate results don't fit into a 64-bit integer, you can't calculate it with the given function.\n\nThere's a faster approach to calculate `C(n, k)` in **O(k)** time and **O(1)** extra space. The idea behind it is that the formula for `C(n, k)` is:\n\n                   n!                      n * (n - 1) * ... * 1\n    C(n, k) = ------------- = ------------------------------------------\n              (n - k)! * k!      (n - k) * (n - k - 1) * ... * 1 * k!\n\nAfter the reduction of fractions, we get the following formula:\n\n                   n * (n - 1) * ... * (n - k + 1)         (n - 0) * (n - 1) * ... * (n - k + 1)\n    C(n, k) = --------------------------------------- = -----------------------------------------\n                               k!                          (0 + 1) * (1 + 1) * ... * (k - 1 + 1)\n\nWe can implement this formula as follows:\n\n```swift\nfunc quickBinomialCoefficient(_ n: Int, choose k: Int) -> Int {\n  var result = 1\n  for i in 0..<k {\n    result *= (n - i)\n    result /= (i + 1)\n  }\n  return result\n}\n```\n\nThis algorithm can create larger numbers than the previous method. Instead of calculating the entire numerator (a potentially huge number) and then dividing it by the factorial (also a very large number), here we already divide in each step. That causes the temporary results to grow much less quickly.\n\nHere's how you can use this improved algorithm:\n\n```swift\nquickBinomialCoefficient(8, choose: 2)     // prints 28\nquickBinomialCoefficient(30, choose: 15)   // prints 155117520\n```\n\nThis new method is quite fast but you're still limited in how large the numbers can get. You can calculate `C(30, 15)` without any problems, but something like `C(66, 33)` will still cause integer overflow in the numerator.\n\nHere is an algorithm that uses dynamic programming to overcome the need for calculating factorials and doing divisions. It is based on Pascal's triangle:\n\n\t0:               1\n\t1:             1   1\n\t2:           1   2   1\n\t3:         1   3   3   1\n\t4:       1   4   6   4   1\n\t5:     1   5  10   10  5   1\n\t6:   1   6  15  20   15  6   1\n\nEach number in the next row is made up by adding two numbers from the previous row. For example in row 6, the number 15 is made by adding the 5 and 10 from row 5. These numbers are called the binomial coefficients and as it happens they are the same as `C(n, k)`.\n\nFor example, for row 6:\n\n\tC(6, 0) = 1\n\tC(6, 1) = 6\n\tC(6, 2) = 15\n\tC(6, 3) = 20\n\tC(6, 4) = 15\n\tC(6, 5) = 6\n\tC(6, 6) = 1\n\nThe following code calculates Pascal's triangle in order to find the `C(n, k)` you're looking for:\n\n```swift\nfunc binomialCoefficient(_ n: Int, choose k: Int) -> Int {\n  var bc = Array(repeating: Array(repeating: 0, count: n + 1), count: n + 1)\n\n  for i in 0...n {\n    bc[i][0] = 1\n    bc[i][i] = 1\n  }\n\n  if n > 0 {\n    for i in 1...n {\n      for j in 1..<i {\n        bc[i][j] = bc[i - 1][j - 1] + bc[i - 1][j]\n      }\n    }\n  }\n\n  return bc[n][k]\n}\n```\n\nThe algorithm itself is quite simple: the first loop fills in the 1s at the outer edges of the triangle. The other loops calculate each number in the triangle by adding up the two numbers from the previous row.\n\nNow you can calculate `C(66, 33)` without any problems:\n\n```swift\nbinomialCoefficient(66, choose: 33)   // prints a very large number\n```\n\nYou may wonder what the point is in calculating these permutations and combinations, but many algorithm problems are really combinatorics problems in disguise. Often you may need to look at all possible combinations of your data to see which one gives the right solution. If that means you need to search through `n!` potential solutions, you may want to consider a different approach -- as you've seen, these numbers become huge very quickly!\n\n## References\n\nWirth's and Sedgewick's permutation algorithms and the code for counting permutations and combinations are based on the Algorithm Alley column from Dr.Dobb's Magazine, June 1993. The dynamic programming binomial coefficient algorithm is from The Algorithm Design Manual by Skiena.\n\n*Written for Swift Algorithm Club by Matthijs Hollemans and [Kanstantsin Linou](https://github.com/nuts23)*\n"
  },
  {
    "path": "Convex Hull/Convex Hull/AppDelegate.swift",
    "content": "//\n//  AppDelegate.swift\n//  Convex Hull\n//\n//  Created by Jaap Wijnen on 19/02/2017.\n//  Copyright © 2017 Workmoose. All rights reserved.\n//\n\nimport UIKit\n\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n\n    var window: UIWindow?\n\n    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {\n\n        let screenBounds = UIScreen.main.bounds\n\n        window = UIWindow(frame: screenBounds)\n\n        let viewController = UIViewController()\n        viewController.view = View(frame: (window?.frame)!)\n        viewController.view.backgroundColor = .white\n\n        window?.rootViewController = viewController\n        window?.makeKeyAndVisible()\n\n        return true\n    }\n\n    func applicationWillResignActive(_ application: UIApplication) {\n        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.\n        // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.\n    }\n\n    func applicationDidEnterBackground(_ application: UIApplication) {\n        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.\n        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.\n    }\n\n    func applicationWillEnterForeground(_ application: UIApplication) {\n        // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.\n    }\n\n    func applicationDidBecomeActive(_ application: UIApplication) {\n        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.\n    }\n\n    func applicationWillTerminate(_ application: UIApplication) {\n        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.\n    }\n\n}\n"
  },
  {
    "path": "Convex Hull/Convex Hull/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"76x76\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"76x76\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"83.5x83.5\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ios-marketing\",\n      \"size\" : \"1024x1024\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Convex Hull/Convex Hull/Base.lproj/LaunchScreen.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"11134\" systemVersion=\"15F34\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" colorMatched=\"YES\" initialViewController=\"01J-lp-oVM\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"11106\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"EHf-IW-A2E\">\n            <objects>\n                <viewController id=\"01J-lp-oVM\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"Llm-lL-Icb\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"xb3-aO-Qok\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"Ze5-6b-2t3\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"iYj-Kq-Ea1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"53\" y=\"375\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "Convex Hull/Convex Hull/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UIRequiresFullScreen</key>\n\t<true/>\n\t<key>UIStatusBarHidden</key>\n\t<true/>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "Convex Hull/Convex Hull/View.swift",
    "content": "//\n//  View.swift\n//  Convex Hull\n//\n//  Created by Jaap Wijnen on 19/02/2017.\n//  Copyright © 2017 Workmoose. All rights reserved.\n//\n\nimport UIKit\n\nclass View: UIView {\n\n  let MAX_POINTS = 100\n  var points = [CGPoint]()\n  var convexHull = [CGPoint]()\n\n  override init(frame: CGRect) {\n    super.init(frame: frame)\n    generateRandomPoints()\n    quickHull(points: points)\n  }\n\n  required init?(coder aDecoder: NSCoder) {\n    fatalError(\"init(coder:) has not been implemented\")\n  }\n\n  func generateRandomPoints() {\n    for _ in 0..<MAX_POINTS {\n      let offset: CGFloat = 50\n      let xrand = CGFloat(arc4random()) / CGFloat(UInt32.max) * (self.frame.width - offset) + 0.5 * offset\n      let yrand = CGFloat(arc4random()) / CGFloat(UInt32.max) * (self.frame.height - offset) + 0.5 * offset\n      let point = CGPoint(x: xrand, y: yrand)\n      points.append(point)\n    }\n\n    points.sort { (a: CGPoint, b: CGPoint) -> Bool in\n      return a.x < b.x\n    }\n  }\n\n  func quickHull(points: [CGPoint]) {\n    var pts = points\n\n    // Assume points has at least 2 points\n    // Assume list is ordered on x\n\n    // left most point\n    let p1 = pts.removeFirst()\n    // right most point\n    let p2 = pts.removeLast()\n\n    // p1 and p2 are outer most points and thus are part of the hull\n    convexHull.append(p1)\n    convexHull.append(p2)\n\n    // points to the right of oriented line from p1 to p2\n    var s1 = [CGPoint]()\n\n    // points to the right of oriented line from p2 to p1\n    var s2 = [CGPoint]()\n\n    // p1 to p2 line\n    let lineVec1 = CGPoint(x: p2.x - p1.x, y: p2.y - p1.y)\n\n    for p in pts { // per point check if point is to right or left of p1 to p2 line\n      let pVec1 = CGPoint(x: p.x - p1.x, y: p.y - p1.y)\n      let sign1 = lineVec1.x * pVec1.y - pVec1.x * lineVec1.y // cross product to check on which side of the line point p is.\n\n      if sign1 > 0 { // right of p1 p2 line (in a normal xy coordinate system this would be < 0 but due to the weird iPhone screen coordinates this is > 0\n        s1.append(p)\n      } else { // right of p2 p1 line\n        s2.append(p)\n      }\n    }\n\n    // find new hull points\n    findHull(s1, p1, p2)\n    findHull(s2, p2, p1)\n  }\n\n  func findHull(_ points: [CGPoint], _ p1: CGPoint, _ p2: CGPoint) {\n    // if set of points is empty there are no points to the right of this line so this line is part of the hull.\n    if points.isEmpty {\n      return\n    }\n\n    var pts = points\n    var maxDist: CGFloat = -1\n    var maxPoint: CGPoint = pts.first!\n\n    for p in pts { // for every point check the distance from our line\n      let dist = distance(from: p, to: (p1, p2))\n      if dist > maxDist { // if distance is larger than current maxDist remember new point p\n        maxDist = dist\n        maxPoint = p\n      }\n    }\n\n    convexHull.insert(maxPoint, at: convexHull.index(of: p1)! + 1) // insert point with max distance from line in the convexHull after p1\n\n    pts.remove(at: pts.index(of: maxPoint)!) // remove maxPoint from points array as we are going to split this array in points left and right of the line\n\n    // points to the right of oriented line from p1 to maxPoint\n    var s1 = [CGPoint]()\n\n    // points to the right of oriented line from maxPoint to p2\n    var s2 = [CGPoint]()\n\n    // p1 to maxPoint line\n    let lineVec1 = CGPoint(x: maxPoint.x - p1.x, y: maxPoint.y - p1.y)\n    // maxPoint to p2 line\n    let lineVec2 = CGPoint(x: p2.x - maxPoint.x, y: p2.y - maxPoint.y)\n\n    for p in pts {\n      let pVec1 = CGPoint(x: p.x - p1.x, y: p.y - p1.y) // vector from p1 to p\n      let sign1 = lineVec1.x * pVec1.y - pVec1.x * lineVec1.y // sign to check is p is to the right or left of lineVec1\n\n      let pVec2 = CGPoint(x: p.x - maxPoint.x, y: p.y - maxPoint.y) // vector from p2 to p\n      let sign2 = lineVec2.x * pVec2.y - pVec2.x * lineVec2.y // sign to check is p is to the right or left of lineVec2\n\n      if sign1 > 0 { // right of p1 maxPoint line\n        s1.append(p)\n      } else if sign2 > 0 { // right of maxPoint p2 line\n        s2.append(p)\n      }\n    }\n\n    // find new hull points\n    findHull(s1, p1, maxPoint)\n    findHull(s2, maxPoint, p2)\n  }\n\n  func distance(from p: CGPoint, to line: (CGPoint, CGPoint)) -> CGFloat {\n    // If line.0 and line.1 are the same point, they don't define a line (and, besides,\n    // would cause division by zero in the distance formula). Return the distance between\n    // line.0 and point p instead.\n    if line.0 == line.1 {\n      return sqrt(pow(p.x - line.0.x, 2) + pow(p.y - line.0.y, 2))\n    }\n\n    // from Deza, Michel Marie; Deza, Elena (2013), Encyclopedia of Distances (2nd ed.), Springer, p. 86, ISBN 9783642309588\n    return abs((line.1.y - line.0.y) * p.x\n      - (line.1.x - line.0.x) * p.y\n      + line.1.x * line.0.y\n      - line.1.y * line.0.x)\n      / sqrt(pow(line.1.y - line.0.y, 2) + pow(line.1.x - line.0.x, 2))\n  }\n\n  override func draw(_ rect: CGRect) {\n\n    let context = UIGraphicsGetCurrentContext()\n\n    // Draw hull\n    let lineWidth: CGFloat = 2.0\n\n    context!.setFillColor(UIColor.black.cgColor)\n    context!.setLineWidth(lineWidth)\n    context!.setStrokeColor(UIColor.red.cgColor)\n    context!.setFillColor(UIColor.black.cgColor)\n\n    let firstPoint = convexHull.first!\n    context!.move(to: firstPoint)\n\n    for p in convexHull.dropFirst() {\n      context!.addLine(to: p)\n    }\n    context!.addLine(to: firstPoint)\n\n    context!.strokePath()\n\n    // Draw points\n    for p in points {\n      let radius: CGFloat = 5\n      let circleRect = CGRect(x: p.x - radius, y: p.y - radius, width: 2 * radius, height: 2 * radius)\n      context!.fillEllipse(in: circleRect)\n    }\n  }\n}\n"
  },
  {
    "path": "Convex Hull/Convex Hull.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t1CB614301F89456C00A14493 /* Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CB6142F1F89456C00A14493 /* Tests.swift */; };\n\t\t1CB614371F8945B300A14493 /* View.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E6D68CB1E599CF100161780 /* View.swift */; };\n\t\t8E6D68BA1E59989400161780 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E6D68B91E59989400161780 /* AppDelegate.swift */; };\n\t\t8E6D68C11E59989400161780 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8E6D68C01E59989400161780 /* Assets.xcassets */; };\n\t\t8E6D68C41E59989400161780 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8E6D68C21E59989400161780 /* LaunchScreen.storyboard */; };\n\t\t8E6D68CC1E599CF100161780 /* View.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E6D68CB1E599CF100161780 /* View.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t1CB614321F89456C00A14493 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 8E6D68AE1E59989400161780 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 8E6D68B51E59989400161780;\n\t\t\tremoteInfo = \"Convex Hull\";\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\t1CB6142D1F89456C00A14493 /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t1CB6142F1F89456C00A14493 /* Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests.swift; sourceTree = \"<group>\"; };\n\t\t1CB614311F89456C00A14493 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t8E6D68B61E59989400161780 /* Convex Hull.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = \"Convex Hull.app\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t8E6D68B91E59989400161780 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t8E6D68C01E59989400161780 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t8E6D68C31E59989400161780 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = \"<group>\"; };\n\t\t8E6D68C51E59989400161780 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t8E6D68CB1E599CF100161780 /* View.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = View.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t1CB6142A1F89456C00A14493 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t8E6D68B31E59989400161780 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t1CB6142E1F89456C00A14493 /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1CB6142F1F89456C00A14493 /* Tests.swift */,\n\t\t\t\t1CB614311F89456C00A14493 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = Tests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t8E6D68AD1E59989400161780 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8E6D68B81E59989400161780 /* Convex Hull */,\n\t\t\t\t1CB6142E1F89456C00A14493 /* Tests */,\n\t\t\t\t8E6D68B71E59989400161780 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t8E6D68B71E59989400161780 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8E6D68B61E59989400161780 /* Convex Hull.app */,\n\t\t\t\t1CB6142D1F89456C00A14493 /* Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t8E6D68B81E59989400161780 /* Convex Hull */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8E6D68B91E59989400161780 /* AppDelegate.swift */,\n\t\t\t\t8E6D68CB1E599CF100161780 /* View.swift */,\n\t\t\t\t8E6D68C01E59989400161780 /* Assets.xcassets */,\n\t\t\t\t8E6D68C21E59989400161780 /* LaunchScreen.storyboard */,\n\t\t\t\t8E6D68C51E59989400161780 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = \"Convex Hull\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t1CB6142C1F89456C00A14493 /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 1CB614341F89456C00A14493 /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t1CB614291F89456C00A14493 /* Sources */,\n\t\t\t\t1CB6142A1F89456C00A14493 /* Frameworks */,\n\t\t\t\t1CB6142B1F89456C00A14493 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t1CB614331F89456C00A14493 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tproductName = Tests;\n\t\t\tproductReference = 1CB6142D1F89456C00A14493 /* Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n\t\t8E6D68B51E59989400161780 /* Convex Hull */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 8E6D68C81E59989400161780 /* Build configuration list for PBXNativeTarget \"Convex Hull\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t8E6D68B21E59989400161780 /* Sources */,\n\t\t\t\t8E6D68B31E59989400161780 /* Frameworks */,\n\t\t\t\t8E6D68B41E59989400161780 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"Convex Hull\";\n\t\t\tproductName = \"Convex Hull\";\n\t\t\tproductReference = 8E6D68B61E59989400161780 /* Convex Hull.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t8E6D68AE1E59989400161780 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0900;\n\t\t\t\tLastUpgradeCheck = 1000;\n\t\t\t\tORGANIZATIONNAME = Workmoose;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t1CB6142C1F89456C00A14493 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 9.0;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t\tTestTargetID = 8E6D68B51E59989400161780;\n\t\t\t\t\t};\n\t\t\t\t\t8E6D68B51E59989400161780 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.2.1;\n\t\t\t\t\t\tDevelopmentTeam = 4SQG5NJNPF;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 8E6D68B11E59989400161780 /* Build configuration list for PBXProject \"Convex Hull\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 8E6D68AD1E59989400161780;\n\t\t\tproductRefGroup = 8E6D68B71E59989400161780 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t8E6D68B51E59989400161780 /* Convex Hull */,\n\t\t\t\t1CB6142C1F89456C00A14493 /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t1CB6142B1F89456C00A14493 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t8E6D68B41E59989400161780 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8E6D68C41E59989400161780 /* LaunchScreen.storyboard in Resources */,\n\t\t\t\t8E6D68C11E59989400161780 /* Assets.xcassets in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t1CB614291F89456C00A14493 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t1CB614371F8945B300A14493 /* View.swift in Sources */,\n\t\t\t\t1CB614301F89456C00A14493 /* Tests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t8E6D68B21E59989400161780 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8E6D68BA1E59989400161780 /* AppDelegate.swift in Sources */,\n\t\t\t\t8E6D68CC1E599CF100161780 /* View.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t1CB614331F89456C00A14493 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 8E6D68B51E59989400161780 /* Convex Hull */;\n\t\t\ttargetProxy = 1CB614321F89456C00A14493 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t8E6D68C21E59989400161780 /* LaunchScreen.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t8E6D68C31E59989400161780 /* Base */,\n\t\t\t);\n\t\t\tname = LaunchScreen.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t1CB614351F89456C00A14493 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tINFOPLIST_FILE = Tests/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.mnespor.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/Convex Hull.app/Convex Hull\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t1CB614361F89456C00A14493 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tINFOPLIST_FILE = Tests/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 11.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.mnespor.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/Convex Hull.app/Convex Hull\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t8E6D68C61E59989400161780 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 10.2;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t8E6D68C71E59989400161780 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 10.2;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t8E6D68C91E59989400161780 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tDEVELOPMENT_TEAM = 4SQG5NJNPF;\n\t\t\t\tINFOPLIST_FILE = \"Convex Hull/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"workmoose.Convex-Hull\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t8E6D68CA1E59989400161780 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tDEVELOPMENT_TEAM = 4SQG5NJNPF;\n\t\t\t\tINFOPLIST_FILE = \"Convex Hull/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"workmoose.Convex-Hull\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t1CB614341F89456C00A14493 /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t1CB614351F89456C00A14493 /* Debug */,\n\t\t\t\t1CB614361F89456C00A14493 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t8E6D68B11E59989400161780 /* Build configuration list for PBXProject \"Convex Hull\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t8E6D68C61E59989400161780 /* Debug */,\n\t\t\t\t8E6D68C71E59989400161780 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t8E6D68C81E59989400161780 /* Build configuration list for PBXNativeTarget \"Convex Hull\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t8E6D68C91E59989400161780 /* Debug */,\n\t\t\t\t8E6D68CA1E59989400161780 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 8E6D68AE1E59989400161780 /* Project object */;\n}\n"
  },
  {
    "path": "Convex Hull/Convex Hull.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Convex Hull.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Convex Hull/Convex Hull.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Convex Hull/Convex Hull.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1000\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"1CB6142C1F89456C00A14493\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Convex Hull.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Convex Hull/README.md",
    "content": "# Convex Hull\n\nGiven a group of points on a plane. The Convex Hull algorithm calculates the shape (made up from the points itself) containing all these points. It can also be used on a collection of points of different dimensions. This implementation however covers points on a plane. It essentially calculates the lines between points which together contain all points. In comparing different solutions to this problem we can describe each algorithm in terms of it's big-O time complexity.\n\nThere are multiple Convex Hull algorithms but this solution is called Quickhull, is comes from the work of both W. Eddy in 1977 and also separately A. Bykat in 1978, this algorithm has an expected time complexity of O(n log n), but it's worst-case time-complexity can be O(n^2) . With average conditions the algorithm has ok efficiency, but it's time-complexity can start to become more exponential in cases of high symmetry or where there are points lying on the circumference of a circle for example.\n\n## Quickhull\n\nThe quickhull algorithm works as follows:\n\n- The algorithm takes an input of a collection of points. These points should be ordered on their x-coordinate value. \n- We first find the two points A and B with the minimum(A) and the maximum(B) x-coordinates (as these will obviously be part of the hull). \n- Use the line formed by the two points to divide the set in two subsets of points, which will be processed recursively.\n- Determine the point, on one side of the line, with the maximum distance from the line. The two points found before along with this one form a triangle.\n- The points lying inside of that triangle cannot be part of the convex hull and can therefore be ignored in the next steps.\n- Repeat the previous two steps on the two lines formed by the triangle (not the initial line).\n- Keep on doing so on until no more points are left, the recursion has come to an end and the points selected constitute the convex hull.\n\n\nOur function will have the following defininition:\n\n`findHull(points: [CGPoint], p1: CGPoint, p2: CGPoint)`\n\n```\nfindHull(S1, A, B)\nfindHull(S2, B, A)\n```\n\nWhat this function does is the following:\n\n1. If `points` is empty we return as there are no points to the right of our line to add to our hull.\n2. Draw a line from `p1` to `p2`.\n3. Find the point in `points` that is furthest away from this line. (`maxPoint`)\n4. Add `maxPoint` to the hull right after `p1`.\n5. Draw a line (`line1`) from `p1` to `maxPoint`.\n6. Draw a line (`line2`) from `maxPoint` to `p2`. (These lines now form a triangle)\n7. All points within this triangle are of course not part of the hull and thus can be ignored. We check which points in `points` are to the right of `line1` these are grouped in an array `s1`.\n8. All points that are to the right of `line2` are grouped in an array `s2`. Note that there are no points that are both to the right of `line1` and `line2` as then `maxPoint` wouldn't be the point furthest away from our initial line between `p1` and `p2`.\n9. We call `findHull(_, _, _)` again on our new groups of points to find more hull points.\n```\nfindHull(s1, p1, maxPoint)\nfindHull(s2, maxPoint, p2)\n```\n\nThis eventually leaves us with an array of points describing the convex hull.\n\n## See also\n\n[Convex Hull on Wikipedia](https://en.wikipedia.org/wiki/Convex_hull_algorithms)\n\n*Written for the Swift Algorithm Club by Jaap Wijnen.*\n"
  },
  {
    "path": "Convex Hull/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Convex Hull/Tests/Tests.swift",
    "content": "//\n//  Tests.swift\n//  Tests\n//\n//  Created by Matthew Nespor on 10/7/17.\n//  Copyright © 2017 Workmoose. All rights reserved.\n//\n\nimport XCTest\n\nclass Tests: XCTestCase {\n  func testHorizontalInitialLine() {\n    let view = View()\n    let excludedPoint = CGPoint(x: 146, y: 284)\n    let includedPoints = [\n      CGPoint(x: 353, y: 22),\n      CGPoint(x: 22, y: 22),\n      CGPoint(x: 157, y: 447),\n    ]\n\n    view.points = [CGPoint]()\n    view.convexHull = [CGPoint]()\n    view.points.append(contentsOf: includedPoints)\n    view.points.append(excludedPoint)\n    view.points.sort { (a: CGPoint, b: CGPoint) -> Bool in\n      return a.x < b.x\n    }\n\n    view.quickHull(points: view.points)\n\n    assert(includedPoints.filter({ view.convexHull.contains($0) }).count == 3,\n           \"\\(includedPoints) should have been included\")\n    assert(!view.convexHull.contains(excludedPoint),\n           \"\\(excludedPoint) should have been excluded\")\n    }\n}\n"
  },
  {
    "path": "Count Occurrences/CountOccurrences.playground/Contents.swift",
    "content": "\nfunc countOccurrences<T: Comparable>(of key: T, in array: [T]) -> Int {\n  var leftBoundary: Int {\n    var low = 0\n    var high = array.count\n    while low < high {\n      let midIndex = low + (high - low)/2\n      if array[midIndex] < key {\n        low = midIndex + 1\n      } else {\n        high = midIndex\n      }\n    }\n    return low\n  }\n\n  var rightBoundary: Int {\n    var low = 0\n    var high = array.count\n    while low < high {\n      let midIndex = low + (high - low)/2\n      if array[midIndex] > key {\n        high = midIndex\n      } else {\n        low = midIndex + 1\n      }\n    }\n    return low\n  }\n\n  return rightBoundary - leftBoundary\n}\n\n// Simple test\n\nlet a = [ 0, 1, 1, 3, 3, 3, 3, 6, 8, 10, 11, 11 ]\ncountOccurrences(of: 3, in: a)\n\n// Test with arrays of random size and contents (see debug output)\n\nimport Foundation\n\nfunc createArray() -> [Int] {\n  var a = [Int]()\n  for i in 0...5 {\n    if i != 2 {  // don't include the number 2\n      let count = Int(arc4random_uniform(UInt32(6))) + 1\n      for _ in 0..<count {\n        a.append(i)\n      }\n    }\n  }\n  return a.sorted()\n}\n\nfor _ in 0..<10 {\n  let a = createArray()\n  print(a)\n\n  // Note: we also test -1 and 6 to check the edge cases.\n  for k in -1...6 {\n    print(\"\\t\\(k): \\(countOccurrences(of: k, in: a))\")\n  }\n}\n"
  },
  {
    "path": "Count Occurrences/CountOccurrences.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Count Occurrences/CountOccurrences.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Count Occurrences/CountOccurrences.swift",
    "content": "/// Counts the number of times a value appears in an array in O(log n) time.  The array must be sorted from low to high.\n///\n/// - Parameter key: the key to be searched for in the array\n/// - Parameter array: the array to search\n/// - Returns: the count of occurences of the key in the given array\nfunc countOccurrences<T: Comparable>(of key: T, in array: [T]) -> Int {\n  var leftBoundary: Int {\n    var low = 0\n    var high = array.count\n    while low < high {\n      let midIndex = low + (high - low)/2\n      if array[midIndex] < key {\n        low = midIndex + 1\n      } else {\n        high = midIndex\n      }\n    }\n    return low\n  }\n\n  var rightBoundary: Int {\n    var low = 0\n    var high = array.count\n    while low < high {\n      let midIndex = low + (high - low)/2\n      if array[midIndex] > key {\n        high = midIndex\n      } else {\n        low = midIndex + 1\n      }\n    }\n    return low\n  }\n\n  return rightBoundary - leftBoundary\n}\n"
  },
  {
    "path": "Count Occurrences/README.markdown",
    "content": "# Count Occurrences\n\nGoal: Count how often a certain value appears in an array.\n\nThe obvious way to do this is with a [linear search](../Linear%20Search/) from the beginning of the array until the end, keeping count of how often you come across the value. That is an **O(n)** algorithm.\n\nHowever, if the array is sorted you can do it much faster, in **O(log n)** time, by using a modification of [binary search](../Binary%20Search/).\n\nLet's say we have the following array:\n\n\t[ 0, 1, 1, 3, 3, 3, 3, 6, 8, 10, 11, 11 ]\n\nIf we want to know how often the value `3` occurs, we can do a regular binary search for `3`. That could give us any of these four indices:\n\n\t[ 0, 1, 1, 3, 3, 3, 3, 6, 8, 10, 11, 11 ]\n\t           *  *  *  *\n\nBut that still doesn't tell you how many other `3`s there are. To find those other `3`s, you'd still have to do a linear search to the left and a linear search to the right. That will be fast enough in most cases, but in the worst case -- when the array consists of nothing but `3`s -- it still takes **O(n)** time.\n\nThe trick is to use two binary searches, one to find where the `3`s start (the left boundary), and one to find where they end (the right boundary).\n\nIn code this looks as follows:\n\n```swift\nfunc countOccurrences<T: Comparable>(of key: T, in array: [T]) -> Int {\n  var leftBoundary: Int {\n    var low = 0\n    var high = array.count\n    while low < high {\n      let midIndex = low + (high - low)/2\n      if a[midIndex] < key {\n        low = midIndex + 1\n      } else {\n        high = midIndex\n      }\n    }\n    return low\n  }\n\n  var rightBoundary: Int {\n    var low = 0\n    var high = array.count\n    while low < high {\n      let midIndex = low + (high - low)/2\n      if a[midIndex] > key {\n        high = midIndex\n      } else {\n        low = midIndex + 1\n      }\n    }\n    return low\n  }\n\n  return rightBoundary - leftBoundary\n}\n```\n\nNotice that the variables `leftBoundary` and `rightBoundary` are very similar to the [binary search](../Binary%20Search/) algorithm. The big difference is that they don't stop when they find the search key, but keep going.  Also, notice that we constrain the type `T` to be Comparable so that the algorithm can be applied to an array of Strings, Ints or other types that conform to the Swift Comparable protocol.\n\nTo test this algorithm, copy the code to a playground and then do:\n\n```swift\nlet a = [ 0, 1, 1, 3, 3, 3, 3, 6, 8, 10, 11, 11 ]\n\ncountOccurrences(of: 3, in: a)  // returns 4\n```\n\n> **Remember:** If you use your own array, make sure it is sorted first!\n\nLet's walk through the example. The array is:\n\n\t[ 0, 1, 1, 3, 3, 3, 3, 6, 8, 10, 11, 11 ]\n\nTo find the left boundary, we start with `low = 0` and `high = 12`. The first mid index is `6`:\n\n\t[ 0, 1, 1, 3, 3, 3, 3, 6, 8, 10, 11, 11 ]\n\t                    *\n\nWith a regular binary search you'd be done now, but here we're not just looking whether the value `3` occurs or not -- instead, we want to find where it occurs *first*.\n\nSince this algorithm follows the same principle as binary search, we now ignore the right half of the array and calculate the new mid index:\n\n\t[ 0, 1, 1, 3, 3, 3 | x, x, x, x, x, x ]\n\t           *\n\nAgain, we've landed on a `3`, and it's the very first one. But the algorithm doesn't know that, so we split the array again:\n\n\t[ 0, 1, 1 | x, x, x | x, x, x, x, x, x ]\n\t     *\n\nStill not done. Split again, but this time use the right half:\n\n\t[ x, x | 1 | x, x, x | x, x, x, x, x, x ]\n\t         *\n\nThe array cannot be split up any further, which means we've found the left boundary, at index 3.\n\nNow let's start over and try to find the right boundary. This is very similar, so I'll just show you the different steps:\n\n\t[ 0, 1, 1, 3, 3, 3, 3, 6, 8, 10, 11, 11 ]\n\t                    *\n\n\t[ x, x, x, x, x, x, x | 6, 8, 10, 11, 11 ]\n\t                              *\n\n\t[ x, x, x, x, x, x, x | 6, 8, | x, x, x ]\n\t                           *\n\n\t[ x, x, x, x, x, x, x | 6 | x | x, x, x ]\n\t                        *\n\nThe right boundary is at index 7. The difference between the two boundaries is 7 - 3 = 4, so the number `3` occurs four times in this array.\n\nEach binary search took 4 steps, so in total this algorithm took 8 steps. Not a big gain on an array of only 12 items, but the bigger the array, the more efficient this algorithm becomes. For a sorted array with 1,000,000 items, it only takes 2 x 20 = 40 steps to count the number of occurrences for any particular value.\n\nBy the way, if the value you're looking for is not in the array, then `rightBoundary` and `leftBoundary` return the same value and so the difference between them is 0.\n\nThis is an example of how you can modify the basic binary search to solve other algorithmic problems as well. Of course, it does require that the array is sorted.\n\n*Written for Swift Algorithm Club by Matthijs Hollemans*\n"
  },
  {
    "path": "CounterClockWise/CounterClockWise.playground/Contents.swift",
    "content": "/*\n CounterClockWise(CCW) Algorithm\n The user cross-multiplies corresponding coordinates to find the area encompassing the polygon,\n and subtracts it from the surrounding polygon to find the area of the polygon within.\n This code is based on the \"Shoelace formula\" by Carl Friedrich Gauss\n https://en.wikipedia.org/wiki/Shoelace_formula\n */\n\nimport Foundation\n\n// MARK : Point struct for defining 2-D coordinate(x,y)\npublic struct Point{\n  // Coordinate(x,y)\n  var x: Int\n  var y: Int\n  \n  public init(x: Int ,y: Int){\n    self.x = x\n    self.y = y\n  }\n}\n\n// MARK : Function that determine the area of a simple polygon whose vertices are described\n//        by their Cartesian coordinates in the plane.\nfunc ccw(points: [Point]) -> Int{\n  let polygon = points.count\n  var orientation = 0\n  \n  // Take the first x-coordinate and multiply it by the second y-value,\n  // then take the second x-coordinate and multiply it by the third y-value,\n  // and repeat as many times until it is done for all wanted points.\n  for i in 0..<polygon{\n      orientation += (points[i%polygon].x*points[(i+1)%polygon].y\n                      - points[(i+1)%polygon].x*points[i%polygon].y)\n  }\n  \n  // If the points are labeled sequentially in the counterclockwise direction,\n  // then the sum of the above determinants is positive and the absolute value signs can be omitted\n  // if they are labeled in the clockwise direction, the sum of the determinants will be negative.\n  // This is because the formula can be viewed as a special case of Green's Theorem.\n  switch orientation {\n  case Int.min..<0:\n    return -1 // if operation < 0 : ClockWise\n  case 0:\n    return 0 // if operation == 0 : Parallel\n  default:\n    return 1 // if operation > 0 : CounterClockWise\n  }\n}\n\n// A few simple tests\n\n\n// Triangle\nvar p1 = Point(x: 5, y: 8)\nvar p2 = Point(x: 9, y: 1)\nvar p3 = Point(x: 3, y: 6)\n\nprint(ccw(points: [p1,p2,p3])) // -1 means ClockWise\n\n// Quadrilateral\nvar p4 = Point(x: 5, y: 8)\nvar p5 = Point(x: 2, y: 3)\nvar p6 = Point(x: 6, y: 1)\nvar p7 = Point(x: 9, y: 3)\n\nprint(ccw(points: [p4,p5,p6,p7])) // 1 means CounterClockWise\n\n// Pentagon\nvar p8 = Point(x: 5, y: 11)\nvar p9 = Point(x: 3, y: 4)\nvar p10 = Point(x: 5, y: 6)\nvar p11 = Point(x: 9, y: 5)\nvar p12 = Point(x: 12, y: 8)\n\nprint(ccw(points: [p8,p9,p10,p11,p12])) // 1 means CounterClockWise\n"
  },
  {
    "path": "CounterClockWise/CounterClockWise.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios' executeOnSourceChanges='false'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "CounterClockWise/CounterClockWise.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "CounterClockWise/CounterClockWise.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "CounterClockWise/CounterClockWise.swift",
    "content": "/*\n CounterClockWise(CCW) Algorithm\n The user cross-multiplies corresponding coordinates to find the area encompassing the polygon,\n and subtracts it from the surrounding polygon to find the area of the polygon within.\n This code is based on the \"Shoelace formula\" by Carl Friedrich Gauss\n https://en.wikipedia.org/wiki/Shoelace_formula\n */\n\n\nimport Foundation\n\n// MARK : Point struct for defining 2-D coordinate(x,y)\npublic struct Point{\n  // Coordinate(x,y)\n  var x: Int\n  var y: Int\n  \n  public init(x: Int ,y: Int){\n    self.x = x\n    self.y = y\n  }\n}\n\n// MARK : Function that determine the area of a simple polygon whose vertices are described\n//        by their Cartesian coordinates in the plane.\nfunc ccw(points: [Point]) -> Int{\n  let polygon = points.count\n  var orientation = 0\n  \n  // Take the first x-coordinate and multiply it by the second y-value,\n  // then take the second x-coordinate and multiply it by the third y-value,\n  // and repeat as many times until it is done for all wanted points.\n  for i in 0..<polygon{\n    orientation += (points[i%polygon].x*points[(i+1)%polygon].y\n      - points[(i+1)%polygon].x*points[i%polygon].y)\n  }\n  \n  // If the points are labeled sequentially in the counterclockwise direction,\n  // then the sum of the above determinants is positive and the absolute value signs can be omitted\n  // if they are labeled in the clockwise direction, the sum of the determinants will be negative.\n  // This is because the formula can be viewed as a special case of Green's Theorem.\n  switch orientation {\n  case Int.min..<0:\n    return -1 // if operation < 0 : ClockWise\n  case 0:\n    return 0 // if operation == 0 : Parallel\n  default:\n    return 1 // if operation > 0 : CounterClockWise\n  }\n}\n"
  },
  {
    "path": "CounterClockWise/README.md",
    "content": "# CounterClockWise\n\nGoal : Determine what direction to take when multiple points are given.\n\nCounterClockWise(CCW) is based on [Shoelace formula](https://en.wikipedia.org/wiki/Shoelace_formula#Examples) by Carl Friedrich Gauss.\n\n\n\n1. Take the first x-coordinate and multiply it by the second y-value, then take the second x-coordinate and multiply it by the third y-value, and repeat as many times until it is done for all wanted points.\n2. If the points are labeled sequentially in the counterclockwise direction, then the sum of the above determinants is positive and the absolute value signs can be omitted if they are labeled in the clockwise direction, the sum of the determinants will be negative. This is because the formula can be viewed as a special case of [Green's theorem](https://en.wikipedia.org/wiki/Green%27s_theorem).\n\n![Shoelace](./Images/Shoelace.png)\n\n\n\nHere's an implementation in Swift that should be easy to understand:\n\n```swift\nfunc ccw(points: [Point]) -> Int{\n  let polygon = points.count\n  var orientation = 0\n\n  for i in 0..<polygon{\n    orientation += (points[i%polygon].x*points[(i+1)%polygon].y\n      - points[(i+1)%polygon].x*points[i%polygon].y)\n  }\n    \n  switch orientation {\n  case Int.min..<0:\n    return -1 // if operation < 0 : ClockWise\n  case 0:\n    return 0 // if operation == 0 : Parallel\n  default:\n    return 1 // if operation > 0 : CounterClockWise\n  }\n}\n```\n\nPut this code in a playground and test it like so:\n\n```swift\nvar p1 = Point(x: 5, y: 8)\nvar p2 = Point(x: 9, y: 1)\nvar p3 = Point(x: 3, y: 6)\n\nprint(ccw(points: [p1,p2,p3])) // -1 means ClockWise\n```\n\nHere's how it works. When given an `[Photo]`, `ccw(points:)` calculates the direction of the given points according to the Shoelaces formula.\n\n\n\n`orientation` is less than 0, the direction is clockwise. \n\n`orientation` is equal to 0, the direction is parallel. \n\n`orientation` is greater than 0, the direction is counterclockwise. \n\n\n\n## An example\n\n**In Triangle**\n\n```swift\nvar p1 = Point(x: 5, y: 8)\nvar p2 = Point(x: 9, y: 1)\nvar p3 = Point(x: 3, y: 6)\n\nprint(ccw(points: [p1,p2,p3])) // -1 means ClockWise\n```\n\n![triangle](./Images/Triangle_img.jpg)\n\n![triangleExpression](./Images/triangle.png)\n\n\n\n**In Quadrilateral**\n\n```swift\nvar p4 = Point(x: 5, y: 8)\nvar p5 = Point(x: 2, y: 3)\nvar p6 = Point(x: 6, y: 1)\nvar p7 = Point(x: 9, y: 3)\n\nprint(ccw(points: [p4,p5,p6,p7])) // 1 means CounterClockWise\n```\n\n![Quadrilateral](./Images/Quadrilateral_img.jpg)\n\n![triangleExpression](./Images/quadrilateral.png)\n\n\n\n**In Pentagon**\n\n```swift\nvar p8 = Point(x: 5, y: 11)\nvar p9 = Point(x: 3, y: 4)\nvar p10 = Point(x: 5, y: 6)\nvar p11 = Point(x: 9, y: 5)\nvar p12 = Point(x: 12, y: 8)\n\nprint(ccw(points: [p8,p9,p10,p11,p12])) // 1 means CounterClockWise\n```\n\n![triangle](./Images/Pentagon_img.png)\n\n![triangleExpression](./Images/pentagon.png)\n\n\n\nYou probably won't need to use the CCW in any real-world problems, but it's cool to play around with geometry algorithm. The formula was described by Meister (1724-1788) in 1769 and by Gauss in 1795. It can be verified by dividing the polygon into triangles, and can be considered to be a special case of Green's theorem.\n\n\n\n*Written for Swift Algorithm Club by TaeJoong Yoon*\n"
  },
  {
    "path": "Counting Sort/CountingSort.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\nenum CountingSortError: Error {\n  case arrayEmpty\n}\n\nfunc countingSort(array: [Int]) throws -> [Int] {\n  guard array.count > 0 else {\n    throw CountingSortError.arrayEmpty\n  }\n\n  // Step 1\n  // Create an array to store the count of each element\n  let maxElement = array.max() ?? 0\n\n  var countArray = [Int](repeating: 0, count: Int(maxElement + 1))\n  for element in array {\n    countArray[element] += 1\n  }\n\n  // Step 2\n  // Set each value to be the sum of the previous two values\n  for index in 1 ..< countArray.count {\n    let sum = countArray[index] + countArray[index - 1]\n    countArray[index] = sum\n  }\n\n  print(countArray)\n\n  // Step 3\n  // Place the element in the final array as per the number of elements before it\n  // Loop through the array in reverse to keep the stability of the new array\n  // i.e. 7, is at index 3 and 6, thus in sortedArray the position of 7 at index 3 should be before 7 at index 6\n  var sortedArray = [Int](repeating: 0, count: array.count)\n  for index in stride(from: array.count - 1, through: 0, by: -1) {\n    let element = array[index]\n    countArray[element] -= 1\n    sortedArray[countArray[element]] = element\n  }\n    \n  return sortedArray\n}\n\ntry countingSort(array: [10, 9, 8, 7, 1, 2, 7, 3])\n\n"
  },
  {
    "path": "Counting Sort/CountingSort.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Counting Sort/CountingSort.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Counting Sort/CountingSort.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Counting Sort/CountingSort.swift",
    "content": "//\n//  Sort.swift\n//  test\n//\n//  Created by Kauserali on 11/04/16.\n//  Copyright © 2016 Ali Hafizji. All rights reserved.\n//\n\nfunc countingSort(_ array: [Int])-> [Int] {\n  guard array.count > 0 else {return []}\n\n  // Step 1\n  // Create an array to store the count of each element\n  let maxElement = array.max() ?? 0\n\n  var countArray = [Int](repeating: 0, count: Int(maxElement + 1))\n  for element in array {\n    countArray[element] += 1\n  }\n\n  // Step 2\n  // Set each value to be the sum of the previous two values\n  for index in 1 ..< countArray.count {\n    let sum = countArray[index] + countArray[index - 1]\n    countArray[index] = sum\n  }\n\n  print(countArray)\n\n  // Step 3\n  // Place the element in the final array as per the number of elements before it\n  // Loop through the array in reverse to keep the stability of the new sorted array\n  // (For Example: 7 is at index 3 and 6, thus in sortedArray the position of 7 at index 3 should be before 7 at index 6\n  var sortedArray = [Int](repeating: 0, count: array.count)\n  for index in stride(from: array.count - 1, through: 0, by: -1) {\n    let element = array[index]\n    countArray[element] -= 1\n    sortedArray[countArray[element]] = element\n  }\n  return sortedArray\n}\n"
  },
  {
    "path": "Counting Sort/README.markdown",
    "content": "# Counting Sort\n\nCounting sort is an algorithm for sorting a collection of objects according to keys that are small integers. It operates by counting the number of objects that have each distinct key values, and using arithmetic on those counts to determine the positions of each key value in the output sequence.\n\n## Example\n\nTo understand the algorithm let's walk through a small example.\n\nConsider the array: `[ 10, 9, 8, 7, 1, 2, 7, 3 ]`\n\n### Step 1:\n\nThe first step is to count the total number of occurrences for each item in the array. The output for the first step would be a new array that looks as follows:\n\n```\nIndex 0 1 2 3 4 5 6 7 8 9 10\nCount 0 1 1 1 0 0 0 2 1 1 1\n```\n\nHere is the code to accomplish this:\n\n```swift\n  let maxElement = array.max() ?? 0\n\n  var countArray = [Int](repeating: 0, count: Int(maxElement + 1))\n  for element in array {\n    countArray[element] += 1\n  }\n```\n\n### Step 2:\n\nIn this step the algorithm tries to determine the number of elements that are placed before each element. Since, you already know the total occurrences for each element you can use this information to your advantage. The way it works is to sum up the previous counts and store them at each index.\n\nThe count array would be as follows:\n\n```\nIndex 0 1 2 3 4 5 6 7 8 9 10\nCount 0 1 2 3 3 3 3 5 6 7 8\n```\n\nThe code for step 2 is:\n\n```swift\n  for index in 1 ..< countArray.count {\n    let sum = countArray[index] + countArray[index - 1]\n    countArray[index] = sum\n  }\n```\n\n### Step 3:\n\nThis is the last step in the algorithm. Each element in the original array is placed at the position defined by the output of step 2. For example, the number 10 would be placed at an index of 7 in the output array. Also, as you place the elements you need to reduce the count by 1 as those many elements are reduced from the array. \nWe also have to loop through the array in reverse to keep the stability of the new sorted array.\nFor Example: 7 is at index 3 and 6, thus in sortedArray the position of 7 at index 3 should be before 7 at index 6.\n\nThe final output would be:\n\n```\nIndex  0 1 2 3 4 5 6 7\nOutput 1 2 3 7 7 8 9 10\n```\n\nHere is the code for this final step:\n\n```swift\n  var sortedArray = [Int](repeating: 0, count: array.count)\n  for index in stride(from: array.count - 1, through: 0, by: -1) {\n    let element = array[index]\n    countArray[element] -= 1\n    sortedArray[countArray[element]] = element\n  }\n  return sortedArray\n```\n\n## Performance\n\nThe algorithm uses simple loops to sort a collection. Hence, the time to run the entire algorithm is **O(n+k)** where **O(n)** represents the loops that are required to initialize the output arrays and **O(k)** is the loop required to create the count array.\n\nThe algorithm uses arrays of length **n + 1** and **n**, so the total space required is **O(2n)**. Hence for collections where the keys are scattered in a dense area along the number line it can be space efficient.\n\n*Written for Swift Algorithm Club by Ali Hafizji*\n"
  },
  {
    "path": "Counting Sort/Tests/CountingSortTest.swift",
    "content": "//\n//  CountingSort.swift\n//  CountingSort\n//\n//  Created by Kauserali on 11/04/16.\n//\n//\n\nimport XCTest\n\nclass CountingSort: XCTestCase {\n\n  func testCountingSort() {\n    let sequence = [10, 8, 1, 2, 5, 8]\n    let sortedSequence = [1, 2, 5, 8, 8, 10]\n\n    do {\n      let afterCountingSort = try countingSort(sequence)\n      XCTAssertEqual(afterCountingSort, sortedSequence)\n    } catch {\n      XCTFail(\"\")\n    }\n  }\n}\n"
  },
  {
    "path": "Counting Sort/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Counting Sort/Tests/Tests.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t7B74638C1CBCCC3C006DB977 /* CountingSortTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B74638B1CBCCC3C006DB977 /* CountingSortTest.swift */; };\n\t\t7B80C3D81C77A313003CECC7 /* CountingSort.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C3D71C77A313003CECC7 /* CountingSort.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t7B2BBC801C779D720067B71D /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7B2BBC941C779E7B0067B71D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };\n\t\t7B74638B1CBCCC3C006DB977 /* CountingSortTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CountingSortTest.swift; sourceTree = SOURCE_ROOT; };\n\t\t7B80C3D71C77A313003CECC7 /* CountingSort.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = CountingSort.swift; path = ../CountingSort.swift; sourceTree = SOURCE_ROOT; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t7B2BBC7D1C779D720067B71D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t7B2BBC681C779D710067B71D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC831C779D720067B71D /* Tests */,\n\t\t\t\t7B2BBC721C779D710067B71D /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC721C779D710067B71D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC801C779D720067B71D /* Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC831C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B80C3D71C77A313003CECC7 /* CountingSort.swift */,\n\t\t\t\t7B74638B1CBCCC3C006DB977 /* CountingSortTest.swift */,\n\t\t\t\t7B2BBC941C779E7B0067B71D /* Info.plist */,\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tpath = TestsTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t7B2BBC7F1C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t7B2BBC7C1C779D720067B71D /* Sources */,\n\t\t\t\t7B2BBC7D1C779D720067B71D /* Frameworks */,\n\t\t\t\t7B2BBC7E1C779D720067B71D /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tproductName = TestsTests;\n\t\t\tproductReference = 7B2BBC801C779D720067B71D /* Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t7B2BBC691C779D710067B71D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0720;\n\t\t\t\tLastUpgradeCheck = 0820;\n\t\t\t\tORGANIZATIONNAME = \"Swift Algorithm Club\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t7B2BBC7F1C779D720067B71D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2;\n\t\t\t\t\t\tLastSwiftMigration = 0820;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\tEnglish,\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 7B2BBC681C779D710067B71D;\n\t\t\tproductRefGroup = 7B2BBC721C779D710067B71D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t7B2BBC7F1C779D720067B71D /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t7B2BBC7E1C779D720067B71D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t7B2BBC7C1C779D720067B71D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7B74638C1CBCCC3C006DB977 /* CountingSortTest.swift in Sources */,\n\t\t\t\t7B80C3D81C77A313003CECC7 /* CountingSort.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t7B2BBC871C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC881C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t7B2BBC8D1C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC8E1C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC871C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC881C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC8D1C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC8E1C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 7B2BBC691C779D710067B71D /* Project object */;\n}\n"
  },
  {
    "path": "Counting Sort/Tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Tests.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Counting Sort/Tests/Tests.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Counting Sort/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0820\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Depth-First Search/DepthFirstSearch.playground/Pages/Simple Example.xcplaygroundpage/Contents.swift",
    "content": "// last checked with Xcode 10.1\n\nfunc depthFirstSearch(_ graph: Graph, source: Node) -> [String] {\n    var nodesExplored = [source.label]\n    source.visited = true\n    \n    for edge in source.neighbors {\n        if !edge.neighbor.visited {\n            nodesExplored += depthFirstSearch(graph, source: edge.neighbor)\n        }\n    }\n    return nodesExplored\n}\n\nlet graph = Graph()\n\nlet nodeA = graph.addNode(\"a\")\nlet nodeB = graph.addNode(\"b\")\nlet nodeC = graph.addNode(\"c\")\nlet nodeD = graph.addNode(\"d\")\nlet nodeE = graph.addNode(\"e\")\nlet nodeF = graph.addNode(\"f\")\nlet nodeG = graph.addNode(\"g\")\nlet nodeH = graph.addNode(\"h\")\n\ngraph.addEdge(nodeA, neighbor: nodeB)\ngraph.addEdge(nodeA, neighbor: nodeC)\ngraph.addEdge(nodeB, neighbor: nodeD)\ngraph.addEdge(nodeB, neighbor: nodeE)\ngraph.addEdge(nodeC, neighbor: nodeF)\ngraph.addEdge(nodeC, neighbor: nodeG)\ngraph.addEdge(nodeE, neighbor: nodeH)\ngraph.addEdge(nodeE, neighbor: nodeF)\ngraph.addEdge(nodeF, neighbor: nodeG)\n\nlet nodesExplored = depthFirstSearch(graph, source: nodeA)\nprint(nodesExplored)\n"
  },
  {
    "path": "Depth-First Search/DepthFirstSearch.playground/Sources/Edge.swift",
    "content": "public class Edge: Equatable {\n    public var neighbor: Node\n    \n    public init(_ neighbor: Node) {\n        self.neighbor = neighbor\n    }\n}\n\npublic func == (_ lhs: Edge, rhs: Edge) -> Bool {\n    return lhs.neighbor == rhs.neighbor\n}\n"
  },
  {
    "path": "Depth-First Search/DepthFirstSearch.playground/Sources/Graph.swift",
    "content": "public class Graph: CustomStringConvertible, Equatable {\n  public private(set) var nodes: [Node]\n  \n  public init() {\n    self.nodes = []\n  }\n  \n  @discardableResult\n  public func addNode(_ label: String) -> Node {\n    let node = Node(label)\n    nodes.append(node)\n    return node\n  }\n  \n  public func addEdge(_ source: Node, neighbor: Node) {\n    let edge = Edge(neighbor)\n    source.neighbors.append(edge)\n  }\n  \n  public var description: String {\n    var description = \"\"\n    \n    for node in nodes {\n      if !node.neighbors.isEmpty {\n        description += \"[node: \\(node.label) edges: \\(node.neighbors.map { $0.neighbor.label})]\"\n      }\n    }\n    return description\n  }\n  \n  public func findNodeWithLabel(_ label: String) -> Node {\n    return nodes.filter { $0.label == label }.first!\n  }\n  \n  public func duplicate() -> Graph {\n    let duplicated = Graph()\n    \n    for node in nodes {\n      duplicated.addNode(node.label)\n    }\n    \n    for node in nodes {\n      for edge in node.neighbors {\n        let source = duplicated.findNodeWithLabel(node.label)\n        let neighbour = duplicated.findNodeWithLabel(edge.neighbor.label)\n        duplicated.addEdge(source, neighbor: neighbour)\n      }\n    }\n    \n    return duplicated\n  }\n}\n\npublic func == (_ lhs: Graph, rhs: Graph) -> Bool {\n  return lhs.nodes == rhs.nodes\n}\n"
  },
  {
    "path": "Depth-First Search/DepthFirstSearch.playground/Sources/Node.swift",
    "content": "public class Node: CustomStringConvertible, Equatable {\n  public var neighbors: [Edge]\n  \n  public private(set) var label: String\n  public var distance: Int?\n  public var visited: Bool\n  \n  public init(_ label: String) {\n    self.label = label\n    neighbors = []\n    visited = false\n  }\n  \n  public var description: String {\n    if let distance = distance {\n      return \"Node(label: \\(label), distance: \\(distance))\"\n    }\n    return \"Node(label: \\(label), distance: infinity)\"\n  }\n  \n  public var hasDistance: Bool {\n    return distance != nil\n  }\n  \n  public func remove(_ edge: Edge) {\n    neighbors.remove(at: neighbors.index { $0 === edge }!)\n  }\n}\n\npublic func == (_ lhs: Node, rhs: Node) -> Bool {\n  return lhs.label == rhs.label && lhs.neighbors == rhs.neighbors\n}\n"
  },
  {
    "path": "Depth-First Search/DepthFirstSearch.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='6.0' target-platform='ios' display-mode='rendered'/>"
  },
  {
    "path": "Depth-First Search/DepthFirstSearch.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Depth-First Search/DepthFirstSearch.swift",
    "content": "func depthFirstSearch(_ graph: Graph, source: Node) -> [String] {\n  var nodesExplored = [source.label]\n  source.visited = true\n\n  for edge in source.neighbors {\n    if !edge.neighbor.visited {\n      nodesExplored += depthFirstSearch(graph, source: edge.neighbor)\n    }\n  }\n  return nodesExplored\n}\n"
  },
  {
    "path": "Depth-First Search/README.markdown",
    "content": "# Depth-First Search\n\n> This topic has been tutorialized [here](https://www.raywenderlich.com/157949/swift-algorithm-club-depth-first-search)\n\nDepth-first search (DFS) is an algorithm for traversing or searching [tree](../Tree/) or [graph](../Graph/) data structures. It starts at a source node and explores as far as possible along each branch before backtracking.\n\nDepth-first search can be used on both directed and undirected graphs.\n\n## Animated example\n\nHere's how depth-first search works on a graph:\n\n![Animated example](Images/AnimatedExample.gif)\n\nLet's say we start the search from node `A`. In depth-first search we look at the starting node's first neighbor and visit that. In the example that is node `B`. Then we look at node `B`'s first neighbor and visit it. This is node `D`. Since `D` doesn't have any unvisited neighbors of its own, we backtrack to node `B` and go to its other neighbor `E`. And so on, until we've visited all the nodes in the graph.\n\nEach time we visit the first neighbor and keep going until there's nowhere left to go, and then we backtrack to a point where there are again nodes to visit. When we've backtracked all the way to node `A`, the search is complete.\n\nFor the example, the nodes were visited in the order `A`, `B`, `D`, `E`, `H`, `F`, `G`, `C`.\n\nThe depth-first search process can also be visualized as a tree:\n\n![Traversal tree](Images/TraversalTree.png)\n\nThe parent of a node is the one that \"discovered\" that node. The root of the tree is the node you started the depth-first search from. Whenever there's a branch, that's where we backtracked.\n\n## The code\n\nSimple recursive implementation of depth-first search:\n\n```swift\nfunc depthFirstSearch(_ graph: Graph, source: Node) -> [String] {\n  var nodesExplored = [source.label]\n  source.visited = true\n\n  for edge in source.neighbors {\n    if !edge.neighbor.visited {\n      nodesExplored += depthFirstSearch(graph, source: edge.neighbor)\n    }\n  }\n  return nodesExplored\n}\n```\n\nWhere a [breadth-first search](../Breadth-First%20Search/) visits all immediate neighbors first, a depth-first search tries to go as deep down the tree or graph as it can.\n\nPut this code in a playground and test it like so:\n\n```swift\nlet graph = Graph()\n\nlet nodeA = graph.addNode(\"a\")\nlet nodeB = graph.addNode(\"b\")\nlet nodeC = graph.addNode(\"c\")\nlet nodeD = graph.addNode(\"d\")\nlet nodeE = graph.addNode(\"e\")\nlet nodeF = graph.addNode(\"f\")\nlet nodeG = graph.addNode(\"g\")\nlet nodeH = graph.addNode(\"h\")\n\ngraph.addEdge(nodeA, neighbor: nodeB)\ngraph.addEdge(nodeA, neighbor: nodeC)\ngraph.addEdge(nodeB, neighbor: nodeD)\ngraph.addEdge(nodeB, neighbor: nodeE)\ngraph.addEdge(nodeC, neighbor: nodeF)\ngraph.addEdge(nodeC, neighbor: nodeG)\ngraph.addEdge(nodeE, neighbor: nodeH)\ngraph.addEdge(nodeE, neighbor: nodeF)\ngraph.addEdge(nodeF, neighbor: nodeG)\n\nlet nodesExplored = depthFirstSearch(graph, source: nodeA)\nprint(nodesExplored)\n```\n\nThis will output: `[\"a\", \"b\", \"d\", \"e\", \"h\", \"f\", \"g\", \"c\"]`\n\n## What is DFS good for?\n\nDepth-first search can be used to solve many problems, for example:\n\n* Finding connected components of a sparse graph\n* [Topological sorting](../Topological%20Sort/) of nodes in a graph\n* Finding bridges of a graph (see: [Bridges](https://en.wikipedia.org/wiki/Bridge_(graph_theory)#Bridge-finding_algorithm))\n* And lots of others!\n\n*Written for Swift Algorithm Club by Paulo Tanaka and Matthijs Hollemans*\n"
  },
  {
    "path": "Depth-First Search/Tests/DepthFirstSearchTests.swift",
    "content": "import XCTest\n\nclass DepthFirstSearchTests: XCTestCase {\n    \n    func testSwift4(){\n        // last checked with Xcode 9.0b4\n        #if swift(>=4.0)\n            print(\"Hello, Swift 4!\")\n        #endif\n    }\n    func testExploringTree() {\n        let tree = Graph()\n        \n        let nodeA = tree.addNode(\"a\")\n        let nodeB = tree.addNode(\"b\")\n        let nodeC = tree.addNode(\"c\")\n        let nodeD = tree.addNode(\"d\")\n        let nodeE = tree.addNode(\"e\")\n        let nodeF = tree.addNode(\"f\")\n        let nodeG = tree.addNode(\"g\")\n        let nodeH = tree.addNode(\"h\")\n        \n        tree.addEdge(nodeA, neighbor: nodeB)\n        tree.addEdge(nodeA, neighbor: nodeC)\n        tree.addEdge(nodeB, neighbor: nodeD)\n        tree.addEdge(nodeB, neighbor: nodeE)\n        tree.addEdge(nodeC, neighbor: nodeF)\n        tree.addEdge(nodeC, neighbor: nodeG)\n        tree.addEdge(nodeE, neighbor: nodeH)\n        \n        let nodesExplored = depthFirstSearch(tree, source: nodeA)\n        \n        XCTAssertEqual(nodesExplored, [\"a\", \"b\", \"d\", \"e\", \"h\", \"c\", \"f\", \"g\"])\n    }\n    \n    func testExploringDigraph() {\n        let digraph = Graph()\n        \n        let nodeA = digraph.addNode(\"a\")\n        let nodeB = digraph.addNode(\"b\")\n        let nodeC = digraph.addNode(\"c\")\n        let nodeD = digraph.addNode(\"d\")\n        let nodeE = digraph.addNode(\"e\")\n        let nodeF = digraph.addNode(\"f\")\n        let nodeG = digraph.addNode(\"g\")\n        let nodeH = digraph.addNode(\"h\")\n        let nodeI = digraph.addNode(\"i\")\n        \n        digraph.addEdge(nodeA, neighbor: nodeB)\n        digraph.addEdge(nodeA, neighbor: nodeH)\n        digraph.addEdge(nodeB, neighbor: nodeA)\n        digraph.addEdge(nodeB, neighbor: nodeC)\n        digraph.addEdge(nodeB, neighbor: nodeH)\n        digraph.addEdge(nodeC, neighbor: nodeB)\n        digraph.addEdge(nodeC, neighbor: nodeD)\n        digraph.addEdge(nodeC, neighbor: nodeF)\n        digraph.addEdge(nodeC, neighbor: nodeI)\n        digraph.addEdge(nodeD, neighbor: nodeC)\n        digraph.addEdge(nodeD, neighbor: nodeE)\n        digraph.addEdge(nodeD, neighbor: nodeF)\n        digraph.addEdge(nodeE, neighbor: nodeD)\n        digraph.addEdge(nodeE, neighbor: nodeF)\n        digraph.addEdge(nodeF, neighbor: nodeC)\n        digraph.addEdge(nodeF, neighbor: nodeD)\n        digraph.addEdge(nodeF, neighbor: nodeE)\n        digraph.addEdge(nodeF, neighbor: nodeG)\n        digraph.addEdge(nodeG, neighbor: nodeF)\n        digraph.addEdge(nodeG, neighbor: nodeH)\n        digraph.addEdge(nodeG, neighbor: nodeI)\n        digraph.addEdge(nodeH, neighbor: nodeA)\n        digraph.addEdge(nodeH, neighbor: nodeB)\n        digraph.addEdge(nodeH, neighbor: nodeG)\n        digraph.addEdge(nodeH, neighbor: nodeI)\n        digraph.addEdge(nodeI, neighbor: nodeC)\n        digraph.addEdge(nodeI, neighbor: nodeG)\n        digraph.addEdge(nodeI, neighbor: nodeH)\n        \n        let nodesExplored = depthFirstSearch(digraph, source: nodeA)\n        \n        XCTAssertEqual(nodesExplored, [\"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\", \"i\"])\n    }\n    \n    func testExploringDigraphWithASingleNode() {\n        let digraph = Graph()\n        let node = digraph.addNode(\"a\")\n        \n        let nodesExplored = depthFirstSearch(digraph, source: node)\n        \n        XCTAssertEqual(nodesExplored, [\"a\"])\n    }\n}\n"
  },
  {
    "path": "Depth-First Search/Tests/Graph.swift",
    "content": "// MARK: - Edge\n\nopen class Edge: Equatable {\n  open var neighbor: Node\n\n  public init(neighbor: Node) {\n    self.neighbor = neighbor\n  }\n}\n\npublic func == (lhs: Edge, rhs: Edge) -> Bool {\n  return lhs.neighbor == rhs.neighbor\n}\n\n// MARK: - Node\n\nopen class Node: CustomStringConvertible, Equatable {\n  open var neighbors: [Edge]\n\n  open fileprivate(set) var label: String\n  open var distance: Int?\n  open var visited: Bool\n\n  public init(label: String) {\n    self.label = label\n    neighbors = []\n    visited = false\n  }\n\n  open var description: String {\n    if let distance = distance {\n      return \"Node(label: \\(label), distance: \\(distance))\"\n    }\n    return \"Node(label: \\(label), distance: infinity)\"\n  }\n\n  open var hasDistance: Bool {\n    return distance != nil\n  }\n\n  open func remove(_ edge: Edge) {\n    neighbors.remove(at: neighbors.index { $0 === edge }!)\n  }\n}\n\npublic func == (lhs: Node, rhs: Node) -> Bool {\n  return lhs.label == rhs.label && lhs.neighbors == rhs.neighbors\n}\n\n// MARK: - Graph\n\nopen class Graph: CustomStringConvertible, Equatable {\n  open fileprivate(set) var nodes: [Node]\n\n  public init() {\n    self.nodes = []\n  }\n\n  open func addNode(_ label: String) -> Node {\n    let node = Node(label: label)\n    nodes.append(node)\n    return node\n  }\n\n  open func addEdge(_ source: Node, neighbor: Node) {\n    let edge = Edge(neighbor: neighbor)\n    source.neighbors.append(edge)\n  }\n\n  open var description: String {\n    var description = \"\"\n\n    for node in nodes {\n      if !node.neighbors.isEmpty {\n        description += \"[node: \\(node.label) edges: \\(node.neighbors.map { $0.neighbor.label})]\"\n      }\n    }\n    return description\n  }\n\n  open func findNodeWithLabel(_ label: String) -> Node {\n    return nodes.filter { $0.label == label }.first!\n  }\n\n  open func duplicate() -> Graph {\n    let duplicated = Graph()\n\n    for node in nodes {\n      _ = duplicated.addNode(node.label)\n    }\n\n    for node in nodes {\n      for edge in node.neighbors {\n        let source = duplicated.findNodeWithLabel(node.label)\n        let neighbour = duplicated.findNodeWithLabel(edge.neighbor.label)\n        duplicated.addEdge(source, neighbor: neighbour)\n      }\n    }\n\n    return duplicated\n  }\n}\n\npublic func == (lhs: Graph, rhs: Graph) -> Bool {\n  return lhs.nodes == rhs.nodes\n}\n"
  },
  {
    "path": "Depth-First Search/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Depth-First Search/Tests/Tests.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t83F9C96C1C8443E800B3A87F /* DepthFirstSearchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83F9C96B1C8443E800B3A87F /* DepthFirstSearchTests.swift */; };\n\t\t83F9C9721C84449D00B3A87F /* Graph.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83F9C96E1C84449D00B3A87F /* Graph.swift */; };\n\t\tFFC6E11E1C8656D10046BA79 /* DepthFirstSearch.swift in Sources */ = {isa = PBXBuildFile; fileRef = FFC6E11D1C8656D10046BA79 /* DepthFirstSearch.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t7B2BBC801C779D720067B71D /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7B2BBC941C779E7B0067B71D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };\n\t\t83F9C96B1C8443E800B3A87F /* DepthFirstSearchTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DepthFirstSearchTests.swift; sourceTree = SOURCE_ROOT; };\n\t\t83F9C96E1C84449D00B3A87F /* Graph.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Graph.swift; sourceTree = SOURCE_ROOT; };\n\t\tFFC6E11D1C8656D10046BA79 /* DepthFirstSearch.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DepthFirstSearch.swift; path = ../DepthFirstSearch.swift; sourceTree = SOURCE_ROOT; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t7B2BBC7D1C779D720067B71D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t7B2BBC681C779D710067B71D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC831C779D720067B71D /* Tests */,\n\t\t\t\t7B2BBC721C779D710067B71D /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC721C779D710067B71D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC801C779D720067B71D /* Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC831C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t83F9C96E1C84449D00B3A87F /* Graph.swift */,\n\t\t\t\t83F9C96B1C8443E800B3A87F /* DepthFirstSearchTests.swift */,\n\t\t\t\tFFC6E11D1C8656D10046BA79 /* DepthFirstSearch.swift */,\n\t\t\t\t7B2BBC941C779E7B0067B71D /* Info.plist */,\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tpath = TestsTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t7B2BBC7F1C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t7B2BBC7C1C779D720067B71D /* Sources */,\n\t\t\t\t7B2BBC7D1C779D720067B71D /* Frameworks */,\n\t\t\t\t7B2BBC7E1C779D720067B71D /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tproductName = TestsTests;\n\t\t\tproductReference = 7B2BBC801C779D720067B71D /* Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t7B2BBC691C779D710067B71D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0720;\n\t\t\t\tLastUpgradeCheck = 0820;\n\t\t\t\tORGANIZATIONNAME = \"Swift Algorithm Club\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t7B2BBC7F1C779D720067B71D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2;\n\t\t\t\t\t\tLastSwiftMigration = 0820;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 7B2BBC681C779D710067B71D;\n\t\t\tproductRefGroup = 7B2BBC721C779D710067B71D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t7B2BBC7F1C779D720067B71D /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t7B2BBC7E1C779D720067B71D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t7B2BBC7C1C779D720067B71D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t83F9C9721C84449D00B3A87F /* Graph.swift in Sources */,\n\t\t\t\tFFC6E11E1C8656D10046BA79 /* DepthFirstSearch.swift in Sources */,\n\t\t\t\t83F9C96C1C8443E800B3A87F /* DepthFirstSearchTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t7B2BBC871C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC881C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t7B2BBC8D1C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC8E1C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC871C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC881C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC8D1C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC8E1C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 7B2BBC691C779D710067B71D /* Project object */;\n}\n"
  },
  {
    "path": "Depth-First Search/Tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Depth-First Search/Tests/Tests.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Depth-First Search/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0820\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Deque/Deque-Optimized.swift",
    "content": "/*\n  Deque (pronounced \"deck\"), a double-ended queue\n\n  All enqueuing and dequeuing operations are O(1).\n*/\npublic struct Deque<T> {\n  private var array: [T?]\n  private var head: Int\n  private var capacity: Int\n  private let originalCapacity: Int\n\n  public init(_ capacity: Int = 10) {\n    self.capacity = max(capacity, 1)\n    originalCapacity = self.capacity\n    array = [T?](repeating: nil, count: capacity)\n    head = capacity\n  }\n\n  public var isEmpty: Bool {\n    return count == 0\n  }\n\n  public var count: Int {\n    return array.count - head\n  }\n\n  public mutating func enqueue(_ element: T) {\n    array.append(element)\n  }\n\n  public mutating func enqueueFront(_ element: T) {\n    if head == 0 {\n      capacity *= 2\n      let emptySpace = [T?](repeating: nil, count: capacity)\n      array.insert(contentsOf: emptySpace, at: 0)\n      head = capacity\n    }\n\n    head -= 1\n    array[head] = element\n  }\n\n  public mutating func dequeue() -> T? {\n    guard head < array.count, let element = array[head] else { return nil }\n\n    array[head] = nil\n    head += 1\n\n    if capacity >= originalCapacity && head >= capacity*2 {\n      let amountToRemove = capacity + capacity/2\n      array.removeFirst(amountToRemove)\n      head -= amountToRemove\n      capacity /= 2\n    }\n    return element\n  }\n\n  public mutating func dequeueBack() -> T? {\n    if isEmpty {\n      return nil\n    } else {\n      return array.removeLast()\n    }\n  }\n\n  public func peekFront() -> T? {\n    if isEmpty {\n      return nil\n    } else {\n      return array[head]\n    }\n  }\n\n  public func peekBack() -> T? {\n    if isEmpty {\n      return nil\n    } else {\n      return array.last!\n    }\n  }\n}\n"
  },
  {
    "path": "Deque/Deque-Simple.swift",
    "content": "/*\n  Deque (pronounced \"deck\"), a double-ended queue\n\n  This particular implementation is simple but not very efficient. Several\n  operations are O(n). A more efficient implementation would use a doubly\n  linked list or a circular buffer.\n*/\npublic struct Deque<T> {\n  private var array = [T]()\n\n  public var isEmpty: Bool {\n    return array.isEmpty\n  }\n\n  public var count: Int {\n    return array.count\n  }\n\n  public mutating func enqueue(_ element: T) {\n    array.append(element)\n  }\n\n  public mutating func enqueueFront(_ element: T) {\n    array.insert(element, at: 0)\n  }\n\n  public mutating func dequeue() -> T? {\n    if isEmpty {\n      return nil\n    } else {\n      return array.removeFirst()\n    }\n  }\n\n  public mutating func dequeueBack() -> T? {\n    if isEmpty {\n      return nil\n    } else {\n      return array.removeLast()\n    }\n  }\n\n  public func peekFront() -> T? {\n    return array.first\n  }\n\n  public func peekBack() -> T? {\n    return array.last\n  }\n}\n"
  },
  {
    "path": "Deque/Deque.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\npublic struct Deque<T> {\n  private var array = [T]()\n\n  public var isEmpty: Bool {\n    return array.isEmpty\n  }\n\n  public var count: Int {\n    return array.count\n  }\n\n  public mutating func enqueue(_ element: T) {\n    array.append(element)\n  }\n\n  public mutating func enqueueFront(_ element: T) {\n    array.insert(element, at: 0)\n  }\n\n  public mutating func dequeue() -> T? {\n    if isEmpty {\n      return nil\n    } else {\n      return array.removeFirst()\n    }\n  }\n\n  public mutating func dequeueBack() -> T? {\n    if isEmpty {\n      return nil\n    } else {\n      return array.removeLast()\n    }\n  }\n\n  public func peekFront() -> T? {\n    return array.first\n  }\n\n  public func peekBack() -> T? {\n    return array.last\n  }\n}\n\nvar deque = Deque<Int>()\ndeque.enqueue(1)\ndeque.enqueue(2)\ndeque.enqueue(3)\ndeque.enqueue(4)\n\ndeque.dequeue()       // 1\ndeque.dequeueBack()   // 4\n\ndeque.enqueueFront(5)\ndeque.dequeue()       // 5\n"
  },
  {
    "path": "Deque/Deque.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Deque/Deque.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Deque/README.markdown",
    "content": "# Deque\n\nA double-ended queue. For some reason this is pronounced as \"deck\".\n\nA regular [queue](../Queue/) adds elements to the back and removes from the front. The deque also allows enqueuing at the front and dequeuing from the back, and peeking at both ends.\n\nHere is a very basic implementation of a deque in Swift:\n\n```swift\npublic struct Deque<T> {\n  private var array = [T]()\n\n  public var isEmpty: Bool {\n    return array.isEmpty\n  }\n\n  public var count: Int {\n    return array.count\n  }\n\n  public mutating func enqueue(_ element: T) {\n    array.append(element)\n  }\n\n  public mutating func enqueueFront(_ element: T) {\n    array.insert(element, at: 0)\n  }\n\n  public mutating func dequeue() -> T? {\n    if isEmpty {\n      return nil\n    } else {\n      return array.removeFirst()\n    }\n  }\n\n  public mutating func dequeueBack() -> T? {\n    if isEmpty {\n      return nil\n    } else {\n      return array.removeLast()\n    }\n  }\n\n  public func peekFront() -> T? {\n    return array.first\n  }\n\n  public func peekBack() -> T? {\n    return array.last\n  }\n}\n```\n\nThis uses an array internally. Enqueuing and dequeuing are simply a matter of adding and removing items from the front or back of the array.\n\nAn example of how to use it in a playground:\n\n```swift\nvar deque = Deque<Int>()\ndeque.enqueue(1)\ndeque.enqueue(2)\ndeque.enqueue(3)\ndeque.enqueue(4)\n\ndeque.dequeue()       // 1\ndeque.dequeueBack()   // 4\n\ndeque.enqueueFront(5)\ndeque.dequeue()       // 5\n```\n\nThis particular implementation of `Deque` is simple but not very efficient. Several operations are **O(n)**, notably `enqueueFront()` and `dequeue()`. I've included it only to show the principle of what a deque does.\n\n## A more efficient version\n\nThe reason that `dequeue()` and `enqueueFront()` are **O(n)** is that they work on the front of the array. If you remove an element at the front of an array, what happens is that all the remaining elements need to be shifted in memory.\n\nLet's say the deque's array contains the following items:\n\n\t[ 1, 2, 3, 4 ]\n\nThen `dequeue()` will remove `1` from the array and the elements `2`, `3`, and `4`, are shifted one position to the front:\n\n\t[ 2, 3, 4 ]\n\nThis is an **O(n)** operation because all array elements need to be moved by one position in the computer's memory.\n\nLikewise, inserting an element at the front of the array is expensive because it requires that all other elements must be shifted one position to the back. So `enqueueFront(5)` will change the array to be:\n\n\t[ 5, 2, 3, 4 ]\n\nFirst, the elements `2`, `3`, and `4` are moved up by one position in the computer's memory, and then the new element `5` is inserted at the position where `2` used to be.\n\nWhy is this not an issue at for `enqueue()` and `dequeueBack()`? Well, these operations are performed at the end of the array. The way resizable arrays are implemented in Swift is by reserving a certain amount of free space at the back.\n\nOur initial array `[ 1, 2, 3, 4]` actually looks like this in memory:\n\n\t[ 1, 2, 3, 4, x, x, x ]\n\nwhere the `x`s denote additional positions in the array that are not being used yet. Calling `enqueue(6)` simply copies the new item into the next unused spot:\n\n\t[ 1, 2, 3, 4, 6, x, x ]\n\nThe `dequeueBack()` function uses `array.removeLast()` to delete that item. This does not shrink the array's memory but only decrements `array.count` by one. There are no expensive memory copies involved here. So operations at the back of the array are fast, **O(1)**.\n\nIt is possible the array runs out of free spots at the back. In that case, Swift will allocate a new, larger array and copy over all the data. This is an **O(n)** operation but because it only happens once in a while, adding new elements at the end of an array is still **O(1)** on average.\n\nOf course, we can use this same trick at the *beginning* of the array. That will make our deque efficient too for operations at the front of the queue. Our array will look like this:\n\n\t[ x, x, x, 1, 2, 3, 4, x, x, x ]\n\nThere is now also a chunk of free space at the start of the array, which allows adding or removing elements at the front of the queue to be **O(1)** as well.\n\nHere is the new version of `Deque`:\n\n```swift\npublic struct Deque<T> {\n  private var array: [T?]\n  private var head: Int\n  private var capacity: Int\n  private let originalCapacity:Int\n\n  public init(_ capacity: Int = 10) {\n    self.capacity = max(capacity, 1)\n    originalCapacity = self.capacity\n    array = [T?](repeating: nil, count: capacity)\n    head = capacity\n  }\n\n  public var isEmpty: Bool {\n    return count == 0\n  }\n\n  public var count: Int {\n    return array.count - head\n  }\n\n  public mutating func enqueue(_ element: T) {\n    array.append(element)\n  }\n\n  public mutating func enqueueFront(_ element: T) {\n    // this is explained below\n  }\n\n  public mutating func dequeue() -> T? {\n    // this is explained below\n  }\n\n  public mutating func dequeueBack() -> T? {\n    if isEmpty {\n      return nil\n    } else {\n      return array.removeLast()\n    }\n  }\n\n  public func peekFront() -> T? {\n    if isEmpty {\n      return nil\n    } else {\n      return array[head]\n    }\n  }\n\n  public func peekBack() -> T? {\n    if isEmpty {\n      return nil\n    } else {\n      return array.last!\n    }\n  }  \n}\n```\n\nIt still largely looks the same -- `enqueue()` and `dequeueBack()` haven't changed -- but there are also a few important differences. The array now stores objects of type `T?` instead of just `T` because we need some way to mark array elements as being empty.\n\nThe `init` method allocates a new array that contains a certain number of `nil` values. This is the free room we have to work with at the beginning of the array. By default this creates 10 empty spots.\n\nThe `head` variable is the index in the array of the front-most object. Since the queue is currently empty, `head` points at an index beyond the end of the array.\n\n\t[ x, x, x, x, x, x, x, x, x, x ]\n\t                                 |\n\t                                 head\n\nTo enqueue an object at the front, we move `head` one position to the left and then copy the new object into the array at index `head`. For example, `enqueueFront(5)` gives:\n\n\t[ x, x, x, x, x, x, x, x, x, 5 ]\n\t                             |\n\t                             head\n\nFollowed by `enqueueFront(7)`:\n\n\t[ x, x, x, x, x, x, x, x, 7, 5 ]\n\t                          |\n\t                          head\n\nAnd so on... the `head` keeps moving to the left and always points at the first item in the queue. `enqueueFront()` is now **O(1)** because it only involves copying a value into the array, a constant-time operation.\n\nHere is the code:\n\n```swift\n  public mutating func enqueueFront(element: T) {\n    head -= 1\n    array[head] = element\n  }\n```\n\nAppending to the back of the queue has not changed (it's the exact same code as before). For example, `enqueue(1)` gives:\n\n\t[ x, x, x, x, x, x, x, x, 7, 5, 1, x, x, x, x, x, x, x, x, x ]\n\t                          |\n\t                          head\n\nNotice how the array has resized itself. There was no room to add the `1`, so Swift decided to make the array larger and add a number of empty spots to the end. If you enqueue another object, it gets added to the next empty spot in the back. For example, `enqueue(2)`:\n\n\t[ x, x, x, x, x, x, x, x, 7, 5, 1, 2, x, x, x, x, x, x, x, x ]\n\t                          |\n\t                          head\n\n> **Note:** You won't see those empty spots at the back of the array when you `print(deque.array)`. This is because Swift hides them from you. Only the ones at the front of the array show up.\n\nThe `dequeue()` method does the opposite of `enqueueFront()`, it reads the value at `head`, sets the array element back to `nil`, and then moves `head` one position to the right:\n\n```swift\n  public mutating func dequeue() -> T? {\n    guard head < array.count, let element = array[head] else { return nil }\n\n    array[head] = nil\n    head += 1\n\n    return element\n  }\n```\n\nThere is one tiny problem... If you enqueue a lot of objects at the front, you're going to run out of empty spots at the front at some point. When this happens at the back of the array, Swift automatically resizes it. But at the front of the array we have to handle this situation ourselves, with some extra logic in `enqueueFront()`:\n\n```swift\n  public mutating func enqueueFront(element: T) {\n    if head == 0 {\n      capacity *= 2\n      let emptySpace = [T?](repeating: nil, count: capacity)\n      array.insert(contentsOf: emptySpace, at: 0)\n      head = capacity\n    }\n\n    head -= 1\n    array[head] = element\n  }\n```\n\nIf `head` equals 0, there is no room left at the front. When that happens, we add a whole bunch of new `nil` elements to the array. This is an **O(n)** operation but since this cost gets divided over all the `enqueueFront()`s, each individual call to `enqueueFront()` is still **O(1)** on average.\n\n> **Note:** We also multiply the capacity by 2 each time this happens, so if your queue grows bigger and bigger, the resizing happens less often. This is also what Swift arrays automatically do at the back.\n\nWe have to do something similar for `dequeue()`. If you mostly enqueue a lot of elements at the back and mostly dequeue from the front, then you may end up with an array that looks as follows:\n\n\t[ x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, 1, 2, 3 ]\n\t                                                              |\n\t                                                              head\n\nThose empty spots at the front only get used when you call `enqueueFront()`. But if enqueuing objects at the front happens only rarely, this leaves a lot of wasted space. So let's add some code to `dequeue()` to clean this up:\n\n```swift\n  public mutating func dequeue() -> T? {\n    guard head < array.count, let element = array[head] else { return nil }\n\n    array[head] = nil\n    head += 1\n\n    if capacity >= originalCapacity && head >= capacity*2 {\n      let amountToRemove = capacity + capacity/2\n      array.removeFirst(amountToRemove)\n      head -= amountToRemove\n      capacity /= 2\n    }\n    return element\n  }\n```\n\nRecall that `capacity` is the original number of empty places at the front of the queue. If the `head` has advanced more to the right than twice the capacity, then it's time to trim off a bunch of these empty spots. We reduce it to about 25%.\n\n> **Note:**  The deque will keep at least its original capacity by comparing `capacity` to `originalCapacity`.\n\nFor example, this:\n\n\t[ x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, x, 1, 2, 3 ]\n\t                                |                             |\n\t                                capacity                      head\n\nbecomes after trimming:\n\n\t[ x, x, x, x, x, 1, 2, 3 ]\n\t                 |\n\t                 head\n\t                 capacity\n\nThis way we can strike a balance between fast enqueuing and dequeuing at the front and keeping the memory requirements reasonable.\n\n> **Note:** We don't perform trimming on very small arrays. It's not worth it for saving just a few bytes of memory.\n\n## See also\n\nOther ways to implement deque are by using a [doubly linked list](../Linked%20List/), a [circular buffer](../Ring%20Buffer/), or two [stacks](../Stack/) facing opposite directions.\n\n[A fully-featured deque implementation in Swift](https://github.com/lorentey/Deque)\n\n*Written for Swift Algorithm Club by Matthijs Hollemans*\n"
  },
  {
    "path": "Dijkstra Algorithm/Dijkstra.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\nimport Foundation\n\nvar vertices: Set<Vertex> = Set()\n\nfunc createNotConnectedVertices() {\n    //change this value to increase or decrease amount of vertices in the graph\n    let numberOfVerticesInGraph = 15\n    for i in 0..<numberOfVerticesInGraph {\n        let vertex = Vertex(identifier: \"\\(i)\")\n        vertices.insert(vertex)\n    }\n}\n\nfunc setupConnections() {\n    for vertex in vertices {\n        //the amount of edges each vertex can have\n        let randomEdgesCount = arc4random_uniform(4) + 1\n        for _ in 0..<randomEdgesCount {\n            //randomize weight value from 0 to 9\n            let randomWeight = Double(arc4random_uniform(10))\n            let neighborVertex = randomVertex(except: vertex)\n\n            //we need this check to set only one connection between two equal pairs of vertices\n            if vertex.neighbors.contains(where: { $0.0 == neighborVertex }) {\n                continue\n            }\n            //creating neighbors and setting them\n            let neighbor1 = (neighborVertex, randomWeight)\n            let neighbor2 = (vertex, randomWeight)\n            vertex.neighbors.append(neighbor1)\n            neighborVertex.neighbors.append(neighbor2)\n        }\n    }\n}\n\nfunc randomVertex(except vertex: Vertex) -> Vertex {\n    var newSet = vertices\n    newSet.remove(vertex)\n    let offset = Int(arc4random_uniform(UInt32(newSet.count)))\n    let index = newSet.index(newSet.startIndex, offsetBy: offset)\n    return newSet[index]\n}\n\nfunc randomVertex() -> Vertex {\n    let offset = Int(arc4random_uniform(UInt32(vertices.count)))\n    let index = vertices.index(vertices.startIndex, offsetBy: offset)\n    return vertices[index]\n}\n\n//initialize random graph\ncreateNotConnectedVertices()\nsetupConnections()\n\n//initialize Dijkstra algorithm with graph vertices\nlet dijkstra = Dijkstra(vertices: vertices)\n\n//decide which vertex will be the starting one\nlet startVertex = randomVertex()\n\nlet startTime = Date()\n\n//ask algorithm to find shortest paths from start vertex to all others\ndijkstra.findShortestPaths(from: startVertex)\n\nlet endTime = Date()\n\nprint(\"calculation time is = \\((endTime.timeIntervalSince(startTime))) sec\")\n\n//printing results\nlet destinationVertex = randomVertex(except: startVertex)\nprint(destinationVertex.pathLengthFromStart)\nvar pathVerticesFromStartString: [String] = []\nfor vertex in destinationVertex.pathVerticesFromStart {\n    pathVerticesFromStartString.append(vertex.identifier)\n}\n\nprint(pathVerticesFromStartString.joined(separator: \"->\"))\n\n\n"
  },
  {
    "path": "Dijkstra Algorithm/Dijkstra.playground/Sources/Dijkstra.swift",
    "content": "import Foundation\n\npublic class Dijkstra {\n    private var totalVertices: Set<Vertex>\n\n    public init(vertices: Set<Vertex>) {\n        totalVertices = vertices\n    }\n\n    private func clearCache() {\n        totalVertices.forEach { $0.clearCache() }\n    }\n\n    public func findShortestPaths(from startVertex: Vertex) {\n        clearCache()\n        var currentVertices = self.totalVertices\n        startVertex.pathLengthFromStart = 0\n        startVertex.pathVerticesFromStart.append(startVertex)\n        var currentVertex: Vertex? = startVertex\n        while let vertex = currentVertex {\n            currentVertices.remove(vertex)\n            let filteredNeighbors = vertex.neighbors.filter { currentVertices.contains($0.0) }\n            for neighbor in filteredNeighbors {\n                let neighborVertex = neighbor.0\n                let weight = neighbor.1\n\n                let theoreticNewWeight = vertex.pathLengthFromStart + weight\n                if theoreticNewWeight < neighborVertex.pathLengthFromStart {\n                    neighborVertex.pathLengthFromStart = theoreticNewWeight\n                    neighborVertex.pathVerticesFromStart = vertex.pathVerticesFromStart\n                    neighborVertex.pathVerticesFromStart.append(neighborVertex)\n                }\n            }\n            if currentVertices.isEmpty {\n                currentVertex = nil\n                break\n            }\n            currentVertex = currentVertices.min { $0.pathLengthFromStart < $1.pathLengthFromStart }\n        }\n    }\n}\n"
  },
  {
    "path": "Dijkstra Algorithm/Dijkstra.playground/Sources/Vertex.swift",
    "content": "import Foundation\n\nopen class Vertex {\n\n    open var identifier: String\n    open var neighbors: [(Vertex, Double)] = []\n    open var pathLengthFromStart = Double.infinity\n    open var pathVerticesFromStart: [Vertex] = []\n\n    public init(identifier: String) {\n        self.identifier = identifier\n    }\n\n    open func clearCache() {\n        pathLengthFromStart = Double.infinity\n        pathVerticesFromStart = []\n    }\n}\n\nextension Vertex: Hashable {\n    open var hashValue: Int {\n        return identifier.hashValue\n    }\n}\n\nextension Vertex: Equatable {\n    public static func ==(lhs: Vertex, rhs: Vertex) -> Bool {\n        return lhs.hashValue == rhs.hashValue\n    }\n}\n"
  },
  {
    "path": "Dijkstra Algorithm/Dijkstra.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Dijkstra Algorithm/Dijkstra.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Dijkstra Algorithm/Dijkstra.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Dijkstra Algorithm/README.md",
    "content": "# Weighted graph general concepts\n\nEvery weighted graph should contain:\n1. Vertices/Nodes (I will use \"vertex\" in this readme).\n\n<img src=\"Images/Vertices.png\" height=\"250\" />\n\n2. Edges connecting vertices. Let's add some edges to our graph. For simplicity let's create directed graph for now. Directed means that edge has a direction, i.e. vertex, where it starts and vertex, where it ends. But remember a VERY IMPORTANT thing:\n    * All undirected graphs can be viewed as a directed graph.\n    * A directed graph is undirected if and only if every edge is paired with an edge going in the opposite direction.\n\n<img src=\"Images/DirectedGraph.png\" height=\"250\" />\n\n3. Weights for every edge.\n\n<img src=\"Images/WeightedDirectedGraph.png\" height=\"250\" />\n\nFinal result.\nDirected weighted graph:\n\n<img src=\"Images/WeightedDirectedGraphFinal.png\" height=\"250\" />\n\nUndirected weighted graph:\n\n<img src=\"Images/WeightedUndirectedGraph.png\" height=\"250\" />\n\nAnd once again: An undirected graph it is a directed graph with every edge paired with an edge going in the opposite direction. This statement is clear on the image above.\n\nGreat! Now we are familiar with general concepts about graphs.\n\n# The Dijkstra's algorithm\nThis [algorithm](https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm) was invented in 1956 by Edsger W. Dijkstra.\n\nIt can be used when you have one source vertex and want to find the shortest paths to ALL other vertices in the graph.\n\nThe best example is a road network. If you want to find the shortest path from your house to your job or if you want to find the closest store to your house then it is time for the Dijkstra's algorithm.\n\nThe algorithm repeats following cycle until all vertices are marked as visited.\nCycle:\n1. From the non-visited vertices the algorithm picks a vertex with the shortest path length from the start (if there are more than one vertex with the same shortest path value then algorithm picks any of them)\n2. The algorithm marks picked vertex as visited.\n3. The algorithm checks all of its neighbours. If the current vertex path length from the start plus an edge weight to a neighbour less than the neighbour current path length from the start than it assigns new path length from the start to the neighbour.\nWhen all vertices are marked as visited, the algorithm's job is done. Now, you can see the shortest path from the start for every vertex by pressing the one you are interested in.\n\nI have created **VisualizedDijkstra.playground** game/tutorial to improve your understanding of the algorithm's flow. Besides, below is step by step algorithm's description.\n\nA short sidenote. The Swift Algorithm Club also contains the A* algorithm, which essentially is a faster version of Dijkstra's algorithm for which the only extra prerequisite is you have to know where the destination is located.\n\n## Example\nLet's imagine that you want to go to the shop. Your house is A vertex and there are 4 possible stores around your house. How to find the closest one/ones? Luckily, you have a graph that connects your house with all these stores. So, you know what to do :)\n\n### Initialisation\n\nWhen the algorithm starts to work initial graph looks like this:\n\n<img src=\"Images/image1.png\" height=\"250\" />\n\nThe table below represents graph state:\n\n|                           |  A  |  B  |  C  |  D  |  E  |\n|:------------------------- |:---:|:---:|:---:|:---:|:---:|\n| Visited                   |  F  |  F  |  F  |  F  |  F  |\n| Path Length From Start    | inf | inf | inf | inf | inf |\n| Path Vertices From Start  | [ ] | [ ] | [ ] | [ ] | [ ] |\n\n>inf is equal infinity which basically means that algorithm doesn't know how far away is this vertex from start one.\n\n>F states for False\n\n>T states for True\n\nTo initialize our graph we have to set source vertex path length from source vertex to 0 and append itself to path vertices from start.\n\n|                           |  A  |  B  |  C  |  D  |  E  |\n|:------------------------- |:---:|:---:|:---:|:---:|:---:|\n| Visited                   |  F  |  F  |  F  |  F  |  F  |\n| Path Length From Start    |  0  | inf | inf | inf | inf |\n| Path Vertices From Start  | [A] | [ ] | [ ] | [ ] | [ ] |\n\nGreat, now our graph is initialised and we can pass it to the Dijkstra's algorithm, let's start!\n\nLet's follow the algorithm's cycle and pick the first vertex which neighbours we want to check.\nAll our vertices are not visited but there is only one has the smallest path length from start. It is A. This vertex is the first one which neighbors we will check.\nFirst of all, set this vertex as visited.\n\nA.visited = true\n\n<img src=\"Images/image2.png\" height=\"250\" />\n\nAfter this step graph has this state:\n\n|                           |  A  |  B  |  C  |  D  |  E  |\n|:------------------------- |:---:|:---:|:---:|:---:|:---:|\n| Visited                   |  T  |  F  |  F  |  F  |  F  |\n| Path Length From Start    |  0  | inf | inf | inf | inf |\n| Path Vertices From Start  | [A] | [ ] | [ ] | [ ] | [ ] |\n\n### Step 1\n\nThen we check all of its neighbours.\nIf checking vertex path length from start + edge weight is smaller than neighbour's path length from start then we set neighbour's path length from start new value and append to its pathVerticesFromStart array new vertex: checkingVertex. Repeat this action for every vertex.\n\nfor clarity:\n```swift\nif (A.pathLengthFromStart + AB.weight) < B.pathLengthFromStart {\n    B.pathLengthFromStart = A.pathLengthFromStart + AB.weight\n    B.pathVerticesFromStart = A.pathVerticesFromStart\n    B.pathVerticesFromStart.append(B)\n}\n```\nAnd now our graph looks like this one:\n\n<img src=\"Images/image3.png\" height=\"250\" />\n\nAnd its state is here:\n\n|                           |     A      |     B      |     C      |     D      |     E      |\n|:------------------------- |:----------:|:----------:|:----------:|:----------:|:----------:|\n| Visited                   |     T      |     F      |     F      |     F      |     F      |\n| Path Length From Start    |     0      |     3      |    inf     |     1      |    inf     |\n| Path Vertices From Start  |    [A]     |   [A, B]   |    [ ]     |   [A, D]   |    [ ]     |\n\n### Step 2\n\nFrom now we repeat all actions again and fill our table with new info!\n\n<img src=\"Images/image4.png\" height=\"250\" />\n\n|                           |     A      |     B      |     C      |     D      |     E      |\n|:------------------------- |:----------:|:----------:|:----------:|:----------:|:----------:|\n| Visited                   |     T      |     F      |     F      |     T      |     F      |\n| Path Length From Start    |     0      |     3      |    inf     |     1      |     2      |\n| Path Vertices From Start  |    [A]     |   [A, B]   |    [ ]     |   [A, D]   | [A, D, E]  |\n\n### Step 3\n\n<img src=\"Images/image5.png\" height=\"250\" />\n\n|                           |     A      |     B      |     C      |     D      |     E      |\n|:------------------------- |:----------:|:----------:|:----------:|:----------:|:----------:|\n| Visited                   |     T      |     F      |     F      |     T      |     T      |\n| Path Length From Start    |     0      |     3      |     11     |     1      |     2      |\n| Path Vertices From Start  |    [A]     |   [A, B]   |[A, D, E, C]|   [A, D]   | [A, D, E ] |\n\n### Step 4\n\n<img src=\"Images/image6.png\" height=\"250\" />\n\n|                           |     A      |     B      |     C      |     D      |     E      |\n|:------------------------- |:----------:|:----------:|:----------:|:----------:|:----------:|\n| Visited                   |     T      |     T      |     F      |     T      |     T      |\n| Path Length From Start    |     0      |     3      |     8      |     1      |     2      |\n| Path Vertices From Start  |    [A]     |   [A, B]   |   [A, B, C]|   [A, D]   | [A, D, E ] |\n\n### Step 5\n\n<img src=\"Images/image7.png\" height=\"250\" />\n\n|                           |     A      |     B      |     C      |     D      |     E      |\n|:------------------------- |:----------:|:----------:|:----------:|:----------:|:----------:|\n| Visited                   |     T      |     T      |     T      |     T      |     T      |\n| Path Length From Start    |     0      |     3      |     8      |     1      |     2      |\n| Path Vertices From Start  |    [A]     |   [A, B]   |   [A, B, C]|   [A, D]   | [A, D, E ] |\n\n\n## Code implementation\nFirst of all, let’s create class that will describe any Vertex in the graph.\nIt is pretty simple\n```swift\nopen class Vertex {\n\n    //Every vertex should be unique that's why we set up identifier\n    open var identifier: String\n\n    //For Dijkstra every vertex in the graph should be connected with at least one other vertex. But there can be some usecases\n    //when you firstly initialize all vertices without neighbours. And then on next iteration you set up their neighbours. So, initially neighbours is an empty array.\n    //Array contains tuples (Vertex, Double). Vertex is a neighbour and Double is as edge weight to that neighbour.\n    open var neighbours: [(Vertex, Double)] = []\n\n    //As it was mentioned in the algorithm description, default path length from start for all vertices should be as much as possible.\n    //It is var because we will update it during the algorithm execution.\n    open var pathLengthFromStart = Double.infinity\n\n    //This array contains vertices which we need to go through to reach this vertex from starting one\n    //As with path length from start, we will change this array during the algorithm execution.\n    open var pathVerticesFromStart: [Vertex] = []\n\n    public init(identifier: String) {\n        self.identifier = identifier\n    }\n\n    //This function let us use the same array of vertices again and again to calculate paths with different starting vertex.\n    //When we will need to set new starting vertex and recalculate paths then we will simply clear graph vertices' cashes.\n    open func clearCache() {\n        pathLengthFromStart = Double.infinity\n        pathVerticesFromStart = []\n    }\n}\n```\n\nAs every vertex should be unique it is useful to make them Hashable and according Equatable. We use an identifier for this purposes.\n```swift\nextension Vertex: Hashable {\n    open var hashValue: Int {\n        return identifier.hashValue\n    }\n}\n\nextension Vertex: Equatable {\n    public static func ==(lhs: Vertex, rhs: Vertex) -> Bool {\n        return lhs.hashValue == rhs.hashValue\n    }\n}\n```\n\nWe've created a base for our algorithm. Now let's create a house :)\nDijkstra's realisation is really straightforward.\n```swift\npublic class Dijkstra {\n    //This is a storage for vertices in the graph.\n    //Assuming that our vertices are unique we can use Set instead of array. This approach will bring some benefits later.\n    private var totalVertices: Set<Vertex>\n\n    public init(vertices: Set<Vertex>) {\n        totalVertices = vertices\n    }\n\n    //Remember clearCache function in the Vertex class implementation?\n    //This is just a wrapper that cleans cache for all stored vertices.\n    private func clearCache() {\n        totalVertices.forEach { $0.clearCache() }\n    }\n\n    public func findShortestPaths(from startVertex: Vertex) {\n\t//Before we start searching the shortest path from startVertex,\n\t//we need to clear vertices cache just to be sure that out graph is clean.\n\t//Remember that every Vertex is a class and classes are passed by reference.\n\t//So whenever you change vertex outside of this class it will affect this vertex inside totalVertices Set\n        clearCache()\n\t//Now all our vertices have Double.infinity pathLengthFromStart and an empty pathVerticesFromStart array.\n\n\t//The next step in the algorithm is to set startVertex pathLengthFromStart and pathVerticesFromStart\n        startVertex.pathLengthFromStart = 0\n        startVertex.pathVerticesFromStart.append(startVertex)\n\n\t//Here starts the main part. We will use while loop to iterate through all vertices in the graph.\n\t//For this purpose we define currentVertex variable which we will change in the end of each while cycle.\n        var currentVertex: Vertex? = startVertex\n\n        while let vertex = currentVertex {\n\n    \t    //Next line of code is an implementation of setting vertex as visited.\n    \t    //As it has been said, we should check only unvisited vertices in the graph,\n\t    //So why don't just delete it from the set? This approach let us skip checking for *\"if !vertex.visited then\"*\n            totalVertices.remove(vertex)\n\n\t    //filteredNeighbours is an array that contains current vertex neighbours which aren't yet visited\n            let filteredNeighbours = vertex.neighbours.filter { totalVertices.contains($0.0) }\n\n\t    //Let's iterate through them\n            for neighbour in filteredNeighbours {\n\t\t//These variable are more representative, than neighbour.0 or neighbour.1\n                let neighbourVertex = neighbour.0\n                let weight = neighbour.1\n\n\t\t//Here we calculate new weight, that we can offer to neighbour.\n                let theoreticNewWeight = vertex.pathLengthFromStart + weight\n\n\t\t//If it is smaller than neighbour's current pathLengthFromStart\n\t\t//Then we perform this code\n                if theoreticNewWeight < neighbourVertex.pathLengthFromStart {\n\n\t\t    //set new pathLengthFromStart\n                    neighbourVertex.pathLengthFromStart = theoreticNewWeight\n\n\t\t    //set new pathVerticesFromStart\n                    neighbourVertex.pathVerticesFromStart = vertex.pathVerticesFromStart\n\n\t\t    //append current vertex to neighbour's pathVerticesFromStart\n                    neighbourVertex.pathVerticesFromStart.append(neighbourVertex)\n                }\n            }\n\n\t    //If totalVertices is empty, i.e. all vertices are visited\n\t    //Than break the loop\n            if totalVertices.isEmpty {\n                currentVertex = nil\n                break\n            }\n\n\t    //If loop is not broken, than pick next vertex for checkin from not visited.\n\t    //Next vertex pathLengthFromStart should be the smallest one.\n            currentVertex = totalVertices.min { $0.pathLengthFromStart < $1.pathLengthFromStart }\n        }\n    }\n}\n```\n\nThat's all! Now you can check this algorithm in the playground. On the main page there is a code for creating a random graph.\n\nAlso there is a **VisualizedDijkstra.playground**. Use it to figure out the algorithm's flow in real (slowed :)) time.\n\nIt is up to you how to implement some specific parts of the algorithm, you can use Array instead of Set, add _visited_ property to Vertex or you can create some local totalVertices Array/Set inside _func findShortestPaths(from startVertex: Vertex)_ to keep totalVertices Array/Set unchanged. This is a general explanation with one possible implementation :)\n\n# About this repository\n\nThis repository contains two playgrounds:\n* To understand how does this algorithm works, I created **VisualizedDijkstra.playground.** It works in auto and interactive modes. Moreover, there are play/pause/stop buttons.\n* If you need only realisation of the algorithm without visualisation then run **Dijkstra.playground.** It contains necessary classes and couple functions to create random graph for algorithm testing.\n\n# Demo video\n\nClick the link: [YouTube](https://youtu.be/PPESI7et0cQ)\n\n# Credits\n\nWWDC 2017 Scholarship Project (Rejected) created by [Taras Nikulin](https://github.com/crabman448)\n"
  },
  {
    "path": "Dijkstra Algorithm/VisualizedDijkstra.playground/Contents.swift",
    "content": "/*:\n ## Dijkstra's algorithm visualization\n This playground is about the [Dijkstra's algorithm](https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm).\n Plyground works in 2 modes:\n * Auto visualization\n * Interactive visualization\n\n */\nimport UIKit\nimport PlaygroundSupport\n\n/*:\n First of all, let's set up colors for our window and graph. The visited color will be applied to visited vertices. The checking color will be applied to an edge and an edge neighbor every time the algorithm is checking some vertex neighbors. And default colors are just initial colors for elements.\n */\nGraphColors.sharedInstance.visitedColor = #colorLiteral(red: 0, green: 0.5898008943, blue: 1, alpha: 1)\nGraphColors.sharedInstance.checkingColor = #colorLiteral(red: 0.9411764741, green: 0.4980392158, blue: 0.3529411852, alpha: 1)\nGraphColors.sharedInstance.defaultEdgeColor = #colorLiteral(red: 0.721568644, green: 0.8862745166, blue: 0.5921568871, alpha: 1)\nGraphColors.sharedInstance.defaultVertexColor = #colorLiteral(red: 0.721568644, green: 0.8862745166, blue: 0.5921568871, alpha: 1)\n\nGraphColors.sharedInstance.mainWindowBackgroundColor = #colorLiteral(red: 0.921431005, green: 0.9214526415, blue: 0.9214410186, alpha: 1)\nGraphColors.sharedInstance.topViewBackgroundColor = #colorLiteral(red: 1, green: 0.4932718873, blue: 0.4739984274, alpha: 1)\nGraphColors.sharedInstance.buttonsBackgroundColor = #colorLiteral(red: 0, green: 0.3285208941, blue: 0.5748849511, alpha: 1)\nGraphColors.sharedInstance.graphBackgroundColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)\n/*:\n Now, we need to create some graph. You can create graph with any vertices amount but I aware you from setting up too many, otherwise it will be hard to place all of them nicely on the screen. Also, you can change the animations' duration: slow down or speed up.\n */\nlet graph = Graph(verticesCount: 6)\ngraph.interactiveNeighborCheckAnimationDuration = 1.2\ngraph.visualizationNeighborCheckAnimationDuration = 1.2\n/*:\n Now, let's configure the graph's visual representation by passing the virtual graph to our window. For better perception open live view in full screen.\n */\nlet screenBounds = UIScreen.main.bounds\nlet frame = CGRect(x: 0, y: 0, width: screenBounds.width * 0.8, height: screenBounds.height * 0.8)\nlet window = Window(frame: frame)\nwindow.configure(graph: graph)\nPlaygroundPage.current.liveView = window\n/*:\n **Great!**\n\n Now we have graph on the screen. It is beautiful, isn't it? ;) Before the visualization starts, I recommend you to move vertices around the screen using you finger to be sure that all vertices and edges are properly visible.\n \n And a final step! Before you will see the visualization **(by pressing \"Visualization\" button),** please, read explanation of how the Dijkstra's algorithm works.\n\n Algorithm's flow:\n First of all, this program randomly decides which vertex will be the start one, then the program assigns a zero value to the start vertex path length from the start.\n\n Then the algorithm repeats following cycle until all vertices are marked as visited.\n Cycle:\n 1) From the non-visited vertices the algorithm picks a vertex with the shortest path length from the start (if there are more than one vertex with the same shortest path value, then algorithm picks any of them)\n 2) The algorithm marks picked vertex as visited.\n 3) The algorithm check all of its neighbors. If the current vertex path length from the start plus an edge weight to a neighbor less than the neighbor current path length from the start, than it assigns new path length from the start to the neihgbor.\n When all vertices are marked as visited, the algorithm's job is done. Now, you can see the shortest path from the start for every vertex by pressing the one you are interested in.\n \n Now, try yourself at the Dijkstra's algorithm. Press **\"Interactive\" button.** The program will mark the start vertex as visited and calculate new paths for its neighbors. You have to pick next vertex for the algorithm to check. If you are wrong, you will see a message on the screen.\n \n Good luck and have fun! ;)\n */\n"
  },
  {
    "path": "Dijkstra Algorithm/VisualizedDijkstra.playground/Sources/CustomUI/EdgeRepresentation.swift",
    "content": "import UIKit\n\npublic class EdgeRepresentation {\n    private var graphColors: GraphColors = GraphColors.sharedInstance\n\n    public private(set)var label: UILabel!\n    public private(set)var layer: MyShapeLayer!\n\n    public init(from vertex1: Vertex, to vertex2: Vertex, weight: Double) {\n        guard let vertex1View = vertex1.view, let vertex2View = vertex2.view else {\n            assertionFailure(\"passed vertices without configured views\")\n            return\n        }\n        let x1 = vertex1View.frame.origin.x\n        let y1 = vertex1View.frame.origin.y\n        let width1 = vertex1View.frame.width\n        let height1 = vertex1View.frame.height\n\n        let x2 = vertex2View.frame.origin.x\n        let y2 = vertex2View.frame.origin.y\n        let width2 = vertex2View.frame.width\n        let height2 = vertex2View.frame.height\n\n        var startPoint: CGPoint\n        var endPoint: CGPoint\n\n        if y1 == y2 {\n            if x1 < x2 {\n                startPoint = CGPoint(x: x1 + width1, y: y1 + height1 / 2)\n                endPoint = CGPoint(x: x2, y: y2 + height2 / 2)\n            } else {\n                startPoint = CGPoint(x: x1, y: y1 + height1 / 2)\n                endPoint = CGPoint(x: x2 + width2, y: y2 + height2 / 2)\n            }\n        } else {\n            startPoint = CGPoint(x: x1 + width1 / 2, y: y1 + height1)\n            endPoint = CGPoint(x: x2 + width2 / 2, y: y2)\n        }\n\n        let arcDiameter: CGFloat = 20\n        var circleOrigin: CGPoint!\n\n        if endPoint.x == startPoint.x {\n            startPoint.y -= 1\n            endPoint.y += 1\n            let x = startPoint.x - arcDiameter / 2\n            let y = startPoint.y + ((endPoint.y - startPoint.y) / 2 * 1.25 - arcDiameter / 2)\n            circleOrigin = CGPoint(x: x, y: y)\n        } else if endPoint.y == startPoint.y {\n            let x = startPoint.x + ((endPoint.x - startPoint.x) / 2 * 1.25 - arcDiameter / 2)\n            let y = startPoint.y + ((endPoint.y - startPoint.y) / 2 * 1.25 - arcDiameter / 2)\n            circleOrigin = CGPoint(x: x, y: y)\n        } else {\n            startPoint.x -= 1\n            endPoint.x += 1\n            startPoint.y -= 1\n            endPoint.y += 1\n            let x = startPoint.x + ((endPoint.x - startPoint.x) / 2 * 1.25 - arcDiameter / 2)\n            let y = startPoint.y + ((endPoint.y - startPoint.y) / 2 * 1.25 - arcDiameter / 2)\n            circleOrigin = CGPoint(x: x, y: y)\n        }\n\n\n        let path = UIBezierPath()\n        path.move(to: startPoint)\n        path.addLine(to: endPoint)\n\n        let label = UILabel(frame: CGRect(origin: circleOrigin, size: CGSize(width: arcDiameter, height: arcDiameter)))\n        label.textAlignment = .center\n        label.backgroundColor = graphColors.defaultEdgeColor\n        label.clipsToBounds = true\n        label.adjustsFontSizeToFitWidth = true\n        label.layer.cornerRadius = arcDiameter / 2\n        label.text = \"\"\n\n        let shapeLayer = MyShapeLayer()\n        shapeLayer.path = path.cgPath\n        shapeLayer.strokeColor = graphColors.defaultEdgeColor.cgColor\n        shapeLayer.fillColor = UIColor.clear.cgColor\n        shapeLayer.lineWidth = 2.0\n        shapeLayer.startPoint = startPoint\n        shapeLayer.endPoint = endPoint\n        shapeLayer.actions = [\"position\" : NSNull(), \"bounds\" : NSNull(), \"path\" : NSNull()]\n\n        self.layer = shapeLayer\n        self.label = label\n        self.label.text = \"\\(weight)\"\n    }\n\n    public func setCheckingColor() {\n        layer.strokeColor = graphColors.checkingColor.cgColor\n        label.backgroundColor = graphColors.checkingColor\n    }\n\n    public func setDefaultColor() {\n        layer.strokeColor = graphColors.defaultEdgeColor.cgColor\n        label.backgroundColor = graphColors.defaultEdgeColor\n    }\n\n    public func setText(text: String) {\n        label.text = text\n    }\n}\n\nextension EdgeRepresentation: Equatable {\n    public static func ==(lhs: EdgeRepresentation, rhs: EdgeRepresentation) -> Bool {\n        return lhs.label.hashValue == rhs.label.hashValue && lhs.layer.hashValue == rhs.layer.hashValue\n    }\n}\n"
  },
  {
    "path": "Dijkstra Algorithm/VisualizedDijkstra.playground/Sources/CustomUI/ErrorView.swift",
    "content": "import UIKit\n\npublic class ErrorView: UIView {\n    private var label: UILabel!\n\n    public override init(frame: CGRect) {\n        super.init(frame: frame)\n        commonInit()\n    }\n\n    public required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n\n    private func commonInit() {\n        backgroundColor = UIColor(red: 242/255, green: 156/255, blue: 84/255, alpha: 1)\n        layer.cornerRadius = 10\n\n        let labelFrame = CGRect(x: 10, y: 10, width: frame.width - 20, height: frame.height - 20)\n        label = UILabel(frame: labelFrame)\n        label.numberOfLines = 0\n        label.adjustsFontSizeToFitWidth = true\n        label.textAlignment = .center\n        label.textColor = UIColor.white\n        addSubview(label)\n    }\n\n    public func setText(text: String) {\n        label.text = text\n    }\n}\n"
  },
  {
    "path": "Dijkstra Algorithm/VisualizedDijkstra.playground/Sources/CustomUI/MyShapeLayer.swift",
    "content": "import UIKit\n\npublic class MyShapeLayer: CAShapeLayer {\n    public var startPoint: CGPoint?\n    public var endPoint: CGPoint?\n}\n"
  },
  {
    "path": "Dijkstra Algorithm/VisualizedDijkstra.playground/Sources/CustomUI/RoundedButton.swift",
    "content": "import UIKit\n\npublic class RoundedButton: UIButton {\n    private var graphColors: GraphColors = GraphColors.sharedInstance\n    \n    public override init(frame: CGRect) {\n        super.init(frame: frame)\n        commonInit()\n    }\n    \n    public required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n\n    private func commonInit() {\n        backgroundColor = graphColors.buttonsBackgroundColor\n        titleLabel?.adjustsFontSizeToFitWidth = true\n        layer.cornerRadius = 7\n    }\n}\n"
  },
  {
    "path": "Dijkstra Algorithm/VisualizedDijkstra.playground/Sources/CustomUI/VertexView.swift",
    "content": "import UIKit\n\npublic class VertexView: UIButton {\n\n    public var vertex: Vertex?\n    private var idLabel: UILabel!\n    private var pathLengthLabel: UILabel!\n    private var graphColors: GraphColors = GraphColors.sharedInstance\n\n    public required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n\n    public override init(frame: CGRect) {\n        precondition(frame.height == frame.width)\n        precondition(frame.height >= 30)\n        super.init(frame: frame)\n        backgroundColor = graphColors.defaultVertexColor\n        layer.cornerRadius = frame.width / 2\n        clipsToBounds = true\n        setupIdLabel()\n        setupPathLengthFromStartLabel()\n    }\n\n    private func setupIdLabel() {\n        let x: CGFloat = frame.width * 0.2\n        let y: CGFloat = 0\n        let width: CGFloat = frame.width * 0.6\n        let height: CGFloat = frame.height / 2\n        let idLabelFrame = CGRect(x: x, y: y, width: width, height: height)\n\n        idLabel = UILabel(frame: idLabelFrame)\n        idLabel.textAlignment = .center\n        idLabel.adjustsFontSizeToFitWidth = true\n        addSubview(idLabel)\n    }\n\n    private func setupPathLengthFromStartLabel() {\n        let x: CGFloat = frame.width * 0.2\n        let y: CGFloat = frame.height / 2\n        let width: CGFloat = frame.width * 0.6\n        let height: CGFloat = frame.height / 2\n        let pathLengthLabelFrame = CGRect(x: x, y: y, width: width, height: height)\n\n        pathLengthLabel = UILabel(frame: pathLengthLabelFrame)\n        pathLengthLabel.textAlignment = .center\n        pathLengthLabel.adjustsFontSizeToFitWidth = true\n        addSubview(pathLengthLabel)\n    }\n\n    public func setIdLabel(text: String) {\n        idLabel.text = text\n    }\n\n    public func setPathLengthLabel(text: String) {\n        pathLengthLabel.text = text\n    }\n\n    public func setLabelsTextColor(color: UIColor) {\n        idLabel.textColor = color\n        pathLengthLabel.textColor = color\n    }\n}\n"
  },
  {
    "path": "Dijkstra Algorithm/VisualizedDijkstra.playground/Sources/Graph.swift",
    "content": "import Foundation\nimport UIKit\n\npublic enum GraphState {\n    case initial\n    case autoVisualization\n    case interactiveVisualization\n    case parsing\n    case completed\n}\n\npublic class Graph {\n    private var verticesCount: UInt\n    private var _vertices: Set<Vertex> = Set()\n    public weak var delegate: GraphDelegate?\n    public var nextVertices: [Vertex] = []\n    public var state: GraphState = .initial\n    public var pauseVisualization = false\n    public var stopVisualization = false\n    public var startVertex: Vertex?\n    public var interactiveNeighborCheckAnimationDuration: Double = 1.8 {\n        didSet {\n            _interactiveOneSleepDuration = UInt32(interactiveNeighborCheckAnimationDuration * 1000000.0 / 3.0)\n        }\n    }\n    private var _interactiveOneSleepDuration: UInt32 = 600000\n\n    public var visualizationNeighborCheckAnimationDuration: Double = 2.25 {\n        didSet {\n            _visualizationOneSleepDuration = UInt32(visualizationNeighborCheckAnimationDuration * 1000000.0 / 3.0)\n        }\n    }\n    private var _visualizationOneSleepDuration: UInt32 = 750000\n\n    public var vertices: Set<Vertex> {\n        return _vertices\n    }\n\n    public init(verticesCount: UInt) {\n        self.verticesCount = verticesCount\n    }\n\n    public func removeGraph() {\n        _vertices.removeAll()\n        startVertex = nil\n    }\n\n    public func createNewGraph() {\n        guard _vertices.isEmpty, startVertex == nil else {\n            assertionFailure(\"Clear graph before creating new one\")\n            return\n        }\n        createNotConnectedVertices()\n        setupConnections()\n        let offset = Int(arc4random_uniform(UInt32(_vertices.count)))\n        let index = _vertices.index(_vertices.startIndex, offsetBy: offset)\n        startVertex =  _vertices[index]\n        setVertexLevels()\n    }\n    \n    private func clearCache() {\n        _vertices.forEach { $0.clearCache() }\n    }\n\n    public func reset() {\n        for vertex in _vertices {\n            vertex.clearCache()\n        }\n    }\n\n    private func createNotConnectedVertices() {\n        for i in 0..<verticesCount {\n            let vertex = Vertex(identifier: \"\\(i)\")\n            _vertices.insert(vertex)\n        }\n    }\n\n    private func setupConnections() {\n        for vertex in _vertices {\n            let randomEdgesCount = arc4random_uniform(4) + 1\n            for _ in 0..<randomEdgesCount {\n                let randomWeight = Double(arc4random_uniform(10))\n                let neighbor = randomVertex(except: vertex)\n                let edge1 = Edge(vertex: neighbor, weight: randomWeight)\n                if vertex.edges.contains(where: { $0.neighbor == neighbor }) {\n                    continue\n                }\n                let edge2 = Edge(vertex: vertex, weight: randomWeight)\n                vertex.edges.append(edge1)\n                neighbor.edges.append(edge2)\n            }\n        }\n    }\n\n    private func randomVertex(except vertex: Vertex) -> Vertex {\n        var newSet = _vertices\n        newSet.remove(vertex)\n        let offset = Int(arc4random_uniform(UInt32(newSet.count)))\n        let index = newSet.index(newSet.startIndex, offsetBy: offset)\n        return newSet[index]\n    }\n\n    private func setVertexLevels() {\n        _vertices.forEach { $0.clearLevelInfo() }\n        guard let startVertex = startVertex else {\n            assertionFailure()\n            return\n        }\n        var queue: [Vertex] = [startVertex]\n        startVertex.levelChecked = true\n\n        //BFS\n        while !queue.isEmpty {\n            let currentVertex = queue.first!\n            for edge in currentVertex.edges {\n                let neighbor = edge.neighbor\n                if !neighbor.levelChecked {\n                    neighbor.levelChecked = true\n                    neighbor.level = currentVertex.level + 1\n                    queue.append(neighbor)\n                }\n            }\n            queue.removeFirst()\n        }\n    }\n\n    public func findShortestPathsWithVisualization(completion: () -> Void) {\n        guard let startVertex = self.startVertex else {\n            assertionFailure(\"start vertex is nil\")\n            return\n        }\n        clearCache()\n        startVertex.pathLengthFromStart = 0\n        startVertex.pathVerticesFromStart.append(startVertex)\n        var currentVertex: Vertex? = startVertex\n\n        var totalVertices = _vertices\n\n        breakableLoop: while let vertex = currentVertex {\n            totalVertices.remove(vertex)\n            while pauseVisualization == true {\n                if stopVisualization == true {\n                    break breakableLoop\n                }\n            }\n            if stopVisualization == true {\n                break breakableLoop\n            }\n            DispatchQueue.main.async {\n                vertex.setVisitedColor()\n            }\n            usleep(750000)\n            vertex.visited = true\n            let filteredEdges = vertex.edges.filter { !$0.neighbor.visited }\n            for edge in filteredEdges {\n                let neighbor = edge.neighbor\n                let weight = edge.weight\n                let edgeRepresentation = edge.edgeRepresentation\n\n                while pauseVisualization == true {\n                    if stopVisualization == true {\n                        break breakableLoop\n                    }\n                }\n                if stopVisualization == true {\n                    break breakableLoop\n                }\n                DispatchQueue.main.async {\n                    edgeRepresentation?.setCheckingColor()\n                    neighbor.setCheckingPathColor()\n                    self.delegate?.willCompareVertices(startVertexPathLength: vertex.pathLengthFromStart,\n                                                       edgePathLength: weight,\n                                                       endVertexPathLength: neighbor.pathLengthFromStart)\n                }\n                usleep(_visualizationOneSleepDuration)\n\n\n                let theoreticNewWeight = vertex.pathLengthFromStart + weight\n\n                if theoreticNewWeight < neighbor.pathLengthFromStart {\n                    while pauseVisualization == true {\n                        if stopVisualization == true {\n                            break breakableLoop\n                        }\n                    }\n                    if stopVisualization == true {\n                        break breakableLoop\n                    }\n                    neighbor.pathLengthFromStart = theoreticNewWeight\n                    neighbor.pathVerticesFromStart = vertex.pathVerticesFromStart\n                    neighbor.pathVerticesFromStart.append(neighbor)\n                }\n                usleep(_visualizationOneSleepDuration)\n\n                DispatchQueue.main.async {\n                    self.delegate?.didFinishCompare()\n                    edge.edgeRepresentation?.setDefaultColor()\n                    edge.neighbor.setDefaultColor()\n                }\n                usleep(_visualizationOneSleepDuration)\n            }\n            if totalVertices.isEmpty {\n                currentVertex = nil\n                break\n            }\n            currentVertex = totalVertices.min { $0.pathLengthFromStart < $1.pathLengthFromStart }\n        }\n        if stopVisualization == true {\n            DispatchQueue.main.async {\n                self.delegate?.didStop()\n            }\n        } else {\n            completion()\n        }\n    }\n\n    public func parseNeighborsFor(vertex: Vertex, completion: @escaping () -> ()) {\n        DispatchQueue.main.async {\n            vertex.setVisitedColor()\n        }\n        DispatchQueue.global(qos: .background).async {\n            vertex.visited = true\n\n            let nonVisitedVertices = self._vertices.filter { $0.visited == false }\n            if nonVisitedVertices.isEmpty {\n                self.state = .completed\n                DispatchQueue.main.async {\n                    self.delegate?.didCompleteGraphParsing()\n                }\n                return\n            }\n\n            let filteredEdges = vertex.edges.filter { !$0.neighbor.visited }\n            breakableLoop: for edge in filteredEdges {\n                while self.pauseVisualization == true {\n                    if self.stopVisualization == true {\n                        break breakableLoop\n                    }\n                }\n                if self.stopVisualization == true {\n                    break breakableLoop\n                }\n                let weight = edge.weight\n                let neighbor = edge.neighbor\n\n                DispatchQueue.main.async {\n                    edge.neighbor.setCheckingPathColor()\n                    edge.edgeRepresentation?.setCheckingColor()\n                    self.delegate?.willCompareVertices(startVertexPathLength: vertex.pathLengthFromStart,\n                                                       edgePathLength: weight,\n                                                       endVertexPathLength: neighbor.pathLengthFromStart)\n                }\n                usleep(self._interactiveOneSleepDuration)\n                \n                let theoreticNewWeight = vertex.pathLengthFromStart + weight\n                if theoreticNewWeight < neighbor.pathLengthFromStart {\n                    while self.pauseVisualization == true {\n                        if self.stopVisualization == true {\n                            break breakableLoop\n                        }\n                    }\n                    if self.stopVisualization == true {\n                        break breakableLoop\n                    }\n                    neighbor.pathLengthFromStart = theoreticNewWeight\n                    neighbor.pathVerticesFromStart = vertex.pathVerticesFromStart\n                    neighbor.pathVerticesFromStart.append(neighbor)\n                }\n\n                usleep(self._interactiveOneSleepDuration)\n                while self.pauseVisualization == true {\n                    if self.stopVisualization == true {\n                        break breakableLoop\n                    }\n                }\n                if self.stopVisualization == true {\n                    break breakableLoop\n                }\n                DispatchQueue.main.async {\n                    self.delegate?.didFinishCompare()\n                    edge.neighbor.setDefaultColor()\n                    edge.edgeRepresentation?.setDefaultColor()\n                }\n                usleep(self._interactiveOneSleepDuration)\n            }\n            if self.stopVisualization == true {\n                DispatchQueue.main.async {\n                    self.delegate?.didStop()\n                }\n            } else {\n                let nextVertexPathLength = nonVisitedVertices.sorted { $0.pathLengthFromStart < $1.pathLengthFromStart }.first!.pathLengthFromStart\n                self.nextVertices = nonVisitedVertices.filter { $0.pathLengthFromStart == nextVertexPathLength }\n                completion()\n            }\n        }\n    }\n\n    public func didTapVertex(vertex: Vertex) {\n        if nextVertices.contains(vertex) {\n            delegate?.willStartVertexNeighborsChecking()\n            state = .parsing\n            parseNeighborsFor(vertex: vertex) {\n                self.state = .interactiveVisualization\n                self.delegate?.didFinishVertexNeighborsChecking()\n            }\n        } else {\n            self.delegate?.didTapWrongVertex()\n        }\n    }\n}\n"
  },
  {
    "path": "Dijkstra Algorithm/VisualizedDijkstra.playground/Sources/GraphColors.swift",
    "content": "import UIKit\n\npublic class GraphColors {\n    public static let sharedInstance: GraphColors = GraphColors()\n    private init() { }\n\n    public var mainWindowBackgroundColor: UIColor = #colorLiteral(red: 0.921431005, green: 0.9214526415, blue: 0.9214410186, alpha: 1)\n    public var topViewBackgroundColor: UIColor = #colorLiteral(red: 1, green: 0.4932718873, blue: 0.4739984274, alpha: 1)\n    public var graphBackgroundColor: UIColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)\n    public var defaultVertexColor: UIColor = #colorLiteral(red: 0.721568644, green: 0.8862745166, blue: 0.5921568871, alpha: 1)\n    public var defaultEdgeColor: UIColor = #colorLiteral(red: 0.721568644, green: 0.8862745166, blue: 0.5921568871, alpha: 1)\n    public var checkingColor: UIColor = #colorLiteral(red: 0.9411764741, green: 0.4980392158, blue: 0.3529411852, alpha: 1)\n    public var visitedColor: UIColor = #colorLiteral(red: 0, green: 0.5898008943, blue: 1, alpha: 1)\n    public var buttonsBackgroundColor: UIColor = #colorLiteral(red: 0, green: 0.3285208941, blue: 0.5748849511, alpha: 1)\n}\n"
  },
  {
    "path": "Dijkstra Algorithm/VisualizedDijkstra.playground/Sources/GraphView.swift",
    "content": "import UIKit\n\npublic class GraphView: UIView {\n    private var graph: Graph\n    private var panningView: VertexView? = nil\n    private var graphColors = GraphColors.sharedInstance\n\n    public init(frame: CGRect, graph: Graph) {\n        self.graph = graph\n        super.init(frame: frame)\n        backgroundColor = graphColors.graphBackgroundColor\n        layer.cornerRadius = 15\n    }\n    \n    public required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    \n    }\n\n    public func removeGraph() {\n        for vertex in graph.vertices {\n            if let view = vertex.view {\n                view.removeFromSuperview()\n                vertex.view = nil\n            }\n        }\n        for vertex in graph.vertices {\n            for edge in vertex.edges {\n                if let edgeRepresentation = edge.edgeRepresentation {\n                    edgeRepresentation.layer.removeFromSuperlayer()\n                    edgeRepresentation.label.removeFromSuperview()\n                    edge.edgeRepresentation = nil\n                }\n            }\n        }\n    }\n\n    public func createNewGraph() {\n        setupVertexViews()\n        setupEdgeRepresentations()\n        addGraph()\n    }\n\n    public func reset() {\n        for vertex in graph.vertices {\n            vertex.edges.forEach { $0.edgeRepresentation?.setDefaultColor() }\n            vertex.setDefaultColor()\n        }\n    }\n\n    private func addGraph() {\n        for vertex in graph.vertices {\n            for edge in vertex.edges {\n                if let edgeRepresentation = edge.edgeRepresentation {\n                    layer.addSublayer(edgeRepresentation.layer)\n                    addSubview(edgeRepresentation.label)\n                }\n            }\n        }\n        for vertex in graph.vertices {\n            if let view = vertex.view {\n                addSubview(view)\n            }\n        }\n    }\n\n    private func setupVertexViews() {\n        var level = 0\n        var buildViewQueue = [graph.startVertex!]\n        let itemWidth: CGFloat = 40\n        while !buildViewQueue.isEmpty {\n            let levelItemsCount = CGFloat(buildViewQueue.count)\n            let xStep = (frame.width - levelItemsCount * itemWidth) / (levelItemsCount + 1)\n            var previousVertexMaxX: CGFloat = 0.0\n            for vertex in buildViewQueue {\n                let x: CGFloat = previousVertexMaxX + xStep\n                let y: CGFloat = CGFloat(level * 100)\n                previousVertexMaxX = x + itemWidth\n                let frame = CGRect(x: x, y: y, width: itemWidth, height: itemWidth)\n                let vertexView = VertexView(frame: frame)\n                vertex.view = vertexView\n                vertexView.vertex = vertex\n                vertex.view?.setIdLabel(text: vertex.identifier)\n                vertex.view?.setPathLengthLabel(text: \"\\(vertex.pathLengthFromStart)\")\n                vertex.view?.addTarget(self, action: #selector(didTapVertex(sender:)), for: .touchUpInside)\n                let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePan(recognizer:)))\n                vertex.view?.addGestureRecognizer(panGesture)\n            }\n            level += 1\n            buildViewQueue = graph.vertices.filter { $0.level == level }\n        }\n    }\n\n    private var movingVertexInputEdges: [EdgeRepresentation] = []\n    private var movingVertexOutputEdges: [EdgeRepresentation] = []\n\n    @objc private func handlePan(recognizer: UIPanGestureRecognizer) {\n        guard let vertexView = recognizer.view as? VertexView, let vertex = vertexView.vertex else {\n            return\n        }\n        if panningView != nil {\n            if panningView != vertexView {\n                return\n            }\n        }\n\n        switch recognizer.state {\n        case .began:\n            let movingVertexViewFrame = vertexView.frame\n            let sizedVertexView = CGRect(x: movingVertexViewFrame.origin.x - 10,\n                                         y: movingVertexViewFrame.origin.y - 10,\n                                         width: movingVertexViewFrame.width + 20,\n                                         height: movingVertexViewFrame.height + 20)\n            vertex.edges.forEach { edge in\n                if let edgeRepresentation = edge.edgeRepresentation{\n                    if sizedVertexView.contains(edgeRepresentation.layer.startPoint!) {\n                        movingVertexOutputEdges.append(edgeRepresentation)\n                    } else {\n                        movingVertexInputEdges.append(edgeRepresentation)\n                    }\n                }\n            }\n            panningView = vertexView\n        case .changed:\n            if movingVertexOutputEdges.isEmpty && movingVertexInputEdges.isEmpty {\n                return\n            }\n            let translation = recognizer.translation(in: self)\n            if vertexView.frame.origin.x + translation.x <= 0\n                || vertexView.frame.origin.y + translation.y <= 0\n                || (vertexView.frame.origin.x + vertexView.frame.width + translation.x) >= frame.width\n                || (vertexView.frame.origin.y + vertexView.frame.height + translation.y) >= frame.height {\n                break\n            }\n            movingVertexInputEdges.forEach { edgeRepresentation in\n                let originalLabelCenter = edgeRepresentation.label.center\n                edgeRepresentation.label.center = CGPoint(x: originalLabelCenter.x + translation.x * 0.625,\n                                                          y: originalLabelCenter.y + translation.y * 0.625)\n\n                CATransaction.begin()\n                CATransaction.setValue(kCFBooleanTrue, forKey: kCATransactionDisableActions)\n                let newPath = path(fromEdgeRepresentation: edgeRepresentation, movingVertex: vertex, translation: translation, outPath: false)\n                edgeRepresentation.layer.path = newPath\n                CATransaction.commit()\n\n            }\n\n            movingVertexOutputEdges.forEach { edgeRepresentation in\n                let originalLabelCenter = edgeRepresentation.label.center\n                edgeRepresentation.label.center = CGPoint(x: originalLabelCenter.x + translation.x * 0.375,\n                                                          y: originalLabelCenter.y + translation.y * 0.375)\n\n                CATransaction.begin()\n                CATransaction.setValue(kCFBooleanTrue, forKey: kCATransactionDisableActions)\n                let newPath = path(fromEdgeRepresentation: edgeRepresentation, movingVertex: vertex, translation: translation, outPath: true)\n                edgeRepresentation.layer.path = newPath\n                CATransaction.commit()\n            }\n\n            vertexView.center = CGPoint(x: vertexView.center.x + translation.x,\n                                        y: vertexView.center.y + translation.y)\n            recognizer.setTranslation(CGPoint.zero, in: self)\n        case .ended:\n            movingVertexInputEdges = []\n            movingVertexOutputEdges = []\n            panningView = nil\n        default:\n            break\n        }\n    }\n\n    private func path(fromEdgeRepresentation edgeRepresentation: EdgeRepresentation, movingVertex: Vertex, translation: CGPoint, outPath: Bool) -> CGPath {\n        let bezier = UIBezierPath()\n\n        if outPath == true {\n            bezier.move(to: edgeRepresentation.layer.endPoint!)\n            let startPoint = CGPoint(x: edgeRepresentation.layer.startPoint!.x + translation.x,\n                                     y: edgeRepresentation.layer.startPoint!.y + translation.y)\n            edgeRepresentation.layer.startPoint = startPoint\n            bezier.addLine(to: startPoint)\n        } else {\n            bezier.move(to: edgeRepresentation.layer.startPoint!)\n            let endPoint = CGPoint(x: edgeRepresentation.layer.endPoint!.x + translation.x,\n                                   y: edgeRepresentation.layer.endPoint!.y + translation.y)\n            edgeRepresentation.layer.endPoint = endPoint\n            bezier.addLine(to: endPoint)\n        }\n        return bezier.cgPath\n    }\n\n    @objc private func didTapVertex(sender: AnyObject) {\n        DispatchQueue.main.async {\n            if self.graph.state == .completed {\n                for vertex in self.graph.vertices {\n                    vertex.edges.forEach { $0.edgeRepresentation?.setDefaultColor() }\n                    vertex.setVisitedColor()\n                }\n                if let vertexView = sender as? VertexView, let vertex = vertexView.vertex {\n                    for (index, pathVertex) in vertex.pathVerticesFromStart.enumerated() {\n                        pathVertex.setCheckingPathColor()\n                        if vertex.pathVerticesFromStart.count > index + 1 {\n                            let nextVertex = vertex.pathVerticesFromStart[index + 1]\n\n                            if let edge = pathVertex.edges.filter({ $0.neighbor == nextVertex }).first {\n                                edge.edgeRepresentation?.setCheckingColor()\n                            }\n                        }\n\n                    }\n                }\n            } else if self.graph.state == .interactiveVisualization {\n                if let vertexView = sender as? VertexView, let vertex = vertexView.vertex {\n                    if vertex.visited {\n                        return\n                    } else {\n                        self.graph.didTapVertex(vertex: vertex)\n                    }\n                }\n            }\n        }\n    }\n\n    private func setupEdgeRepresentations() {\n        var edgeQueue: [Vertex] = [graph.startVertex!]\n\n        //BFS\n        while !edgeQueue.isEmpty {\n            let currentVertex = edgeQueue.first!\n            currentVertex.haveAllEdges = true\n            for edge in currentVertex.edges {\n                let neighbor = edge.neighbor\n                let weight = edge.weight\n                if !neighbor.haveAllEdges {\n                    let edgeRepresentation = EdgeRepresentation(from: currentVertex, to: neighbor, weight: weight)\n                    edge.edgeRepresentation = edgeRepresentation\n                    let index = neighbor.edges.index(where: { $0.neighbor == currentVertex })!\n                    neighbor.edges[index].edgeRepresentation = edgeRepresentation\n                    edgeQueue.append(neighbor)\n                }\n            }\n            edgeQueue.removeFirst()\n        }\n    }\n}\n"
  },
  {
    "path": "Dijkstra Algorithm/VisualizedDijkstra.playground/Sources/SimpleObjects/Edge.swift",
    "content": "import Foundation\n\npublic class Edge {\n    public var neighbor: Vertex\n    public var weight: Double\n    public var edgeRepresentation: EdgeRepresentation?\n\n    public init(vertex: Vertex, weight: Double) {\n        self.neighbor = vertex\n        self.weight = weight\n    }\n}\n"
  },
  {
    "path": "Dijkstra Algorithm/VisualizedDijkstra.playground/Sources/SimpleObjects/Vertex.swift",
    "content": "import UIKit\n\npublic class Vertex {\n    private var graphColors: GraphColors = GraphColors.sharedInstance\n\n    public var view: VertexView?\n    \n    public var identifier: String\n    public var edges: [Edge] = []\n    public var pathVerticesFromStart: [Vertex] = []\n    public var level: Int = 0\n    public var levelChecked: Bool = false\n    public var haveAllEdges: Bool = false\n    public var visited: Bool = false\n    public var pathLengthFromStart: Double = Double.infinity {\n        didSet {\n            DispatchQueue.main.async {\n                self.view?.setPathLengthLabel(text: \"\\(self.pathLengthFromStart)\")\n            }\n        }\n    }\n\n    public init(identifier: String) {\n        self.identifier = identifier\n    }\n\n    public func clearCache() {\n        pathLengthFromStart = Double.infinity\n        pathVerticesFromStart = []\n        visited = false\n    }\n\n    public func clearLevelInfo() {\n        level = 0\n        levelChecked = false\n    }\n\n    public func setVisitedColor() {\n        view?.backgroundColor = graphColors.visitedColor\n        view?.setLabelsTextColor(color: UIColor.white)\n    }\n\n    public func setCheckingPathColor() {\n        view?.backgroundColor = graphColors.checkingColor\n    }\n\n    public func setDefaultColor() {\n        view?.backgroundColor = graphColors.defaultVertexColor\n        view?.setLabelsTextColor(color: UIColor.black)\n    }\n}\n\nextension Vertex: Hashable {\n    public var hashValue: Int {\n        return identifier.hashValue\n    }\n}\n\nextension Vertex: Equatable {\n    public static func ==(lhs: Vertex, rhs: Vertex) -> Bool {\n        return lhs.hashValue == rhs.hashValue\n    }\n}\n"
  },
  {
    "path": "Dijkstra Algorithm/VisualizedDijkstra.playground/Sources/Window.swift",
    "content": "import Foundation\nimport UIKit\n\npublic protocol GraphDelegate: class {\n    func willCompareVertices(startVertexPathLength: Double, edgePathLength: Double, endVertexPathLength: Double)\n    func didFinishCompare()\n    func didCompleteGraphParsing()\n    func didTapWrongVertex()\n    func didStop()\n    func willStartVertexNeighborsChecking()\n    func didFinishVertexNeighborsChecking()\n}\n\npublic class Window: UIView, GraphDelegate {\n    public var graphView: GraphView!\n\n    private var topView: UIView!\n    private var createGraphButton: RoundedButton!\n    private var startVisualizationButton: RoundedButton!\n    private var startInteractiveVisualizationButton: RoundedButton!\n    private var startButton: UIButton!\n    private var pauseButton: UIButton!\n    private var stopButton: UIButton!\n    private var comparisonLabel: UILabel!\n    private var activityIndicator: UIActivityIndicatorView!\n    private var graph: Graph!\n    private var numberOfVertices: UInt!\n    private var graphColors = GraphColors.sharedInstance\n\n    public override init(frame: CGRect) {\n        super.init(frame: frame)\n        self.frame = frame\n        backgroundColor = graphColors.mainWindowBackgroundColor\n    }\n    \n    public required init?(coder aDecoder: NSCoder) {\n        fatalError(\"init(coder:) has not been implemented\")\n    }\n\n    public func configure(graph: Graph) {\n        self.graph = graph\n        graph.createNewGraph()\n        graph.delegate = self\n        let frame = CGRect(x: 10, y: 170, width: self.frame.width - 20, height: self.frame.height - 180)\n        graphView = GraphView(frame: frame, graph: graph)\n        \n\n        graphView.createNewGraph()\n        addSubview(graphView)\n\n        configureCreateGraphButton()\n        configureStartVisualizationButton()\n        configureStartInteractiveVisualizationButton()\n        configureStartButton()\n        configurePauseButton()\n        configureStopButton()\n        configureComparisonLabel()\n        configureActivityIndicator()\n\n        topView = UIView(frame: CGRect(x: 10, y: 10, width: frame.width - 20, height: 150))\n        topView.backgroundColor = graphColors.topViewBackgroundColor\n        topView.layer.cornerRadius = 15\n        addSubview(topView)\n\n        topView.addSubview(createGraphButton)\n        topView.addSubview(startVisualizationButton)\n        topView.addSubview(startInteractiveVisualizationButton)\n        topView.addSubview(startButton)\n        topView.addSubview(pauseButton)\n        topView.addSubview(stopButton)\n        topView.addSubview(comparisonLabel)\n        topView.addSubview(activityIndicator)\n    }\n\n    private func configureCreateGraphButton() {\n        let frame = CGRect(x: center.x - 200, y: 12, width: 100, height: 34)\n        createGraphButton = RoundedButton(frame: frame)\n        createGraphButton.setTitle(\"New graph\", for: .normal)\n        createGraphButton.addTarget(self, action: #selector(createGraphButtonTap), for: .touchUpInside)\n    }\n\n    private func configureStartVisualizationButton() {\n        let frame = CGRect(x: center.x - 50, y: 12, width: 100, height: 34)\n        startVisualizationButton = RoundedButton(frame: frame)\n        startVisualizationButton.setTitle(\"Auto\", for: .normal)\n        startVisualizationButton.addTarget(self, action: #selector(startVisualizationButtonDidTap), for: .touchUpInside)\n    }\n\n    private func configureStartInteractiveVisualizationButton() {\n        let frame = CGRect(x: center.x + 100, y: 12, width: 100, height: 34)\n        startInteractiveVisualizationButton = RoundedButton(frame: frame)\n        startInteractiveVisualizationButton.setTitle(\"Interactive\", for: .normal)\n        startInteractiveVisualizationButton.addTarget(self, action: #selector(startInteractiveVisualizationButtonDidTap), for: .touchUpInside)\n    }\n\n    private func configureStartButton() {\n        let frame = CGRect(x: center.x - 65, y: 56, width: 30, height: 30)\n        startButton = UIButton(frame: frame)\n        let playImage = UIImage(named: \"Start.png\")\n        startButton.setImage(playImage, for: .normal)\n        startButton.isEnabled = false\n        startButton.addTarget(self, action: #selector(didTapStartButton), for: .touchUpInside)\n    }\n\n    private func configurePauseButton() {\n        let frame = CGRect(x: center.x - 15, y: 56, width: 30, height: 30)\n        pauseButton = UIButton(frame: frame)\n        let pauseImage = UIImage(named: \"Pause.png\")\n        pauseButton.setImage(pauseImage, for: .normal)\n        pauseButton.isEnabled = false\n        pauseButton.addTarget(self, action: #selector(didTapPauseButton), for: .touchUpInside)\n    }\n\n    private func configureStopButton() {\n        let frame = CGRect(x: center.x + 35, y: 56, width: 30, height: 30)\n        stopButton = UIButton(frame: frame)\n        let stopImage = UIImage(named: \"Stop.png\")\n        stopButton.setImage(stopImage, for: .normal)\n        stopButton.isEnabled = false\n        stopButton.addTarget(self, action: #selector(didTapStopButton), for: .touchUpInside)\n    }\n\n    private func configureComparisonLabel() {\n        let size = CGSize(width: 250, height: 42)\n        let origin = CGPoint(x: center.x - 125, y: 96)\n        let frame = CGRect(origin: origin, size: size)\n        comparisonLabel = UILabel(frame: frame)\n        comparisonLabel.textAlignment = .center\n        comparisonLabel.text = \"Have fun!\"\n    }\n\n    private func configureActivityIndicator() {\n        let size = CGSize(width: 50, height: 42)\n        let origin = CGPoint(x: center.x - 25, y: 100)\n        let activityIndicatorFrame = CGRect(origin: origin, size: size)\n        activityIndicator = UIActivityIndicatorView(frame: activityIndicatorFrame)\n        activityIndicator.style = .whiteLarge\n    }\n\n    @objc private func createGraphButtonTap() {\n        comparisonLabel.text = \"\"\n        graphView.removeGraph()\n        graph.removeGraph()\n        graph.createNewGraph()\n        graphView.createNewGraph()\n        graph.state = .initial\n    }\n\n    @objc private func startVisualizationButtonDidTap() {\n        comparisonLabel.text = \"\"\n        pauseButton.isEnabled = true\n        stopButton.isEnabled = true\n        createGraphButton.isEnabled = false\n        startVisualizationButton.isEnabled = false\n        startInteractiveVisualizationButton.isEnabled = false\n        createGraphButton.alpha = 0.5\n        startVisualizationButton.alpha = 0.5\n        startInteractiveVisualizationButton.alpha = 0.5\n\n        if graph.state == .completed {\n            graphView.reset()\n            graph.reset()\n        }\n        graph.state = .autoVisualization\n        DispatchQueue.global(qos: .background).async {\n            self.graph.findShortestPathsWithVisualization {\n                self.graph.state = .completed\n\n                DispatchQueue.main.async {\n                    self.startButton.isEnabled = false\n                    self.pauseButton.isEnabled = false\n                    self.stopButton.isEnabled = false\n                    self.createGraphButton.isEnabled = true\n                    self.startVisualizationButton.isEnabled = true\n                    self.startInteractiveVisualizationButton.isEnabled = true\n                    self.createGraphButton.alpha = 1\n                    self.startVisualizationButton.alpha = 1\n                    self.startInteractiveVisualizationButton.alpha = 1\n                    self.comparisonLabel.text = \"Completed!\"\n                }\n            }\n        }\n    }\n\n    @objc private func startInteractiveVisualizationButtonDidTap() {\n        comparisonLabel.text = \"\"\n        pauseButton.isEnabled = true\n        stopButton.isEnabled = true\n        createGraphButton.isEnabled = false\n        startVisualizationButton.isEnabled = false\n        startInteractiveVisualizationButton.isEnabled = false\n        createGraphButton.alpha = 0.5\n        startVisualizationButton.alpha = 0.5\n        startInteractiveVisualizationButton.alpha = 0.5\n\n        if graph.state == .completed {\n            graphView.reset()\n            graph.reset()\n        }\n\n        guard let startVertex = graph.startVertex else {\n            assertionFailure(\"startVertex is nil\")\n            return\n        }\n        startVertex.pathLengthFromStart = 0\n        startVertex.pathVerticesFromStart.append(startVertex)\n        graph.state = .parsing\n        graph.parseNeighborsFor(vertex: startVertex) {\n            self.graph.state = .interactiveVisualization\n            DispatchQueue.main.async {\n                self.comparisonLabel.text = \"Pick next vertex\"\n            }\n        }\n    }\n\n    @objc private func didTapStartButton() {\n        startButton.isEnabled = false\n        pauseButton.isEnabled = true\n        DispatchQueue.global(qos: .utility).async {\n            self.graph.pauseVisualization = false\n        }\n    }\n\n    @objc private func didTapPauseButton() {\n        startButton.isEnabled = true\n        pauseButton.isEnabled = false\n        DispatchQueue.global(qos: .utility).async {\n            self.graph.pauseVisualization = true\n        }\n    }\n\n    @objc private func didTapStopButton() {\n        startButton.isEnabled = false\n        pauseButton.isEnabled = false\n        comparisonLabel.text = \"\"\n        activityIndicator.startAnimating()\n        if graph.state == .parsing || graph.state == .autoVisualization {\n            graph.stopVisualization = true\n        } else if graph.state == .interactiveVisualization {\n            didStop()\n        }\n    }\n\n    private func setButtonsToInitialState() {\n        createGraphButton.isEnabled = true\n        startVisualizationButton.isEnabled = true\n        startInteractiveVisualizationButton.isEnabled = true\n        startButton.isEnabled = false\n        pauseButton.isEnabled = false\n        stopButton.isEnabled = false\n        createGraphButton.alpha = 1\n        startVisualizationButton.alpha = 1\n        startInteractiveVisualizationButton.alpha = 1\n    }\n\n    private func showError(error: String) {\n        DispatchQueue.main.async {\n            let size = CGSize(width: 250, height: 42)\n            let origin = CGPoint(x: self.topView.center.x - 125, y: 96)\n            let frame = CGRect(origin: origin, size: size)\n            let errorView = ErrorView(frame: frame)\n            errorView.setText(text: error)\n            self.topView.addSubview(errorView)\n            UIView.animate(withDuration: 2, animations: {\n                errorView.alpha = 0\n            }, completion: { _ in\n                errorView.removeFromSuperview()\n            })\n        }\n    }\n\n    // MARK: GraphDelegate\n    public func didCompleteGraphParsing() {\n        graph.state = .completed\n        setButtonsToInitialState()\n        comparisonLabel.text = \"Completed!\"\n    }\n\n    public func didTapWrongVertex() {\n        if !subviews.contains { $0 is ErrorView } {\n            showError(error: \"You have picked wrong next vertex\")\n        }\n    }\n\n    public func willCompareVertices(startVertexPathLength: Double, edgePathLength: Double, endVertexPathLength: Double) {\n        DispatchQueue.main.async {\n            if startVertexPathLength + edgePathLength < endVertexPathLength {\n                self.comparisonLabel.text = \"\\(startVertexPathLength) + \\(edgePathLength) < \\(endVertexPathLength) 👍\"\n            } else {\n                self.comparisonLabel.text = \"\\(startVertexPathLength) + \\(edgePathLength) >= \\(endVertexPathLength) 👎\"\n            }\n        }\n    }\n\n    public func didFinishCompare() {\n        DispatchQueue.main.async {\n            self.comparisonLabel.text = \"\"\n        }\n    }\n\n    public func didStop() {\n        graph.state = .initial\n        graph.stopVisualization = false\n        graph.pauseVisualization = false\n        graphView.reset()\n        graph.reset()\n        setButtonsToInitialState()\n        activityIndicator.stopAnimating()\n    }\n\n    public func willStartVertexNeighborsChecking() {\n        DispatchQueue.main.async {\n            self.comparisonLabel.text = \"\"\n        }\n    }\n\n    public func didFinishVertexNeighborsChecking() {\n        DispatchQueue.main.async {\n            self.comparisonLabel.text = \"Pick next vertex\"\n        }\n    }\n}\n"
  },
  {
    "path": "Dijkstra Algorithm/VisualizedDijkstra.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios' display-mode='raw'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Dijkstra Algorithm/VisualizedDijkstra.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Dijkstra Algorithm/VisualizedDijkstra.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "DiningPhilosophers/DiningPhilosophers.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\tOBJ_18 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_9 /* main.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t232D7939216F76F700831A74 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = \"<group>\"; };\n\t\tOBJ_12 /* DiningPhilosophers */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; path = DiningPhilosophers; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tOBJ_6 /* Package.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; path = Package.swift; sourceTree = \"<group>\"; };\n\t\tOBJ_9 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\tOBJ_19 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 0;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\tOBJ_11 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tOBJ_12 /* DiningPhilosophers */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\tOBJ_5 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t232D7939216F76F700831A74 /* README.md */,\n\t\t\t\tOBJ_6 /* Package.swift */,\n\t\t\t\tOBJ_7 /* Sources */,\n\t\t\t\tOBJ_11 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tOBJ_7 /* Sources */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tOBJ_8 /* DiningPhilosophers */,\n\t\t\t);\n\t\t\tpath = Sources;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tOBJ_8 /* DiningPhilosophers */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tOBJ_9 /* main.swift */,\n\t\t\t);\n\t\t\tname = DiningPhilosophers;\n\t\t\tpath = Sources;\n\t\t\tsourceTree = SOURCE_ROOT;\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\tOBJ_13 /* DiningPhilosophers */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = OBJ_14 /* Build configuration list for PBXNativeTarget \"DiningPhilosophers\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tOBJ_17 /* Sources */,\n\t\t\t\tOBJ_19 /* Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = DiningPhilosophers;\n\t\t\tproductName = DiningPhilosophers;\n\t\t\tproductReference = OBJ_12 /* DiningPhilosophers */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\tOBJ_1 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 9999;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\tOBJ_13 = {\n\t\t\t\t\t\tLastSwiftMigration = 1000;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = OBJ_2 /* Build configuration list for PBXProject \"DiningPhilosophers\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t);\n\t\t\tmainGroup = OBJ_5;\n\t\t\tproductRefGroup = OBJ_11 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\tOBJ_13 /* DiningPhilosophers */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\tOBJ_17 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 0;\n\t\t\tfiles = (\n\t\t\t\tOBJ_18 /* main.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\tOBJ_15 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"$(PLATFORM_DIR)/Developer/Library/Frameworks\";\n\t\t\t\tHEADER_SEARCH_PATHS = \"\";\n\t\t\t\tINFOPLIST_FILE = DiningPhilosophers.xcodeproj/DiningPhilosophers_Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(TOOLCHAIN_DIR)/usr/lib/swift/macosx @executable_path\";\n\t\t\t\tOTHER_LDFLAGS = \"$(inherited)\";\n\t\t\t\tOTHER_SWIFT_FLAGS = \"$(inherited)\";\n\t\t\t\tSUPPORTED_PLATFORMS = macosx;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = SWIFT_PACKAGE;\n\t\t\t\tSWIFT_FORCE_DYNAMIC_LINK_STDLIB = YES;\n\t\t\t\tSWIFT_FORCE_STATIC_LINK_STDLIB = NO;\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t\tTARGET_NAME = DiningPhilosophers;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tOBJ_16 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"$(PLATFORM_DIR)/Developer/Library/Frameworks\";\n\t\t\t\tHEADER_SEARCH_PATHS = \"\";\n\t\t\t\tINFOPLIST_FILE = DiningPhilosophers.xcodeproj/DiningPhilosophers_Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(TOOLCHAIN_DIR)/usr/lib/swift/macosx @executable_path\";\n\t\t\t\tOTHER_LDFLAGS = \"$(inherited)\";\n\t\t\t\tOTHER_SWIFT_FLAGS = \"$(inherited)\";\n\t\t\t\tSUPPORTED_PLATFORMS = macosx;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = SWIFT_PACKAGE;\n\t\t\t\tSWIFT_FORCE_DYNAMIC_LINK_STDLIB = YES;\n\t\t\t\tSWIFT_FORCE_STATIC_LINK_STDLIB = NO;\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t\tTARGET_NAME = DiningPhilosophers;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tOBJ_3 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tENABLE_NS_ASSERTIONS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.10;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tOTHER_SWIFT_FLAGS = \"-DXcode\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSUPPORTED_PLATFORMS = \"macosx iphoneos iphonesimulator appletvos appletvsimulator watchos watchsimulator\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tUSE_HEADERMAP = NO;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tOBJ_4 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = s;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.10;\n\t\t\t\tOTHER_SWIFT_FLAGS = \"-DXcode\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSUPPORTED_PLATFORMS = \"macosx iphoneos iphonesimulator appletvos appletvsimulator watchos watchsimulator\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tUSE_HEADERMAP = NO;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\tOBJ_14 /* Build configuration list for PBXNativeTarget \"DiningPhilosophers\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tOBJ_15 /* Debug */,\n\t\t\t\tOBJ_16 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Debug;\n\t\t};\n\t\tOBJ_2 /* Build configuration list for PBXProject \"DiningPhilosophers\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tOBJ_3 /* Debug */,\n\t\t\t\tOBJ_4 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Debug;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = OBJ_1 /* Project object */;\n}\n"
  },
  {
    "path": "DiningPhilosophers/DiningPhilosophers.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "DiningPhilosophers/DiningPhilosophers.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "DiningPhilosophers/DiningPhilosophers.xcodeproj/xcshareddata/xcschemes/DiningPhilosophers.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"9999\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"OBJ_13\"\n               BuildableName = \"DiningPhilosophers\"\n               BlueprintName = \"DiningPhilosophers\"\n               ReferencedContainer = \"container:DiningPhilosophers.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"OBJ_13\"\n            BuildableName = \"DiningPhilosophers\"\n            BlueprintName = \"DiningPhilosophers\"\n            ReferencedContainer = \"container:DiningPhilosophers.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "DiningPhilosophers/DiningPhilosophers.xcodeproj/xcshareddata/xcschemes/xcschememanagement.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<plist version=\"1.0\">\n<dict>\n  <key>SchemeUserState</key>\n  <dict>\n    <key>DiningPhilosophers.xcscheme</key>\n    <dict></dict>\n  </dict>\n  <key>SuppressBuildableAutocreation</key>\n  <dict></dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "DiningPhilosophers/LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"{}\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright {yyyy} {name of copyright owner}\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "DiningPhilosophers/Package.swift",
    "content": "import PackageDescription\n\nlet package = Package(\n    name: \"DiningPhilosophers\"\n)\n"
  },
  {
    "path": "DiningPhilosophers/README.md",
    "content": "# Dining Philosophers\nThe dining philosophers problem Algorithm implemented in Swift (concurrent algorithm design to illustrate synchronization issues and techniques for resolving them using [GCD](https://apple.github.io/swift-corelibs-libdispatch/) and [Semaphore](https://developer.apple.com/reference/dispatch/dispatchsemaphore) in Swift)\n\nWritten for Swift Algorithm Club by Jacopo Mangiavacchi\n\n\n# Introduction\n\nIn computer science, the dining philosophers problem is often used in the concurrent algorithm design to illustrate synchronization issues and techniques for resolving them.\n\nIt was originally formulated in 1965 by Edsger Dijkstra as a student exam exercise, presented in terms of computers competing for access to tape drive peripherals. Soon after, Tony Hoare gave the problem its present formulation.\n\nThis Swift implementation is based on the Chandy/Misra solution, and it uses the GCD Dispatch and Semaphores on the Swift cross platform.\n\n# Problem statement\n\nFive silent philosophers sit at a round table with bowls of spaghetti. Forks are placed between each pair of adjacent philosophers.\n\nEach philosopher must alternately think and eat. A philosopher can only eat spaghetti when they have both left and right forks. Since each fork can be held by only one philosopher, a philosopher can use the fork only if it is not being used by another philosopher. When a philosopher finishes eating, they need to put down both forks so that the forks become available to others. A philosopher can take the fork on their right or the one on their left as they become available, but they cannot start eating before getting both forks.\n\nEating is not limited by the remaining amounts of spaghetti or stomach space; an infinite supply and an infinite demand are assumed.\n\nThe problem is how to design a discipline of behavior (a concurrent algorithm) such that no philosopher will starve; i.e., each can forever continue to alternate between eating and thinking, assuming that no philosopher can know when others may want to eat or think.\n\nThis is an illustration of a dining table:\n\n![Dining Philosophers table](https://upload.wikimedia.org/wikipedia/commons/7/7b/An_illustration_of_the_dining_philosophers_problem.png)\n\n# Solution\nThere are different solutions for this classic algorithm, and this Swift implementation is based on the Chandy/Misra solution. This implementation allows agents to contend for an arbitrary number of resources in a completely distributed scenario with no need for a central authority to control the locking and serialization of resources. \n\nHowever, this solution violates the requirement that \"the philosophers do not speak to each other\" (due to the request messages).\n\n# Description\nFor every pair of philosophers contending for a resource, create a fork and give it to the philosopher with the lower ID (n for agent Pn). Each fork can either be dirty or clean. Initially, all forks are dirty.\nWhen a philosopher wants to use a set of resources (i.e. eat), said philosopher must obtain the forks from their contending neighbors. The philospher send a message for all such forks needed. When a philosopher with a fork receives a request message, they keep the fork if it is clean, but give it up when it is dirty. If the philosopher sends the fork over, they clean the fork before doing so.\nAfter a philosopher is done eating, all their forks become dirty. If another philosopher had previously requested one of the forks, the philosopher that has just finished eating cleans the fork and sends it.\nThis solution also allows for a large degree of concurrency, and it will solve an arbitrarily large problem.\n\nIn addition, it solves the starvation problem. The clean / dirty labels give a preference to the most \"starved\" processes and a disadvantage to processes that have just \"eaten\". One could compare their solution to one where philosophers are not allowed to eat twice in a row without letting others use the forks in between. The Chandy and Misra's solution is more flexible but has an element tending in that direction.\n\nBased on the Chandy and Misra's analysis, a system of preference levels is derived from the distribution of the forks and their clean/dirty states. This system may describe an acyclic graph, and if so, the solution's protocol cannot turn that graph into a cyclic one. This guarantees that deadlock cannot occur. However, if the system is initialized to a perfectly symmetric state, such as all philosophers holding their left side forks, then the graph is cyclic at the outset, and the solution cannot prevent a deadlock. Initializing the system so that philosophers with lower IDs have dirty forks ensures the graph is initially acyclic.\n\n\n# Swift implementation\n\nThis Swift 3.0 implementation of the Chandy/Misra solution is based on the GCD and Semaphore technique that can be built on both macOS and Linux.\n\nThe code is based on a ForkPair struct used for holding an array of DispatchSemaphore and a Philosopher struct for associate a couple of forks to each Philosopher.\n\nThe ForkPair DispatchSemaphore static array is used for waking the neighbour Philosophers any time a fork pair is put down on the table.\n\nA background DispatchQueue is then used to let any Philosopher run asyncrounosly on the background, and a global DispatchSemaphore is used to keep the main thread on wait forever and let the Philosophers continue forever in their alternate think and eat cycle.\n  \n# See also\n\nDining Philosophers on Wikipedia https://en.wikipedia.org/wiki/Dining_philosophers_problem\n\nWritten for Swift Algorithm Club by Jacopo Mangiavacchi\nSwift 4.2 check by Bruno Scheele\n"
  },
  {
    "path": "DiningPhilosophers/Sources/main.swift",
    "content": "//\n//  Swift Dining philosophers problem Algorithm\n//  https://en.wikipedia.org/wiki/Dining_philosophers_problem\n//\n//  Created by Jacopo Mangiavacchi on 11/02/16.\n//\n//\n\n// last checked with Xcode 9.0b4\n#if swift(>=4.0)\n  print(\"Hello, Swift 4!\")\n#endif\n\nimport Dispatch\n\nlet numberOfPhilosophers = 4\n\nstruct ForkPair {\n    static let forksSemaphore: [DispatchSemaphore] = Array(repeating: DispatchSemaphore(value: 1), count: numberOfPhilosophers)\n\n    let leftFork: DispatchSemaphore\n    let rightFork: DispatchSemaphore\n\n    init(leftIndex: Int, rightIndex: Int) {\n        //Order forks by index to prevent deadlock\n        if leftIndex > rightIndex {\n            leftFork = ForkPair.forksSemaphore[leftIndex]\n            rightFork = ForkPair.forksSemaphore[rightIndex]\n        } else {\n            leftFork = ForkPair.forksSemaphore[rightIndex]\n            rightFork = ForkPair.forksSemaphore[leftIndex]\n        }\n    }\n\n    func pickUp() {\n        //Acquire by starting with the lower index\n        leftFork.wait()\n        rightFork.wait()\n    }\n\n    func putDown() {\n        //The order does not matter here\n        leftFork.signal()\n        rightFork.signal()\n    }\n}\n\nstruct Philosophers {\n    let forkPair: ForkPair\n    let philosopherIndex: Int\n\n    var leftIndex = -1\n    var rightIndex = -1\n\n    init(philosopherIndex: Int) {\n        leftIndex = philosopherIndex\n        rightIndex = philosopherIndex - 1\n\n        if rightIndex < 0 {\n            rightIndex += numberOfPhilosophers\n        }\n\n        self.forkPair = ForkPair(leftIndex: leftIndex, rightIndex: rightIndex)\n        self.philosopherIndex = philosopherIndex\n\n        print(\"Philosopher: \\(philosopherIndex)  left: \\(leftIndex)  right: \\(rightIndex)\")\n    }\n\n    func run() {\n        while true {\n            print(\"Acquiring lock for Philosopher: \\(philosopherIndex) Left:\\(leftIndex) Right:\\(rightIndex)\")\n            forkPair.pickUp()\n            print(\"Start Eating Philosopher: \\(philosopherIndex)\")\n            //sleep(1000)\n            print(\"Releasing lock for Philosopher: \\(philosopherIndex) Left:\\(leftIndex) Right:\\(rightIndex)\")\n            forkPair.putDown()\n        }\n    }\n}\n\n// Layout of the table (P = philosopher, f = fork) for 4 Philosophers\n//          P0\n//       f3    f0\n//     P3        P1\n//       f2    f1\n//          P2\nlet globalSem = DispatchSemaphore(value: 0)\n\nfor i in 0..<numberOfPhilosophers {\n    if #available(macOS 10.10, *) {\n        DispatchQueue.global(qos: .background).async {\n            let p = Philosophers(philosopherIndex: i)\n\n            p.run()\n        }\n    }\n}\n\n//Start the thread signaling the semaphore\nfor semaphore in ForkPair.forksSemaphore {\n    semaphore.signal()\n}\n\n//Wait forever\nglobalSem.wait()\n"
  },
  {
    "path": "Egg Drop Problem/EggDrop.playground/Contents.swift",
    "content": "drop(numberOfEggs: 2, numberOfFloors: 2) //expected answer: 2\ndrop(numberOfEggs: 2, numberOfFloors: 4) //expected answer: 3\ndrop(numberOfEggs: 2, numberOfFloors: 6) //expected answer: 3\ndrop(numberOfEggs: 5, numberOfFloors: 5) //expected answer: 2\ndrop(numberOfEggs: 5, numberOfFloors: 20) //expected answer: 4\n\ndrop(numberOfEggs: 2, numberOfFloors: 36)\ndrop(numberOfEggs: 2, numberOfFloors: 10)\n"
  },
  {
    "path": "Egg Drop Problem/EggDrop.playground/Sources/EggDrop.swift",
    "content": "public func drop(numberOfEggs: Int, numberOfFloors: Int) -> Int {\n  guard numberOfEggs != 0 && numberOfFloors != 0 else { return 0 }\n  guard numberOfEggs != 1 && numberOfFloors != 1 else { return 1 }\n  \n  var eggFloor: [[Int]] = .init(repeating: .init(repeating: 0, count: numberOfFloors + 1), count: numberOfEggs + 1)\n  var attempts = 0\n  \n  for floorNumber in stride(from: 0, through: numberOfFloors, by: 1) {\n    eggFloor[1][floorNumber] = floorNumber\n  }\n  eggFloor[2][1] = 1\n  \n  for eggNumber in stride(from: 2, through: numberOfEggs, by: 1) {\n    for floorNumber in stride(from: 2, through: numberOfFloors, by: 1) {\n      eggFloor[eggNumber][floorNumber] = Int.max\n      for visitingFloor in stride(from: 1, through: floorNumber, by: 1) {\n        attempts = 1 + max(eggFloor[eggNumber - 1][visitingFloor - 1], eggFloor[eggNumber][floorNumber - visitingFloor])\n        \n        if attempts < eggFloor[eggNumber][floorNumber] {\n          eggFloor[eggNumber][floorNumber] = attempts\n        }\n      }\n    }\n  }\n  \n  return eggFloor[numberOfEggs][numberOfFloors]\n}\n"
  },
  {
    "path": "Egg Drop Problem/EggDrop.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='macos'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Egg Drop Problem/EggDrop.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Egg Drop Problem/EggDrop.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Egg Drop Problem/EggDrop.playground/playground.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict/>\n</plist>\n"
  },
  {
    "path": "Egg Drop Problem/EggDrop.swift",
    "content": "public func eggDrop(numberOfEggs: Int, numberOfFloors: Int) -> Int {\n    if numberOfEggs == 0 || numberOfFloors == 0{ //edge case: When either number of eggs or number of floors is 0, answer is 0\n        return 0\n    }\n    if numberOfEggs == 1 || numberOfFloors == 1{ //edge case: When either number of eggs or number of floors is 1, answer is 1\n        return 1\n    }\n    \n    var eggFloor = [[Int]](repeating: [Int](repeating: 0, count: numberOfFloors+1), count: numberOfEggs+1) //egg(rows) floor(cols) array to store the solutions\n    var attempts: Int = 0\n    \n    for var floorNumber in (0..<(numberOfFloors+1)){\n        eggFloor[1][floorNumber] = floorNumber      //base case: if there's only one egg, it takes 'numberOfFloors' attempts\n    }\n    eggFloor[2][1] = 1 //base case: if there are two eggs and one floor, it takes one attempt\n    \n    for var eggNumber in (2..<(numberOfEggs+1)){\n        for var floorNumber in (2..<(numberOfFloors+1)){\n            eggFloor[eggNumber][floorNumber] = Int.max   //setting the final result a high number to find out minimum\n            for var visitingFloor in (1..<(floorNumber+1)){\n                //there are two cases\n                //case 1: egg breaks. meaning we'll have one less egg, and we'll have to go downstairs -> visitingFloor-1\n                //case 2: egg doesn't break. meaning we'll still have 'eggs' number of eggs, and we'll go upstairs -> floorNumber-visitingFloor\n                attempts = 1 + max(eggFloor[eggNumber-1][visitingFloor-1], eggFloor[eggNumber][floorNumber-visitingFloor])//we add one taking into account the attempt we're taking at the moment\n                \n                if attempts < eggFloor[eggNumber][floorNumber]{ //finding the min\n                    eggFloor[eggNumber][floorNumber] = attempts;\n                }\n            }\n        }\n    }\n    \n    return eggFloor[numberOfEggs][numberOfFloors]\n}\n\n//Helper function to find max of two integers\npublic func max(_ x1: Int, _ x2: Int) -> Int{\n    return x1 > x2 ? x1 : x2\n}\n"
  },
  {
    "path": "Egg Drop Problem/README.markdown",
    "content": "# Egg Drop\n\nThe *egg drop* problem is an interview question popularized by Google. The premise is simple; You're given a task to evaluate the *shatter resistance* of unknown objects by dropping them at a certain height. For simplicity, you test this by going inside a multi-story building and performing tests by dropping the objects out the window and onto the ground:\n\n![building with eggs being dropped](images/eggdrop.png)\n\nYour goal is to find out the **minimum** height that causes the object to shatter. Consider the trivial case you're given **1** object to obtain the results with. Since you've only got one sample for testing, you need to play it safe by performing drop tests starting with the bottom floor and working your way up:\n\n![dropping from first floor](images/eggdrop2.png)\n\nIf the object is incredibly resilient, and you may need to do the testing on the world's tallest building - the [Burj Khalifa](https://en.wikipedia.org/wiki/Burj_Khalifa). With **163** floors, that's a lot of climbing. Let's assume you complain, and your employer hears your plight. You are now given *several* samples to work with. How can you make use of these extra samples to expedite your testing process? The problem for this situation is popularized as the **egg drop** problem.\n\n## Description\n\nYou're in a building with **m** floors and you are given **n** eggs. What is the minimum number of attempts it will take to find out the floor that breaks the egg?\n\nFor convenience, here are a few rules to keep in mind:\n\n- An egg that survives a fall can be used again.\n- A broken egg must be discarded.\n- The effect of a fall is the same for all eggs.\n- If an egg breaks, then it would break if dropped from a higher floor.\n- If an egg survives, then it would survive a shorter fall.\n\n## Solution\n\n- eggNumber -> Number of eggs at the moment\n- floorNumber -> Floor number at the moment\n- visitingFloor -> Floor being visited at the moment\n- attempts -> Minimum number of attempts it will take to find out from which floor egg will break\n\nWe store all the solutions in a 2D array. Where rows represents number of eggs and columns represent number of floors. \n\nFirst, we set base cases:\n1) If there's only one egg, it takes as many attempts as number of floors\n2) If there are two eggs and one floor, it takes one attempt\n\n```swift\nfor var floorNumber in (0..<(numberOfFloors+1)){\neggFloor[1][floorNumber] = floorNumber      //base case 1: if there's only one egg, it takes 'numberOfFloors' attempts\n}\n\neggFloor[2][1] = 1 //base case 2: if there are two eggs and one floor, it takes one attempt\n```\n\nWhen we drop an egg from a floor 'floorNumber', there can be two cases (1) The egg breaks (2) The egg doesn’t break.\n\n1) If the egg breaks after dropping from 'visitingFloorth' floor, then we only need to check for floors lower than 'visitingFloor' with remaining eggs; so the problem reduces to 'visitingFloor'-1 floors and 'eggNumber'-1 eggs.\n2) If the egg doesn’t break after dropping from the 'visitingFloorth' floor, then we only need to check for floors higher than 'visitingFloor'; so the problem reduces to floors-'visitingFloor' floors and 'eggNumber' eggs.\n\nSince we need to minimize the number of trials in worst case, we take the maximum of two cases. We consider the max of above two cases for every floor and choose the floor which yields minimum number of trials.\n\nWe find the answer based on the base cases and previously found answers as follows. \n```swift\nattempts = 1 + max(eggFloor[eggNumber-1][floors-1], eggFloor[eggNumber][floorNumber-floors])//we add one taking into account the attempt we're taking at the moment\n\nif attempts < eggFloor[eggNumber][floorNumber]{ //finding the min\n    eggFloor[eggNumber][floorNumber] = attempts;\n}\n```\n## Example\nLet's assume we have 2 eggs and 2 floors.\n1) We drop one egg from the first floor. If it breaks, then we get the answer. If it doesn't we'll have 2 eggs and 1 floors to work with.\n    attempts = 1 + maximum of 0(got the answer) and eggFloor[2][1] (base case 2 which gives us 1)\n    attempts = 1 + 1 = 2\n2) We drop one egg from the second floor. If it breaks, we'll have 1 egg and 1 floors to work with. If it doesn't, we'll get the answer.\n    attempts = 1 + maximum of eggFloor[1][1](base case 1 which gives us 1) and 0(got the answer)\n    attempts = 1 + 1 = 2\n3) Finding the minimum of 2 and 2 gives us 2, so the answer is 2. \n   2 is the minimum number of attempts it will take to find out from which floor egg will break.\n\n*Written for the Swift Algorithm Club by Arkalyk Akash. Revisions and additions by Kelvin Lau*\n"
  },
  {
    "path": "Encode and Decode Tree/EncodeAndDecodeTree.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\nfunc printTree(_ root: BinaryNode<String>?) {\n    guard let root = root else {\n        return\n    }\n\n    let leftVal = root.left == nil ? \"nil\" : root.left!.val\n    let rightVal = root.right == nil ? \"nil\" : root.right!.val\n\n    print(\"val: \\(root.val) left: \\(leftVal) right: \\(rightVal)\")\n\n    printTree(root.left)\n    printTree(root.right)\n}\n\nlet coder = BinaryNodeCoder<String>()\n\nlet node1 = BinaryNode(\"a\")\nlet node2 = BinaryNode(\"b\")\nlet node3 = BinaryNode(\"c\")\nlet node4 = BinaryNode(\"d\")\nlet node5 = BinaryNode(\"e\")\n\nnode1.left = node2\nnode1.right = node3\nnode3.left = node4\nnode3.right = node5\n\nlet encodeStr = try coder.encode(node1)\nprint(encodeStr)\n// \"a b # # c d # # e # #\"\n\n\nlet root: BinaryNode<String> = coder.decode(from: encodeStr)!\nprint(\"Tree:\")\nprintTree(root)\n/*\n Tree:\n val: a left: b right: c\n val: b left: nil right: nil\n val: c left: d right: e\n val: d left: nil right: nil\n val: e left: nil right: nil\n */\n\n"
  },
  {
    "path": "Encode and Decode Tree/EncodeAndDecodeTree.playground/Sources/EncodeAndDecodeTree.swift",
    "content": "//\n//  EncodeAndDecodeTree.swift\n//  \n//\n//  Created by Kai Chen on 19/07/2017.\n//\n//\n\nimport Foundation\n\nprotocol BinaryNodeEncoder {\n  func encode<T>(_ node: BinaryNode<T>?) throws -> String\n}\n\nprotocol BinaryNodeDecoder {\n  func decode<T>(from string: String) -> BinaryNode<T>?\n}\n\npublic class BinaryNodeCoder<T: Comparable>: BinaryNodeEncoder, BinaryNodeDecoder {\n\n  // MARK: Private\n\n  private let separator: Character = \",\"\n  private let nilNode = \"X\"\n\n  private func decode<T>(from array: inout [String]) -> BinaryNode<T>? {\n    guard !array.isEmpty else {\n      return nil\n    }\n\n    let value = array.removeLast()\n\n    guard value != nilNode, let val = value as? T else {\n      return nil\n    }\n\n    let node = BinaryNode<T>(val)\n    node.left = decode(from: &array)\n    node.right = decode(from: &array)\n\n    return node\n  }\n\n  // MARK: Public\n\n  public init() {}\n\n  public func encode<T>(_ node: BinaryNode<T>?) throws -> String {\n    var str = \"\"\n    node?.preOrderTraversal { data in\n      if let data = data {\n        let string = String(describing: data)\n        str.append(string)\n      } else {\n        str.append(nilNode)\n      }\n      str.append(separator)\n    }\n\n    return str\n  }\n\n  public func decode<T>(from string: String) -> BinaryNode<T>? {\n    var components = string.split(separator: separator).reversed().map(String.init)\n    return decode(from: &components)\n  }\n}\n\npublic class BinaryNode<Element: Comparable> {\n  public var val: Element\n  public var left: BinaryNode?\n  public var right: BinaryNode?\n\n  public init(_ val: Element, left: BinaryNode? = nil, right: BinaryNode? = nil) {\n    self.val = val\n    self.left = left\n    self.right = right\n  }\n\n  public func preOrderTraversal(visit: (Element?) throws -> ()) rethrows {\n    try visit(val)\n\n    if let left = left {\n      try left.preOrderTraversal(visit: visit)\n    } else {\n      try visit(nil)\n    }\n\n    if let right = right {\n      try right.preOrderTraversal(visit: visit)\n    } else {\n      try visit(nil)\n    }\n  }\n}\n"
  },
  {
    "path": "Encode and Decode Tree/EncodeAndDecodeTree.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Encode and Decode Tree/EncodeAndDecodeTree.swift",
    "content": "//\n//  EncodeAndDecodeTree.swift\n//\n//\n//  Created by Kai Chen on 19/07/2017.\n//\n//\n\nimport Foundation\n\nprotocol BinaryNodeEncoder {\n  func encode<T>(_ node: BinaryNode<T>?) throws -> String\n}\n\nprotocol BinaryNodeDecoder {\n  func decode<T>(from string: String) -> BinaryNode<T>?\n}\n\npublic class BinaryNodeCoder<T: Comparable>: BinaryNodeEncoder, BinaryNodeDecoder {\n\n  // MARK: Private\n\n  private let separator: Character = \",\"\n  private let nilNode = \"X\"\n\n  private func decode<T>(from array: inout [String]) -> BinaryNode<T>? {\n    guard !array.isEmpty else {\n      return nil\n    }\n\n    let value = array.removeLast()\n\n    guard value != nilNode, let val = value as? T else {\n      return nil\n    }\n\n    let node = BinaryNode<T>(val)\n    node.left = decode(from: &array)\n    node.right = decode(from: &array)\n\n    return node\n  }\n\n  // MARK: Public\n\n  public init() {}\n\n  public func encode<T>(_ node: BinaryNode<T>?) throws -> String {\n    var str = \"\"\n    node?.preOrderTraversal { data in\n      if let data = data {\n        let string = String(describing: data)\n        str.append(string)\n      } else {\n        str.append(nilNode)\n      }\n      str.append(separator)\n    }\n\n    return str\n  }\n\n  public func decode<T>(from string: String) -> BinaryNode<T>? {\n    var components = string.split(separator: separator).reversed().map(String.init)\n    return decode(from: &components)\n  }\n}\n\npublic class BinaryNode<Element: Comparable> {\n  public var val: Element\n  public var left: BinaryNode?\n  public var right: BinaryNode?\n\n  public init(_ val: Element, left: BinaryNode? = nil, right: BinaryNode? = nil) {\n    self.val = val\n    self.left = left\n    self.right = right\n  }\n\n  public func preOrderTraversal(visit: (Element?) throws -> ()) rethrows {\n    try visit(val)\n\n    if let left = left {\n      try left.preOrderTraversal(visit: visit)\n    } else {\n      try visit(nil)\n    }\n\n    if let right = right {\n      try right.preOrderTraversal(visit: visit)\n    } else {\n      try visit(nil)\n    }\n  }\n}\n"
  },
  {
    "path": "Encode and Decode Tree/readme.md",
    "content": "# Encode and Decode Binary Tree\n\n> **Note**: The prerequisite for this article is an understanding of how [binary trees](https://github.com/raywenderlich/swift-algorithm-club/tree/master/Binary%20Tree) work.\n\nTrees are complex structures. Unlike linear collections such as arrays or linked lists, trees are *non-linear* and each element in a tree has positional information such as the *parent-child* relationship between nodes. When you want to send a tree structure to your backend, you need to send the data of each node, and a way to represent the parent-child relationship for each node.\n\nYour strategy in how you choose to represent this information is called your **encoding** strategy. The opposite of that - changing your encoded data back to its original form - is your **decoding** strategy. \n\nThere are many ways to encode a tree and decode a tree. The important thing to keep in mind is that encoding and decoding strategies are closely related. The way you choose to encode a tree directly affects how you might decode a tree. \n\nEncoding and decoding are synonyms to *serializing* and *deserializing* trees. \n\nAs a reference, the following code represents the typical `Node` type of a binary tree:\n\n```swift\nclass BinaryNode<Element: Comparable> {\n  var data: Element\n  var leftChild: BinaryNode?\n  var rightChild: BinaryNode?\n\n  // ... (rest of the implementation)\n}\n```\n\nYour encoding and decoding methods will reside in the `BinaryNodeEncoder` and `BinaryNodeDecoder` classes:\n\n```swift\nclass BinaryNodeCoder {\n \n  // transforms nodes into string representation\n  func encode<T>(_ node: BinaryNode<T>) throws -> String where T: Encodable {\n    \n  }\n  \n  // transforms string into `BinaryNode` representation\n  func decode<T>(from string: String) \n    throws -> BinaryNode<T> where T: Decodable {\n  \n  }\n}\n```\n\n## Encoding\n\nAs mentioned before, there are different ways to do encoding. For no particular reason, you'll opt for the following rules:\n\n1. The result of the encoding will be a `String` object.\n2. You'll encode using *pre-order* traversal.\n\nHere's an example of this operation in code:\n\n```swift\nfileprivate extension BinaryNode {\n  \n  // 1\n  func preOrderTraversal(visit: (Element?) throws -> ()) rethrows {\n    try visit(data)\n    \n    if let leftChild = leftChild {\n      try leftChild.preOrderTraversal(visit: visit)\n    } else {\n      try visit(nil)\n    }\n    \n    if let rightChild = rightChild {\n      try rightChild.preOrderTraversal(visit: visit)\n    } else {\n      try visit(nil)\n    }\n  }\n}\n\nclass BinaryNodeCoder {\n\n  // 2\n  private var separator: String { return \",\" }\n  \n  // 3\n  private var nilNode: String { return \"X\" }\n  \n  // 4\n  func encode<T>(_ node: BinaryNode<T>) -> String {\n    var str = \"\"\n    node.preOrderTraversal { data in\n      if let data = data {\n        let string = String(describing: data)\n        str.append(string)\n      } else {\n        str.append(nilNode)\n      }\n      str.append(separator)\n    }\n    return str\n  }\n  \n  // ...\n}\n```\n\nHere's a high level overview of the above code:\n\n2. `separator` is a way to distinguish the nodes in a string. To illustrate its importance, consider the following encoded string \"banana\". How did the tree structure look like before encoding? Without the `separator`, you can't tell.\n\n3. `nilNode` is used to identify empty children. This a necesssary piece of information to retain in order to rebuild the tree later.\n\n4. `encode` returns a `String` representation of the `BinaryNode`. For example: \"ba,nana,nil\" represents a tree with two nodes - \"ba\" and \"nana\" - in pre-order format.\n\n## Decoding\n\nYour decoding strategy is the exact opposite of your encoding strategy. You'll take an encoded string, and turn it back into your binary tree.\n\nYour encoding strategy followed the following rules:\n\n1. The result of the encoding will be a `String` object.\n2. You'll encode using *pre-order* traversal.\n\nThe implementation also added a few important details:\n\n* node values are separated by `,` \n* `nil` children are denoted by the `nil` string\n\nThese details will shape your `decode` operation. Here's a possible implementation:\n\n```swift\n\nclass BinaryNodeCoder {\n\n  // ...\n  \n  // 1\n  func decode<T>(_ string: String) -> BinaryNode<T>? {\n    let components = encoded.lazy.split(separator: separator).reversed().map(String.init)\n    return decode(from: components)\n  }\n  \n  // 2\n  private func decode(from array: inout [String]) -> BinaryNode<String>? {\n    guard !array.isEmpty else { return nil }\n    let value = array.removeLast()\n    guard value != \"\\(nilNode)\" else { return nil }\n    \n    let node = AVLNode<String>(value: value)\n    node.leftChild = decode(from: &array)\n    node.rightChild = decode(from: &array)\n    return node\n  }\n}\n```\n\nHere's a high level overview of the above code:\n\n1. Takes a `String`, and uses `split` to partition the contents of `string` into an array based on the `separator` defined in the encoding step. The result is first `reversed`, and then mapped to a `String`. The `reverse` step is an optimization for the next function, allowing us to use `array.removeLast()` instead of `array.removeFirst()`.\n\n2. Using an array as a stack, you recursively decode each node. The array keeps track of sequence of nodes and progress.\n\nHere's an example output of a tree undergoing the encoding and decoding process:\n\n```\nOriginal Tree\n\n  ┌──8423\n ┌──8391\n │ └──nil\n┌──7838\n│ │ ┌──4936\n│ └──3924\n│  └──2506\n830\n│ ┌──701\n└──202\n └──169\n\nEncoded tree: 830,202,169,X,X,701,X,X,7838,3924,2506,X,X,4936,X,X,8391,X,8423,X,X,\n\nDecoded tree\n\n  ┌──8423\n ┌──8391\n │ └──nil\n┌──7838\n│ │ ┌──4936\n│ └──3924\n│  └──2506\n830\n│ ┌──701\n└──202\n └──169\n ```\n\nNotice the original tree and decoded tree are identical. \n\n## Further Reading & References\n\n- [LeetCode](https://leetcode.com/problems/serialize-and-deserialize-binary-tree/description/)\n\n*Written for the Swift Algorithm Club by Kai Chen & Kelvin Lau*\n\n\n\n"
  },
  {
    "path": "Fixed Size Array/FixedSizeArray.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\n/*\n An unordered array with a maximum size.\n \n Performance is always O(1).\n */\nstruct FixedSizeArray<T> {\n  private var maxSize: Int\n  private var defaultValue: T\n  private var array: [T]\n  private (set) var count = 0\n\n  init(maxSize: Int, defaultValue: T) {\n    self.maxSize = maxSize\n    self.defaultValue = defaultValue\n    self.array = [T](repeating: defaultValue, count: maxSize)\n  }\n\n  subscript(index: Int) -> T {\n    assert(index >= 0)\n    assert(index < count)\n    return array[index]\n  }\n\n  mutating func append(_ newElement: T) {\n    assert(count < maxSize)\n    array[count] = newElement\n    count += 1\n  }\n\n  mutating func removeAt(index: Int) -> T {\n    assert(index >= 0)\n    assert(index < count)\n    count -= 1\n    let result = array[index]\n    array[index] = array[count]\n    array[count] = defaultValue\n    return result\n  }\n\n  mutating func removeAll() {\n    for i in 0..<count {\n      array[i] = defaultValue\n    }\n    count = 0\n  }\n}\n\nvar array = FixedSizeArray(maxSize: 5, defaultValue: 0)\narray.append(4)\narray.append(2)\narray[1]\narray.removeAt(index: 0)\narray.removeAll()\n\n"
  },
  {
    "path": "Fixed Size Array/FixedSizeArray.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Fixed Size Array/FixedSizeArray.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Fixed Size Array/FixedSizeArray.playground/timeline.xctimeline",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Timeline\n   version = \"3.0\">\n   <TimelineItems>\n      <LoggerValueHistoryTimelineItem\n         documentLocation = \"#CharacterRangeLen=5&amp;CharacterRangeLoc=1093&amp;EndingColumnNumber=6&amp;EndingLineNumber=52&amp;StartingColumnNumber=1&amp;StartingLineNumber=52&amp;Timestamp=499691409.537369\"\n         selectedRepresentationIndex = \"0\"\n         shouldTrackSuperviewWidth = \"NO\">\n      </LoggerValueHistoryTimelineItem>\n      <LoggerValueHistoryTimelineItem\n         documentLocation = \"#CharacterRangeLen=5&amp;CharacterRangeLoc=1143&amp;EndingColumnNumber=6&amp;EndingLineNumber=54&amp;StartingColumnNumber=1&amp;StartingLineNumber=54&amp;Timestamp=499691409.537492\"\n         selectedRepresentationIndex = \"0\"\n         shouldTrackSuperviewWidth = \"NO\">\n      </LoggerValueHistoryTimelineItem>\n   </TimelineItems>\n</Timeline>\n"
  },
  {
    "path": "Fixed Size Array/README.markdown",
    "content": "# Fixed-Size Arrays\n\nEarly programming languages didn't have very fancy arrays. You'd create the array with a specific size and from that moment on it would never grow or shrink. Even the standard arrays in C and Objective-C are still of this type.\n\nWhen you define an array like so,\n\n\tint myArray[10];\n\nthe compiler allocates one contiguous block of memory that can hold 40 bytes (assuming an `int` is 4 bytes):\n\n![An array with room for 10 elements](Images/array.png)\n\nThat's your array. It will always be this size. If you need to fit more than 10 elements, you're out of luck... there is no room for it.\n\nTo get an array that grows when it gets full you need to use a [dynamic array](https://en.wikipedia.org/wiki/Dynamic_array) object such as `NSMutableArray` in Objective-C or `std::vector` in C++, or a language like Swift whose arrays increase their capacity as needed.\n\nA major downside of the old-style arrays is that they need to be big enough or you run out of space. But if they are too big you're wasting memory. And you need to be careful about security flaws and crashes due to buffer overflows. In summary, fixed-size arrays are not flexible and they leave no room for error.\n\nThat said, **I like fixed-size arrays** because they are simple, fast, and predictable.\n\nThe following operations are typical for an array:\n\n- append a new element to the end\n- insert a new element at the beginning or somewhere in the middle\n- delete an element\n- look up an element by index\n- count the size of the array\n\nFor a fixed-size array, appending is easy as long as the array isn't full yet:\n\n![Appending a new element](Images/append.png)\n\nLooking up by index is also quick and easy:\n\n![Indexing the array](Images/indexing.png)\n\nThese two operations have complexity **O(1)**, meaning the time it takes to perform them is independent of the size of the array.\n\nFor an array that can grow, appending is more involved: if the array is full, new memory must be allocated and the old contents copied over to the new memory buffer. On average, appending is still an **O(1)** operation, but what goes on under the hood is less predictable.\n\nThe expensive operations are inserting and deleting. When you insert an element somewhere that's not at the end, it requires moving up the remainder of the array by one position. That involves a relatively costly memory copy operation. For example, inserting the value `7` in the middle of the array:\n\n![Insert requires a memory copy](Images/insert.png)\n\nIf your code was using any indexes into the array beyond the insertion point, these indexes are now referring to the wrong objects.\n\nDeleting requires a copy the other way around:\n\n![Delete also requires a memory copy](Images/delete.png)\n\nThis, by the way, is also true for `NSMutableArray` or Swift arrays. Inserting and deleting are **O(n)** operations -- the larger the array the more time it takes.\n\nFixed-size arrays are a good solution when:\n\n1. You know beforehand the maximum number of elements you'll need. In a game this could be the number of sprites that can be active at a time. It's not unreasonable to put a limit on this. (For games it's a good idea to allocate all the objects you need in advance anyway.)\n2. It is not necessary to have a sorted version of the array, i.e. the order of the elements does not matter.\n\nIf the array does not need to be sorted, then an `insertAt(index)` operation is not needed. You can simply append any new elements to the end, until the array is full.\n\nThe code for adding an element becomes:\n\n```swift\nfunc append(_ newElement: T) {\n  if count < maxSize {\n    array[count] = newElement\n    count += 1\n  }\n}\n```\n\nThe `count` variable keeps track of the size of the array and can be considered the index just beyond the last element. That's the index where you'll insert the new element.\n\nDetermining the number of elements in the array is just a matter of reading the `count` variable, a **O(1)** operation.\n\nThe code for removing an element is equally simple:\n\n```swift\nfunc removeAt(index: Int) {\n  count -= 1\n  array[index] = array[count]\n}\n```\n\nThis copies the last element on top of the element you want to remove, and then decrements the size of the array.\n\n![Deleting just means copying one element](Images/delete-no-copy.png)\n\nThis is why the array is not sorted. To avoid an expensive copy of a potentially large portion of the array we copy just one element, but that does change the order of the elements.\n\nThere are now two copies of element `6` in the array, but what was previously the last element is no longer part of the active array. It's just junk data -- the next time you append an new element, this old version of `6` will be overwritten.\n\nUnder these two constraints -- a limit on the number of elements and an unsorted array -- fixed-size arrays are still perfectly suitable for use in modern software.\n\nHere is an implementation in Swift:\n\n```swift\nstruct FixedSizeArray<T> {\n  private var maxSize: Int\n  private var defaultValue: T\n  private var array: [T]\n  private (set) var count = 0\n  \n  init(maxSize: Int, defaultValue: T) {\n    self.maxSize = maxSize\n    self.defaultValue = defaultValue\n    self.array = [T](repeating: defaultValue, count: maxSize)\n  }\n  \n  subscript(index: Int) -> T {\n    assert(index >= 0)\n    assert(index < count)\n    return array[index]\n  }\n  \n  mutating func append(_ newElement: T) {\n    assert(count < maxSize)\n    array[count] = newElement\n    count += 1\n  }\n  \n  mutating func removeAt(index: Int) -> T {\n    assert(index >= 0)\n    assert(index < count)\n    count -= 1\n    let result = array[index]\n    array[index] = array[count]\n    array[count] = defaultValue\n    return result\n  }\n  \n  mutating func removeAll() {\n    for i in 0..<count {\n      array[i] = defaultValue\n    }\n    count = 0\n  }\n}\n```\n\nWhen creating the array, you specify the maximum size and a default value:\n\n```swift\nvar a = FixedSizeArray(maxSize: 10, defaultValue: 0)\n```\n\nNote that `removeAt(index: Int)` overwrites the last element with this `defaultValue` to clean up the \"junk\" object that gets left behind. Normally it wouldn't matter to leave that duplicate object in the array, but if it's a class or a struct it may have strong references to other objects and it's good boyscout practice to zero those out.\n\n*Written for Swift Algorithm Club by Matthijs Hollemans*\n"
  },
  {
    "path": "Fizz Buzz/FizzBuzz.playground/Contents.swift",
    "content": "// Last checked with Xcode Version 11.4.1 (11E503a)\n\nfunc fizzBuzz(_ numberOfTurns: Int) {\n    guard numberOfTurns >= 1 else {\n        print(\"Number of turns must be >= 1\")\n        return\n    }\n    \n    for i in 1...numberOfTurns {\n        switch (i.isMultiple(of: 3), i.isMultiple(of: 5)) {\n        case (false, false):\n            print(\"\\(i)\")\n        case (true, false):\n            print(\"Fizz\")\n        case (false, true):\n            print(\"Buzz\")\n        case (true, true):\n            print(\"Fizz Buzz\")\n        }\n    }\n}\n\nfizzBuzz(15)\n"
  },
  {
    "path": "Fizz Buzz/FizzBuzz.swift",
    "content": "// Last checked with Xcode Version 11.4.1 (11E503a)\n\nfunc fizzBuzz(_ numberOfTurns: Int) {\n    guard numberOfTurns >= 1 else {\n        print(\"Number of turns must be >= 1\")\n        return\n    }\n    \n    for i in 1...numberOfTurns {\n        switch (i.isMultiple(of: 3), i.isMultiple(of: 5)) {\n        case (false, false):\n            print(\"\\(i)\")\n        case (true, false):\n            print(\"Fizz\")\n        case (false, true):\n            print(\"Buzz\")\n        case (true, true):\n            print(\"Fizz Buzz\")\n        }\n    }\n}"
  },
  {
    "path": "Fizz Buzz/README.markdown",
    "content": "# Fizz Buzz\n\nFizz buzz is a group word game for children to teach them about division. Players take turns to count incrementally, replacing any number divisible by three with the word \"fizz\", and any number divisible by five with the word \"buzz\".\n\nFizz buzz has been used as an interview screening device for computer programmers.\n\n## Example\n\nA typical round of fizz buzz:\n\n`1`, `2`, `Fizz`, `4`, `Buzz`, `Fizz`, `7`, `8`, `Fizz`, `Buzz`, `11`, `Fizz`, `13`, `14`, `Fizz Buzz`, `16`, `17`, `Fizz`, `19`, `Buzz`, `Fizz`, `22`, `23`, `Fizz`, `Buzz`, `26`, `Fizz`, `28`, `29`, `Fizz Buzz`, `31`, `32`, `Fizz`, `34`, `Buzz`, `Fizz`, ...\n\n## \tModulus Operator\n\nThe modulus operator `%` is the key to solving fizz buzz.\n\nThe modulus operator returns the remainder after an integer division. Here is an example of the modulus operator:\n\n| Division    | Division Result       | Modulus       | Modulus Result|\n| ----------- | --------------------- | ------------- | :-----------: |\n| 1 / 3       | 0 with a remainder of 3 | 1 % 3         | 1             |\n| 5 / 3       | 1 with a remainder of 2 | 5 % 3         | 2             |\n| 16 / 3      | 5 with a remainder of 1 | 16 % 3        | 1             |\n\nA common approach to determine if a number is even or odd is to use the modulus operator:\n\n| Modulus  | Result | Swift Code                       | Swift Code<br>Result | Comment                                    |\n| -------- | :-----:| -------------------------------- | :----------------:| --------------------------------------------- |\n| 6 % 2    | 0      | `let isEven = (number % 2 == 0)` | `true`            | If a number is divisible by 2 it is *even*    |\n| 5 % 2    | 1      | `let isOdd = (number % 2 != 0)`  | `true`            | If a number is not divisible by 2 it is *odd* |\n\nAlternatively, Swift's built in function .isMultiple(of:) can be used, i.e. 6.isMultiple(of: 2) will return true, 5.isMultiple(of: 2) will return false\n\n## Solving fizz buzz\n\nNow we can use the modulus operator `%` or .isMultiple(of:) method to solve fizz buzz.\n\nFinding numbers divisible by three:\n\n| Modulus | Modulus<br>Result | Swift Code<br>using Modulo | Swift Code<br>using .isMultiple(of:) | Swift Code<br>Result |\n| ------- | :---------------: | -------------------------- | ------------------------------------ | ------------------- |\n|1 % 3    | 1                 | `1 % 3 == 0`               | `1.isMultiple(of: 3)`                | `false`              |\n|2 % 3    | 2                 | `2 % 3 == 0`               | `2.isMultiple(of: 3)`                | `false`              |\n|3 % 3    | 0                 | `3 % 3 == 0`               | `3.isMultiple(of: 3)`                | `true`               |\n|4 % 3    | 1                 | `4 % 3 == 0`               | `4.isMultiple(of: 3)`                | `false`              |\n\nFinding numbers divisible by five:\n\n| Modulus | Modulus<br>Result | Swift Code<br>using Modulo | Swift Code<br>using .isMultiple(of:) | Swift Code<br>Result |\n| ------- | :---------------: | -------------------------- | ------------------------------------ | -------------------- |\n| 1 % 5   | 1                 | `1 % 5 == 0`               | `1.isMultiple(of: 5)`                | `false`              |\n| 2 % 5   | 2                 | `2 % 5 == 0`               | `2.isMultiple(of: 5)`                | `false`              |\n| 3 % 5   | 3                 | `3 % 5 == 0`               | `3.isMultiple(of: 5)`                | `false`              |\n| 4 % 5   | 4                 | `4 % 5 == 0`               | `4.isMultiple(of: 5)`                | `false`              |\n| 5 % 5   | 0                 | `5 % 5 == 0`               | `5.isMultiple(of: 5)`                | `true`               |\n| 6 % 5   | 1                 | `6 % 5 == 0`               | `6.isMultiple(of: 5)`                | `false`              |\n\n## The code\n\nHere is a simple implementation in Swift using Modulus approach\n\n```swift\nfunc fizzBuzz(_ numberOfTurns: Int) {\n  for i in 1...numberOfTurns {\n    var result = \"\"\n\n    if i % 3 == 0 {\n      result += \"Fizz\"\n    }\n\n    if i % 5 == 0 {\n      result += (result.isEmpty ? \"\" : \" \") + \"Buzz\"\n    }\n\n    if result.isEmpty {\n      result += \"\\(i)\"\n    }\n\n    print(result)\n  }\n}\n```\n\nHere is simple implementation in Swift using .isMultiple(of:) and switch statement\n\n```swift\nfunc fizzBuzz(_ numberOfTurns: Int) {\n    guard numberOfTurns >= 1 else {\n        print(\"Number of turns must be >= 1\")\n        return\n    }\n    \n    for i in 1...numberOfTurns {\n        switch (i.isMultiple(of: 3), i.isMultiple(of: 5)) {\n        case (false, false):\n            print(\"\\(i)\")\n        case (true, false):\n            print(\"Fizz\")\n        case (false, true):\n            print(\"Buzz\")\n        case (true, true):\n            print(\"Fizz Buzz\")\n        }\n    }\n}\n```\n\nPut either code in a playground and test it like so:\n\n```swift\nfizzBuzz(15)\n```\n\nThis will output:\n\n1    \n2   \nFizz   \n4   \nBuzz    \nFizz  \n7   \n8   \nFizz   \nBuzz   \n11   \nFizz  \n13   \n14    \nFizz Buzz  \n\n## See also\n\n[Fizz buzz on Wikipedia](https://en.wikipedia.org/wiki/Fizz_buzz)\n\n*Originally written by [Chris Pilcher](https://github.com/chris-pilcher)*<br>\n*Updated by [Lance Rettberg](https://github.com/l-rettberg)*\n"
  },
  {
    "path": "GCD/GCD.playground/Contents.swift",
    "content": "gcd(52, 39)       // 13\ngcd(228, 36)      // 12\ngcd(51357, 3819)  // 57\ngcd(841, 299)     // 1\n\ngcd(52, 39, using: gcdRecursiveEuklid)       // 13\ngcd(228, 36, using:  gcdRecursiveEuklid)      // 12\ngcd(51357, 3819, using: gcdRecursiveEuklid)  // 57\ngcd(841, 299, using: gcdRecursiveEuklid)     // 1\n\ngcd(52, 39, using: gcdBinaryRecursiveStein)       // 13\ngcd(228, 36, using: gcdBinaryRecursiveStein)      // 12\ngcd(51357, 3819, using: gcdBinaryRecursiveStein)  // 57\ngcd(841, 299, using: gcdBinaryRecursiveStein)     // 1\n\ndo {\n    try lcm(2, 3)   // 6\n    try lcm(10, 8, using: gcdRecursiveEuklid)  // 40\n} catch {\n    dump(error)\n}\n"
  },
  {
    "path": "GCD/GCD.playground/Sources/GCD.swift",
    "content": "/*\n Finds the largest positive integer that divides both\n m and n without a remainder.\n\n - Parameter m: First natural number\n - Parameter n: Second natural number\n - Parameter using: The used algorithm to calculate the gcd.\n                    If nothing provided, the Iterative Euclidean\n                    algorithm is used.\n - Returns: The natural gcd of m and n.\n */\npublic func gcd(_ m: Int, _ n: Int, using gcdAlgorithm: (Int, Int) -> (Int) = gcdIterativeEuklid) -> Int {\n    return gcdAlgorithm(m, n)\n}\n\n/*\n Iterative approach based on the Euclidean algorithm.\n The Euclidean algorithm is based on the principle that the greatest\n common divisor of two numbers does not change if the larger number\n is replaced by its difference with the smaller number.\n - Parameter m: First natural number\n - Parameter n: Second natural number\n - Returns: The natural gcd of m and n.\n */\npublic func gcdIterativeEuklid(_ m: Int, _ n: Int) -> Int {\n    var a: Int = 0\n    var b: Int = max(m, n)\n    var r: Int = min(m, n)\n    \n    while r != 0 {\n        a = b\n        b = r\n        r = a % b\n    }\n    return b\n}\n\n/*\n Recursive approach based on the Euclidean algorithm.\n \n - Parameter m: First natural number\n - Parameter n: Second natural number\n - Returns: The natural gcd of m and n.\n - Note: The recursive version makes only tail recursive calls.\n Most compilers for imperative languages do not optimize these.\n The swift compiler as well as the obj-c compiler is able to do\n optimizations for tail recursive calls, even though it still ends\n up to be the same in terms of complexity. That said, tail call\n elimination is not mutually exclusive to recursion.\n */\npublic func gcdRecursiveEuklid(_ m: Int, _ n: Int) -> Int {\n    let r: Int = m % n\n    if r != 0 {\n        return gcdRecursiveEuklid(n, r)\n    } else {\n        return n\n    }\n}\n\n/*\n The binary GCD algorithm, also known as Stein's algorithm,\n is an algorithm that computes the greatest common divisor of two\n nonnegative integers. Stein's algorithm uses simpler arithmetic\n operations than the conventional Euclidean algorithm; it replaces\n division with arithmetic shifts, comparisons, and subtraction.\n \n - Parameter m: First natural number\n - Parameter n: Second natural number\n - Returns: The natural gcd of m and n\n - Complexity: worst case O(n^2), where n is the number of bits\n in the larger of the two numbers. Although each step reduces\n at least one of the operands by at least a factor of 2,\n the subtract and shift operations take linear time for very\n large integers\n */\npublic func gcdBinaryRecursiveStein(_ m: Int, _ n: Int) -> Int {\n    if let easySolution = findEasySolution(m, n) { return easySolution }\n    \n    if (m & 1) == 0 {\n        // m is even\n        if (n & 1) == 1 {\n            // and n is odd\n            return gcdBinaryRecursiveStein(m >> 1, n)\n        } else {\n            // both m and n are even\n            return gcdBinaryRecursiveStein(m >> 1, n >> 1) << 1\n        }\n    } else if (n & 1) == 0 {\n        // m is odd, n is even\n        return gcdBinaryRecursiveStein(m, n >> 1)\n    } else if (m > n) {\n        // reduce larger argument\n        return gcdBinaryRecursiveStein((m - n) >> 1, n)\n    } else {\n        // reduce larger argument\n        return gcdBinaryRecursiveStein((n - m) >> 1, m)\n    }\n}\n\n/*\n Finds an easy solution for the gcd.\n - Parameter m: First natural number\n - Parameter n: Second natural number\n - Returns: A natural gcd of m and n if possible.\n - Note: It might be relevant for different usecases to\n try finding an easy solution for the GCD calculation\n before even starting more difficult operations.\n */\nfunc findEasySolution(_ m: Int, _ n: Int) -> Int? {\n    if m == n {\n        return m\n    }\n    if m == 0 {\n        return n\n    }\n    if n == 0 {\n        return m\n    }\n    return nil\n}\n\n\npublic enum LCMError: Error {\n    case divisionByZero\n}\n\n/*\n Calculates the lcm for two given numbers using a specified gcd algorithm.\n \n - Parameter m: First natural number.\n - Parameter n: Second natural number.\n - Parameter using: The used gcd algorithm to calculate the lcm.\n                    If nothing provided, the Iterative Euclidean\n                    algorithm is used.\n - Throws: Can throw a `divisionByZero` error if one of the given\n attributes turns out to be zero or less.\n - Returns: The least common multiplier of the two attributes as\n an unsigned integer\n */\npublic func lcm(_ m: Int, _ n: Int, using gcdAlgorithm: (Int, Int) -> (Int) = gcdIterativeEuklid) throws -> Int {\n    guard m & n != 0 else { throw LCMError.divisionByZero }\n    return m / gcdAlgorithm(m, n) * n\n}\n"
  },
  {
    "path": "GCD/GCD.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "GCD/GCD.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "GCD/GCD.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "GCD/README.markdown",
    "content": "# Greatest Common Divisor\n\nThe *greatest common divisor* (or Greatest Common Factor) of two numbers `a` and `b` is the largest positive integer that divides both `a` and `b` without a remainder. The GCD.swift file contains three different algorithms of how to calculate the greatest common divisor.\nFor example, `gcd(39, 52) = 13` because 13 divides 39 (`39 / 13 = 3`) as well as 52 (`52 / 13 = 4`). But there is no larger number than 13 that divides them both.\nYou've probably had to learn about this in school at some point. :-)\n\nYou probably won't need to use the GCD or LCM in any real-world problems, but it's cool to play around with this ancient algorithm. It was first described by Euklid in his [Elements](http://publicdomainreview.org/collections/the-first-six-books-of-the-elements-of-euclid-1847/) around 300 BC. Rumor has it that he discovered this algorithm while he was hacking on his Commodore 64.\n\n## Different Algorithms\n\nThis example includes three different algorithms to find the same result. \n\n### Iterative Euklidean\n\nThe laborious way to find the GCD of two numbers is to first figure out the factors of both numbers, then take the greatest number they have in common. The problem is that factoring numbers is quite difficult, especially when they get larger. (On the plus side, that difficulty is also what keeps your online payments secure.)\nThere is a smarter way to calculate the GCD: Euklid's algorithm. The big idea here is that,\n\n\tgcd(a, b) = gcd(b, a % b)\n\nwhere `a % b` calculates the remainder of `a` divided by `b`.\n\nHere is an implementation of this idea in Swift:\n\n```swift\nfunc gcdIterativeEuklid(_ m: Int, _ n: Int) -> Int {\n    var a: Int = 0\n    var b: Int = max(m, n)\n    var r: Int = min(m, n)\n\n    while r != 0 {\n        a = b\n        b = r\n        r = a % b\n    }\n    return b\n}\n```\n\nPut it in a playground and try it out with these examples:\n\n```swift\ngcd(52, 39, using: gcdIterativeEuklid)        // 13\ngcd(228, 36, using: gcdIterativeEuklid)       // 12\ngcd(51357, 3819, using: gcdIterativeEuklid)   // 57\n```\n\n### Recursive Euklidean\n\nHere is a slightly different implementation of Euklid's algorithm. Unlike the first version this doesn't use a `while` loop, but leverages recursion.\n\n```swift\nfunc gcdRecursiveEuklid(_ m: Int, _ n: Int) -> Int {\n    let r: Int = m % n\n    if r != 0 {\n        return gcdRecursiveEuklid(n, r)\n    } else {\n        return n\n    }\n}\n```\n\nPut it in a playground and compare it with the results of the iterative Eulidean gcd. They should return the same results:\n\n```swift\ngcd(52, 39, using: gcdRecursiveEuklid)        // 13\ngcd(228, 36, using: gcdRecursiveEuklid)       // 12\ngcd(51357, 3819, using: gcdRecursiveEuklid)   // 57\n```\n\nThe `max()` and `min()` at the top of the function make sure we always divide the larger number by the smaller one.\n\nLet's step through the third example using the *recursive Euklidean algorithm* here:\n\n\tgcd(51357, 3819)\n\nAccording to Euklid's rule, this is equivalent to,\n\n\tgcd(3819, 51357 % 3819) = gcd(3819, 1710)\n\nbecause the remainder of `51357 % 3819` is `1710`. If you work out this division you get `51357 = (13 * 3819) + 1710` but we only care about the remainder part.\n\nSo `gcd(51357, 3819)` is the same as `gcd(3819, 1710)`. That's useful because we can keep simplifying:\n\n\tgcd(3819, 1710) = gcd(1710, 3819 % 1710) =\n\tgcd(1710, 399)  = gcd(399, 1710 % 399)   =\n\tgcd(399, 114)   = gcd(114, 399 % 114)    =\n\tgcd(114, 57)    = gcd(57, 114 % 57)      =\n\tgcd(57, 0)\n\nAnd now can't divide any further. The remainder of `114 / 57` is zero because `114 = 57 * 2` exactly. That means we've found the answer:\n\n\tgcd(3819, 51357) = gcd(57, 0) = 57\n\nSo in each step of Euklid's algorithm the numbers become smaller and at some point it ends when one of them becomes zero.\n\nBy the way, it's also possible that two numbers have a GCD of 1. They are said to be *relatively prime*. This happens when there is no number that divides them both, for example:\n\n```swift\ngcd(841, 299)     // 1\n```\n\n### Binary Recursive Stein\n\nThe binary GCD algorithm, also known as Stein's algorithm, is an algorithm that computes the greatest common divisor of two nonnegative integers. Stein's algorithm is very similar to the recursive Eulidean algorithm, but uses arithmetical operations, which are simpler for computers to perform, than the conventional Euclidean algorithm does. It replaces division with arithmetic shifts, comparisons, and subtraction.\n\n```swift\nfunc gcdBinaryRecursiveStein(_ m: Int, _ n: Int) -> Int {\n    if let easySolution = findEasySolution(m, n) { return easySolution }\n\n    if (m & 1) == 0 {\n        // m is even\n        if (n & 1) == 1 {\n            // and n is odd\n            return gcdBinaryRecursiveStein(m >> 1, n)\n        } else {\n            // both m and n are even\n            return gcdBinaryRecursiveStein(m >> 1, n >> 1) << 1\n        }\n    } else if (n & 1) == 0 {\n        // m is odd, n is even\n        return gcdBinaryRecursiveStein(m, n >> 1)\n    } else if (m > n) {\n        // reduce larger argument\n        return gcdBinaryRecursiveStein((m - n) >> 1, n)\n    } else {\n        // reduce larger argument\n        return gcdBinaryRecursiveStein((n - m) >> 1, m)\n    }\n}\n```\n\nDepending on your application and your input expectations, it might be reasonable to also search for an \"easy solution\" using the other gcd implementations:\n\n```swift\nfunc findEasySolution(_ m: Int, _ n: Int) -> Int? {\n    if m == n {\n        return m\n    }\n    if m == 0 {\n        return n\n    }\n    if n == 0 {\n        return m\n    }\n    return nil\n}\n\n```\n\nPut it in a playground and compare it with the results of the other gcd implementations:\n\n```swift\ngcd(52, 39, using: gcdBinaryRecursiveStein)        // 13\ngcd(228, 36, using: gcdBinaryRecursiveStein)       // 12\ngcd(51357, 3819, using: gcdBinaryRecursiveStein)   // 57\n```\n\n### Least Common Multiple\n\nAnother algorithm related to the GCD is the *least common multiple* or LCM.\n\nThe least common multiple of two numbers `a` and `b` is the smallest positive integer that is a multiple of both. In other words, the LCM is evenly divisible by `a` and `b`. The example implementation of the LCM takes two numbers and an optional specification which GCD algorithm is used.\n\nFor example: `lcm(2, 3, using: gcdRecursiveEuklid) = 6` , which tells us that 6 is the smallest number that can be devided by 2 as well as 3.\n\nWe can calculate the LCM using Euklid's algorithm too:\n\na * b\nlcm(a, b) = ---------\ngcd(a, b)\n\nIn code:\n\n```swift\nfunc lcm(_ m: Int, _ n: Int, using gcdAlgorithm: (Int, Int) -> (Int) = gcdIterativeEuklid) throws -> Int {\nguard (m & n) != 0 else { throw LCMError.divisionByZero }\nreturn m / gcdAlgorithm(m, n) * n\n}\n```\n\nAnd to try it out in a playground:\n\n```swift\nlcm(10, 8)    // 40\n```\n\n## Discussion\n\nWhile these algorithms all calculate the same result, comparing their plane complexity might not be enough to decide for one of them, though. The original iterative Euklidean algorithm is easier to understand. The recursive Euklidean and Stein's algorithm, while being generally faster, their runtime is heavily dependend on the environment they are running on.\n_If a fast calculation of the gcd is necessary, a runtime comparison for the specific platform and compiler optimization level should be done for the rekursive Euklidean and Stein's algorithm._\n\n*Written for Swift Algorithm Club by Matthijs Hollemans*\n\n*Extended by Simon C. Krüger*\n"
  },
  {
    "path": "Genetic/README.markdown",
    "content": "# Genetic Algorthim\n\n## What is it?\n\nA genetic algorithm (GA) is process inspired by natural selection to find high quality solutions. Most commonly used for optimization. GAs rely on the bio-inspired processes of natural selection, more specifically the process of selection (fitness), crossover and mutation. To understand more, let's walk through these processes in terms of biology:\n\n### Selection\n>**Selection**, in biology, the preferential survival and reproduction or preferential elimination of individuals with certain genotypes (genetic compositions), by means of natural or artificial controlling factors.\n\nIn other words, survival of the fittest. Organisms that survive in their environment tend to reproduce more. With GAs we generate a fitness model that will rank individuals and give them a better chance for reproduction.\n\n### Crossover\n>**Chromosomal crossover** (or crossing over) is the exchange of genetic material between homologous chromosomes that results in recombinant chromosomes during sexual reproduction [Wikipedia](https://en.wikipedia.org/wiki/Chromosomal_crossover)\n\nSimply reproduction. A generation will be a mixed representation of the previous generation, with offspring taking DNA from both parents. GAs do this by randomly, but weightily, mating offspring to create new generations.\n\n### Mutation\n>**Mutation**, an alteration in the genetic material (the genome) of a cell of a living organism or of a virus that is more or less permanent and that can be transmitted to the cell’s or the virus’s descendants. [Britannica](https://www.britannica.com/science/mutation-genetics)\n\nThe randomization that allows for organisms to change over time. In GAs we build a randomization process that will mutate offspring in a population in order to introduce fitness variance.\n\n### Resources:\n* [Genetic Algorithms in Search Optimization, and Machine Learning](https://www.amazon.com/Genetic-Algorithms-Optimization-Machine-Learning/dp/0201157675/ref=sr_1_sc_1?ie=UTF8&qid=1520628364&sr=8-1-spell&keywords=Genetic+Algortithms+in+search)\n* [Wikipedia](https://en.wikipedia.org/wiki/Genetic_algorithm)\n* [My Original Gist](https://gist.github.com/blainerothrock/efda6e12fe10792c99c990f8ff3daeba)\n\n## The Code\n\n### Problem\nFor this quick and dirty example, we are going to produce an optimized string using a simple genetic algorithm. More specifically we are trying to take a randomly generated origin string of a fixed length and evolve it into the most optimized string of our choosing.\n\nWe will be creating a bio-inspired world where the absolute existence is the string `Hello, World!`. Nothing in this universe is better and it's our goal to get as close to it as possible to ensure survival.\n\n### Define the Universe\n\nBefore we dive into the core processes we need to set up our \"universe\". First let's define a lexicon, a set of everything that exists in our universe.\n\n```swift\nlet lex: [UInt8] = \" !\\\"#$%&\\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\".asciiArray\n```\n\nTo make things easier, we are actually going to work in [Unicode values](https://en.wikipedia.org/wiki/List_of_Unicode_characters), so let's define a String extension to help with that.\n\n```swift\nextension String {\n  var unicodeArray: [UInt8] {\n    return [UInt8](self.utf8)\n  }\n}\n```\n\n Now, let's define a few global variables for the universe:\n * `OPTIMAL`: This is the end goal and what we will be using to rate fitness. In the real world this will not exist\n * `DNA_SIZE`: The length of the string in our population. Organisms need to be similar\n * `POP_SIZE`: Size of each generation\n * `MAX_GENERATIONS`: Max number of generations, script will stop when it reach 5000 if the optimal value is not found\n * `MUTATION_CHANCE`: The chance in which a random nucleotide can mutate (`1/MUTATION_CHANCE`)\n\n ```swift\nlet OPTIMAL:[UInt8] = \"Hello, World\".unicodeArray\nlet DNA_SIZE = OPTIMAL.count\nlet POP_SIZE = 50\nlet GENERATIONS = 5000\nlet MUTATION_CHANCE = 100\n ```\n\n ### Population Zero\n\nBefore selecting, crossover and mutation, we need a population to start with. Now that we have the universe defined we can write that function:\n\n ```swift\n func randomPopulation(from lexicon: [UInt8], populationSize: Int, dnaSize: Int) -> [[UInt8]] {\n    guard lexicon.count > 1 else { return [] }\n    var pop = [[UInt8]]()\n\n    (0..<populationSize).forEach { _ in\n        var dna = [UInt8]()\n        (0..<dnaSize).forEach { _ in\n            let char = lexicon.randomElement()! // guaranteed to be non-nil by initial guard statement\n            dna.append(char)\n        }\n        pop.append(dna)\n    }\n    return pop\n }\n ```\n\n### Selection\n\nThere are two parts to the selection process, the first is calculating the fitness, which will assign a rating to a individual. We do this by simply calculating how close the individual is to the optimal string using unicode values:\n\n```swift\nfunc calculateFitness(dna: [UInt8], optimal: [UInt8]) -> Int {\n    guard dna.count == optimal.count else { return -1 }\n    var fitness = 0\n    for index in dna.indices {\n        fitness += abs(Int(dna[index]) - Int(optimal[index]))\n    }\n    return fitness\n}\n```\n\nThe above will produce a fitness value to an individual. The perfect solution, \"Hello, World\" will have a fitness of 0. \"Gello, World\" will have a fitness of 1 since it is one unicode value off from the optimal (`H->G`).\n\nThis example is very simple, but it'll work for our example. In a real world problem, the optimal solution is unknown or impossible. [Here](https://iccl.inf.tu-dresden.de/w/images/b/b7/GA_for_TSP.pdf) is a paper about optimizing a solution for the famous [traveling salesman problem](https://en.wikipedia.org/wiki/Travelling_salesman_problem) using a GA. In this example the problem is unsolvable by modern computers, but you can rate a individual solution by distance traveled. The optimal fitness here is an impossible 0. The closer the solution is to 0, the better chance for survival. In our example we will reach our goal, a fitness of 0.\n\nThe second part to selection is weighted choice, also called roulette wheel selection. This defines how individuals are selected for the reproduction process out of the current population. Just because you are the best choice for natural selection doesn't mean the environment will select you. The individual could fall off a cliff, get dysentery or be unable to reproduce.\n\nLet's take a second and ask why on this one. Why would you not always want to select the most fit from a population? It's hard to see from this simple example, but let's think about dog breeding, because breeders remove this process and hand select dogs for the next generation. As a result you get improved desired characteristics, but the individuals will also continue to carry genetic disorders that come along with those traits. A certain \"branch\" of evolution may beat out the current fittest solution at a later time. This may be ok depending on the problem, but to keep this educational we will go with the bio-inspired way.\n\nWith all that, here is our weight choice function:\n\nfunc weightedChoice(items: [(dna: [UInt8], weight: Double)]) -> (dna: [UInt8], weight: Double) {\n    \n    let total = items.reduce(0) { $0 + $1.weight }\n    var n = Double.random(in: 0..<(total * 1000000)) / 1000000.0\n    \n    for item in items {\n        if n < item.weight {\n            return item\n        }\n        n = n - item.weight\n    }\n    return items[1]\n}\n\n\nThe above function takes a list of individuals with their calculated fitness. Then selects one at random offset by their fitness value. The horrible 1,000,000 multiplication and division is to insure precision by calculating decimals. `Double.random` only uses integers so this is required to convert to a precise Double, it's not perfect, but enough for our example.\n\n## Mutation\n\nThe all powerful mutation, the thing that introduces otherwise non existent fitness variance. It can either hurt of improve a individuals fitness but over time it will cause evolution towards more fit populations. Imagine if our initial random population was missing the charachter `H`, in that case we need to rely on mutation to introduce that character into the population in order to achieve the optimal solution.\n\n```swift\nfunc mutate(lexicon: [UInt8], dna: [UInt8], mutationChance: Int) -> [UInt8] {\n    var outputDna = dna\n    (0..<dna.count).forEach { i in\n        let rand = Int.random(in: 0..<mutationChance)\n        if rand == 1 {\n            outputDna[i] = lexicon.randomElement()!\n        }\n    }\n    \n    return outputDna\n}\n```\n\nTakes a mutation chance and a individual and returns that individual with mutations, if any.\n\nThis allows for a population to explore all the possibilities of it's building blocks and randomly stumble on a better solution. If there is too much mutation, the evolution process will get nowhere. If there is too little the populations will become too similar and never be able to branch out of a defect to meet their changing environment.\n\n## Crossover\n\nCrossover, the sexy part of a GA, is how offspring are created from 2 selected individuals in the current population. This is done by splitting the parents into 2 parts, then combining 1 part from each parent to create the offspring. To promote diversity, we randomly select a index to split the parents.\n\n```swift\nfunc crossover(dna1: [UInt8], dna2: [UInt8], dnaSize: Int) -> [UInt8] {\n    let pos = Int.random(in: 0..<dnaSize)\n    \n    let dna1Index1 = dna1.index(dna1.startIndex, offsetBy: pos)\n    let dna2Index1 = dna2.index(dna2.startIndex, offsetBy: pos)\n    \n    return [UInt8](dna1.prefix(upTo: dna1Index1) + dna2.suffix(from: dna2Index1))\n}\n```\n\nThe above is used to generate a completely new generation based on the current generation.\n\n## Putting it all together -- Running the Genetic Algorithm\n\nWe now have all the functions we need to kick off the algorithm. Let's start from the beginning, first we need a random population to serve as a starting point. We will also initialize a fittest variable to hold the fittest individual, we will initialize it with the first individual of our random population.\n\n```swift\nvar population:[[UInt8]] = randomPopulation(from: lex, populationSize: POP_SIZE, dnaSize: DNA_SIZE)\nvar fittest = population[0]\n```\n\nNow for the meat, the remainder of the code will take place in the generation loop, running once for every generation:\n\n```swift\nfor generation in 0...GENERATIONS {\n  // run\n}\n```\n\nNow, for each individual in the population, we need to calculate its fitness and weighted value. Since 0 is the best value we will use `1/fitness` to represent the weight. Note this is not a percent, but just how much more likely the value is to be selected over others. If the highest number was the most fit, the weight calculation would be `fitness/totalFitness`, which would be a percent.\n\n```swift\nvar weightedPopulation = [(dna:[UInt8], weight:Double)]()\n\nfor individual in population {\n  let fitnessValue = calculateFitness(dna: individual, optimal: OPTIMAL)\n  let pair = ( individual, fitnessValue == 0 ? 1.0 : 1.0/Double( fitnessValue ) )\n  weightedPopulation.append(pair)\n}\n```\n\nFrom here we can start to build the next generation.\n\n```swift\nvar nextGeneration = []\n```\n\nThe below loop is where we pull everything together. We loop for `POP_SIZE`, selecting 2 individuals by weighted choice, crossover their values to produce a offspring, then finial subject the new individual to mutation. Once completed we have a completely new generation based on the last generation.\n\n```swift\n0...POP_SIZE).forEach { _ in\n    let ind1 = weightedChoice(items: weightedPopulation)\n    let ind2 = weightedChoice(items: weightedPopulation)\n\n    let offspring = crossover(dna1: ind1.dna, dna2: ind2.dna, dnaSize: DNA_SIZE)\n\n    // append to the population and mutate\n    nextGeneration.append(mutate(lexicon: lex, dna: offspring, mutationChance: MUTATION_CHANCE))\n}\n```\n\nThe final piece to the main loop is to select the fittest individual of a population:\n\n```swift\nfittest = population[0]\nvar minFitness = calculateFitness(dna: fittest, optimal: OPTIMAL)\n\npopulation.forEach { indv in\n    let indvFitness = calculateFitness(dna: indv, optimal: OPTIMAL)\n    if indvFitness < minFitness {\n        fittest = indv\n        minFitness = indvFitness\n    }\n}\nif minFitness == 0 { break; }\nprint(\"\\(generation): \\(String(bytes: fittest, encoding: .utf8)!)\")\n```\n\nSince we know the fittest string, I've added a `break` to kill the program if we find it. At the end of a loop add a print statement for the fittest string:\n\n```swift\nprint(\"fittest string: \\(String(bytes: fittest, encoding: .utf8)!)\")\n```\n\nNow we can run the program! Playgrounds are a nice place to develop, but are going to run this program **very slow**. I highly suggest running in Terminal: `swift gen.swift`. When running you should see something like this and it should not take too long to get `Hello, World`:\n\n```text\n0: RXclh F HDko\n1: DkyssjgElk];\n2: TiM4u) DrKvZ\n3: Dkysu) DrKvZ\n4: -kysu) DrKvZ\n5: Tlwsu) DrKvZ\n6: Tlwsu) Drd}k\n7: Tlwsu) Drd}k\n8: Tlwsu) Drd}k\n9: Tlwsu) Drd}k\n10: G^csu) |zd}k\n11: G^csu) |zdko\n12: G^csu) |zdko\n13: Dkysu) Drd}k\n14: G^wsu) `rd}k\n15: Dkysu) `rdko\n16: Dkysu) `rdko\n17: Glwsu) `rdko\n18: TXysu) `rdkc\n19: U^wsu) `rdko\n20: G^wsu) `rdko\n21: Glysu) `rdko\n22: G^ysu) `rdko\n23: G^ysu) `ryko\n24: G^wsu) `rdko\n25: G^wsu) `rdko\n26: G^wsu) `rdko\n...\n1408: Hello, Wormd\n1409: Hello, Wormd\n1410: Hello, Wormd\n1411: Hello, Wormd\n1412: Hello, Wormd\n1413: Hello, Wormd\n1414: Hello, Wormd\n1415: Hello, Wormd\n1416: Hello, Wormd\n1417: Hello, Wormd\n1418: Hello, Wormd\n1419: Hello, Wormd\n1420: Hello, Wormd\n1421: Hello, Wormd\n1422: Hello, Wormd\n1423: Hello, Wormd\n1424: Hello, Wormd\n1425: Hello, Wormd\n1426: Hello, Wormd\n1427: Hello, Wormd\n1428: Hello, Wormd\n1429: Hello, Wormd\n1430: Hello, Wormd\n1431: Hello, Wormd\n1432: Hello, Wormd\n1433: Hello, Wormd\n1434: Hello, Wormd\n1435: Hello, Wormd\nfittest string: Hello, World\n```\n\nHow long it takes will vary since this is based on randomization, but it should almost always finish in under 5000 generations. Woo!\n\n\n## Now What?\n\nWe did it, we have a running simple genetic algorithm. Take some time a play around with the global variables, `POP_SIZE`, `OPTIMAL`, `MUTATION_CHANCE`, `GENERATIONS`. Just make sure to only add characters that are in the lexicon or update the lexicon.\n\nFor an example let's try something much longer: `Ray Wenderlich's Swift Algorithm Club Rocks`. Plug that string into `OPTIMAL` and change `GENERATIONS` to `10000`. You'll be able to see that the we are getting somewhere, but you most likely will not reach the optimal string in 10,000 generations. Since we have a larger string let's raise our mutation chance to `200` (1/2 as likely to mutate). You may not get there, but you should get a lot closer than before. With a longer string, too much mutation can make it hard for fit strings to survive. Now try either upping `POP_SIZE` or increase `GENERATIONS`. Either way you should eventually get the value, but there will be a \"sweet spot\" for an string of a certain size.\n\nPlease submit any kind of update to this tutorial or add more examples!\n"
  },
  {
    "path": "Genetic/gen.playground/Contents.swift",
    "content": "\n\nextension String {\n  \n  var unicodeArray: [UInt8] {\n    return [UInt8](self.utf8)\n  }\n}\n\nlet lex: [UInt8] = \" !\\\"#$%&\\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\".unicodeArray\n\n// This is the end goal and what we will be using to rate fitness. In the real world this will not exist\nlet OPTIMAL:[UInt8] = \"Hello, World\".unicodeArray\n\n// The length of the string in our population. Organisms need to be similar\nlet DNA_SIZE = OPTIMAL.count\n\n// Size of each generation\nlet POP_SIZE = 50\n\n// Max number of generations, script will stop when it reaches 5000 if the optimal value is not found\nlet GENERATIONS = 5000\n\n// The chance in which a random nucleotide can mutate (1/n)\nlet MUTATION_CHANCE = 100\n\nfunc randomPopulation(from lexicon: [UInt8], populationSize: Int, dnaSize: Int) -> [[UInt8]] {\n  var pop = [[UInt8]]()\n  \n  (0..<populationSize).forEach { _ in\n    var dna = [UInt8]()\n    (0..<dnaSize).forEach { _ in\n      let char = lexicon.randomElement()!\n      dna.append(char)\n    }\n    pop.append(dna)\n  }\n  return pop\n}\n\nfunc calculateFitness(dna: [UInt8], optimal: [UInt8]) -> Int {\n  var fitness = 0\n  for index in dna.indices {\n    fitness += abs(Int(dna[index]) - Int(optimal[index]))\n  }\n  return fitness\n}\n\nfunc weightedChoice(items: [(dna: [UInt8], weight: Double)]) -> (dna: [UInt8], weight: Double) {\n  \n  let total = items.reduce(0) { $0 + $1.weight }\n  var n = Double.random(in: 0..<(total * 1000000)) / 1000000.0\n  \n  for item in items {\n    if n < item.weight {\n      return item\n    }\n    n = n - item.weight\n  }\n  return items[1]\n}\n\nfunc mutate(lexicon: [UInt8], dna: [UInt8], mutationChance: Int) -> [UInt8] {\n  var outputDna = dna\n  (0..<dna.count).forEach { i in\n    let rand = Int.random(in: 0..<mutationChance)\n    if rand == 1 {\n      outputDna[i] = lexicon.randomElement()!\n    }\n  }\n  \n  return outputDna\n}\n\nfunc crossover(dna1: [UInt8], dna2: [UInt8], dnaSize: Int) -> [UInt8] {\n  let pos = Int.random(in: 0..<dnaSize)\n  \n  let dna1Index1 = dna1.index(dna1.startIndex, offsetBy: pos)\n  let dna2Index1 = dna2.index(dna2.startIndex, offsetBy: pos)\n  \n  return [UInt8](dna1.prefix(upTo: dna1Index1) + dna2.suffix(from: dna2Index1))\n}\n\nvar population: [[UInt8]] = randomPopulation(from: lex, populationSize: POP_SIZE, dnaSize: DNA_SIZE)\nvar fittest = population[0]\nimport Foundation\n\nfunc main() {\n  for generation in 0...GENERATIONS {\n    var weightedPopulation = [(dna: [UInt8], weight: Double)]()\n    \n    for individual in population {\n      let fitnessValue = calculateFitness(dna: individual, optimal: OPTIMAL)\n      let pair = (individual, fitnessValue == 0 ? 1.0 : 1.0/Double(fitnessValue))\n      weightedPopulation.append(pair)\n    }\n    \n    population = []\n    \n    (0...POP_SIZE).forEach { _ in\n      let ind1 = weightedChoice(items: weightedPopulation)\n      let ind2 = weightedChoice(items: weightedPopulation)\n      \n      let offspring = crossover(dna1: ind1.dna, dna2: ind2.dna, dnaSize: DNA_SIZE)\n      population.append(mutate(lexicon: lex, dna: offspring, mutationChance: MUTATION_CHANCE))\n    }\n    \n    fittest = population[0]\n    var minFitness = calculateFitness(dna: fittest, optimal: OPTIMAL)\n    \n    population.forEach { indv in\n      let indvFitness = calculateFitness(dna: indv, optimal: OPTIMAL)\n      if indvFitness < minFitness {\n        fittest = indv\n        minFitness = indvFitness\n      }\n    }\n    \n    if minFitness == 0 { break }\n    print(\"\\(generation): \\(String(bytes: fittest, encoding: .utf8)!)\")\n  }\n  print(\"fittest string: \\(String(bytes: fittest, encoding: .utf8)!)\")\n}\nmain()\n"
  },
  {
    "path": "Genetic/gen.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Genetic/gen.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Genetic/gen.swift",
    "content": "//: Playground - noun: a place where people can play\n\nimport Foundation\n\nextension String {\n    var unicodeArray: [UInt8] {\n        return [UInt8](self.utf8)\n    }\n}\n\n\nlet lex: [UInt8] = \" !\\\"#$%&\\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\".unicodeArray\n\n// This is the end goal and what we will be using to rate fitness. In the real world this will not exist\nlet OPTIMAL:[UInt8] = \"Hello, World\".unicodeArray\n\n// The length of the string in our population. Organisms need to be similar\nlet DNA_SIZE = OPTIMAL.count\n\n// size of each generation\nlet POP_SIZE = 50\n\n// max number of generations, script will stop when it reach 5000 if the optimal value is not found\nlet MAX_GENERATIONS = 5000\n\n// The chance in which a random nucleotide can mutate (1/n)\nlet MUTATION_CHANCE = 100\n\nfunc randomChar(from lexicon: [UInt8]) -> UInt8 {\n    let len = UInt32(lexicon.count-1)\n    let rand = Int(arc4random_uniform(len))\n    return lexicon[rand]\n}\n\nfunc randomPopulation(from lexicon: [UInt8], populationSize: Int, dnaSize: Int) -> [[UInt8]] {\n\n   var pop = [[UInt8]]()\n\n   (0..<populationSize).forEach { _ in\n       var dna = [UInt8]()\n       (0..<dnaSize).forEach { _ in\n           let char = randomChar(from: lexicon)\n           dna.append(char)\n       }\n       pop.append(dna)\n   }\n   return pop\n}\n\nfunc calculateFitness(dna:[UInt8], optimal:[UInt8]) -> Int {\n    var fitness = 0\n    (0...dna.count-1).forEach { c in\n        fitness += abs(Int(dna[c]) - Int(optimal[c]))\n    }\n    return fitness\n}\n\nfunc weightedChoice(items:[(dna:[UInt8], weight:Double)]) -> (dna:[UInt8], weight:Double) {\n\n    let total = items.reduce(0.0) { return $0 + $1.weight}\n\n    var n = Double(arc4random_uniform(UInt32(total * 1000000.0))) / 1000000.0\n\n    for item in items {\n        if n < item.weight {\n            return item\n        }\n        n = n - item.weight\n    }\n    return items[1]\n}\n\nfunc mutate(lexicon: [UInt8], dna:[UInt8], mutationChance:Int) -> [UInt8] {\n    var outputDna = dna\n\n    (0..<dna.count).forEach { i in\n        let rand = Int(arc4random_uniform(UInt32(mutationChance)))\n        if rand == 1 {\n            outputDna[i] = randomChar(from: lexicon)\n        }\n    }\n\n    return outputDna\n}\n\n\nfunc crossover(dna1:[UInt8], dna2:[UInt8], dnaSize:Int) -> [UInt8] {\n    let pos = Int(arc4random_uniform(UInt32(dnaSize-1)))\n\n    let dna1Index1 = dna1.index(dna1.startIndex, offsetBy: pos)\n    let dna2Index1 = dna2.index(dna2.startIndex, offsetBy: pos)\n\n    return [UInt8](dna1.prefix(upTo: dna1Index1) + dna2.suffix(from: dna2Index1))\n}\n\nfunc main() {\n\n    // generate the starting random population\n    var population:[[UInt8]] = randomPopulation(from: lex, populationSize: POP_SIZE, dnaSize: DNA_SIZE)\n    // print(\"population: \\(population), dnaSize: \\(DNA_SIZE) \")\n    var fittest = [UInt8]()\n\n    for generation in 0...MAX_GENERATIONS {\n\n        var weightedPopulation = [(dna:[UInt8], weight:Double)]()\n\n        // calulcated the fitness of each individual in the population\n        // and add it to the weight population (weighted = 1.0/fitness)\n        for individual in population {\n            let fitnessValue = calculateFitness(dna: individual, optimal: OPTIMAL)\n\n            let pair = ( individual, fitnessValue == 0 ? 1.0 : Double(100/POP_SIZE)/Double( fitnessValue ) )\n\n            weightedPopulation.append(pair)\n        }\n\n        population = []\n\n        // create a new generation using the individuals in the origional population\n        (0...POP_SIZE).forEach { _ in\n            let ind1 = weightedChoice(items: weightedPopulation)\n            let ind2 = weightedChoice(items: weightedPopulation)\n\n            let offspring = crossover(dna1: ind1.dna, dna2: ind2.dna, dnaSize: DNA_SIZE)\n\n            // append to the population and mutate\n            population.append(mutate(lexicon: lex, dna: offspring, mutationChance: MUTATION_CHANCE))\n        }\n\n        fittest = population[0]\n        var minFitness = calculateFitness(dna: fittest, optimal: OPTIMAL)\n\n        // parse the population for the fittest string\n        population.forEach { indv in\n            let indvFitness = calculateFitness(dna: indv, optimal: OPTIMAL)\n            if indvFitness < minFitness {\n                fittest = indv\n                minFitness = indvFitness\n            }\n        }\n        if minFitness == 0 { break; }\n        print(\"\\(generation): \\(String(bytes: fittest, encoding: .utf8)!)\")\n\n    }\n    print(\"fittest string: \\(String(bytes: fittest, encoding: .utf8)!)\")\n}\n\nmain()\n"
  },
  {
    "path": "Graph/Graph/AdjacencyListGraph.swift",
    "content": "//\n//  AdjacencyListGraph.swift\n//  Graph\n//\n//  Created by Andrew McKnight on 5/13/16.\n//\n\nimport Foundation\n\nprivate class EdgeList<T> where T: Hashable {\n\n  var vertex: Vertex<T>\n  var edges: [Edge<T>]?\n\n  init(vertex: Vertex<T>) {\n    self.vertex = vertex\n  }\n\n  func addEdge(_ edge: Edge<T>) {\n    edges?.append(edge)\n  }\n\n}\n\nopen class AdjacencyListGraph<T>: AbstractGraph<T> where T: Hashable {\n\n  fileprivate var adjacencyList: [EdgeList<T>] = []\n\n  public required init() {\n    super.init()\n  }\n\n  public required init(fromGraph graph: AbstractGraph<T>) {\n    super.init(fromGraph: graph)\n  }\n\n  open override var vertices: [Vertex<T>] {\n    var vertices = [Vertex<T>]()\n    for edgeList in adjacencyList {\n      vertices.append(edgeList.vertex)\n    }\n    return vertices\n  }\n\n  open override var edges: [Edge<T>] {\n    var allEdges = Set<Edge<T>>()\n    for edgeList in adjacencyList {\n      guard let edges = edgeList.edges else {\n        continue\n      }\n\n      for edge in edges {\n        allEdges.insert(edge)\n      }\n    }\n    return Array(allEdges)\n  }\n\n  open override func createVertex(_ data: T) -> Vertex<T> {\n    // check if the vertex already exists\n    let matchingVertices = vertices.filter { vertex in\n      return vertex.data == data\n    }\n\n    if matchingVertices.count > 0 {\n      return matchingVertices.last!\n    }\n\n    // if the vertex doesn't exist, create a new one\n    let vertex = Vertex(data: data, index: adjacencyList.count)\n    adjacencyList.append(EdgeList(vertex: vertex))\n    return vertex\n  }\n\n  open override func addDirectedEdge(_ from: Vertex<T>, to: Vertex<T>, withWeight weight: Double?) {\n    // works\n    let edge = Edge(from: from, to: to, weight: weight)\n    let edgeList = adjacencyList[from.index]\n    if edgeList.edges != nil {\n        edgeList.addEdge(edge)\n    } else {\n        edgeList.edges = [edge]\n    }\n  }\n\n  open override func addUndirectedEdge(_ vertices: (Vertex<T>, Vertex<T>), withWeight weight: Double?) {\n    addDirectedEdge(vertices.0, to: vertices.1, withWeight: weight)\n    addDirectedEdge(vertices.1, to: vertices.0, withWeight: weight)\n  }\n\n  open override func weightFrom(_ sourceVertex: Vertex<T>, to destinationVertex: Vertex<T>) -> Double? {\n    guard let edges = adjacencyList[sourceVertex.index].edges else {\n      return nil\n    }\n\n    for edge: Edge<T> in edges {\n      if edge.to == destinationVertex {\n        return edge.weight\n      }\n    }\n\n    return nil\n  }\n\n  open override func edgesFrom(_ sourceVertex: Vertex<T>) -> [Edge<T>] {\n    return adjacencyList[sourceVertex.index].edges ?? []\n  }\n\n  open override var description: String {\n    var rows = [String]()\n    for edgeList in adjacencyList {\n\n      guard let edges = edgeList.edges else {\n        continue\n      }\n\n      var row = [String]()\n      for edge in edges {\n        var value = \"\\(edge.to.data)\"\n        if edge.weight != nil {\n          value = \"(\\(value): \\(edge.weight!))\"\n        }\n        row.append(value)\n      }\n\n      rows.append(\"\\(edgeList.vertex.data) -> [\\(row.joined(separator: \", \"))]\")\n    }\n\n    return rows.joined(separator: \"\\n\")\n  }\n}\n"
  },
  {
    "path": "Graph/Graph/AdjacencyMatrixGraph.swift",
    "content": "//\n//  AdjacencyMatrixGraph.swift\n//  Graph\n//\n//  Created by Andrew McKnight on 5/13/16.\n//\n\nimport Foundation\n\nopen class AdjacencyMatrixGraph<T>: AbstractGraph<T> where T: Hashable {\n\n  // If adjacencyMatrix[i][j] is not nil, then there is an edge from\n  // vertex i to vertex j.\n  fileprivate var adjacencyMatrix: [[Double?]] = []\n  fileprivate var _vertices: [Vertex<T>] = []\n\n  public required init() {\n    super.init()\n  }\n\n  public required init(fromGraph graph: AbstractGraph<T>) {\n    super.init(fromGraph: graph)\n  }\n\n  open override var vertices: [Vertex<T>] {\n    return _vertices\n  }\n\n  open override var edges: [Edge<T>] {\n    var edges = [Edge<T>]()\n    for row in 0 ..< adjacencyMatrix.count {\n      for column in 0 ..< adjacencyMatrix.count {\n        if let weight = adjacencyMatrix[row][column] {\n          edges.append(Edge(from: vertices[row], to: vertices[column], weight: weight))\n        }\n      }\n    }\n    return edges\n  }\n\n  // Adds a new vertex to the matrix.\n  // Performance: possibly O(n^2) because of the resizing of the matrix.\n  open override func createVertex(_ data: T) -> Vertex<T> {\n    // check if the vertex already exists\n    let matchingVertices = vertices.filter { vertex in\n      return vertex.data == data\n    }\n\n    if matchingVertices.count > 0 {\n      return matchingVertices.last!\n    }\n\n    // if the vertex doesn't exist, create a new one\n    let vertex = Vertex(data: data, index: adjacencyMatrix.count)\n\n    // Expand each existing row to the right one column.\n    for i in 0 ..< adjacencyMatrix.count {\n      adjacencyMatrix[i].append(nil)\n    }\n\n    // Add one new row at the bottom.\n    let newRow = [Double?](repeating: nil, count: adjacencyMatrix.count + 1)\n    adjacencyMatrix.append(newRow)\n\n    _vertices.append(vertex)\n\n    return vertex\n  }\n\n  open override func addDirectedEdge(_ from: Vertex<T>, to: Vertex<T>, withWeight weight: Double?) {\n    adjacencyMatrix[from.index][to.index] = weight\n  }\n\n  open override func addUndirectedEdge(_ vertices: (Vertex<T>, Vertex<T>), withWeight weight: Double?) {\n    addDirectedEdge(vertices.0, to: vertices.1, withWeight: weight)\n    addDirectedEdge(vertices.1, to: vertices.0, withWeight: weight)\n  }\n\n  open override func weightFrom(_ sourceVertex: Vertex<T>, to destinationVertex: Vertex<T>) -> Double? {\n    return adjacencyMatrix[sourceVertex.index][destinationVertex.index]\n  }\n\n  open override func edgesFrom(_ sourceVertex: Vertex<T>) -> [Edge<T>] {\n    var outEdges = [Edge<T>]()\n    let fromIndex = sourceVertex.index\n    for column in 0..<adjacencyMatrix.count {\n      if let weight = adjacencyMatrix[fromIndex][column] {\n        outEdges.append(Edge(from: sourceVertex, to: vertices[column], weight: weight))\n      }\n    }\n    return outEdges\n  }\n\n  open override var description: String {\n    var grid = [String]()\n    let n = self.adjacencyMatrix.count\n    for i in 0..<n {\n      var row = \"\"\n      for j in 0..<n {\n        if let value = self.adjacencyMatrix[i][j] {\n          let number = NSString(format: \"%.1f\", value)\n          row += \"\\(value >= 0 ? \" \" : \"\")\\(number) \"\n        } else {\n          row += \"  ø  \"\n        }\n      }\n      grid.append(row)\n    }\n    return (grid as NSArray).componentsJoined(by: \"\\n\")\n  }\n\n}\n"
  },
  {
    "path": "Graph/Graph/Edge.swift",
    "content": "//\n//  Edge.swift\n//  Graph\n//\n//  Created by Andrew McKnight on 5/8/16.\n//\n\nimport Foundation\n\npublic struct Edge<T>: Equatable where T: Hashable {\n\n  public let from: Vertex<T>\n  public let to: Vertex<T>\n\n  public let weight: Double?\n\n}\n\nextension Edge: CustomStringConvertible {\n\n  public var description: String {\n    guard let unwrappedWeight = weight else {\n      return \"\\(from.description) -> \\(to.description)\"\n    }\n    return \"\\(from.description) -(\\(unwrappedWeight))-> \\(to.description)\"\n  }\n\n}\n\nextension Edge: Hashable {\n\n  public func hash(into hasher: inout Hasher) {\n    hasher.combine(from)\n    hasher.combine(to)\n    if weight != nil {\n      hasher.combine(weight)\n    }\n  }\n\n}\n\npublic func == <T>(lhs: Edge<T>, rhs: Edge<T>) -> Bool {\n  guard lhs.from == rhs.from else {\n    return false\n  }\n\n  guard lhs.to == rhs.to else {\n    return false\n  }\n\n  guard lhs.weight == rhs.weight else {\n    return false\n  }\n\n  return true\n}\n"
  },
  {
    "path": "Graph/Graph/Graph.h",
    "content": "//\n//  Graph.h\n//  Graph\n//\n//  Created by Andrew McKnight on 5/8/16.\n//\n\n#import <Cocoa/Cocoa.h>\n\n//! Project version number for Graph.\nFOUNDATION_EXPORT double GraphVersionNumber;\n\n//! Project version string for Graph.\nFOUNDATION_EXPORT const unsigned char GraphVersionString[];\n\n// In this header, you should import all the public headers of your framework using statements like #import <Graph/PublicHeader.h>\n\n\n"
  },
  {
    "path": "Graph/Graph/Graph.swift",
    "content": "//\n//  Graph.swift\n//  Graph\n//\n//  Created by Andrew McKnight on 5/8/16.\n//\n\nimport Foundation\n\nopen class AbstractGraph<T>: CustomStringConvertible where T: Hashable {\n\n  public required init() {}\n\n  public required init(fromGraph graph: AbstractGraph<T>) {\n    for edge in graph.edges {\n      let from = createVertex(edge.from.data)\n      let to = createVertex(edge.to.data)\n\n      addDirectedEdge(from, to: to, withWeight: edge.weight)\n    }\n  }\n\n  open var description: String {\n    fatalError(\"abstract property accessed\")\n  }\n\n  open var vertices: [Vertex<T>] {\n    fatalError(\"abstract property accessed\")\n  }\n\n  open var edges: [Edge<T>] {\n    fatalError(\"abstract property accessed\")\n  }\n\n  // Adds a new vertex to the matrix.\n  // Performance: possibly O(n^2) because of the resizing of the matrix.\n  open func createVertex(_ data: T) -> Vertex<T> {\n    fatalError(\"abstract function called\")\n  }\n\n  open func addDirectedEdge(_ from: Vertex<T>, to: Vertex<T>, withWeight weight: Double?) {\n    fatalError(\"abstract function called\")\n  }\n\n  open func addUndirectedEdge(_ vertices: (Vertex<T>, Vertex<T>), withWeight weight: Double?) {\n    fatalError(\"abstract function called\")\n  }\n\n  open func weightFrom(_ sourceVertex: Vertex<T>, to destinationVertex: Vertex<T>) -> Double? {\n    fatalError(\"abstract function called\")\n  }\n\n  open func edgesFrom(_ sourceVertex: Vertex<T>) -> [Edge<T>] {\n    fatalError(\"abstract function called\")\n  }\n}\n"
  },
  {
    "path": "Graph/Graph/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>FMWK</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>$(CURRENT_PROJECT_VERSION)</string>\n\t<key>NSPrincipalClass</key>\n\t<string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Graph/Graph/Vertex.swift",
    "content": "//\n//  Vertex.swift\n//  Graph\n//\n//  Created by Andrew McKnight on 5/8/16.\n//\n\nimport Foundation\n\npublic struct Vertex<T>: Equatable where T: Hashable {\n\n  public var data: T\n  public let index: Int\n\n}\n\nextension Vertex: CustomStringConvertible {\n\n  public var description: String {\n    return \"\\(index): \\(data)\"\n  }\n\n}\n\nextension Vertex: Hashable {\n\n  public func hasher(into hasher: inout Hasher) {\n    hasher.combine(data)\n    hasher.combine(index)\n  }\n\n}\n\npublic func ==<T>(lhs: Vertex<T>, rhs: Vertex<T>) -> Bool {\n  guard lhs.index == rhs.index else {\n    return false\n  }\n\n  guard lhs.data == rhs.data else {\n    return false\n  }\n\n  return true\n}\n"
  },
  {
    "path": "Graph/Graph.playground/Contents.swift",
    "content": "import Graph\n\nfor graph in [AdjacencyMatrixGraph<Int>(), AdjacencyListGraph<Int>()] {\n\n  let v1 = graph.createVertex(1)\n  let v2 = graph.createVertex(2)\n  let v3 = graph.createVertex(3)\n  let v4 = graph.createVertex(4)\n  let v5 = graph.createVertex(5)\n\n  // Set up a cycle like so:\n  //               v5\n  //                ^\n  //                | (3.2)\n  //                |\n  // v1 ---(1)---> v2 ---(1)---> v3 ---(4.5)---> v4\n  // ^                                            |\n  // |                                            V\n  // ---------<-----------<---------(2.8)----<----|\n\n  graph.addDirectedEdge(v1, to: v2, withWeight: 1.0)\n  graph.addDirectedEdge(v2, to: v3, withWeight: 1.0)\n  graph.addDirectedEdge(v3, to: v4, withWeight: 4.5)\n  graph.addDirectedEdge(v4, to: v1, withWeight: 2.8)\n  graph.addDirectedEdge(v2, to: v5, withWeight: 3.2)\n\n  // Returns the weight of the edge from v1 to v2 (1.0)\n  graph.weightFrom(v1, to: v2)\n\n  // Returns the weight of the edge from v1 to v3 (nil, since there is not an edge)\n  graph.weightFrom(v1, to: v3)\n\n  // Returns the weight of the edge from v3 to v4 (4.5)\n  graph.weightFrom(v3, to: v4)\n\n  // Returns the weight of the edge from v4 to v1 (2.8)\n  graph.weightFrom(v4, to: v1)\n\n  print(graph)\n  print() // separate by a newline\n}\n"
  },
  {
    "path": "Graph/Graph.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='6.0' target-platform='osx' display-mode='rendered'/>"
  },
  {
    "path": "Graph/Graph.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Graph/Graph.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Graph/Graph.playground/timeline.xctimeline",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Timeline\n   version = \"3.0\">\n   <TimelineItems>\n      <LoggerValueHistoryTimelineItem\n         documentLocation = \"file:///Users/ashishkakkad/Ashish/iOS/GitHub/swift-algorithm-club/Graph/Graph.playground#CharacterRangeLen=12&amp;CharacterRangeLoc=1238&amp;EndingColumnNumber=4&amp;EndingLineNumber=39&amp;StartingColumnNumber=7&amp;StartingLineNumber=38&amp;Timestamp=560365411.415967\"\n         selectedRepresentationIndex = \"1\"\n         shouldTrackSuperviewWidth = \"NO\">\n      </LoggerValueHistoryTimelineItem>\n   </TimelineItems>\n</Timeline>\n"
  },
  {
    "path": "Graph/Graph.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t491AA3761CE6B81C00A2E2C5 /* AdjacencyListGraph.swift in Sources */ = {isa = PBXBuildFile; fileRef = 491AA3751CE6B81C00A2E2C5 /* AdjacencyListGraph.swift */; };\n\t\t491AA3781CE6B82E00A2E2C5 /* AdjacencyMatrixGraph.swift in Sources */ = {isa = PBXBuildFile; fileRef = 491AA3771CE6B82E00A2E2C5 /* AdjacencyMatrixGraph.swift */; };\n\t\t49BFA3011CDF886B00522D66 /* Graph.h in Headers */ = {isa = PBXBuildFile; fileRef = 49BFA3001CDF886B00522D66 /* Graph.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t49BFA3081CDF886B00522D66 /* Graph.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 49BFA2FD1CDF886B00522D66 /* Graph.framework */; };\n\t\t49BFA30D1CDF886B00522D66 /* GraphTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49BFA30C1CDF886B00522D66 /* GraphTests.swift */; };\n\t\t49BFA3181CDF887E00522D66 /* Graph.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49BFA3171CDF887E00522D66 /* Graph.swift */; };\n\t\t49BFA3271CDF899400522D66 /* Edge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49BFA3261CDF899400522D66 /* Edge.swift */; };\n\t\t49BFA32F1CDF89FC00522D66 /* Vertex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49BFA32E1CDF89FC00522D66 /* Vertex.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t49BFA3091CDF886B00522D66 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 49BFA2F41CDF886B00522D66 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 49BFA2FC1CDF886B00522D66;\n\t\t\tremoteInfo = Graph;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\t491AA3751CE6B81C00A2E2C5 /* AdjacencyListGraph.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AdjacencyListGraph.swift; sourceTree = \"<group>\"; };\n\t\t491AA3771CE6B82E00A2E2C5 /* AdjacencyMatrixGraph.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AdjacencyMatrixGraph.swift; sourceTree = \"<group>\"; };\n\t\t49BFA2FD1CDF886B00522D66 /* Graph.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Graph.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t49BFA3001CDF886B00522D66 /* Graph.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Graph.h; sourceTree = \"<group>\"; };\n\t\t49BFA3021CDF886B00522D66 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t49BFA3071CDF886B00522D66 /* GraphTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GraphTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t49BFA30C1CDF886B00522D66 /* GraphTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GraphTests.swift; sourceTree = \"<group>\"; };\n\t\t49BFA30E1CDF886B00522D66 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t49BFA3171CDF887E00522D66 /* Graph.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Graph.swift; sourceTree = \"<group>\"; };\n\t\t49BFA3261CDF899400522D66 /* Edge.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Edge.swift; sourceTree = \"<group>\"; };\n\t\t49BFA32E1CDF89FC00522D66 /* Vertex.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Vertex.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t49BFA2F91CDF886B00522D66 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t49BFA3041CDF886B00522D66 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t49BFA3081CDF886B00522D66 /* Graph.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t49BFA2F31CDF886B00522D66 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t49BFA2FF1CDF886B00522D66 /* Graph */,\n\t\t\t\t49BFA30B1CDF886B00522D66 /* GraphTests */,\n\t\t\t\t49BFA2FE1CDF886B00522D66 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t49BFA2FE1CDF886B00522D66 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t49BFA2FD1CDF886B00522D66 /* Graph.framework */,\n\t\t\t\t49BFA3071CDF886B00522D66 /* GraphTests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t49BFA2FF1CDF886B00522D66 /* Graph */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t49BFA3001CDF886B00522D66 /* Graph.h */,\n\t\t\t\t49BFA3021CDF886B00522D66 /* Info.plist */,\n\t\t\t\t49BFA3261CDF899400522D66 /* Edge.swift */,\n\t\t\t\t49BFA32E1CDF89FC00522D66 /* Vertex.swift */,\n\t\t\t\t49BFA3171CDF887E00522D66 /* Graph.swift */,\n\t\t\t\t491AA3751CE6B81C00A2E2C5 /* AdjacencyListGraph.swift */,\n\t\t\t\t491AA3771CE6B82E00A2E2C5 /* AdjacencyMatrixGraph.swift */,\n\t\t\t);\n\t\t\tpath = Graph;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t49BFA30B1CDF886B00522D66 /* GraphTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t49BFA30C1CDF886B00522D66 /* GraphTests.swift */,\n\t\t\t\t49BFA30E1CDF886B00522D66 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = GraphTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXHeadersBuildPhase section */\n\t\t49BFA2FA1CDF886B00522D66 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t49BFA3011CDF886B00522D66 /* Graph.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXHeadersBuildPhase section */\n\n/* Begin PBXNativeTarget section */\n\t\t49BFA2FC1CDF886B00522D66 /* Graph */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 49BFA3111CDF886B00522D66 /* Build configuration list for PBXNativeTarget \"Graph\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t49BFA2F81CDF886B00522D66 /* Sources */,\n\t\t\t\t49BFA2F91CDF886B00522D66 /* Frameworks */,\n\t\t\t\t49BFA2FA1CDF886B00522D66 /* Headers */,\n\t\t\t\t49BFA2FB1CDF886B00522D66 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Graph;\n\t\t\tproductName = Graph;\n\t\t\tproductReference = 49BFA2FD1CDF886B00522D66 /* Graph.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t49BFA3061CDF886B00522D66 /* GraphTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 49BFA3141CDF886B00522D66 /* Build configuration list for PBXNativeTarget \"GraphTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t49BFA3031CDF886B00522D66 /* Sources */,\n\t\t\t\t49BFA3041CDF886B00522D66 /* Frameworks */,\n\t\t\t\t49BFA3051CDF886B00522D66 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t49BFA30A1CDF886B00522D66 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = GraphTests;\n\t\t\tproductName = GraphTests;\n\t\t\tproductReference = 49BFA3071CDF886B00522D66 /* GraphTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t49BFA2F41CDF886B00522D66 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0730;\n\t\t\t\tLastUpgradeCheck = 1000;\n\t\t\t\tORGANIZATIONNAME = \"Swift Algorithm Club\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t49BFA2FC1CDF886B00522D66 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.3;\n\t\t\t\t\t\tLastSwiftMigration = 0900;\n\t\t\t\t\t};\n\t\t\t\t\t49BFA3061CDF886B00522D66 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.3;\n\t\t\t\t\t\tLastSwiftMigration = 0820;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 49BFA2F71CDF886B00522D66 /* Build configuration list for PBXProject \"Graph\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t);\n\t\t\tmainGroup = 49BFA2F31CDF886B00522D66;\n\t\t\tproductRefGroup = 49BFA2FE1CDF886B00522D66 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t49BFA2FC1CDF886B00522D66 /* Graph */,\n\t\t\t\t49BFA3061CDF886B00522D66 /* GraphTests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t49BFA2FB1CDF886B00522D66 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t49BFA3051CDF886B00522D66 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t49BFA2F81CDF886B00522D66 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t491AA3761CE6B81C00A2E2C5 /* AdjacencyListGraph.swift in Sources */,\n\t\t\t\t49BFA3271CDF899400522D66 /* Edge.swift in Sources */,\n\t\t\t\t491AA3781CE6B82E00A2E2C5 /* AdjacencyMatrixGraph.swift in Sources */,\n\t\t\t\t49BFA3181CDF887E00522D66 /* Graph.swift in Sources */,\n\t\t\t\t49BFA32F1CDF89FC00522D66 /* Vertex.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t49BFA3031CDF886B00522D66 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t49BFA30D1CDF886B00522D66 /* GraphTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t49BFA30A1CDF886B00522D66 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 49BFA2FC1CDF886B00522D66 /* Graph */;\n\t\t\ttargetProxy = 49BFA3091CDF886B00522D66 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin XCBuildConfiguration section */\n\t\t49BFA30F1CDF886B00522D66 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t49BFA3101CDF886B00522D66 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t49BFA3121CDF886B00522D66 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tFRAMEWORK_VERSION = A;\n\t\t\t\tINFOPLIST_FILE = Graph/Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.swift-algorithm-club.Graph\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Off;\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t49BFA3131CDF886B00522D66 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tFRAMEWORK_VERSION = A;\n\t\t\t\tINFOPLIST_FILE = Graph/Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.swift-algorithm-club.Graph\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Off;\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t49BFA3151CDF886B00522D66 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = GraphTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.swift-algorithm-club.GraphTests\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 3.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t49BFA3161CDF886B00522D66 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = GraphTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.swift-algorithm-club.GraphTests\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 3.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t49BFA2F71CDF886B00522D66 /* Build configuration list for PBXProject \"Graph\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t49BFA30F1CDF886B00522D66 /* Debug */,\n\t\t\t\t49BFA3101CDF886B00522D66 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t49BFA3111CDF886B00522D66 /* Build configuration list for PBXNativeTarget \"Graph\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t49BFA3121CDF886B00522D66 /* Debug */,\n\t\t\t\t49BFA3131CDF886B00522D66 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t49BFA3141CDF886B00522D66 /* Build configuration list for PBXNativeTarget \"GraphTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t49BFA3151CDF886B00522D66 /* Debug */,\n\t\t\t\t49BFA3161CDF886B00522D66 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 49BFA2F41CDF886B00522D66 /* Project object */;\n}\n"
  },
  {
    "path": "Graph/Graph.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n</Workspace>\n"
  },
  {
    "path": "Graph/Graph.xcodeproj/xcshareddata/xcschemes/Graph.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1010\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"49BFA2FC1CDF886B00522D66\"\n               BuildableName = \"Graph.framework\"\n               BlueprintName = \"Graph\"\n               ReferencedContainer = \"container:Graph.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"49BFA2FC1CDF886B00522D66\"\n            BuildableName = \"Graph.framework\"\n            BlueprintName = \"Graph\"\n            ReferencedContainer = \"container:Graph.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"49BFA2FC1CDF886B00522D66\"\n            BuildableName = \"Graph.framework\"\n            BlueprintName = \"Graph\"\n            ReferencedContainer = \"container:Graph.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Graph/Graph.xcodeproj/xcshareddata/xcschemes/GraphTests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1010\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"49BFA3061CDF886B00522D66\"\n               BuildableName = \"GraphTests.xctest\"\n               BlueprintName = \"GraphTests\"\n               ReferencedContainer = \"container:Graph.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"49BFA3061CDF886B00522D66\"\n               BuildableName = \"GraphTests.xctest\"\n               BlueprintName = \"GraphTests\"\n               ReferencedContainer = \"container:Graph.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"49BFA3061CDF886B00522D66\"\n            BuildableName = \"GraphTests.xctest\"\n            BlueprintName = \"GraphTests\"\n            ReferencedContainer = \"container:Graph.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"49BFA3061CDF886B00522D66\"\n            BuildableName = \"GraphTests.xctest\"\n            BlueprintName = \"GraphTests\"\n            ReferencedContainer = \"container:Graph.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Graph/Graph.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:Graph.playground\">\n   </FileRef>\n   <FileRef\n      location = \"group:Graph.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Graph/Graph.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Graph/Graph.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Graph/GraphTests/GraphTests.swift",
    "content": "//\n//  GraphTests.swift\n//  GraphTests\n//\n//  Created by Andrew McKnight on 5/8/16.\n//\n\nimport XCTest\n@testable import Graph\n\nclass GraphTests: XCTestCase {\n\n  func testAdjacencyMatrixGraphDescription() {\n\n    let graph = AdjacencyMatrixGraph<String>()\n\n    let a = graph.createVertex(\"a\")\n    let b = graph.createVertex(\"b\")\n    let c = graph.createVertex(\"c\")\n\n    graph.addDirectedEdge(a, to: b, withWeight: 1.0)\n    graph.addDirectedEdge(b, to: c, withWeight: 2.0)\n\n    let expectedValue = \"  ø   1.0   ø  \\n  ø    ø   2.0 \\n  ø    ø    ø  \"\n    XCTAssertEqual(graph.description, expectedValue)\n  }\n\n  func testAdjacencyListGraphDescription() {\n\n    let graph = AdjacencyListGraph<String>()\n\n    let a = graph.createVertex(\"a\")\n    let b = graph.createVertex(\"b\")\n    let c = graph.createVertex(\"c\")\n\n    graph.addDirectedEdge(a, to: b, withWeight: 1.0)\n    graph.addDirectedEdge(b, to: c, withWeight: 2.0)\n    graph.addDirectedEdge(a, to: c, withWeight: -5.5)\n\n    let expectedValue = \"a -> [(b: 1.0), (c: -5.5)]\\nb -> [(c: 2.0)]\"\n    XCTAssertEqual(graph.description, expectedValue)\n  }\n\n  func testAddingPreexistingVertex() {\n    let adjacencyList = AdjacencyListGraph<String>()\n    let adjacencyMatrix = AdjacencyMatrixGraph<String>()\n\n    for graph in [adjacencyList, adjacencyMatrix] {\n      let a = graph.createVertex(\"a\")\n      let b = graph.createVertex(\"a\")\n\n      XCTAssertEqual(a, b, \"Should have returned the same vertex when creating a new one with identical data\")\n      XCTAssertEqual(graph.vertices.count, 1, \"Graph should only contain one vertex after trying to create two vertices with identical data\")\n    }\n  }\n\n  func testEdgesFromReturnsCorrectEdgeInSingleEdgeDirecedGraphWithType(_ graphType: AbstractGraph<Int>.Type) {\n    let graph = graphType.init()\n\n    let a = graph.createVertex(1)\n    let b = graph.createVertex(2)\n\n    graph.addDirectedEdge(a, to: b, withWeight: 1.0)\n\n    let edgesFromA = graph.edgesFrom(a)\n    let edgesFromB = graph.edgesFrom(b)\n\n    XCTAssertEqual(edgesFromA.count, 1)\n    XCTAssertEqual(edgesFromB.count, 0)\n\n    XCTAssertEqual(edgesFromA.first?.to, b)\n  }\n\n  func testEdgesFromReturnsCorrectEdgeInSingleEdgeUndirectedGraphWithType(_ graphType: AbstractGraph<Int>.Type) {\n    let graph = graphType.init()\n\n    let a = graph.createVertex(1)\n    let b = graph.createVertex(2)\n\n    graph.addUndirectedEdge((a, b), withWeight: 1.0)\n\n    let edgesFromA = graph.edgesFrom(a)\n    let edgesFromB = graph.edgesFrom(b)\n\n    XCTAssertEqual(edgesFromA.count, 1)\n    XCTAssertEqual(edgesFromB.count, 1)\n\n    XCTAssertEqual(edgesFromA.first?.to, b)\n    XCTAssertEqual(edgesFromB.first?.to, a)\n  }\n\n  func testEdgesFromReturnsNoEdgesInNoEdgeGraphWithType(_ graphType: AbstractGraph<Int>.Type) {\n    let graph = graphType.init()\n\n    let a = graph.createVertex(1)\n    let b = graph.createVertex(2)\n\n    XCTAssertEqual(graph.edgesFrom(a).count, 0)\n    XCTAssertEqual(graph.edgesFrom(b).count, 0)\n  }\n\n  func testEdgesFromReturnsCorrectEdgesInBiggerGraphInDirectedGraphWithType(_ graphType: AbstractGraph<Int>.Type) {\n    let graph = graphType.init()\n    let verticesCount = 100\n    var vertices: [Vertex<Int>] = []\n\n    for i in 0..<verticesCount {\n      vertices.append(graph.createVertex(i))\n    }\n\n    for i in 0..<verticesCount {\n      for j in i+1..<verticesCount {\n        graph.addDirectedEdge(vertices[i], to: vertices[j], withWeight: 1)\n      }\n    }\n\n    for i in 0..<verticesCount {\n      let outEdges = graph.edgesFrom(vertices[i])\n      let toVertices = outEdges.map {return $0.to}\n      XCTAssertEqual(outEdges.count, verticesCount - i - 1)\n      for j in i+1..<verticesCount {\n        XCTAssertTrue(toVertices.contains(vertices[j]))\n      }\n    }\n  }\n\n  func testEdgesFromReturnsCorrectEdgeInSingleEdgeDirecedMatrixGraph() {\n    testEdgesFromReturnsCorrectEdgeInSingleEdgeDirecedGraphWithType(AdjacencyMatrixGraph<Int>.self)\n  }\n\n  func testEdgesFromReturnsCorrectEdgeInSingleEdgeUndirectedMatrixGraph() {\n    testEdgesFromReturnsCorrectEdgeInSingleEdgeUndirectedGraphWithType(AdjacencyMatrixGraph<Int>.self)\n  }\n\n  func testEdgesFromReturnsNoInNoEdgeMatrixGraph() {\n    testEdgesFromReturnsNoEdgesInNoEdgeGraphWithType(AdjacencyMatrixGraph<Int>.self)\n  }\n\n  func testEdgesFromReturnsCorrectEdgesInBiggerGraphInDirectedMatrixGraph() {\n    testEdgesFromReturnsCorrectEdgesInBiggerGraphInDirectedGraphWithType(AdjacencyMatrixGraph<Int>.self)\n  }\n\n  func testEdgesFromReturnsCorrectEdgeInSingleEdgeDirecedListGraph() {\n    testEdgesFromReturnsCorrectEdgeInSingleEdgeDirecedGraphWithType(AdjacencyListGraph<Int>.self)\n  }\n\n  func testEdgesFromReturnsCorrectEdgeInSingleEdgeUndirectedListGraph() {\n    testEdgesFromReturnsCorrectEdgeInSingleEdgeUndirectedGraphWithType(AdjacencyListGraph<Int>.self)\n  }\n\n  func testEdgesFromReturnsNoInNoEdgeListGraph() {\n    testEdgesFromReturnsNoEdgesInNoEdgeGraphWithType(AdjacencyListGraph<Int>.self)\n  }\n\n  func testEdgesFromReturnsCorrectEdgesInBiggerGraphInDirectedListGraph() {\n    testEdgesFromReturnsCorrectEdgesInBiggerGraphInDirectedGraphWithType(AdjacencyListGraph<Int>.self)\n  }\n}\n"
  },
  {
    "path": "Graph/GraphTests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Graph/README.markdown",
    "content": "# Graph\n\n> This topic has been tutorialized [here](https://www.raywenderlich.com/152046/swift-algorithm-club-graphs-adjacency-list)\n\n\nA graph looks like the following picture:\n\n![A graph](Images/Graph.png)\n\nIn computer science, a graph is defined as a set of *vertices* paired with a set of *edges*. The vertices are represented by circles, and the edges are the lines between them. Edges connect a vertex to other vertices.\n\n> **Note:** Vertices are sometimes called \"nodes\", and edges are called \"links\".\n\nA graph can represent a social network. Each person is a vertex, and people who know each other are connected by edges. Here is a somewhat historically inaccurate example:\n\n![Social network](Images/SocialNetwork.png)\n\nGraphs have various shapes and sizes. The edges can have a *weight*, where a positive or negative numeric value is assigned to each edge. Consider an example of a graph representing airplane flights. Cities can be vertices, and flights can be edges. Then, an edge weight could describe flight time or the price of a ticket.\n\n![Airplane flights](Images/Flights.png)\n\nWith this hypothetical airline, flying from San Francisco to Moscow is cheapest by going through New York.\n\nEdges can also be *directed*. In examples mentioned above, the edges are undirected. For instance, if Ada knows Charles, then Charles also knows Ada. A directed edge, on the other hand, implies a one-way relationship. A directed edge from vertex X to vertex Y connects X to Y, but *not* Y to X.\n\nContinuing from the flights example, a directed edge from San Francisco to Juneau in Alaska indicates that there is a flight from San Francisco to Juneau, but not from Juneau to San Francisco (I suppose that means you're walking back).\n\n![One-way flights](Images/FlightsDirected.png)\n\nThe following are also graphs:\n\n![Tree and linked list](Images/TreeAndList.png)\n\nOn the left is a [tree](../Tree/) structure, on the right a [linked list](../Linked%20List/). They can be considered graphs but in a simpler form. They both have vertices (nodes) and edges (links).\n\nThe first graph includes *cycles*, where you can start off at a vertex, follow a path, and come back to the original vertex. A tree is a graph without such cycles.\n\nAnother common type of graph is the *directed acyclic graph* or DAG:\n\n![DAG](Images/DAG.png)\n\nLike a tree, this graph does not have any cycles (no matter where you start, there is no path back to the starting vertex), but this graph has directional edges with the shape that does not necessarily form a hierarchy.\n\n## Why use graphs?\n\nMaybe you're shrugging your shoulders and thinking, what's the big deal? Well, it turns out that a graph is a useful data structure.\n\nIf you have a programming problem where you can represent your data as vertices and edges, then you can draw your problem as a graph and use well-known graph algorithms such as [breadth-first search](../Breadth-First%20Search/) or [depth-first search](../Depth-First%20Search) to find a solution.\n\nFor example, suppose you have a list of tasks where some tasks have to wait on others before they can begin. You can model this using an acyclic directed graph:\n\n![Tasks as a graph](Images/Tasks.png)\n\nEach vertex represents a task. An edge between two vertices means the source task must be completed before the destination task can start. As an example, task C cannot start before B and D are finished, and B nor D can start before A is finished.\n\nNow that the problem is expressed using a graph, you can use a depth-first search to perform a [topological sort](../Topological%20Sort/). This will put the tasks in an optimal order so that you minimize the time spent waiting for tasks to complete. (One possible order here is A, B, D, E, C, F, G, H, I, J, K.)\n\nWhenever you are faced with a tough programming problem, ask yourself, \"how can I express this problem using a graph?\" Graphs are all about representing relationships between your data. The trick is in how you define \"relationships\".\n\nIf you are a musician you might appreciate this graph:\n\n![Chord map](Images/ChordMap.png)\n\nThe vertices are chords from the C major scale. The edges -- the relationships between the chords -- represent how [likely one chord is to follow another](http://mugglinworks.com/chordmaps/genmap.htm). This is a directed graph, so the direction of the arrows shows how you can go from one chord to the next. It is also a weighted graph, where the weight of the edges -- portrayed here by line thickness -- shows a strong relationship between two chords. As you can see, a G7-chord is very likely to be followed by a C chord, and much less likely by a Am chord.\n\nYou are probably already using graphs without even knowing it. Your data model is also a graph (from Apple's Core Data documentation):\n\n![Core Data model](https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreDataVersioning/Art/recipe_version2.0.jpg)\n\nAnother common graph used by programmers is the state machine, where edges depict the conditions for transitioning between states. Here is a state machine that models my cat:\n\n![State machine](Images/StateMachine.png)\n\nGraphs are awesome. Facebook made a fortune from their social graph. If you are going to learn any data structure, you must choose the graph and the vast collection of standard graph algorithms.\n\n## Vertices and edges, oh my!\n\nIn theory, a graph is just a bunch of vertex and edge objects, but how do you describe this in code?\n\nThere are two main strategies: adjacency list and adjacency matrix.\n\n**Adjacency List.** In an adjacency list implementation, each vertex stores a list of edges that originate from that vertex. For example, if vertex A has an edge to vertices B, C, and D, then vertex A would have a list containing 3 edges.\n\n![Adjacency list](Images/AdjacencyList.png)\n\nThe adjacency list describes outgoing edges. A has an edge to B, but B does not have an edge back to A, so A does not appear in B's adjacency list. Finding an edge or weight between two vertices can be expensive because there is no random access to edges. You must traverse the adjacency lists until it is found.\n\n**Adjacency Matrix.** In an adjacency matrix implementation, a matrix with rows and columns representing vertices stores a weight to indicate if vertices are connected and by what weight. For example, if there is a directed edge of weight 5.6 from vertex A to vertex B, then the entry with row for vertex A and column for vertex B would have the value 5.6:\n\n![Adjacency matrix](Images/AdjacencyMatrix.png)\n\nAdding another vertex to the graph is expensive, because a new matrix structure must be created with enough space to hold the new row/column, and the existing structure must be copied into the new one.\n\nSo which one should you use? Most of the time, the adjacency list is the right approach. What follows is a more detailed comparison between the two.\n\nLet *V* be the number of vertices in the graph, and *E* the number of edges.  Then we have:\n\n| Operation       | Adjacency List | Adjacency Matrix |\n|-----------------|----------------|------------------|\n| Storage Space   | O(V + E)       | O(V^2)           |\n| Add Vertex      | O(1)           | O(V^2)           |\n| Add Edge        | O(1)           | O(1)             |\n| Check Adjacency | O(V)           | O(1)             |\n\n\"Checking adjacency\" means that we try to determine that a given vertex is an immediate neighbor of another vertex. The time to check adjacency for an adjacency list is **O(V)**, because in the worst case a vertex is connected to *every* other vertex.\n\nIn the case of a *sparse* graph, where each vertex is connected to only a handful of other vertices, an adjacency list is the best way to store the edges. If the graph is *dense*, where each vertex is connected to most of the other vertices, then a matrix is preferred.\n\nHere are sample implementations of both adjacency list and adjacency matrix:\n\n## The code: edges and vertices\n\nThe adjacency list for each vertex consists of `Edge` objects:\n\n```swift\npublic struct Edge<T>: Equatable where T: Equatable, T: Hashable {\n\n  public let from: Vertex<T>\n  public let to: Vertex<T>\n\n  public let weight: Double?\n\n}\n```\n\nThis struct describes the \"from\" and \"to\" vertices and a weight value. Note that an `Edge` object is always directed, a one-way connection (shown as arrows in the illustrations above). If you want an undirected connection, you also need to add an `Edge` object in the opposite direction. Each `Edge` optionally stores a weight, so they can be used to describe both weighted and unweighted graphs.\n\nThe `Vertex` looks like this:\n\n```swift\npublic struct Vertex<T>: Equatable where T: Equatable, T: Hashable {\n\n  public var data: T\n  public let index: Int\n\n}\n```\n\nIt stores arbitrary data with a generic type `T`, which is `Hashable` to enforce uniqueness, and also `Equatable`. Vertices themselves are also `Equatable`.\n\n## The code: graphs\n\n> **Note:** There are many ways to implement graphs. The code given here is just one possible implementation. You probably want to tailor the graph code to each individual problem you are trying to solve. For instance, your edges may not need a `weight` property, or you may not have the need to distinguish between directed and undirected edges.\n\nHere is an example of a simple graph:\n\n![Demo](Images/Demo1.png)\n\nWe can represent it as an adjacency matrix or adjacency list. The classes implementing those concepts both inherit a common API from `AbstractGraph`, so they can be created in an identical fashion, with different optimized data structures behind the scenes.\n\nLet's create some directed, weighted graphs, using each representation, to store the example:\n\n```swift\nfor graph in [AdjacencyMatrixGraph<Int>(), AdjacencyListGraph<Int>()] {\n\n  let v1 = graph.createVertex(1)\n  let v2 = graph.createVertex(2)\n  let v3 = graph.createVertex(3)\n  let v4 = graph.createVertex(4)\n  let v5 = graph.createVertex(5)\n\n  graph.addDirectedEdge(v1, to: v2, withWeight: 1.0)\n  graph.addDirectedEdge(v2, to: v3, withWeight: 1.0)\n  graph.addDirectedEdge(v3, to: v4, withWeight: 4.5)\n  graph.addDirectedEdge(v4, to: v1, withWeight: 2.8)\n  graph.addDirectedEdge(v2, to: v5, withWeight: 3.2)\n\n}\n```\n\nAs mentioned earlier, to create an undirected edge you need to make two directed edges. For undirected graphs, we call the following method instead:\n\n```swift\n  graph.addUndirectedEdge(v1, to: v2, withWeight: 1.0)\n  graph.addUndirectedEdge(v2, to: v3, withWeight: 1.0)\n  graph.addUndirectedEdge(v3, to: v4, withWeight: 4.5)\n  graph.addUndirectedEdge(v4, to: v1, withWeight: 2.8)\n  graph.addUndirectedEdge(v2, to: v5, withWeight: 3.2)\n```\n\nWe could provide `nil` as the values for the `withWeight` parameter in either case to make unweighted graphs.\n\n## The code: adjacency list\n\nTo maintain the adjacency list, there is a class that maps a list of edges to a vertex. The graph simply maintains an array of such objects and modifies them as necessary.\n\n```swift\nprivate class EdgeList<T> where T: Equatable, T: Hashable {\n\n  var vertex: Vertex<T>\n  var edges: [Edge<T>]? = nil\n\n  init(vertex: Vertex<T>) {\n    self.vertex = vertex\n  }\n\n  func addEdge(_ edge: Edge<T>) {\n    edges?.append(edge)\n  }\n\n}\n```\n\nThey are implemented as a class as opposed to structs, so we can modify them by reference, in place, like when adding an edge to a new vertex, where the source vertex already has an edge list:\n\n```swift\nopen override func createVertex(_ data: T) -> Vertex<T> {\n  // check if the vertex already exists\n  let matchingVertices = vertices.filter() { vertex in\n    return vertex.data == data\n  }\n\n  if matchingVertices.count > 0 {\n    return matchingVertices.last!\n  }\n\n  // if the vertex doesn't exist, create a new one\n  let vertex = Vertex(data: data, index: adjacencyList.count)\n  adjacencyList.append(EdgeList(vertex: vertex))\n  return vertex\n}\n```\n\nThe adjacency list for the example looks like this:\n\n```\nv1 -> [(v2: 1.0)]\nv2 -> [(v3: 1.0), (v5: 3.2)]\nv3 -> [(v4: 4.5)]\nv4 -> [(v1: 2.8)]\n```\n\nwhere the general form `a -> [(b: w), ...]` means an edge exists from `a` to `b` with weight `w` (with possibly more edges connecting `a` to other vertices as well).\n\n## The code: adjacency matrix\n\nWe will keep track of the adjacency matrix in a two-dimensional `[[Double?]]` array. An entry of `nil` indicates no edge, while any other value indicates an edge of the given weight. If `adjacencyMatrix[i][j]` is not nil, then there is an edge from vertex `i` to vertex `j`.\n\nTo index into the matrix using vertices, we use the `index` property in `Vertex`, which is assigned when creating the vertex through the graph object. When creating a new vertex, the graph must resize the matrix:\n\n```swift\nopen override func createVertex(_ data: T) -> Vertex<T> {\n  // check if the vertex already exists\n  let matchingVertices = vertices.filter() { vertex in\n    return vertex.data == data\n  }\n\n  if matchingVertices.count > 0 {\n    return matchingVertices.last!\n  }\n\n  // if the vertex doesn't exist, create a new one\n  let vertex = Vertex(data: data, index: adjacencyMatrix.count)\n\n  // Expand each existing row to the right one column.\n  for i in 0 ..< adjacencyMatrix.count {\n    adjacencyMatrix[i].append(nil)\n  }\n\n  // Add one new row at the bottom.\n  let newRow = [Double?](repeating: nil, count: adjacencyMatrix.count + 1)\n  adjacencyMatrix.append(newRow)\n\n  _vertices.append(vertex)\n\n  return vertex\n}\n```\n\nThen the adjacency matrix looks like this:\n\n\t[[nil, 1.0, nil, nil, nil]    v1\n\t [nil, nil, 1.0, nil, 3.2]    v2\n\t [nil, nil, nil, 4.5, nil]    v3\n\t [2.8, nil, nil, nil, nil]    v4\n\t [nil, nil, nil, nil, nil]]   v5\n\n\t  v1   v2   v3   v4   v5\n\n\n## See also\n\nThis article described what a graph is, and how you can implement the basic data structure. We have other articles on practical uses of graphs, so check those out too!\n\n*Written by Donald Pinckney and Matthijs Hollemans*\n"
  },
  {
    "path": "Hash Set/HashSet.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\nvar set = HashSet<String>()\n\nset.insert(\"one\")\nset.insert(\"two\")\nset.insert(\"three\")\nset.allElements()\n\nset.insert(\"two\")\nset.allElements()\n\nset.contains(\"one\")\nset.remove(\"one\")\nset.allElements()\nset.contains(\"one\")\n\n/* Union */\n\nvar setA = HashSet<Int>()\nsetA.insert(1)\nsetA.insert(2)\nsetA.insert(3)\nsetA.insert(4)\n\nvar setB = HashSet<Int>()\nsetB.insert(3)\nsetB.insert(4)\nsetB.insert(5)\nsetB.insert(6)\n\nlet union = setA.union(setB)\nunion.allElements()          // [5, 6, 2, 3, 1, 4]\n\n/* Intersection */\n\nlet intersection = setA.intersect(setB)\nintersection.allElements()               // [3, 4]\n\n/* Difference */\n\nlet difference1 = setA.difference(setB)\ndifference1.allElements()                // [2, 1]\n\nlet difference2 = setB.difference(setA)\ndifference2.allElements()                // [5, 6]\n"
  },
  {
    "path": "Hash Set/HashSet.playground/Sources/HashSet.swift",
    "content": "//: Playground - noun: a place where people can play\n\npublic struct HashSet<T: Hashable> {\n    fileprivate var dictionary = Dictionary<T, Bool>()\n\n    public init() {\n\n    }\n\n    public mutating func insert(_ element: T) {\n        dictionary[element] = true\n    }\n\n    public mutating func remove(_ element: T) {\n        dictionary[element] = nil\n    }\n\n    public func contains(_ element: T) -> Bool {\n        return dictionary[element] != nil\n    }\n\n    public func allElements() -> [T] {\n        return Array(dictionary.keys)\n    }\n\n    public var count: Int {\n        return dictionary.count\n    }\n\n    public var isEmpty: Bool {\n        return dictionary.isEmpty\n    }\n}\n\n/* Union */\n\nextension HashSet {\n    public func union(_ otherSet: HashSet<T>) -> HashSet<T> {\n        var combined = HashSet<T>()\n        for obj in self.dictionary.keys {\n            combined.insert(obj)\n        }\n        for obj in otherSet.dictionary.keys {\n            combined.insert(obj)\n        }\n        return combined\n    }\n}\n\n/* Intersection */\n\nextension HashSet {\n    public func intersect(_ otherSet: HashSet<T>) -> HashSet<T> {\n        var common = HashSet<T>()\n        for obj in dictionary.keys {\n            if otherSet.contains(obj) {\n                common.insert(obj)\n            }\n        }\n        return common\n    }\n}\n\n/* Difference */\n\nextension HashSet {\n    public func difference(_ otherSet: HashSet<T>) -> HashSet<T> {\n        var diff = HashSet<T>()\n        for obj in dictionary.keys {\n            if !otherSet.contains(obj) {\n                diff.insert(obj)\n            }\n        }\n        return diff\n    }\n}\n"
  },
  {
    "path": "Hash Set/HashSet.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Hash Set/HashSet.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Hash Set/HashSet.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Hash Set/HashSet.swift",
    "content": "public struct HashSet<T: Hashable> {\n  private var dictionary = Dictionary<T, Bool>()\n\n  public mutating func insert(element: T) {\n    dictionary[element] = true\n  }\n\n  public mutating func remove(element: T) {\n    dictionary[element] = nil\n  }\n\n  public func contains(element: T) -> Bool {\n    return dictionary[element] != nil\n  }\n\n  public func allElements() -> [T] {\n    return Array(dictionary.keys)\n  }\n\n  public var count: Int {\n    return dictionary.count\n  }\n\n  public var isEmpty: Bool {\n    return dictionary.isEmpty\n  }\n}\n\nextension HashSet {\n  public func union(otherSet: HashSet<T>) -> HashSet<T> {\n    var combined = HashSet<T>()\n    for obj in dictionary.keys {\n      combined.insert(obj)\n    }\n    for obj in otherSet.dictionary.keys {\n      combined.insert(obj)\n    }\n    return combined\n  }\n\n  public func intersect(otherSet: HashSet<T>) -> HashSet<T> {\n    var common = HashSet<T>()\n    for obj in dictionary.keys {\n      if otherSet.contains(obj) {\n        common.insert(obj)\n      }\n    }\n    return common\n  }\n\n  public func difference(otherSet: HashSet<T>) -> HashSet<T> {\n    var diff = HashSet<T>()\n    for obj in dictionary.keys {\n      if !otherSet.contains(obj) {\n        diff.insert(obj)\n      }\n    }\n    return diff\n  }\n}\n"
  },
  {
    "path": "Hash Set/Images/CombineSets.graffle",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>ActiveLayerIndex</key>\n\t<integer>0</integer>\n\t<key>ApplicationVersion</key>\n\t<array>\n\t\t<string>com.omnigroup.OmniGraffle6.MacAppStore</string>\n\t\t<string>167.4</string>\n\t</array>\n\t<key>AutoAdjust</key>\n\t<true/>\n\t<key>BackgroundGraphic</key>\n\t<dict>\n\t\t<key>Bounds</key>\n\t\t<string>{{0, 0}, {559.28001499176025, 782.8900146484375}}</string>\n\t\t<key>Class</key>\n\t\t<string>SolidGraphic</string>\n\t\t<key>ID</key>\n\t\t<integer>2</integer>\n\t\t<key>Style</key>\n\t\t<dict>\n\t\t\t<key>stroke</key>\n\t\t\t<dict>\n\t\t\t\t<key>Draws</key>\n\t\t\t\t<string>NO</string>\n\t\t\t</dict>\n\t\t</dict>\n\t</dict>\n\t<key>BaseZoom</key>\n\t<integer>0</integer>\n\t<key>CanvasOrigin</key>\n\t<string>{0, 0}</string>\n\t<key>ColumnAlign</key>\n\t<integer>1</integer>\n\t<key>ColumnSpacing</key>\n\t<real>36</real>\n\t<key>CreationDate</key>\n\t<string>2014-11-05 12:23:41 +0000</string>\n\t<key>Creator</key>\n\t<string>Matthijs</string>\n\t<key>DisplayScale</key>\n\t<string>1.0000 cm = 1.0000 cm</string>\n\t<key>ExportShapes</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>InspectorGroup</key>\n\t\t\t<real>255</real>\n\t\t\t<key>ShapeImageRect</key>\n\t\t\t<string>{{2, 2}, {22, 22}}</string>\n\t\t\t<key>ShapeName</key>\n\t\t\t<string>232885A2-A375-4FB4-BA43-24B390AE920A-34894-00030AD794E8A764</string>\n\t\t\t<key>ShouldExport</key>\n\t\t\t<string>YES</string>\n\t\t\t<key>StrokePath</key>\n\t\t\t<dict>\n\t\t\t\t<key>elements</key>\n\t\t\t\t<array>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>element</key>\n\t\t\t\t\t\t<string>MOVETO</string>\n\t\t\t\t\t\t<key>point</key>\n\t\t\t\t\t\t<string>{-4.0305071813406812e-07, -0.49999985541807312}</string>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>control1</key>\n\t\t\t\t\t\t<string>{-0.66666664829673206, -0.2229760996015262}</string>\n\t\t\t\t\t\t<key>control2</key>\n\t\t\t\t\t\t<string>{-0.66666653231640627, 0.22297630296069038}</string>\n\t\t\t\t\t\t<key>element</key>\n\t\t\t\t\t\t<string>CURVETO</string>\n\t\t\t\t\t\t<key>point</key>\n\t\t\t\t\t\t<string>{-5.5109742547188034e-08, 0.5}</string>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>control1</key>\n\t\t\t\t\t\t<string>{0.6666667137482456, 0.22297609960152798}</string>\n\t\t\t\t\t\t<key>control2</key>\n\t\t\t\t\t\t<string>{0.66666659776791981, -0.2229763029606886}</string>\n\t\t\t\t\t\t<key>element</key>\n\t\t\t\t\t\t<string>CURVETO</string>\n\t\t\t\t\t\t<key>point</key>\n\t\t\t\t\t\t<string>{1.2056125342496671e-07, -0.5}</string>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>element</key>\n\t\t\t\t\t\t<string>CLOSE</string>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>element</key>\n\t\t\t\t\t\t<string>MOVETO</string>\n\t\t\t\t\t\t<key>point</key>\n\t\t\t\t\t\t<string>{-4.0305071813406812e-07, -0.49999985541807312}</string>\n\t\t\t\t\t</dict>\n\t\t\t\t</array>\n\t\t\t</dict>\n\t\t\t<key>TextBounds</key>\n\t\t\t<string>{{0, 0}, {1, 1}}</string>\n\t\t</dict>\n\t</array>\n\t<key>GraphDocumentVersion</key>\n\t<integer>12</integer>\n\t<key>GraphicsList</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>Class</key>\n\t\t\t<string>Group</string>\n\t\t\t<key>Graphics</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Class</key>\n\t\t\t\t\t<string>Group</string>\n\t\t\t\t\t<key>Graphics</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>Bounds</key>\n\t\t\t\t\t\t\t<string>{{363.44110091494207, 181.54080882304791}, {51.331169128417969, 52.040813446044922}}</string>\n\t\t\t\t\t\t\t<key>Class</key>\n\t\t\t\t\t\t\t<string>ShapedGraphic</string>\n\t\t\t\t\t\t\t<key>ID</key>\n\t\t\t\t\t\t\t<integer>130</integer>\n\t\t\t\t\t\t\t<key>Shape</key>\n\t\t\t\t\t\t\t<string>Circle</string>\n\t\t\t\t\t\t\t<key>Style</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>fill</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>shadow</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>Bounds</key>\n\t\t\t\t\t\t\t<string>{{403.13219679380046, 199.35715176273706}, {57.5, 14}}</string>\n\t\t\t\t\t\t\t<key>Class</key>\n\t\t\t\t\t\t\t<string>ShapedGraphic</string>\n\t\t\t\t\t\t\t<key>FitText</key>\n\t\t\t\t\t\t\t<string>Vertical</string>\n\t\t\t\t\t\t\t<key>Flow</key>\n\t\t\t\t\t\t\t<string>Resize</string>\n\t\t\t\t\t\t\t<key>FontInfo</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Font</key>\n\t\t\t\t\t\t\t\t<string>Helvetica</string>\n\t\t\t\t\t\t\t\t<key>Size</key>\n\t\t\t\t\t\t\t\t<real>12</real>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>ID</key>\n\t\t\t\t\t\t\t<integer>131</integer>\n\t\t\t\t\t\t\t<key>Style</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>fill</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>shadow</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>stroke</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Text</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Pad</key>\n\t\t\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t\t\t<key>Text</key>\n\t\t\t\t\t\t\t\t<string>{\\rtf1\\ansi\\ansicpg1252\\cocoartf1404\\cocoasubrtf340\n{\\fonttbl\\f0\\fswiss\\fcharset0 Helvetica;}\n{\\colortbl;\\red255\\green255\\blue255;}\n\\pard\\tx560\\tx1120\\tx1680\\tx2240\\tx2800\\tx3360\\tx3920\\tx4480\\tx5040\\tx5600\\tx6160\\tx6720\\pardirnatural\\qc\\partightenfactor0\n\n\\f0\\b\\fs24 \\cf0 B}</string>\n\t\t\t\t\t\t\t\t<key>VerticalPad</key>\n\t\t\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>Bounds</key>\n\t\t\t\t\t\t\t<string>{{357.5783973870204, 199.35712936151944}, {57.5, 14}}</string>\n\t\t\t\t\t\t\t<key>Class</key>\n\t\t\t\t\t\t\t<string>ShapedGraphic</string>\n\t\t\t\t\t\t\t<key>FitText</key>\n\t\t\t\t\t\t\t<string>Vertical</string>\n\t\t\t\t\t\t\t<key>Flow</key>\n\t\t\t\t\t\t\t<string>Resize</string>\n\t\t\t\t\t\t\t<key>FontInfo</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Font</key>\n\t\t\t\t\t\t\t\t<string>Helvetica</string>\n\t\t\t\t\t\t\t\t<key>Size</key>\n\t\t\t\t\t\t\t\t<real>12</real>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>ID</key>\n\t\t\t\t\t\t\t<integer>132</integer>\n\t\t\t\t\t\t\t<key>Style</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>fill</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>shadow</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>stroke</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Text</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Pad</key>\n\t\t\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t\t\t<key>Text</key>\n\t\t\t\t\t\t\t\t<string>{\\rtf1\\ansi\\ansicpg1252\\cocoartf1404\\cocoasubrtf340\n{\\fonttbl\\f0\\fswiss\\fcharset0 Helvetica;}\n{\\colortbl;\\red255\\green255\\blue255;}\n\\pard\\tx560\\tx1120\\tx1680\\tx2240\\tx2800\\tx3360\\tx3920\\tx4480\\tx5040\\tx5600\\tx6160\\tx6720\\pardirnatural\\qc\\partightenfactor0\n\n\\f0\\b\\fs24 \\cf0 A}</string>\n\t\t\t\t\t\t\t\t<key>VerticalPad</key>\n\t\t\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>Bounds</key>\n\t\t\t\t\t\t\t<string>{{399.76763169599639, 180.84693146069711}, {51.331169128417969, 52.040813446044922}}</string>\n\t\t\t\t\t\t\t<key>Class</key>\n\t\t\t\t\t\t\t<string>ShapedGraphic</string>\n\t\t\t\t\t\t\t<key>ID</key>\n\t\t\t\t\t\t\t<integer>133</integer>\n\t\t\t\t\t\t\t<key>Shape</key>\n\t\t\t\t\t\t\t<string>Circle</string>\n\t\t\t\t\t\t\t<key>Style</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>shadow</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>Bounds</key>\n\t\t\t\t\t\t\t<string>{{363.2138444645513, 180.33672333081441}, {51.331169128417969, 52.040813446044922}}</string>\n\t\t\t\t\t\t\t<key>Class</key>\n\t\t\t\t\t\t\t<string>ShapedGraphic</string>\n\t\t\t\t\t\t\t<key>ID</key>\n\t\t\t\t\t\t\t<integer>134</integer>\n\t\t\t\t\t\t\t<key>Shape</key>\n\t\t\t\t\t\t\t<string>Circle</string>\n\t\t\t\t\t\t\t<key>Style</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>fill</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>shadow</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>stroke</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>Bounds</key>\n\t\t\t\t\t\t\t<string>{{363.44110091494207, 181.54080882304791}, {51.331169128417969, 52.040813446044922}}</string>\n\t\t\t\t\t\t\t<key>Class</key>\n\t\t\t\t\t\t\t<string>ShapedGraphic</string>\n\t\t\t\t\t\t\t<key>ID</key>\n\t\t\t\t\t\t\t<integer>135</integer>\n\t\t\t\t\t\t\t<key>Shape</key>\n\t\t\t\t\t\t\t<string>Circle</string>\n\t\t\t\t\t\t\t<key>Style</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>fill</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>FillType</key>\n\t\t\t\t\t\t\t\t\t<integer>2</integer>\n\t\t\t\t\t\t\t\t\t<key>GradientAngle</key>\n\t\t\t\t\t\t\t\t\t<real>90</real>\n\t\t\t\t\t\t\t\t\t<key>GradientColor</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>w</key>\n\t\t\t\t\t\t\t\t\t\t<string>0.666667</string>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>shadow</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>Bounds</key>\n\t\t\t\t\t\t\t<string>{{399.95130498664474, 180.52040782207135}, {51.331169128417969, 52.040813446044922}}</string>\n\t\t\t\t\t\t\t<key>Class</key>\n\t\t\t\t\t\t\t<string>ShapedGraphic</string>\n\t\t\t\t\t\t\t<key>ID</key>\n\t\t\t\t\t\t\t<integer>136</integer>\n\t\t\t\t\t\t\t<key>Shape</key>\n\t\t\t\t\t\t\t<string>Circle</string>\n\t\t\t\t\t\t\t<key>Style</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>fill</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>FillType</key>\n\t\t\t\t\t\t\t\t\t<integer>2</integer>\n\t\t\t\t\t\t\t\t\t<key>GradientAngle</key>\n\t\t\t\t\t\t\t\t\t<real>90</real>\n\t\t\t\t\t\t\t\t\t<key>GradientColor</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>w</key>\n\t\t\t\t\t\t\t\t\t\t<string>0.666667</string>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>shadow</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>stroke</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>ID</key>\n\t\t\t\t\t<integer>129</integer>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Bounds</key>\n\t\t\t\t\t<string>{{362.10529709041043, 246.7831437431239}, {94, 19}}</string>\n\t\t\t\t\t<key>Class</key>\n\t\t\t\t\t<string>ShapedGraphic</string>\n\t\t\t\t\t<key>FitText</key>\n\t\t\t\t\t<string>YES</string>\n\t\t\t\t\t<key>Flow</key>\n\t\t\t\t\t<string>Resize</string>\n\t\t\t\t\t<key>ID</key>\n\t\t\t\t\t<integer>137</integer>\n\t\t\t\t\t<key>Style</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>fill</key>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<key>shadow</key>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<key>stroke</key>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>Text</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>Align</key>\n\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t<key>Pad</key>\n\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t<key>Text</key>\n\t\t\t\t\t\t<string>{\\rtf1\\ansi\\ansicpg1252\\cocoartf1404\\cocoasubrtf340\n{\\fonttbl\\f0\\fswiss\\fcharset0 Helvetica;\\f1\\froman\\fcharset0 Times-Roman;\\f2\\fnil\\fcharset0 LucidaGrande;\n\\f3\\ftech\\fcharset77 Symbol;}\n{\\colortbl;\\red255\\green255\\blue255;}\n\\deftab720\n\\pard\\pardeftab720\\sa240\\partightenfactor0\n\n\\f0\\fs24 \\cf0 Difference\n\\f1\\fs30  A \n\\f2 -\n\\f3  \n\\f1 B}</string>\n\t\t\t\t\t\t<key>VerticalPad</key>\n\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>Wrap</key>\n\t\t\t\t\t<string>NO</string>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>ID</key>\n\t\t\t<integer>128</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Class</key>\n\t\t\t<string>Group</string>\n\t\t\t<key>Graphics</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Bounds</key>\n\t\t\t\t\t<string>{{216.5783973870204, 247.18110099700706}, {105, 18}}</string>\n\t\t\t\t\t<key>Class</key>\n\t\t\t\t\t<string>ShapedGraphic</string>\n\t\t\t\t\t<key>FitText</key>\n\t\t\t\t\t<string>YES</string>\n\t\t\t\t\t<key>Flow</key>\n\t\t\t\t\t<string>Resize</string>\n\t\t\t\t\t<key>ID</key>\n\t\t\t\t\t<integer>121</integer>\n\t\t\t\t\t<key>Style</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>fill</key>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<key>shadow</key>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<key>stroke</key>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>Text</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>Align</key>\n\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t<key>Pad</key>\n\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t<key>Text</key>\n\t\t\t\t\t\t<string>{\\rtf1\\ansi\\ansicpg1252\\cocoartf1404\\cocoasubrtf340\n{\\fonttbl\\f0\\fswiss\\fcharset0 Helvetica;\\f1\\froman\\fcharset0 Times-Roman;\\f2\\ftech\\fcharset77 Symbol;\n}\n{\\colortbl;\\red255\\green255\\blue255;}\n\\deftab720\n\\pard\\pardeftab720\\sa240\\partightenfactor0\n\n\\f0\\fs24 \\cf0 Intersection\n\\f1\\fs30  A \n\\f2 \\uc0\\u8745 \n\\f1  B}</string>\n\t\t\t\t\t\t<key>VerticalPad</key>\n\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>Wrap</key>\n\t\t\t\t\t<string>NO</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Class</key>\n\t\t\t\t\t<string>Group</string>\n\t\t\t\t\t<key>Graphics</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>Bounds</key>\n\t\t\t\t\t\t\t<string>{{263.55728311947803, 199.95919450885376}, {57.5, 14}}</string>\n\t\t\t\t\t\t\t<key>Class</key>\n\t\t\t\t\t\t\t<string>ShapedGraphic</string>\n\t\t\t\t\t\t\t<key>FitText</key>\n\t\t\t\t\t\t\t<string>Vertical</string>\n\t\t\t\t\t\t\t<key>Flow</key>\n\t\t\t\t\t\t\t<string>Resize</string>\n\t\t\t\t\t\t\t<key>FontInfo</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Font</key>\n\t\t\t\t\t\t\t\t<string>Helvetica</string>\n\t\t\t\t\t\t\t\t<key>Size</key>\n\t\t\t\t\t\t\t\t<real>12</real>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>ID</key>\n\t\t\t\t\t\t\t<integer>123</integer>\n\t\t\t\t\t\t\t<key>Style</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>fill</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>shadow</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>stroke</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Text</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Pad</key>\n\t\t\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t\t\t<key>Text</key>\n\t\t\t\t\t\t\t\t<string>{\\rtf1\\ansi\\ansicpg1252\\cocoartf1404\\cocoasubrtf340\n{\\fonttbl\\f0\\fswiss\\fcharset0 Helvetica;}\n{\\colortbl;\\red255\\green255\\blue255;}\n\\pard\\tx560\\tx1120\\tx1680\\tx2240\\tx2800\\tx3360\\tx3920\\tx4480\\tx5040\\tx5600\\tx6160\\tx6720\\pardirnatural\\qc\\partightenfactor0\n\n\\f0\\b\\fs24 \\cf0 B}</string>\n\t\t\t\t\t\t\t\t<key>VerticalPad</key>\n\t\t\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>Bounds</key>\n\t\t\t\t\t\t\t<string>{{217.09951165456278, 199.95917210763608}, {57.5, 14}}</string>\n\t\t\t\t\t\t\t<key>Class</key>\n\t\t\t\t\t\t\t<string>ShapedGraphic</string>\n\t\t\t\t\t\t\t<key>FitText</key>\n\t\t\t\t\t\t\t<string>Vertical</string>\n\t\t\t\t\t\t\t<key>Flow</key>\n\t\t\t\t\t\t\t<string>Resize</string>\n\t\t\t\t\t\t\t<key>FontInfo</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Font</key>\n\t\t\t\t\t\t\t\t<string>Helvetica</string>\n\t\t\t\t\t\t\t\t<key>Size</key>\n\t\t\t\t\t\t\t\t<real>12</real>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>ID</key>\n\t\t\t\t\t\t\t<integer>124</integer>\n\t\t\t\t\t\t\t<key>Style</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>fill</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>shadow</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>stroke</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Text</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Pad</key>\n\t\t\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t\t\t<key>Text</key>\n\t\t\t\t\t\t\t\t<string>{\\rtf1\\ansi\\ansicpg1252\\cocoartf1404\\cocoasubrtf340\n{\\fonttbl\\f0\\fswiss\\fcharset0 Helvetica;}\n{\\colortbl;\\red255\\green255\\blue255;}\n\\pard\\tx560\\tx1120\\tx1680\\tx2240\\tx2800\\tx3360\\tx3920\\tx4480\\tx5040\\tx5600\\tx6160\\tx6720\\pardirnatural\\qc\\partightenfactor0\n\n\\f0\\b\\fs24 \\cf0 A}</string>\n\t\t\t\t\t\t\t\t<key>VerticalPad</key>\n\t\t\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>Bounds</key>\n\t\t\t\t\t\t\t<string>{{260.70292209337657, 180.93877727753991}, {51.331169128417969, 52.040813446044922}}</string>\n\t\t\t\t\t\t\t<key>Class</key>\n\t\t\t\t\t\t\t<string>ShapedGraphic</string>\n\t\t\t\t\t\t\t<key>ID</key>\n\t\t\t\t\t\t\t<integer>125</integer>\n\t\t\t\t\t\t\t<key>Shape</key>\n\t\t\t\t\t\t\t<string>Circle</string>\n\t\t\t\t\t\t\t<key>Style</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>fill</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>shadow</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>Bounds</key>\n\t\t\t\t\t\t\t<string>{{224.14913486193149, 180.93876607693116}, {51.331169128417969, 52.040813446044922}}</string>\n\t\t\t\t\t\t\t<key>Class</key>\n\t\t\t\t\t\t\t<string>ShapedGraphic</string>\n\t\t\t\t\t\t\t<key>ID</key>\n\t\t\t\t\t\t\t<integer>126</integer>\n\t\t\t\t\t\t\t<key>Shape</key>\n\t\t\t\t\t\t\t<string>Circle</string>\n\t\t\t\t\t\t\t<key>Style</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>fill</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>shadow</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>Bounds</key>\n\t\t\t\t\t\t\t<string>{{260.88658255123266, 188.75053690631128}, {14.820989752243648, 36.580534988253419}}</string>\n\t\t\t\t\t\t\t<key>Class</key>\n\t\t\t\t\t\t\t<string>ShapedGraphic</string>\n\t\t\t\t\t\t\t<key>ID</key>\n\t\t\t\t\t\t\t<integer>127</integer>\n\t\t\t\t\t\t\t<key>Shape</key>\n\t\t\t\t\t\t\t<string>232885A2-A375-4FB4-BA43-24B390AE920A-34894-00030AD794E8A764</string>\n\t\t\t\t\t\t\t<key>Style</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>fill</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>FillType</key>\n\t\t\t\t\t\t\t\t\t<integer>2</integer>\n\t\t\t\t\t\t\t\t\t<key>GradientAngle</key>\n\t\t\t\t\t\t\t\t\t<real>90</real>\n\t\t\t\t\t\t\t\t\t<key>GradientColor</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>w</key>\n\t\t\t\t\t\t\t\t\t\t<string>0.666667</string>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>shadow</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>stroke</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>ID</key>\n\t\t\t\t\t<integer>122</integer>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>ID</key>\n\t\t\t<integer>120</integer>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>Class</key>\n\t\t\t<string>Group</string>\n\t\t\t<key>Graphics</key>\n\t\t\t<array>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Bounds</key>\n\t\t\t\t\t<string>{{92.051497683630373, 247.18109539670272}, {74, 18}}</string>\n\t\t\t\t\t<key>Class</key>\n\t\t\t\t\t<string>ShapedGraphic</string>\n\t\t\t\t\t<key>FitText</key>\n\t\t\t\t\t<string>YES</string>\n\t\t\t\t\t<key>Flow</key>\n\t\t\t\t\t<string>Resize</string>\n\t\t\t\t\t<key>ID</key>\n\t\t\t\t\t<integer>112</integer>\n\t\t\t\t\t<key>Style</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>fill</key>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<key>shadow</key>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<key>stroke</key>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>Text</key>\n\t\t\t\t\t<dict>\n\t\t\t\t\t\t<key>Align</key>\n\t\t\t\t\t\t<integer>0</integer>\n\t\t\t\t\t\t<key>Pad</key>\n\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t<key>Text</key>\n\t\t\t\t\t\t<string>{\\rtf1\\ansi\\ansicpg1252\\cocoartf1404\\cocoasubrtf340\n{\\fonttbl\\f0\\fswiss\\fcharset0 Helvetica;\\f1\\froman\\fcharset0 Times-Roman;\\f2\\ftech\\fcharset77 Symbol;\n}\n{\\colortbl;\\red255\\green255\\blue255;}\n\\deftab720\n\\pard\\pardeftab720\\sa240\\partightenfactor0\n\n\\f0\\fs24 \\cf0 Union\n\\f1\\fs30  A \n\\f2 \\uc0\\u8746  \n\\f1 B}</string>\n\t\t\t\t\t\t<key>VerticalPad</key>\n\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t</dict>\n\t\t\t\t\t<key>Wrap</key>\n\t\t\t\t\t<string>NO</string>\n\t\t\t\t</dict>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>Class</key>\n\t\t\t\t\t<string>Group</string>\n\t\t\t\t\t<key>Graphics</key>\n\t\t\t\t\t<array>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>Bounds</key>\n\t\t\t\t\t\t\t<string>{{123.07839738702042, 199.95920010915816}, {57.5, 14}}</string>\n\t\t\t\t\t\t\t<key>Class</key>\n\t\t\t\t\t\t\t<string>ShapedGraphic</string>\n\t\t\t\t\t\t\t<key>FitText</key>\n\t\t\t\t\t\t\t<string>Vertical</string>\n\t\t\t\t\t\t\t<key>Flow</key>\n\t\t\t\t\t\t\t<string>Resize</string>\n\t\t\t\t\t\t\t<key>FontInfo</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Font</key>\n\t\t\t\t\t\t\t\t<string>Helvetica</string>\n\t\t\t\t\t\t\t\t<key>Size</key>\n\t\t\t\t\t\t\t\t<real>12</real>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>ID</key>\n\t\t\t\t\t\t\t<integer>114</integer>\n\t\t\t\t\t\t\t<key>Style</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>fill</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>shadow</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>stroke</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Text</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Pad</key>\n\t\t\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t\t\t<key>Text</key>\n\t\t\t\t\t\t\t\t<string>{\\rtf1\\ansi\\ansicpg1252\\cocoartf1404\\cocoasubrtf340\n{\\fonttbl\\f0\\fswiss\\fcharset0 Helvetica;}\n{\\colortbl;\\red255\\green255\\blue255;}\n\\pard\\tx560\\tx1120\\tx1680\\tx2240\\tx2800\\tx3360\\tx3920\\tx4480\\tx5040\\tx5600\\tx6160\\tx6720\\pardirnatural\\qc\\partightenfactor0\n\n\\f0\\b\\fs24 \\cf0 B}</string>\n\t\t\t\t\t\t\t\t<key>VerticalPad</key>\n\t\t\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>Bounds</key>\n\t\t\t\t\t\t\t<string>{{77.524597980240316, 199.95917770794046}, {57.5, 14}}</string>\n\t\t\t\t\t\t\t<key>Class</key>\n\t\t\t\t\t\t\t<string>ShapedGraphic</string>\n\t\t\t\t\t\t\t<key>FitText</key>\n\t\t\t\t\t\t\t<string>Vertical</string>\n\t\t\t\t\t\t\t<key>Flow</key>\n\t\t\t\t\t\t\t<string>Resize</string>\n\t\t\t\t\t\t\t<key>FontInfo</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Font</key>\n\t\t\t\t\t\t\t\t<string>Helvetica</string>\n\t\t\t\t\t\t\t\t<key>Size</key>\n\t\t\t\t\t\t\t\t<real>12</real>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>ID</key>\n\t\t\t\t\t\t\t<integer>115</integer>\n\t\t\t\t\t\t\t<key>Style</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>fill</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>shadow</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>stroke</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t<key>Text</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>Pad</key>\n\t\t\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t\t\t<key>Text</key>\n\t\t\t\t\t\t\t\t<string>{\\rtf1\\ansi\\ansicpg1252\\cocoartf1404\\cocoasubrtf340\n{\\fonttbl\\f0\\fswiss\\fcharset0 Helvetica;}\n{\\colortbl;\\red255\\green255\\blue255;}\n\\pard\\tx560\\tx1120\\tx1680\\tx2240\\tx2800\\tx3360\\tx3920\\tx4480\\tx5040\\tx5600\\tx6160\\tx6720\\pardirnatural\\qc\\partightenfactor0\n\n\\f0\\b\\fs24 \\cf0 A}</string>\n\t\t\t\t\t\t\t\t<key>VerticalPad</key>\n\t\t\t\t\t\t\t\t<real>0.0</real>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>Bounds</key>\n\t\t\t\t\t\t\t<string>{{119.71383228921627, 181.44897980711818}, {51.331169128417969, 52.040813446044922}}</string>\n\t\t\t\t\t\t\t<key>Class</key>\n\t\t\t\t\t\t\t<string>ShapedGraphic</string>\n\t\t\t\t\t\t\t<key>ID</key>\n\t\t\t\t\t\t\t<integer>116</integer>\n\t\t\t\t\t\t\t<key>Shape</key>\n\t\t\t\t\t\t\t<string>Circle</string>\n\t\t\t\t\t\t\t<key>Style</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>fill</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>shadow</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>Bounds</key>\n\t\t\t\t\t\t\t<string>{{83.160045057771171, 180.93877167723554}, {51.331169128417969, 52.040813446044922}}</string>\n\t\t\t\t\t\t\t<key>Class</key>\n\t\t\t\t\t\t\t<string>ShapedGraphic</string>\n\t\t\t\t\t\t\t<key>ID</key>\n\t\t\t\t\t\t\t<integer>117</integer>\n\t\t\t\t\t\t\t<key>Shape</key>\n\t\t\t\t\t\t\t<string>Circle</string>\n\t\t\t\t\t\t\t<key>Style</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>fill</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>shadow</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>stroke</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>Bounds</key>\n\t\t\t\t\t\t\t<string>{{83.387301508161968, 182.14285716946898}, {51.331169128417969, 52.040813446044922}}</string>\n\t\t\t\t\t\t\t<key>Class</key>\n\t\t\t\t\t\t\t<string>ShapedGraphic</string>\n\t\t\t\t\t\t\t<key>ID</key>\n\t\t\t\t\t\t\t<integer>118</integer>\n\t\t\t\t\t\t\t<key>Shape</key>\n\t\t\t\t\t\t\t<string>Circle</string>\n\t\t\t\t\t\t\t<key>Style</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>fill</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>FillType</key>\n\t\t\t\t\t\t\t\t\t<integer>2</integer>\n\t\t\t\t\t\t\t\t\t<key>GradientAngle</key>\n\t\t\t\t\t\t\t\t\t<real>90</real>\n\t\t\t\t\t\t\t\t\t<key>GradientColor</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>w</key>\n\t\t\t\t\t\t\t\t\t\t<string>0.666667</string>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>shadow</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t<key>Bounds</key>\n\t\t\t\t\t\t\t<string>{{119.89750557986466, 181.12245616849242}, {51.331169128417969, 52.040813446044922}}</string>\n\t\t\t\t\t\t\t<key>Class</key>\n\t\t\t\t\t\t\t<string>ShapedGraphic</string>\n\t\t\t\t\t\t\t<key>ID</key>\n\t\t\t\t\t\t\t<integer>119</integer>\n\t\t\t\t\t\t\t<key>Shape</key>\n\t\t\t\t\t\t\t<string>Circle</string>\n\t\t\t\t\t\t\t<key>Style</key>\n\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t<key>fill</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>FillType</key>\n\t\t\t\t\t\t\t\t\t<integer>2</integer>\n\t\t\t\t\t\t\t\t\t<key>GradientAngle</key>\n\t\t\t\t\t\t\t\t\t<real>90</real>\n\t\t\t\t\t\t\t\t\t<key>GradientColor</key>\n\t\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t\t<key>w</key>\n\t\t\t\t\t\t\t\t\t\t<string>0.666667</string>\n\t\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>shadow</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t\t<key>stroke</key>\n\t\t\t\t\t\t\t\t<dict>\n\t\t\t\t\t\t\t\t\t<key>Draws</key>\n\t\t\t\t\t\t\t\t\t<string>NO</string>\n\t\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t\t</dict>\n\t\t\t\t\t\t</dict>\n\t\t\t\t\t</array>\n\t\t\t\t\t<key>ID</key>\n\t\t\t\t\t<integer>113</integer>\n\t\t\t\t</dict>\n\t\t\t</array>\n\t\t\t<key>ID</key>\n\t\t\t<integer>111</integer>\n\t\t</dict>\n\t</array>\n\t<key>GridInfo</key>\n\t<dict/>\n\t<key>GuidesLocked</key>\n\t<string>NO</string>\n\t<key>GuidesVisible</key>\n\t<string>YES</string>\n\t<key>HPages</key>\n\t<integer>1</integer>\n\t<key>ImageCounter</key>\n\t<integer>1</integer>\n\t<key>KeepToScale</key>\n\t<false/>\n\t<key>Layers</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>Lock</key>\n\t\t\t<string>NO</string>\n\t\t\t<key>Name</key>\n\t\t\t<string>Layer 1</string>\n\t\t\t<key>Print</key>\n\t\t\t<string>YES</string>\n\t\t\t<key>View</key>\n\t\t\t<string>YES</string>\n\t\t</dict>\n\t</array>\n\t<key>LayoutInfo</key>\n\t<dict>\n\t\t<key>Animate</key>\n\t\t<string>NO</string>\n\t\t<key>circoMinDist</key>\n\t\t<real>18</real>\n\t\t<key>circoSeparation</key>\n\t\t<real>0.0</real>\n\t\t<key>layoutEngine</key>\n\t\t<string>dot</string>\n\t\t<key>neatoLineLength</key>\n\t\t<real>0.20000000298023224</real>\n\t\t<key>neatoSeparation</key>\n\t\t<real>0.0</real>\n\t\t<key>twopiSeparation</key>\n\t\t<real>0.0</real>\n\t</dict>\n\t<key>LinksVisible</key>\n\t<string>NO</string>\n\t<key>MagnetsVisible</key>\n\t<string>NO</string>\n\t<key>MasterSheets</key>\n\t<array/>\n\t<key>ModificationDate</key>\n\t<string>2016-01-31 10:15:40 +0000</string>\n\t<key>Modifier</key>\n\t<string>Matthijs Hollemans</string>\n\t<key>NotesVisible</key>\n\t<string>NO</string>\n\t<key>Orientation</key>\n\t<integer>2</integer>\n\t<key>OriginVisible</key>\n\t<string>NO</string>\n\t<key>PageBreaks</key>\n\t<string>YES</string>\n\t<key>PrintInfo</key>\n\t<dict>\n\t\t<key>NSBottomMargin</key>\n\t\t<array>\n\t\t\t<string>float</string>\n\t\t\t<string>41</string>\n\t\t</array>\n\t\t<key>NSHorizonalPagination</key>\n\t\t<array>\n\t\t\t<string>coded</string>\n\t\t\t<string>BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG</string>\n\t\t</array>\n\t\t<key>NSLeftMargin</key>\n\t\t<array>\n\t\t\t<string>float</string>\n\t\t\t<string>18</string>\n\t\t</array>\n\t\t<key>NSPaperSize</key>\n\t\t<array>\n\t\t\t<string>size</string>\n\t\t\t<string>{595.28001499176025, 841.8900146484375}</string>\n\t\t</array>\n\t\t<key>NSPrintReverseOrientation</key>\n\t\t<array>\n\t\t\t<string>coded</string>\n\t\t\t<string>BAtzdHJlYW10eXBlZIHoA4QBQISEhAhOU051bWJlcgCEhAdOU1ZhbHVlAISECE5TT2JqZWN0AIWEASqEhAFxlwCG</string>\n\t\t</array>\n\t\t<key>NSRightMargin</key>\n\t\t<array>\n\t\t\t<string>float</string>\n\t\t\t<string>18</string>\n\t\t</array>\n\t\t<key>NSTopMargin</key>\n\t\t<array>\n\t\t\t<string>float</string>\n\t\t\t<string>18</string>\n\t\t</array>\n\t</dict>\n\t<key>PrintOnePage</key>\n\t<false/>\n\t<key>ReadOnly</key>\n\t<string>NO</string>\n\t<key>RowAlign</key>\n\t<integer>1</integer>\n\t<key>RowSpacing</key>\n\t<real>36</real>\n\t<key>SheetTitle</key>\n\t<string>Canvas 1</string>\n\t<key>SmartAlignmentGuidesActive</key>\n\t<string>YES</string>\n\t<key>SmartDistanceGuidesActive</key>\n\t<string>YES</string>\n\t<key>UniqueID</key>\n\t<integer>1</integer>\n\t<key>UseEntirePage</key>\n\t<false/>\n\t<key>VPages</key>\n\t<integer>1</integer>\n\t<key>WindowInfo</key>\n\t<dict>\n\t\t<key>CurrentSheet</key>\n\t\t<integer>0</integer>\n\t\t<key>Expanded_Canvases</key>\n\t\t<array/>\n\t\t<key>Frame</key>\n\t\t<string>{{525, 120}, {1703, 1293}}</string>\n\t\t<key>ShowInfo</key>\n\t\t<true/>\n\t\t<key>ShowRuler</key>\n\t\t<true/>\n\t\t<key>Sidebar</key>\n\t\t<true/>\n\t\t<key>SidebarWidth</key>\n\t\t<integer>200</integer>\n\t\t<key>TopSlabHeight</key>\n\t\t<real>250</real>\n\t\t<key>VisibleRegion</key>\n\t\t<string>{{0, 32.075473429597466}, {560.8490868792851, 535.37738739107533}}</string>\n\t\t<key>Zoom</key>\n\t\t<real>2.119999885559082</real>\n\t\t<key>ZoomValues</key>\n\t\t<array>\n\t\t\t<array>\n\t\t\t\t<string>Canvas 1</string>\n\t\t\t\t<real>2.119999885559082</real>\n\t\t\t\t<real>2.0699999332427979</real>\n\t\t\t</array>\n\t\t</array>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "Hash Set/README.markdown",
    "content": "# Hash Set\n\nA set is a collection of elements that is kind of like an array but with two important differences: the order of the elements in the set is unimportant and each element can appear only once.\n\nIf the following were arrays, they'd all be different. However, they all represent the same set:\n\n```swift\n[1 ,2, 3]\n[2, 1, 3]\n[3, 2, 1]\n[1, 2, 2, 3, 1]\n```\n\nBecause each element can appear only once, it doesn't matter how often you write the element down -- only one of them counts.\n\n> **Note:** I often prefer to use sets over arrays when I have a collection of objects but don't care what order they are in. Using a set communicates to the programmer that the order of the elements is unimportant. If you're using an array, then you can't assume the same thing.\n\nTypical operations on a set are:\n\n- insert an element\n- remove an element\n- check whether the set contains an element\n- take the union with another set\n- take the intersection with another set\n- calculate the difference with another set\n\nUnion, intersection, and difference are ways to combine two sets into a single one:\n\n![Union, intersection, difference](Images/CombineSets.png)\n\nAs of Swift 1.2, the standard library includes a built-in `Set` type but here I'll show how you can make your own. You wouldn't use this in production code, but it's instructive to see how sets are implemented.\n\nIt's possible to implement a set using a simple array but that's not the most efficient way. Instead, we'll use a dictionary. Since `Swift`'s dictionary is built using a hash table, our own set will be a hash set.\n\n## The code\n\nHere are the beginnings of `HashSet` in Swift:\n\n```swift\npublic struct HashSet<T: Hashable> {\n    fileprivate var dictionary = Dictionary<T, Bool>()\n\n    public init() {\n\n    }\n\n    public mutating func insert(_ element: T) {\n        dictionary[element] = true\n    }\n\n    public mutating func remove(_ element: T) {\n        dictionary[element] = nil\n    }\n\n    public func contains(_ element: T) -> Bool {\n        return dictionary[element] != nil\n    }\n\n    public func allElements() -> [T] {\n        return Array(dictionary.keys)\n    }\n\n    public var count: Int {\n        return dictionary.count\n    }\n\n    public var isEmpty: Bool {\n        return dictionary.isEmpty\n    }\n}\n```\n\nThe code is really very simple because we rely on Swift's built-in `Dictionary` to do all the hard work. The reason we use a dictionary is that dictionary keys must be unique, just like the elements from a set. In addition, a dictionary has **O(1)** time complexity for most of its operations, making this set implementation very fast.\n\nBecause we're using a dictionary, the generic type `T` must conform to `Hashable`. You can put any type of object into our set, as long as it can be hashed. (This is true for Swift's own `Set` too.)\n\nNormally, you use a dictionary to associate keys with values, but for a set we only care about the keys. That's why we use `Bool` as the dictionary's value type, even though we only ever set it to `true`, never to `false`. (We could have picked anything here but booleans take up the least space.)\n\nCopy the code to a playground and add some tests:\n\n```swift\nvar set = HashSet<String>()\n\nset.insert(\"one\")\nset.insert(\"two\")\nset.insert(\"three\")\nset.allElements()      // [\"one, \"three\", \"two\"]\n\nset.insert(\"two\")\nset.allElements()      // still [\"one, \"three\", \"two\"]\n\nset.contains(\"one\")    // true\nset.remove(\"one\")\nset.contains(\"one\")    // false\n```\n\nThe `allElements()` function converts the contents of the set into an array. Note that the order of the elements in that array can be different than the order in which you added the items. As I said, a set doesn't care about the order of the elements (and neither does a dictionary).\n\n\n## Combining sets\n\nA lot of the usefulness of sets is in how you can combine them. (If you've ever used a vector drawing program like Sketch or Illustrator, you'll have seen the Union, Subtract, Intersect options to combine shapes. Same thing.)\n\nHere is the code for the union operation:\n\n```swift\nextension HashSet {\n    public func union(_ otherSet: HashSet<T>) -> HashSet<T> {\n        var combined = HashSet<T>()\n        for obj in self.dictionary.keys {\n            combined.insert(obj)\n        }\n        for obj in otherSet.dictionary.keys {\n            combined.insert(obj)\n        }\n        return combined\n    }\n}\n```\n\nThe *union* of two sets creates a new set that consists of all the elements in set A plus all the elements in set B. Of course, if there are duplicate elements they count only once.\n\nExample:\n\n```swift\nvar setA = HashSet<Int>()\nsetA.insert(1)\nsetA.insert(2)\nsetA.insert(3)\nsetA.insert(4)\n\nvar setB = HashSet<Int>()\nsetB.insert(3)\nsetB.insert(4)\nsetB.insert(5)\nsetB.insert(6)\n\nlet union = setA.union(setB)\nunion.allElements()           // [5, 6, 2, 3, 1, 4]\n```\n\nAs you can see, the union of the two sets contains all of the elements now. The values `3` and `4` still appear only once, even though they were in both sets.\n\nThe *intersection* of two sets contains only the elements that they have in common. Here is the code:\n\n```swift\nextension HashSet {\n    public func intersect(_ otherSet: HashSet<T>) -> HashSet<T> {\n        var common = HashSet<T>()\n        for obj in dictionary.keys {\n            if otherSet.contains(obj) {\n                common.insert(obj)\n            }\n        }\n        return common\n    }\n}\n```\n\nTo test it:\n\n```swift\nlet intersection = setA.intersect(setB)\nintersection.allElements()\n```\n\nThis prints `[3, 4]` because those are the only objects from set A that are also in set B.\n\nFinally, the *difference* between two sets removes the elements they have in common. The code is as follows:\n\n```swift\nextension HashSet {\n    public func difference(_ otherSet: HashSet<T>) -> HashSet<T> {\n        var diff = HashSet<T>()\n        for obj in dictionary.keys {\n            if !otherSet.contains(obj) {\n                diff.insert(obj)\n            }\n        }\n        return diff\n    }\n}\n```\n\nIt's really the opposite of `intersect()`. Try it out:\n\n```swift\nlet difference1 = setA.difference(setB)\ndifference1.allElements()                // [2, 1]\n\nlet difference2 = setB.difference(setA)\ndifference2.allElements()                // [5, 6]\n```\n\n## Where to go from here?\n\nIf you look at the [documentation](http://swiftdoc.org/v2.1/type/Set/) for Swift's own `Set`, you'll notice it has tons more functionality. An obvious extension would be to make `HashSet` conform to `SequenceType` so that you can iterate it with a `for`...`in` loop.\n\nAnother thing you could do is replace the `Dictionary` with an actual [hash table](../Hash%20Table), but one that just stores the keys and doesn't associate them with anything. So you wouldn't need the `Bool` values anymore.\n\nIf you often need to look up whether an element belongs to a set and perform unions, then the [union-find](../Union-Find/) data structure may be more suitable. It uses a tree structure instead of a dictionary to make the find and union operations very efficient.\n\n> **Note:** I'd like to make `HashSet` conform to `ArrayLiteralConvertible` so you can write `let setA: HashSet<Int> = [1, 2, 3, 4]` but currently this crashes the compiler.\n\n*Written for Swift Algorithm Club by Matthijs Hollemans*\n"
  },
  {
    "path": "Hash Table/HashTable.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\n// Playing with hash values\n\n\"firstName\".hashValue\nabs(\"firstName\".hashValue) % 5\n\n\"lastName\".hashValue\nabs(\"lastName\".hashValue) % 5\n\n\"hobbies\".hashValue\nabs(\"hobbies\".hashValue) % 5\n\n// Playing with the hash table\n\nvar hashTable = HashTable<String, String>(capacity: 5)\n\nhashTable[\"firstName\"] = \"Steve\"\nhashTable[\"lastName\"] = \"Jobs\"\nhashTable[\"hobbies\"] = \"Programming Swift\"\n\nprint(hashTable)\nprint(hashTable.debugDescription)\n\nlet x = hashTable[\"firstName\"]\nhashTable[\"firstName\"] = \"Tim\"\n\nlet y = hashTable[\"firstName\"]\nhashTable[\"firstName\"] = nil\n\nlet z = hashTable[\"firstName\"]\n\nprint(hashTable)\nprint(hashTable.debugDescription)\n"
  },
  {
    "path": "Hash Table/HashTable.playground/Sources/HashTable.swift",
    "content": "/*\n Hash Table: A symbol table of generic key-value pairs.\n \n The key must be `Hashable`, which means it can be transformed into a fairly\n unique integer value. The more unique the hash value, the better.\n \n Hash tables use an internal array of buckets to store key-value pairs. The\n hash table's capacity is determined by the number of buckets. This\n implementation has a fixed capacity--it does not resize the array as more\n key-value pairs are inserted.\n \n To insert or locate a particular key-value pair, a hash function transforms the\n key into an array index. An ideal hash function would guarantee that different\n keys map to different indices. In practice, however, this is difficult to\n achieve.\n \n Since different keys can map to the same array index, all hash tables implement\n a collision resolution strategy. This implementation uses a strategy called\n separate chaining, where key-value pairs that hash to the same index are\n \"chained together\" in a list. For good performance, the capacity of the hash\n table should be sufficiently large so that the lists are small.\n \n A well-sized hash table provides very good average performance. In the\n worst-case, however, all keys map to the same bucket, resulting in a list that\n that requires O(n) time to traverse.\n \n        Average Worst-Case\n Space:   O(n)     O(n)\n Search:  O(1)     O(n)\n Insert:  O(1)     O(n)\n Delete:  O(1)     O(n)\n */\npublic struct HashTable<Key: Hashable, Value> {\n    private typealias Element = (key: Key, value: Value)\n    private typealias Bucket = [Element]\n    private var buckets: [Bucket]\n\n    /// The number of key-value pairs in the hash table.\n    private(set) public var count = 0\n\n    /// A Boolean value that indicates whether the hash table is empty.\n    public var isEmpty: Bool { return count == 0 }\n\n    /**\n     Create a hash table with the given capacity.\n     */\n    public init(capacity: Int) {\n        assert(capacity > 0)\n        buckets = Array<Bucket>(repeatElement([], count: capacity))\n    }\n\n    /**\n     Accesses the value associated with\n     the given key for reading and writing.\n     */\n    public subscript(key: Key) -> Value? {\n        get {\n            return value(forKey: key)\n        }\n        set {\n            if let value = newValue {\n                updateValue(value, forKey: key)\n            } else {\n                removeValue(forKey: key)\n            }\n        }\n    }\n\n    /**\n     Returns the value for the given key.\n     */\n    public func value(forKey key: Key) -> Value? {\n        let index = self.index(forKey: key)\n        for element in buckets[index] {\n            if element.key == key {\n                return element.value\n            }\n        }\n        return nil  // key not in hash table\n    }\n\n    /**\n     Updates the value stored in the hash table for the given key,\n     or adds a new key-value pair if the key does not exist.\n     */\n    @discardableResult public mutating func updateValue(_ value: Value, forKey key: Key) -> Value? {\n        let index = self.index(forKey: key)\n\n        // Do we already have this key in the bucket?\n        for (i, element) in buckets[index].enumerated() {\n            if element.key == key {\n                let oldValue = element.value\n                buckets[index][i].value = value\n                return oldValue\n            }\n        }\n\n        // This key isn't in the bucket yet; add it to the chain.\n        buckets[index].append((key: key, value: value))\n        count += 1\n        return nil\n    }\n\n    /**\n     Removes the given key and its\n     associated value from the hash table.\n     */\n    @discardableResult public mutating func removeValue(forKey key: Key) -> Value? {\n        let index = self.index(forKey: key)\n\n        // Find the element in the bucket's chain and remove it.\n        for (i, element) in buckets[index].enumerated() {\n            if element.key == key {\n                buckets[index].remove(at: i)\n                count -= 1\n                return element.value\n            }\n        }\n        return nil  // key not in hash table\n    }\n\n    /**\n     Removes all key-value pairs from the hash table.\n     */\n    public mutating func removeAll() {\n        buckets = Array<Bucket>(repeatElement([], count: buckets.count))\n        count = 0\n    }\n\n    /**\n     Returns the given key's array index.\n     */\n    private func index(forKey key: Key) -> Int {\n        return abs(key.hashValue % buckets.count)\n    }\n}\n\nextension HashTable: CustomStringConvertible {\n    /// A string that represents the contents of the hash table.\n    public var description: String {\n        let pairs = buckets.flatMap { b in b.map { e in \"\\(e.key) = \\(e.value)\" } }\n        return pairs.joined(separator: \", \")\n    }\n    \n    /// A string that represents the contents of\n    /// the hash table, suitable for debugging.\n    public var debugDescription: String {\n        var str = \"\"\n        for (i, bucket) in buckets.enumerated() {\n            let pairs = bucket.map { e in \"\\(e.key) = \\(e.value)\" }\n            str += \"bucket \\(i): \" + pairs.joined(separator: \", \") + \"\\n\"\n        }\n        return str\n    }\n}\n"
  },
  {
    "path": "Hash Table/HashTable.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Hash Table/HashTable.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Hash Table/HashTable.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Hash Table/README.markdown",
    "content": "# Hash Table\n\nA hash table allows you to store and retrieve objects by a \"key\".\n\nA hash table is used to implement structures, such as a dictionary, a map, and an associative array. These structures can be implemented by a tree or a plain array, but it is efficient to use a hash table.\n\nThis should explain why Swift's built-in `Dictionary` type requires that keys conform to the `Hashable` protocol: internally it uses a hash table, like the one you will learn about here.\n\n## How it works\n\nA hash table is nothing more than an array. Initially, this array is empty. When you put a value into the hash table under a certain key, it uses that key to calculate an index in the array. Here is an example:\n\n```swift\nhashTable[\"firstName\"] = \"Steve\"\n\n\tThe hashTable array:\n\t+--------------+\n\t| 0:           |\n\t+--------------+\n\t| 1:           |\n\t+--------------+\n\t| 2:           |\n\t+--------------+\n\t| 3: firstName |---> Steve\n\t+--------------+\n\t| 4:           |\n\t+--------------+\n```\n\nIn this example, the key `\"firstName\"` maps to array index 3.\n\nAdding a value under a different key puts it at another array index:\n\n```swift\nhashTable[\"hobbies\"] = \"Programming Swift\"\n\n\tThe hashTable array:\n\t+--------------+\n\t| 0:           |\n\t+--------------+\n\t| 1: hobbies   |---> Programming Swift\n\t+--------------+\n\t| 2:           |\n\t+--------------+\n\t| 3: firstName |---> Steve\n\t+--------------+\n\t| 4:           |\n\t+--------------+\n```\n\nThe trick is how the hash table calculates those array indices. That is where the hashing comes in. When you write the following statement,\n\n```swift\nhashTable[\"firstName\"] = \"Steve\"\n```\n\nthe hash table takes the key `\"firstName\"` and asks it for its `hashValue` property. Hence, keys must be `Hashable`.\n\nWhen you write `\"firstName\".hashValue`, it returns a big integer: -4799450059917011053. Likewise, `\"hobbies\".hashValue` has the hash value 4799450060928805186. (The values you see may vary.)\n\nThese numbers are big to be used as indices into our array, and one of them is even negative! A common way to make these big numbers  suitable is to first make the hash positive and then take the modulo with the array size.\n\nOur array has size 5, so the index for the `\"firstName\"` key becomes `abs(-4799450059917011053) % 5 = 3`. You can calculate that the array index for `\"hobbies\"` is 1.\n\nUsing hashes in this manner is what makes the dictionary efficient: to find an element in the hash table, you must hash the key to get an array index and then look up the element in the underlying array. All these operations take a constant amount of time, so inserting, retrieving, and removing are all **O(1)**.\n\n> **Note:** It is difficult to predict where in the array your objects end up. Hence, dictionaries do not guarantee any particular order of the elements in the hash table.\n\n## Avoiding collisions\n\nThere is one problem: because we take the modulo of the hash value with the size of the array, it can happen that two or more keys get assigned the same array index. This is called a collision.\n\nOne way to avoid collisions is to have a large array which reduces the likelihood of two keys mapping to the same index. Another trick is to use a prime number for the array size. However, collisions are bound to occur, so you need to find a way to handle them.\n\nBecause our table is small, it is easy to show a collision. For example, the array index for the key `\"lastName\"` is also 3, but we do not want to overwrite the value that is already at this array index.\n\nA common way to handle collisions is to use chaining. The array looks as follows:\n\n```swift\n\tbuckets:\n\t+-----+\n\t|  0  |\n\t+-----+     +----------------------------+\n\t|  1  |---> | hobbies: Programming Swift |\n\t+-----+     +----------------------------+\n\t|  2  |\n\t+-----+     +------------------+     +----------------+\n\t|  3  |---> | firstName: Steve |---> | lastName: Jobs |\n\t+-----+     +------------------+     +----------------+\n\t|  4  |\n\t+-----+\n```\n\nWith chaining, keys and their values are not stored directly in the array. Instead, each array element is a list of zero or more key/value pairs. The array elements are usually called the *buckets* and the lists are called the *chains*. Here we have 5 buckets, and two of these buckets have chains. The other three buckets are empty.\n\nIf we write the following statement to retrieve an item from the hash table,\n\n```swift\nlet x = hashTable[\"lastName\"]\n```\n\nit first hashes the key `\"lastName\"` to calculate the array index, which is 3. Since bucket 3 has a chain, we step through the list to find the value with the key `\"lastName\"`. This is done by comparing the keys using a string comparison. The hash table checks that the key belongs to the last item in the chain and returns the corresponding value, `\"Jobs\"`.\n\nCommon ways to implement this chaining mechanism are to use a linked list or another array. Since the order of the items in the chain does not matter, you can think of it as a set instead of a list. (Now you can also imagine where the term \"bucket\" comes from; we just dump all the objects together into the bucket.)\n\nChains should not become long because looking up items in the hash table would become a slow process. Ideally, we would have no chains at all, but in practice it is impossible to avoid collisions. You can improve the odds by giving the hash table enough buckets using high-quality hash functions.\n\n> **Note:** An alternative to chaining is \"open addressing\". The idea is this: if an array index is already taken, we put the element in the next unused bucket. This approach has its own upsides and downsides.\n\n## The code\n\nLet's look at a basic implementation of a hash table in Swift. We will build it up step-by-step.\n\n```swift\npublic struct HashTable<Key: Hashable, Value> {\n  private typealias Element = (key: Key, value: Value)\n  private typealias Bucket = [Element]\n  private var buckets: [Bucket]\n\n  private(set) public var count = 0\n  \n  public var isEmpty: Bool { return count == 0 }\n\n  public init(capacity: Int) {\n    assert(capacity > 0)\n    buckets = Array<Bucket>(repeatElement([], count: capacity))\n  }\n```\n\nThe `HashTable` is a generic container, and the two generic types are named `Key` (which must be `Hashable`) and `Value`. We also define two other types: `Element` is a key/value pair for using in a chain, and `Bucket` is an array of such `Elements`.\n\nThe main array is named `buckets`. It has a fixed size, the so-called capacity, provided by the `init(capacity)` method. We are also keeping track of how many items have been added to the hash table using the `count` variable.\n\nAn example of how to create a new hash table object:\n\n```swift\nvar hashTable = HashTable<String, String>(capacity: 5)\n```\n\nThe hash table does not do anything yet, so let's add the remaining functionality. First, add a helper method that calculates the array index for a given key:\n\n```swift\n  private func index(forKey key: Key) -> Int {\n    return abs(key.hashValue % buckets.count)\n  }\n```\n\nThis performs the calculation you saw earlier: it takes the absolute value of the key's `hashValue` modulo the size of the buckets array. We have put this in a function of its own because it gets used in a few different places.\n\nThere are four common things you will do with a hash table or dictionary: \n\n- insert a new element\n- look up an element\n- update an existing element\n- remove an element\n\nThe syntax for these is:\n\n```swift\nhashTable[\"firstName\"] = \"Steve\"   // insert\nlet x = hashTable[\"firstName\"]     // lookup\nhashTable[\"firstName\"] = \"Tim\"     // update\nhashTable[\"firstName\"] = nil       // delete\n```\n\nWe can do all these things with a `subscript` function:\n\n```swift\n  public subscript(key: Key) -> Value? {\n    get {\n      return value(forKey: key)\n    }\n    set {\n      if let value = newValue {\n        updateValue(value, forKey: key)\n      } else {\n        removeValue(forKey: key)\n      }\n    }\n  }\n```\n\nThis calls three helper functions to do the actual work. Let's take a look at `value(forKey:)`which retrieves an object from the hash table.\n\n```swift\n  public func value(forKey key: Key) -> Value? {\n    let index = self.index(forKey: key)\n    for element in buckets[index] {\n      if element.key == key {\n        return element.value\n      }\n    }\n    return nil  // key not in hash table\n  }\n```\nFirst it calls `index(forKey:)` to convert the key into an array index. That gives us the bucket number, but this bucket may be used by more than one key if there were collisions. The `value(forKey:)` loops through the chain from that bucket and compares the keys one-by-one. If found, it returns the corresponding value, otherwise it returns `nil`.\n\nThe code to insert a new element or update an existing element lives in `updateValue(_:forKey:)`. This is more complicated:\n\n```swift\n  public mutating func updateValue(_ value: Value, forKey key: Key) -> Value? {\n    let index = self.index(forKey: key)\n    \n    // Do we already have this key in the bucket?\n    for (i, element) in buckets[index].enumerated() {\n      if element.key == key {\n        let oldValue = element.value\n        buckets[index][i].value = value\n        return oldValue\n      }\n    }\n    \n    // This key isn't in the bucket yet; add it to the chain.\n    buckets[index].append((key: key, value: value))\n    count += 1\n    return nil\n  }\n```\n\nAgain, the first step is to convert the key into an array index to find the bucket. Then we loop through the chain for that bucket. If we find the key in the chain, we must update it with the new value. If the key is not in the chain, we insert the new key/value pair to the end of the chain.\n\nAs you can see, it is important to keep the chains short (by making the hash table large enough). Otherwise, you spend excessive time in these `for`...`in` loops and the performance of the hash table will no longer be **O(1)** but more like **O(n)**.\n\nRemoving is similar in that again it loops through the chain:\n\n```swift\n  public mutating func removeValue(forKey key: Key) -> Value? {\n    let index = self.index(forKey: key)\n\n    // Find the element in the bucket's chain and remove it.\n    for (i, element) in buckets[index].enumerated() {\n      if element.key == key {\n        buckets[index].remove(at: i)\n        count -= 1\n        return element.value\n      }\n    }\n    return nil  // key not in hash table\n  }\n```\n\nThese are the basic functions of the hash table. They all work the same way: convert the key into an array index using its hash value, find the bucket, then loop through that bucket's chain and perform the desired operation.\n\nTry this stuff out in a playground. It should work just like a standard Swift `Dictionary`.\n\n## Resizing the hash table\n\nThis version of `HashTable` always uses an array of a fixed size or capacity. If you have many items to store in the hash table, for the capacity, choose a prime number greater than the maximum number of items.\n\nThe *load factor* of a hash table is the percentage of the capacity that is currently used. If there are 3 items in a hash table with 5 buckets, then the load factor is `3/5 = 60%`.\n\nIf the hash table is small, and the chains are long, the load factor can become greater than 1, that is not a good idea.\n\nIf the load factor becomes high, greater than 75%, you can resize the hash table. Adding the code for this condition is left as an exercise for the reader. Keep in mind that making the buckets array larger will change the array indices that the keys map to! This requires you to insert all the elements again after resizing the array.\n\n## Where to go from here?\n\n`HashTable` is quite basic. It might be efficient to integrate it with the Swift standard library by making it a `SequenceType`.\n\n*Written for Swift Algorithm Club by Matthijs Hollemans*\n"
  },
  {
    "path": "Hashed Heap/HashedHeap.swift",
    "content": "// Written by Alejandro Isaza. Adapted from heap implementation written by Kevin Randrup and Matthijs Hollemans.\n\n/// Heap with an index hash map (dictionary) to speed up lookups by value.\n///\n/// A heap keeps elements ordered in a binary tree without the use of pointers. A hashed heap does that as well as\n/// having amortized constant lookups by value. This is used in the A* and other heuristic search algorithms to achieve\n/// optimal performance.\npublic struct HashedHeap<T: Hashable> {\n  /// The array that stores the heap's nodes.\n  private(set) var elements = [T]()\n  \n  /// Hash mapping from elements to indices in the `elements` array.\n  private(set) var indices = [T: Int]()\n  \n  /// Determines whether this is a max-heap (>) or min-heap (<).\n  fileprivate var isOrderedBefore: (T, T) -> Bool\n  \n  /// Creates an empty hashed heap.\n  ///\n  /// The sort function determines whether this is a min-heap or max-heap. For integers, > makes a max-heap, < makes\n  /// a min-heap.\n  public init(sort: @escaping (T, T) -> Bool) {\n    isOrderedBefore = sort\n  }\n  \n  /// Creates a hashed heap from an array.\n  ///\n  /// The order of the array does not matter; the elements are inserted into the heap in the order determined by the\n  /// sort function.\n  ///\n  /// - Complexity: O(n)\n  public init(array: [T], sort: @escaping (T, T) -> Bool) {\n    isOrderedBefore = sort\n    build(from: array)\n  }\n  \n  /// Converts an array to a max-heap or min-heap in a bottom-up manner.\n  ///\n  /// - Complexity: O(n)\n  private mutating func build(from array: [T]) {\n    elements = array\n    for index in elements.indices {\n      indices[elements[index]] = index\n    }\n    \n    for i in stride(from: (elements.count/2 - 1), through: 0, by: -1) {\n      shiftDown(i, heapSize: elements.count)\n    }\n  }\n  \n  /// Whether the heap is empty.\n  public var isEmpty: Bool {\n    return elements.isEmpty\n  }\n  \n  /// The number of elements in the heap.\n  public var count: Int {\n    return elements.count\n  }\n\n  /// Accesses an element by its index.\n  public subscript(index: Int) -> T {\n    return elements[index]\n  }\n\n  /// Returns the index of the given element.\n  ///\n  /// This is the operation that a hashed heap optimizes in compassion with a normal heap. In a normal heap this\n  /// would take O(n), but for the hashed heap this takes amortized constatn time.\n  ///\n  /// - Complexity: Amortized constant\n  public func index(of element: T) -> Int? {\n    return indices[element]\n  }\n  \n  /// Returns the maximum value in the heap (for a max-heap) or the minimum value (for a min-heap).\n  ///\n  /// - Complexity: O(1)\n  public func peek() -> T? {\n    return elements.first\n  }\n  \n  /// Adds a new value to the heap.\n  ///\n  /// This reorders the heap so that the max-heap or min-heap property still holds.\n  ///\n  /// - Complexity: O(log n)\n  public mutating func insert(_ value: T) {\n    elements.append(value)\n    indices[value] = elements.count - 1\n    shiftUp(elements.count - 1)\n  }\n  \n  /// Adds new values to the heap.\n  public mutating func insert<S: Sequence>(_ sequence: S) where S.Iterator.Element == T {\n    for value in sequence {\n      insert(value)\n    }\n  }\n  \n  /// Replaces an element in the hash.\n  ///\n  /// In a max-heap, the new element should be larger than the old one; in a min-heap it should be smaller.\n  public mutating func replace(_ value: T, at index: Int) {\n    guard index < elements.count else { return }\n    \n    assert(isOrderedBefore(value, elements[index]))\n    set(value, at: index)\n    shiftUp(index)\n  }\n  \n  /// Removes the root node from the heap.\n  ///\n  /// For a max-heap, this is the maximum value; for a min-heap it is the minimum value.\n  ///\n  /// - Complexity: O(log n)\n  @discardableResult\n  public mutating func remove() -> T? {\n    if elements.isEmpty {\n      return nil\n    } else if elements.count == 1 {\n      return removeLast()\n    } else {\n      // Use the last node to replace the first one, then fix the heap by\n      // shifting this new first node into its proper position.\n      let value = elements[0]\n      set(removeLast(), at: 0)\n      shiftDown()\n      return value\n    }\n  }\n  \n  /// Removes an arbitrary node from the heap.\n  ///\n  /// You need to know the node's index, which may actually take O(n) steps to find.\n  ///\n  /// - Complexity: O(log n).\n  public mutating func remove(at index: Int) -> T? {\n    guard index < elements.count else { return nil }\n    \n    let size = elements.count - 1\n    if index != size {\n      swapAt(index, size)\n      shiftDown(index, heapSize: size)\n      shiftUp(index)\n    }\n    return removeLast()\n  }\n\n  /// Removes all elements from the heap.\n  public mutating func removeAll() {\n    elements.removeAll()\n    indices.removeAll()\n  }\n  \n  /// Removes the last element from the heap.\n  ///\n  /// - Complexity: O(1)\n  public mutating func removeLast() -> T {\n    guard let value = elements.last else {\n      preconditionFailure(\"Trying to remove element from empty heap\")\n    }\n    indices[value] = nil\n    return elements.removeLast()\n  }\n  \n  /// Takes a child node and looks at its parents; if a parent is not larger (max-heap) or not smaller (min-heap)\n  /// than the child, we exchange them.\n  mutating func shiftUp(_ index: Int) {\n    var childIndex = index\n    let child = elements[childIndex]\n    var parentIndex = self.parentIndex(of: childIndex)\n    \n    while childIndex > 0 && isOrderedBefore(child, elements[parentIndex]) {\n      set(elements[parentIndex], at: childIndex)\n      childIndex = parentIndex\n      parentIndex = self.parentIndex(of: childIndex)\n    }\n    \n    set(child, at: childIndex)\n  }\n  \n  mutating func shiftDown() {\n    shiftDown(0, heapSize: elements.count)\n  }\n  \n  /// Looks at a parent node and makes sure it is still larger (max-heap) or smaller (min-heap) than its childeren.\n  mutating func shiftDown(_ index: Int, heapSize: Int) {\n    var parentIndex = index\n    \n    while true {\n      let leftChildIndex = self.leftChildIndex(of: parentIndex)\n      let rightChildIndex = leftChildIndex + 1\n      \n      // Figure out which comes first if we order them by the sort function:\n      // the parent, the left child, or the right child. If the parent comes\n      // first, we're done. If not, that element is out-of-place and we make\n      // it \"float down\" the tree until the heap property is restored.\n      var first = parentIndex\n      if leftChildIndex < heapSize && isOrderedBefore(elements[leftChildIndex], elements[first]) {\n        first = leftChildIndex\n      }\n      if rightChildIndex < heapSize && isOrderedBefore(elements[rightChildIndex], elements[first]) {\n        first = rightChildIndex\n      }\n      if first == parentIndex { return }\n      \n      swapAt(parentIndex, first)\n      parentIndex = first\n    }\n  }\n  \n  /// Replaces an element in the heap and updates the indices hash.\n  private mutating func set(_ newValue: T, at index: Int) {\n    indices[elements[index]] = nil\n    elements[index] = newValue\n    indices[newValue] = index\n  }\n  \n  /// Swap two elements in the heap and update the indices hash.\n  private mutating func swapAt(_ i: Int, _ j: Int) {\n    elements.swapAt(i, j)\n    indices[elements[i]] = i\n    indices[elements[j]] = j\n  }\n  \n  /// Returns the index of the parent of the element at index i.\n  ///\n  /// - Note: The element at index 0 is the root of the tree and has no parent.\n  @inline(__always)\n  func parentIndex(of index: Int) -> Int {\n    return (index - 1) / 2\n  }\n  \n  /// Returns the index of the left child of the element at index i.\n  ///\n  /// - Note: this index can be greater than the heap size, in which case there is no left child.\n  @inline(__always)\n  func leftChildIndex(of index: Int) -> Int {\n    return 2*index + 1\n  }\n  \n  /// Returns the index of the right child of the element at index i.\n  ///\n  /// - Note: this index can be greater than the heap size, in which case there is no right child.\n  @inline(__always)\n  func rightChildIndex(of index: Int) -> Int {\n    return 2*index + 2\n  }\n}\n"
  },
  {
    "path": "Hashed Heap/README.markdown",
    "content": "# Hashed Heap\n\nA hashed heap is a [heap](../Heap/) with a hash map (also known as a dictionary) to speed up lookup of elements by value. This combination doesn't compromize on time performance but requires extra storage for the hash map. This is mainly used for heuristic search algorihms, in particular A*.\n\n## The code\n\nSee [HashedHeap.swift](HashedHeap.swift) for the implementation. See [Heap](../Heap/) for a detailed explanation of the basic heap implementation.\n\n## See also\n\n[Heap on Wikipedia](https://en.wikipedia.org/wiki/Heap_%28data_structure%29)\n\n*Written for the Swift Algorithm Club by [Alejandro Isaza](https://github.com/aleph7)*\n"
  },
  {
    "path": "Hashed Heap/Tests/Hashed Heap Tests.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t7B80C3FC1C77A658003CECC7 /* HashedHeap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C3FB1C77A658003CECC7 /* HashedHeap.swift */; };\n\t\t7B80C3FE1C77A65E003CECC7 /* HashedHeapTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C3FD1C77A65E003CECC7 /* HashedHeapTests.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t7B2BBC801C779D720067B71D /* Hashed Heap Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = \"Hashed Heap Tests.xctest\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7B2BBC941C779E7B0067B71D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };\n\t\t7B80C3FB1C77A658003CECC7 /* HashedHeap.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = HashedHeap.swift; path = ../HashedHeap.swift; sourceTree = SOURCE_ROOT; };\n\t\t7B80C3FD1C77A65E003CECC7 /* HashedHeapTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HashedHeapTests.swift; sourceTree = SOURCE_ROOT; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t7B2BBC7D1C779D720067B71D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t7B2BBC681C779D710067B71D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC831C779D720067B71D /* Tests */,\n\t\t\t\t7B2BBC721C779D710067B71D /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC721C779D710067B71D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC801C779D720067B71D /* Hashed Heap Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC831C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B80C3FB1C77A658003CECC7 /* HashedHeap.swift */,\n\t\t\t\t7B80C3FD1C77A65E003CECC7 /* HashedHeapTests.swift */,\n\t\t\t\t7B2BBC941C779E7B0067B71D /* Info.plist */,\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t7B2BBC7F1C779D720067B71D /* Hashed Heap Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Hashed Heap Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t7B2BBC7C1C779D720067B71D /* Sources */,\n\t\t\t\t7B2BBC7D1C779D720067B71D /* Frameworks */,\n\t\t\t\t7B2BBC7E1C779D720067B71D /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"Hashed Heap Tests\";\n\t\t\tproductName = TestsTests;\n\t\t\tproductReference = 7B2BBC801C779D720067B71D /* Hashed Heap Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t7B2BBC691C779D710067B71D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0720;\n\t\t\t\tLastUpgradeCheck = 0900;\n\t\t\t\tORGANIZATIONNAME = \"Swift Algorithm Club\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t7B2BBC7F1C779D720067B71D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2;\n\t\t\t\t\t\tLastSwiftMigration = 0900;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Hashed Heap Tests\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 7B2BBC681C779D710067B71D;\n\t\t\tproductRefGroup = 7B2BBC721C779D710067B71D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t7B2BBC7F1C779D720067B71D /* Hashed Heap Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t7B2BBC7E1C779D720067B71D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t7B2BBC7C1C779D720067B71D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7B80C3FE1C77A65E003CECC7 /* HashedHeapTests.swift in Sources */,\n\t\t\t\t7B80C3FC1C77A658003CECC7 /* HashedHeap.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t7B2BBC871C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Default;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC881C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Default;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t7B2BBC8D1C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Default;\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC8E1C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Default;\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Hashed Heap Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC871C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC881C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Hashed Heap Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC8D1C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC8E1C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 7B2BBC691C779D710067B71D /* Project object */;\n}\n"
  },
  {
    "path": "Hashed Heap/Tests/Hashed Heap Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Tests.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Hashed Heap/Tests/Hashed Heap Tests.xcodeproj/xcshareddata/xcschemes/Hashed Heap Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0900\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Hashed Heap Tests.xctest\"\n               BlueprintName = \"Hashed Heap Tests\"\n               ReferencedContainer = \"container:Hashed Heap Tests.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      language = \"\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Hashed Heap/Tests/HashedHeapTests.swift",
    "content": "import Foundation\nimport XCTest\n\nprivate struct Message: Hashable {\n  let text: String\n  let priority: Int\n  \n  var hashValue: Int {\n    return text.hashValue\n  }\n  \n  static func == (lhs: Message, rhs: Message) -> Bool {\n    return lhs.text == rhs.text\n  }\n  \n  static func < (m1: Message, m2: Message) -> Bool {\n    return m1.priority < m2.priority\n  }\n}\n\nclass HashedHeapTest: XCTestCase {\n  override func setUp() {\n    super.setUp()\n    // last checked with Xcode 9.0b4\n    #if swift(>=4.0)\n      print(\"Hello, Swift 4!\")\n    #endif\n  }\n  \n  func testEmpty() {\n    var queue = HashedHeap<Message>(sort: <)\n    XCTAssertTrue(queue.isEmpty)\n    XCTAssertEqual(queue.count, 0)\n    XCTAssertNil(queue.peek())\n    XCTAssertNil(queue.remove())\n  }\n  \n  func testOneElement() {\n    var queue = HashedHeap<Message>(sort: <)\n    \n    queue.insert(Message(text: \"hello\", priority: 100))\n    XCTAssertFalse(queue.isEmpty)\n    XCTAssertEqual(queue.count, 1)\n    XCTAssertEqual(queue.peek()!.priority, 100)\n    \n    let result = queue.remove()\n    XCTAssertEqual(result!.priority, 100)\n    XCTAssertTrue(queue.isEmpty)\n    XCTAssertEqual(queue.count, 0)\n    XCTAssertNil(queue.peek())\n  }\n  \n  func testTwoElementsInOrder() {\n    var queue = HashedHeap<Message>(sort: <)\n    \n    queue.insert(Message(text: \"hello\", priority: 100))\n    queue.insert(Message(text: \"world\", priority: 200))\n    XCTAssertFalse(queue.isEmpty)\n    XCTAssertEqual(queue.count, 2)\n    XCTAssertEqual(queue.peek()!.priority, 100)\n    \n    let result1 = queue.remove()\n    XCTAssertEqual(result1!.priority, 100)\n    XCTAssertFalse(queue.isEmpty)\n    XCTAssertEqual(queue.count, 1)\n    XCTAssertEqual(queue.peek()!.priority, 200)\n    \n    let result2 = queue.remove()\n    XCTAssertEqual(result2!.priority, 200)\n    XCTAssertTrue(queue.isEmpty)\n    XCTAssertEqual(queue.count, 0)\n    XCTAssertNil(queue.peek())\n  }\n  \n  func testTwoElementsOutOfOrder() {\n    var queue = HashedHeap<Message>(sort: <)\n    \n    queue.insert(Message(text: \"world\", priority: 200))\n    queue.insert(Message(text: \"hello\", priority: 100))\n    XCTAssertFalse(queue.isEmpty)\n    XCTAssertEqual(queue.count, 2)\n    XCTAssertEqual(queue.peek()!.priority, 100)\n    \n    let result1 = queue.remove()\n    XCTAssertEqual(result1!.priority, 100)\n    XCTAssertFalse(queue.isEmpty)\n    XCTAssertEqual(queue.count, 1)\n    XCTAssertEqual(queue.peek()!.priority, 200)\n    \n    let result2 = queue.remove()\n    XCTAssertEqual(result2!.priority, 200)\n    XCTAssertTrue(queue.isEmpty)\n    XCTAssertEqual(queue.count, 0)\n    XCTAssertNil(queue.peek())\n  }\n}\n"
  },
  {
    "path": "Hashed Heap/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "HaversineDistance/HaversineDistance.playground/Contents.swift",
    "content": "import UIKit\n\nfunc haversineDistance(la1: Double, lo1: Double, la2: Double, lo2: Double, radius: Double = 6367444.7) -> Double {\n    \n    let haversin = { (angle: Double) -> Double in\n        return (1 - cos(angle))/2\n    }\n    \n    let ahaversin = { (angle: Double) -> Double in\n        return 2*asin(sqrt(angle))\n    }\n    \n    // Converts from degrees to radians\n    let dToR = { (angle: Double) -> Double in\n        return (angle / 360) * 2 * .pi\n    }\n    \n    let lat1 = dToR(la1)\n    let lon1 = dToR(lo1)\n    let lat2 = dToR(la2)\n    let lon2 = dToR(lo2)\n    \n    return radius * ahaversin(haversin(lat2 - lat1) + cos(lat1) * cos(lat2) * haversin(lon2 - lon1))\n}\n\nlet amsterdam = (52.3702, 4.8952)\nlet newYork = (40.7128, -74.0059)\n\n// Google says it's 5857 km so our result is only off by 2km which could be due to all kinds of things, not sure how google calculates the distance or which latitude and longitude google uses to calculate the distance.\nhaversineDistance(la1: amsterdam.0, lo1: amsterdam.1, la2: newYork.0, lo2: newYork.1)\n"
  },
  {
    "path": "HaversineDistance/HaversineDistance.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "HaversineDistance/HaversineDistance.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "HaversineDistance/README.md",
    "content": "# Haversine Distance\n\nCalculates the distance on a sphere between two points given in latitude and longitude using the haversine formula.\n\nThe haversine formula can be found on [Wikipedia](https://en.wikipedia.org/wiki/Haversine_formula)\n\nThe Haversine Distance is implemented as a function as a class would be kind of overkill.\n\n`haversineDinstance(la1: Double, lo1: Double, la2: Double, lo2: Double, radius: Double = 6367444.7) -> Double`\n\n- `la1` is the latitude of point 1 in degrees.\n- `lo1` is the longitude of point 1 in degrees.\n- `la2` is the latitude of point 2 in degrees.\n- `lo2` is the longitude of point 2 in degrees.\n- `radius` is the radius of the sphere considered in meters, which defaults to the mean radius of the earth (from [WolframAlpha](http://www.wolframalpha.com/input/?i=earth+radius)).\n\nThe function contains 3 closures in order to make the code more readable and comparable to the Haversine formula given by the Wikipedia page mentioned above.\n\n1. `haversine` implements the haversine, a trigonometric function.\n2. `ahaversine` the inverse function of the haversine.\n3. `dToR` a closure converting degrees to radians.\n\nThe result of `haversineDistance` is returned in meters.\n\n*Written for Swift Algorithm Club by Jaap Wijnen.*\n"
  },
  {
    "path": "Heap/Heap.swift",
    "content": "//\n//  Heap.swift\n//  Written for the Swift Algorithm Club by Kevin Randrup and Matthijs Hollemans\n//\n\npublic struct Heap<T> {\n  \n  /** The array that stores the heap's nodes. */\n  var nodes = [T]()\n  \n  /**\n   * Determines how to compare two nodes in the heap.\n   * Use '>' for a max-heap or '<' for a min-heap,\n   * or provide a comparing method if the heap is made\n   * of custom elements, for example tuples.\n   */\n  private var orderCriteria: (T, T) -> Bool\n  \n  /**\n   * Creates an empty heap.\n   * The sort function determines whether this is a min-heap or max-heap.\n   * For comparable data types, > makes a max-heap, < makes a min-heap.\n   */\n  public init(sort: @escaping (T, T) -> Bool) {\n    self.orderCriteria = sort\n  }\n  \n  /**\n   * Creates a heap from an array. The order of the array does not matter;\n   * the elements are inserted into the heap in the order determined by the\n   * sort function. For comparable data types, '>' makes a max-heap,\n   * '<' makes a min-heap.\n   */\n  public init(array: [T], sort: @escaping (T, T) -> Bool) {\n    self.orderCriteria = sort\n    configureHeap(from: array)\n  }\n  \n  /**\n   * Configures the max-heap or min-heap from an array, in a bottom-up manner.\n   * Performance: This runs pretty much in O(n).\n   */\n  private mutating func configureHeap(from array: [T]) {\n    nodes = array\n    for i in stride(from: (nodes.count/2-1), through: 0, by: -1) {\n      shiftDown(i)\n    }\n  }\n  \n  public var isEmpty: Bool {\n    return nodes.isEmpty\n  }\n  \n  public var count: Int {\n    return nodes.count\n  }\n  \n  /**\n   * Returns the index of the parent of the element at index i.\n   * The element at index 0 is the root of the tree and has no parent.\n   */\n  @inline(__always) internal func parentIndex(ofIndex i: Int) -> Int {\n    return (i - 1) / 2\n  }\n  \n  /**\n   * Returns the index of the left child of the element at index i.\n   * Note that this index can be greater than the heap size, in which case\n   * there is no left child.\n   */\n  @inline(__always) internal func leftChildIndex(ofIndex i: Int) -> Int {\n    return 2*i + 1\n  }\n  \n  /**\n   * Returns the index of the right child of the element at index i.\n   * Note that this index can be greater than the heap size, in which case\n   * there is no right child.\n   */\n  @inline(__always) internal func rightChildIndex(ofIndex i: Int) -> Int {\n    return 2*i + 2\n  }\n  \n  /**\n   * Returns the maximum value in the heap (for a max-heap) or the minimum\n   * value (for a min-heap).\n   */\n  public func peek() -> T? {\n    return nodes.first\n  }\n  \n  /**\n   * Adds a new value to the heap. This reorders the heap so that the max-heap\n   * or min-heap property still holds. Performance: O(log n).\n   */\n  public mutating func insert(_ value: T) {\n    nodes.append(value)\n    shiftUp(nodes.count - 1)\n  }\n  \n  /**\n   * Adds a sequence of values to the heap. This reorders the heap so that\n   * the max-heap or min-heap property still holds. Performance: O(log n).\n   */\n  public mutating func insert<S: Sequence>(_ sequence: S) where S.Iterator.Element == T {\n    for value in sequence {\n      insert(value)\n    }\n  }\n  \n  /**\n   * Allows you to change an element. This reorders the heap so that\n   * the max-heap or min-heap property still holds.\n   */\n  public mutating func replace(index i: Int, value: T) {\n    guard i < nodes.count else { return }\n    \n    remove(at: i)\n    insert(value)\n  }\n  \n  /**\n   * Removes the root node from the heap. For a max-heap, this is the maximum\n   * value; for a min-heap it is the minimum value. Performance: O(log n).\n   */\n  @discardableResult public mutating func remove() -> T? {\n    guard !nodes.isEmpty else { return nil }\n    \n    if nodes.count == 1 {\n      return nodes.removeLast()\n    } else {\n      // Use the last node to replace the first one, then fix the heap by\n      // shifting this new first node into its proper position.\n      let value = nodes[0]\n      nodes[0] = nodes.removeLast()\n      shiftDown(0)\n      return value\n    }\n  }\n  \n  /**\n   * Removes an arbitrary node from the heap. Performance: O(log n).\n   * Note that you need to know the node's index.\n   */\n  @discardableResult public mutating func remove(at index: Int) -> T? {\n    guard index < nodes.count else { return nil }\n    \n    let size = nodes.count - 1\n    if index != size {\n      nodes.swapAt(index, size)\n      shiftDown(from: index, until: size)\n      shiftUp(index)\n    }\n    return nodes.removeLast()\n  }\n  \n  /**\n   * Takes a child node and looks at its parents; if a parent is not larger\n   * (max-heap) or not smaller (min-heap) than the child, we exchange them.\n   */\n  internal mutating func shiftUp(_ index: Int) {\n    var childIndex = index\n    let child = nodes[childIndex]\n    var parentIndex = self.parentIndex(ofIndex: childIndex)\n    \n    while childIndex > 0 && orderCriteria(child, nodes[parentIndex]) {\n      nodes[childIndex] = nodes[parentIndex]\n      childIndex = parentIndex\n      parentIndex = self.parentIndex(ofIndex: childIndex)\n    }\n    \n    nodes[childIndex] = child\n  }\n  \n  /**\n   * Looks at a parent node and makes sure it is still larger (max-heap) or\n   * smaller (min-heap) than its childeren.\n   */\n  internal mutating func shiftDown(from index: Int, until endIndex: Int) {\n    let leftChildIndex = self.leftChildIndex(ofIndex: index)\n    let rightChildIndex = leftChildIndex + 1\n    \n    // Figure out which comes first if we order them by the sort function:\n    // the parent, the left child, or the right child. If the parent comes\n    // first, we're done. If not, that element is out-of-place and we make\n    // it \"float down\" the tree until the heap property is restored.\n    var first = index\n    if leftChildIndex < endIndex && orderCriteria(nodes[leftChildIndex], nodes[first]) {\n      first = leftChildIndex\n    }\n    if rightChildIndex < endIndex && orderCriteria(nodes[rightChildIndex], nodes[first]) {\n      first = rightChildIndex\n    }\n    if first == index { return }\n    \n    nodes.swapAt(index, first)\n    shiftDown(from: first, until: endIndex)\n  }\n  \n  internal mutating func shiftDown(_ index: Int) {\n    shiftDown(from: index, until: nodes.count)\n  }\n  \n}\n\n// MARK: - Searching\n\nextension Heap where T: Equatable {\n  \n  /** Get the index of a node in the heap. Performance: O(n). */\n  public func index(of node: T) -> Int? {\n    return nodes.index(where: { $0 == node })\n  }\n  \n  /** Removes the first occurrence of a node from the heap. Performance: O(n). */\n  @discardableResult public mutating func remove(node: T) -> T? {\n    if let index = index(of: node) {\n      return remove(at: index)\n    }\n    return nil\n  }\n  \n}\n"
  },
  {
    "path": "Heap/README.markdown",
    "content": "# Heap\n\n> This topic has been tutorialized [here](https://www.raywenderlich.com/160631/swift-algorithm-club-heap-and-priority-queue-data-structure)\n\nA heap is a [binary tree](../Binary%20Tree/) inside an array, so it does not use parent/child pointers. A heap is sorted based on the \"heap property\" that determines the order of the nodes in the tree.\n\nCommon uses for heap:\n\n- To build [priority queues](../Priority%20Queue/).\n- To support [heap sorts](../Heap%20Sort/).\n- To compute the minimum (or maximum) element of a collection quickly.\n- To impress your non-programmer friends.\n\n## The heap property\n\nThere are two kinds of heaps: a *max-heap* and a *min-heap* which are different by the order in which they store the tree nodes.\n\nIn a max-heap, parent nodes have a greater value than each of their children. In a min-heap, every parent node has a smaller value than its child nodes. This is called the \"heap property\", and it is true for every single node in the tree.\n\nAn example:\n\n![A max-heap](Images/Heap1.png)\n\nThis is a max-heap because every parent node is greater than its children. `(10)` is greater than `(7)` and `(2)`. `(7)` is greater than `(5)` and `(1)`.\n\nAs a result of this heap property, a max-heap always stores its largest item at the root of the tree. For a min-heap, the root is always the smallest item in the tree. The heap property is useful because heaps are often used as a [priority queue](../Priority%20Queue/) to access the \"most important\" element quickly.\n\n> **Note:** The root of the heap has the maximum or minimum element, but the sort order of other elements are not predictable. For example, the maximum element is always at index 0 in a max-heap, but the minimum element isn’t necessarily the last one. -- the only guarantee you have is that it is one of the leaf nodes, but not which one.\n\n## How does a heap compare to regular trees?\n\nA heap is not a replacement for a binary search tree, and there are similarities and differences between them. Here are some main differences:\n\n\n**Order of the nodes.** In a [binary search tree (BST)](../Binary%20Search%20Tree/), the left child must be smaller than its parent, and the right child must be greater. This is not true for a heap. In a max-heap both children must be smaller than the parent, while in a min-heap they both must be greater.\n\n**Memory.** Traditional trees take up more memory than just the data they store. You need to allocate additional storage for the node objects and pointers to the left/right child nodes. A heap only uses a plain array for storage and uses no pointers.\n\n**Balancing.** A binary search tree must be \"balanced\" so that most operations have **O(log n)** performance. You can either insert and delete your data in a random order or use something like an [AVL tree](../AVL%20Tree/) or [red-black tree](../Red-Black%20Tree/), but with heaps we don't actually need the entire tree to be sorted. We just want the heap property to be fulfilled, so balancing isn't an issue. Because of the way the heap is structured, heaps can guarantee **O(log n)** performance.\n\n**Searching.** Whereas searching is fast in a binary tree, it is slow in a heap. Searching isn't a top priority in a heap since the purpose of a heap is to put the largest (or smallest) node at the front and to allow relatively fast inserts and deletes.\n\n## The tree inside an array\n\nAn array may seem like an odd way to implement a tree-like structure, but it is efficient in both time and space.\n\nThis is how we are going to store the tree from the above example:\n\n\t[ 10, 7, 2, 5, 1 ]\n\nThat's all there is to it! We don't need any more storage than just this simple array.\n\nSo how do we know which nodes are the parents and which are the children if we are not allowed to use any pointers? Good question! There is a well-defined relationship between the array index of a tree node and the array indices of its parent and children.\n\nIf `i` is the index of a node, then the following formulas give the array indices of its parent and child nodes:\n\n    parent(i) = floor((i - 1)/2)\n    left(i)   = 2i + 1\n    right(i)  = 2i + 2\n\nNote that `right(i)` is simply `left(i) + 1`. The left and right nodes are always stored right next to each other.\n\nLet's use these formulas on the example. Fill in the array index and we should get the positions of the parent and child nodes in the array:\n\n| Node | Array index (`i`) | Parent index | Left child | Right child |\n|------|-------------|--------------|------------|-------------|\n| 10 | 0 | -1 | 1 | 2 |\n| 7 | 1 | 0 | 3 | 4 |\n| 2 | 2 | 0 | 5 | 6 |\n| 5 | 3 | 1 | 7 | 8 |\n| 1 | 4 | 1 | 9 | 10 |\n\nVerify for yourself that these array indices indeed correspond to the picture of the tree.\n\n> **Note:** The root node `(10)` does not have a parent because `-1` is not a valid array index. Likewise, nodes `(2)`, `(5)`, and `(1)` do not have children because those indices are greater than the array size, so we always have to make sure the indices we calculate are actually valid before we use them.\n\nRecall that in a max-heap, the parent's value is always greater than (or equal to) the values of its children. This means the following must be true for all array indices `i`:\n\n```swift\narray[parent(i)] >= array[i]\n```\n\nVerify that this heap property holds for the array from the example heap.\n\nAs you can see, these equations allow us to find the parent or child index for any node without the need for pointers. It is more complicated than just dereferencing a pointer, but that is the tradeoff: we save memory space but pay with extra computations. Fortunately, the computations are fast and only take **O(1)** time.\n\nIt is important to understand this relationship between array index and position in the tree. Here is a larger heap which has 15 nodes divided over four levels:\n\n![Large heap](Images/LargeHeap.png)\n\nThe numbers in this picture are not the values of the nodes but the array indices that store the nodes! Here is the array indices correspond to the different levels of the tree:\n\n![The heap array](Images/Array.png)\n\nFor the formulas to work, parent nodes must appear before child nodes in the array. You can see that in the above picture.\n\nNote that this scheme has limitations. You can do the following with a regular binary tree but not with a heap:\n\n![Impossible with a heap](Images/RegularTree.png)\n\nYou can not start a new level unless the current lowest level is completely full, so heaps always have this kind of shape:\n\n![The shape of a heap](Images/HeapShape.png)\n\n> **Note:** You *could* emulate a regular binary tree with a heap, but it would be a waste of space, and you would need to mark array indices as being empty.\n\nPop quiz! Let's say we have the array:\n\n\t[ 10, 14, 25, 33, 81, 82, 99 ]\n\nIs this a valid heap? The answer is yes! A sorted array from low-to-high is a valid min-heap. We can draw this heap as follows:\n\n![A sorted array is a valid heap](Images/SortedArray.png)\n\nThe heap property holds for each node because a parent is always smaller than its children. (Verify for yourself that an array sorted from high-to-low is always a valid max-heap.)\n\n> **Note:** But not every min-heap is necessarily a sorted array! It only works one way. To turn a heap back into a sorted array, you need to use [heap sort](../Heap%20Sort/).\n\n## More math!\n\nIn case you are curious, here are a few more formulas that describe certain properties of a heap. You do not need to know these by heart, but they come in handy sometimes. Feel free to skip this section!\n\nThe *height* of a tree is defined as the number of steps it takes to go from the root node to the lowest leaf node, or more formally: the height is the maximum number of edges between the nodes. A heap of height *h* has *h + 1* levels.\n\nThis heap has height 3, so it has 4 levels:\n\n![Large heap](Images/LargeHeap.png)\n\nA heap with *n* nodes has height *h = floor(log2(n))*. This is because we always fill up the lowest level completely before we add a new level. The example has 15 nodes, so the height is `floor(log2(15)) = floor(3.91) = 3`.\n\nIf the lowest level is completely full, then that level contains *2^h* nodes. The rest of the tree above it contains *2^h - 1* nodes. Fill in the numbers from the example: the lowest level has 8 nodes, which indeed is `2^3 = 8`. The first three levels contain a total of 7 nodes, i.e. `2^3 - 1 = 8 - 1 = 7`.\n\nThe total number of nodes *n* in the entire heap is therefore *2^(h+1) - 1*. In the example, `2^4 - 1 = 16 - 1 = 15`.\n\nThere are at most *ceil(n/2^(h+1))* nodes of height *h* in an *n*-element heap.\n\nThe leaf nodes are always located at array indices *floor(n/2)* to *n-1*. We will make use of this fact to quickly build up the heap from an array. Verify this for the example if you don't believe it. ;-)\n\nJust a few math facts to brighten your day.\n\n## What can you do with a heap?\n\nThere are two primitive operations necessary to make sure the heap is a valid max-heap or min-heap after you insert or remove an element:\n\n- `shiftUp()`: If the element is greater (max-heap) or smaller (min-heap) than its parent, it needs to be swapped with the parent. This makes it move up the tree.\n\n- `shiftDown()`. If the element is smaller (max-heap) or greater (min-heap) than its children, it needs to move down the tree. This operation is also called \"heapify\".\n\nShifting up or down is a recursive procedure that takes **O(log n)** time.\n\nHere are other operations that are built on primitive operations:\n\n- `insert(value)`: Adds the new element to the end of the heap and then uses `shiftUp()` to fix the heap.\n\n- `remove()`: Removes and returns the maximum value (max-heap) or the minimum value (min-heap). To fill up the hole left by removing the element, the very last element is moved to the root position and then `shiftDown()` fixes up the heap. (This is sometimes called \"extract min\" or \"extract max\".)\n\n- `removeAtIndex(index)`: Just like `remove()` with the exception that it allows you to remove any item from the heap, not just the root. This calls both `shiftDown()`, in case the new element is out-of-order with its children, and `shiftUp()`, in case the element is out-of-order with its parents.\n\n- `replace(index, value)`: Assigns a smaller (min-heap) or larger (max-heap) value to a node. Because this invalidates the heap property, it uses `shiftUp()` to patch things up. (Also called \"decrease key\" and \"increase key\".)\n\nAll of the above take time **O(log n)** because shifting up or down is expensive. There are also a few operations that take more time:\n\n- `search(value)`. Heaps are not built for efficient searches, but the `replace()` and `removeAtIndex()` operations require the array index of the node, so you need to find that index. Time: **O(n)**.\n\n- `buildHeap(array)`: Converts an (unsorted) array into a heap by repeatedly calling `insert()`. If you are smart about this, it can be done in **O(n)** time.\n\n- [Heap sort](../Heap%20Sort/). Since the heap is an array, we can use its unique properties to sort the array from low to high. Time: **O(n log n).**\n\nThe heap also has a `peek()` function that returns the maximum (max-heap) or minimum (min-heap) element, without removing it from the heap. Time: **O(1)**.\n\n> **Note:** By far the most common things you will do with a heap are inserting new values with `insert()` and removing the maximum or minimum value with `remove()`. Both take **O(log n)** time. The other operations exist to support more advanced usage, such as building a priority queue where the \"importance\" of items can change after they have been added to the queue.\n\n## Inserting into the heap\n\nLet's go through an example of insertion to see in details how this works. We will insert the value `16` into this heap:\n\n![The heap before insertion](Images/Heap1.png)\n\nThe array for this heap is `[ 10, 7, 2, 5, 1 ]`.\n\nThe first step when inserting a new item is to append it to the end of the array. The array becomes:\n\n\t[ 10, 7, 2, 5, 1, 16 ]\n\nThis corresponds to the following tree:\n\n![The heap before insertion](Images/Insert1.png)\n\nThe `(16)` was added to the first available space on the last row.\n\nUnfortunately, the heap property is no longer satisfied because `(2)` is above `(16)`, and we want higher numbers above lower numbers. (This is a max-heap.)\n\nTo restore the heap property, we swap `(16)` and `(2)`.\n\n![The heap before insertion](Images/Insert2.png)\n\nWe are not done yet because `(10)` is also smaller than `(16)`. We keep swapping our inserted value with its parent, until the parent is larger or we reach the top of the tree. This is called **shift-up** or **sifting** and is done after every insertion. It makes a number that is too large or too small \"float up\" the tree.\n\nFinally, we get:\n\n![The heap before insertion](Images/Insert3.png)\n\nAnd now every parent is greater than its children again.\n\nThe time required for shifting up is proportional to the height of the tree, so it takes **O(log n)** time. (The time it takes to append the node to the end of the array is only **O(1)**, so that does not slow it down.)\n\n## Removing the root\n\nLet's remove `(10)` from this tree:\n\n![The heap before removal](Images/Heap1.png)\n\nWhat happens to the empty spot at the top?\n\n![The root is gone](Images/Remove1.png)\n\nWhen inserting, we put the new value at the end of the array. Here, we do the opposite: we take the last object we have, stick it up on top of the tree, and restore the heap property.\n\n![The last node goes to the root](Images/Remove2.png)\n\nLet's look at how to **shift-down** `(1)`. To maintain the heap property for this max-heap, we want to the highest number of top. We have two candidates for swapping places with: `(7)` and `(2)`. We choose the highest number between these three nodes to be on top. That is `(7)`, so swapping `(1)` and `(7)` gives us the following tree.\n\n![The last node goes to the root](Images/Remove3.png)\n\nKeep shifting down until the node does not have any children or it is larger than both its children. For our heap, we only need one more swap to restore the heap property:\n\n![The last node goes to the root](Images/Remove4.png)\n\nThe time required for shifting all the way down is proportional to the height of the tree which takes **O(log n)** time.\n\n> **Note:** `shiftUp()` and `shiftDown()` can only fix one out-of-place element at a time. If there are multiple elements in the wrong place, you need to call these functions once for each of those elements.\n\n## Removing any node\n\nThe vast majority of the time you will be removing the object at the root of the heap because that is what heaps are designed for.\n\nHowever, it can be useful to remove an arbitrary element. This is a general version of `remove()` and may involve either `shiftDown()` or `shiftUp()`.\n\nLet's take the example tree again and remove `(7)`:\n\n![The heap before removal](Images/Heap1.png)\n\nAs a reminder, the array is:\n\n\t[ 10, 7, 2, 5, 1 ]\n\nAs you know, removing an element could potentially invalidate the max-heap or min-heap property. To fix this, we swap the node that we are removing with the last element:\n\n\t[ 10, 1, 2, 5, 7 ]\n\nThe last element is the one that we will return; we will call `removeLast()` to remove it from the heap. The `(1)` is now out-of-order because it is smaller than its child, `(5)` but sits higher in the tree. We call `shiftDown()` to repair this.\n\nHowever, shifting down is not the only situation we need to handle. It may also happen that the new element must be shifted up. Consider what happens if you remove `(5)` from the following heap:\n\n![We need to shift up](Images/Remove5.png)\n\nNow `(5)` gets swapped with `(8)`. Because `(8)` is larger than its parent, we need to call `shiftUp()`.\n\n## Creating a heap from an array\n\nIt can be convenient to convert an array into a heap. This just shuffles the array elements around until the heap property is satisfied.\n\nIn code it would look like this:\n\n```swift\n  private mutating func buildHeap(fromArray array: [T]) {\n    for value in array {\n      insert(value)\n    }\n  }\n```\n\nWe simply call `insert()` for each of the values in the array. Simple enough but not very efficient. This takes **O(n log n)** time in total because there are **n** elements and each insertion takes **log n** time.\n\nIf you didn't gloss over the math section, you'd have seen that for any heap the elements at array indices *n/2* to *n-1* are the leaves of the tree. We can simply skip those leaves. We only have to process the other nodes, since they are parents with one or more children and therefore may be in the wrong order.\n\nIn code:\n\n```swift\n  private mutating func buildHeap(fromArray array: [T]) {\n    elements = array\n    for i in stride(from: (nodes.count/2-1), through: 0, by: -1) {\n      shiftDown(index: i, heapSize: elements.count)\n    }\n  }\n```\n\nHere, `elements` is the heap's own array. We walk backwards through this array, starting at the first non-leaf node, and call `shiftDown()`. This simple loop puts these nodes, as well as the leaves that we skipped, in the correct order. This is known as Floyd's algorithm and only takes **O(n)** time. Win!\n\n## Searching the heap\n\nHeaps are not made for fast searches, but if you want to remove an arbitrary element using `removeAtIndex()` or change the value of an element with `replace()`, then you need to obtain the index of that element. Searching is one way to do this, but it is slow.\n\nIn a [binary search tree](../Binary%20Search%20Tree/), depending on the order of the nodes, a fast search can be guaranteed. Since a heap orders its nodes differently, a binary search will not work, and you need to check every node in the tree.\n\nLet's take our example heap again:\n\n![The heap](Images/Heap1.png)\n\nIf we want to search for the index of node `(1)`, we could just step through the array `[ 10, 7, 2, 5, 1 ]` with a linear search.\n\nEven though the heap property was not conceived with searching in mind, we can still take advantage of it. We know that in a max-heap a parent node is always larger than its children, so we can ignore those children (and their children, and so on...) if the parent is already smaller than the value we are looking for.\n\nLet's say we want to see if the heap contains the value `8` (it doesn't). We start at the root `(10)`. This is not what we are looking for, so we recursively look at its left and right child. The left child is `(7)`. That is also not what we want, but since this is a max-heap, we know there is no point in looking at the children of `(7)`. They will always be smaller than `7` and are therefore never equal to `8`; likewise, for the right child, `(2)`.\n\nDespite this small optimization, searching is still an **O(n)** operation.\n\n> **Note:** There is a way to turn lookups into a **O(1)** operation by keeping an additional dictionary that maps node values to indices. This may be worth doing if you often need to call `replace()` to change the \"priority\" of objects in a [priority queue](../Priority%20Queue/) that's built on a heap.\n\n## The code\n\nSee [Heap.swift](Heap.swift) for the implementation of these concepts in Swift. Most of the code is quite straightforward. The only tricky bits are in `shiftUp()` and `shiftDown()`.\n\nYou have seen that there are two types of heaps: a max-heap and a min-heap. The only difference between them is in how they order their nodes: largest value first or smallest value first.\n\nRather than create two different versions, `MaxHeap` and `MinHeap`, there is just one `Heap` object and it takes an `isOrderedBefore` closure. This closure contains the logic that determines the order of two values. You have probably seen this before because it is also how Swift's `sort()` works.\n\nTo make a max-heap of integers, you write:\n\n```swift\nvar maxHeap = Heap<Int>(sort: >)\n```\n\nAnd to create a min-heap you write:\n\n```swift\nvar minHeap = Heap<Int>(sort: <)\n```\n\nI just wanted to point this out, because where most heap implementations use the `<` and `>` operators to compare values, this one uses the `isOrderedBefore()` closure.\n\n## See also\n\n[Heap on Wikipedia](https://en.wikipedia.org/wiki/Heap_%28data_structure%29)\n\n*Written for the Swift Algorithm Club by [Kevin Randrup](http://www.github.com/kevinrandrup) and Matthijs Hollemans*\n"
  },
  {
    "path": "Heap/Tests/HeapTests.swift",
    "content": "//\n//  HeapTests.swift\n//  Written for the Swift Algorithm Club by Kevin Randrup and Matthijs Hollemans\n//\n\nimport XCTest\n\nclass HeapTests: XCTestCase {\n  \n  fileprivate func verifyMaxHeap(_ h: Heap<Int>) -> Bool {\n    for i in 0..<h.count {\n      let left = h.leftChildIndex(ofIndex: i)\n      let right = h.rightChildIndex(ofIndex: i)\n      let parent = h.parentIndex(ofIndex: i)\n      if left < h.count && h.nodes[i] < h.nodes[left] { return false }\n      if right < h.count && h.nodes[i] < h.nodes[right] { return false }\n      if i > 0 && h.nodes[parent] < h.nodes[i] { return false }\n    }\n    return true\n  }\n  \n  fileprivate func verifyMinHeap(_ h: Heap<Int>) -> Bool {\n    for i in 0..<h.count {\n      let left = h.leftChildIndex(ofIndex: i)\n      let right = h.rightChildIndex(ofIndex: i)\n      let parent = h.parentIndex(ofIndex: i)\n      if left < h.count && h.nodes[i] > h.nodes[left] { return false }\n      if right < h.count && h.nodes[i] > h.nodes[right] { return false }\n      if i > 0 && h.nodes[parent] > h.nodes[i] { return false }\n    }\n    return true\n  }\n  \n  fileprivate func isPermutation(_ array1: [Int], _ array2: [Int]) -> Bool {\n    var a1 = array1\n    var a2 = array2\n    if a1.count != a2.count { return false }\n    while a1.count > 0 {\n      if let i = a2.index(of: a1[0]) {\n        a1.remove(at: 0)\n        a2.remove(at: i)\n      } else {\n        return false\n      }\n    }\n    return a2.count == 0\n  }\n  \n  func testEmptyHeap() {\n    var heap = Heap<Int>(sort: <)\n    XCTAssertTrue(heap.isEmpty)\n    XCTAssertEqual(heap.count, 0)\n    XCTAssertNil(heap.peek())\n    XCTAssertNil(heap.remove())\n  }\n  \n  func testIsEmpty() {\n    var heap = Heap<Int>(sort: >)\n    XCTAssertTrue(heap.isEmpty)\n    heap.insert(1)\n    XCTAssertFalse(heap.isEmpty)\n    heap.remove()\n    XCTAssertTrue(heap.isEmpty)\n  }\n  \n  func testCount() {\n    var heap = Heap<Int>(sort: >)\n    XCTAssertEqual(0, heap.count)\n    heap.insert(1)\n    XCTAssertEqual(1, heap.count)\n  }\n  \n  func testMaxHeapOneElement() {\n    let heap = Heap<Int>(array: [10], sort: >)\n    XCTAssertTrue(verifyMaxHeap(heap))\n    XCTAssertTrue(verifyMinHeap(heap))\n    XCTAssertFalse(heap.isEmpty)\n    XCTAssertEqual(heap.count, 1)\n    XCTAssertEqual(heap.peek()!, 10)\n  }\n  \n  func testCreateMaxHeap() {\n    let h1 = Heap(array: [1, 2, 3, 4, 5, 6, 7], sort: >)\n    XCTAssertTrue(verifyMaxHeap(h1))\n    XCTAssertFalse(verifyMinHeap(h1))\n    XCTAssertEqual(h1.nodes, [7, 5, 6, 4, 2, 1, 3])\n    XCTAssertFalse(h1.isEmpty)\n    XCTAssertEqual(h1.count, 7)\n    XCTAssertEqual(h1.peek()!, 7)\n    \n    let h2 = Heap(array: [7, 6, 5, 4, 3, 2, 1], sort: >)\n    XCTAssertTrue(verifyMaxHeap(h2))\n    XCTAssertFalse(verifyMinHeap(h2))\n    XCTAssertEqual(h2.nodes, [7, 6, 5, 4, 3, 2, 1])\n    XCTAssertFalse(h2.isEmpty)\n    XCTAssertEqual(h2.count, 7)\n    XCTAssertEqual(h2.peek()!, 7)\n    \n    let h3 = Heap(array: [4, 1, 3, 2, 16, 9, 10, 14, 8, 7], sort: >)\n    XCTAssertTrue(verifyMaxHeap(h3))\n    XCTAssertFalse(verifyMinHeap(h3))\n    XCTAssertEqual(h3.nodes, [16, 14, 10, 8, 7, 9, 3, 2, 4, 1])\n    XCTAssertFalse(h3.isEmpty)\n    XCTAssertEqual(h3.count, 10)\n    XCTAssertEqual(h3.peek()!, 16)\n    \n    let h4 = Heap(array: [27, 17, 3, 16, 13, 10, 1, 5, 7, 12, 4, 8, 9, 0], sort: >)\n    XCTAssertTrue(verifyMaxHeap(h4))\n    XCTAssertFalse(verifyMinHeap(h4))\n    XCTAssertEqual(h4.nodes, [27, 17, 10, 16, 13, 9, 1, 5, 7, 12, 4, 8, 3, 0])\n    XCTAssertFalse(h4.isEmpty)\n    XCTAssertEqual(h4.count, 14)\n    XCTAssertEqual(h4.peek()!, 27)\n  }\n  \n  func testCreateMinHeap() {\n    let h1 = Heap(array: [1, 2, 3, 4, 5, 6, 7], sort: <)\n    XCTAssertTrue(verifyMinHeap(h1))\n    XCTAssertFalse(verifyMaxHeap(h1))\n    XCTAssertEqual(h1.nodes, [1, 2, 3, 4, 5, 6, 7])\n    XCTAssertFalse(h1.isEmpty)\n    XCTAssertEqual(h1.count, 7)\n    XCTAssertEqual(h1.peek()!, 1)\n    \n    let h2 = Heap(array: [7, 6, 5, 4, 3, 2, 1], sort: <)\n    XCTAssertTrue(verifyMinHeap(h2))\n    XCTAssertFalse(verifyMaxHeap(h2))\n    XCTAssertEqual(h2.nodes, [1, 3, 2, 4, 6, 7, 5])\n    XCTAssertFalse(h2.isEmpty)\n    XCTAssertEqual(h2.count, 7)\n    XCTAssertEqual(h2.peek()!, 1)\n    \n    let h3 = Heap(array: [4, 1, 3, 2, 16, 9, 10, 14, 8, 7], sort: <)\n    XCTAssertTrue(verifyMinHeap(h3))\n    XCTAssertFalse(verifyMaxHeap(h3))\n    XCTAssertEqual(h3.nodes, [1, 2, 3, 4, 7, 9, 10, 14, 8, 16])\n    XCTAssertFalse(h3.isEmpty)\n    XCTAssertEqual(h3.count, 10)\n    XCTAssertEqual(h3.peek()!, 1)\n    \n    let h4 = Heap(array: [27, 17, 3, 16, 13, 10, 1, 5, 7, 12, 4, 8, 9, 0], sort: <)\n    XCTAssertTrue(verifyMinHeap(h4))\n    XCTAssertFalse(verifyMaxHeap(h4))\n    XCTAssertEqual(h4.nodes, [0, 4, 1, 5, 12, 8, 3, 16, 7, 17, 13, 10, 9, 27])\n    XCTAssertFalse(h4.isEmpty)\n    XCTAssertEqual(h4.count, 14)\n    XCTAssertEqual(h4.peek()!, 0)\n  }\n  \n  func testCreateMaxHeapEqualnodes() {\n    let heap = Heap(array: [1, 1, 1, 1, 1], sort: >)\n    XCTAssertTrue(verifyMaxHeap(heap))\n    XCTAssertTrue(verifyMinHeap(heap))\n    XCTAssertEqual(heap.nodes, [1, 1, 1, 1, 1])\n  }\n  \n  func testCreateMinHeapEqualnodes() {\n    let heap = Heap(array: [1, 1, 1, 1, 1], sort: <)\n    XCTAssertTrue(verifyMinHeap(heap))\n    XCTAssertTrue(verifyMaxHeap(heap))\n    XCTAssertEqual(heap.nodes, [1, 1, 1, 1, 1])\n  }\n  \n  fileprivate func randomArray(_ n: Int) -> [Int] {\n    var a = [Int]()\n    for _ in 0..<n {\n      a.append(Int(arc4random()))\n    }\n    return a\n  }\n  \n  func testCreateRandomMaxHeap() {\n    for n in 1...40 {\n      let a = randomArray(n)\n      let h = Heap(array: a, sort: >)\n      XCTAssertTrue(verifyMaxHeap(h))\n      XCTAssertFalse(h.isEmpty)\n      XCTAssertEqual(h.count, n)\n      XCTAssertTrue(isPermutation(a, h.nodes))\n    }\n  }\n  \n  func testCreateRandomMinHeap() {\n    for n in 1...40 {\n      let a = randomArray(n)\n      let h = Heap(array: a, sort: <)\n      XCTAssertTrue(verifyMinHeap(h))\n      XCTAssertFalse(h.isEmpty)\n      XCTAssertEqual(h.count, n)\n      XCTAssertTrue(isPermutation(a, h.nodes))\n    }\n  }\n  \n  func testRemoving() {\n    var h = Heap(array: [100, 50, 70, 10, 20, 60, 65], sort: >)\n    XCTAssertTrue(verifyMaxHeap(h))\n    XCTAssertEqual(h.nodes, [100, 50, 70, 10, 20, 60, 65])\n    \n    //test index out of bounds\n    let v = h.remove(at: 10)\n    XCTAssertEqual(v, nil)\n    XCTAssertTrue(verifyMaxHeap(h))\n    XCTAssertEqual(h.nodes, [100, 50, 70, 10, 20, 60, 65])\n    \n    let v1 = h.remove(at: 5)\n    XCTAssertEqual(v1, 60)\n    XCTAssertTrue(verifyMaxHeap(h))\n    XCTAssertEqual(h.nodes, [100, 50, 70, 10, 20, 65])\n    \n    let v2 = h.remove(at: 4)\n    XCTAssertEqual(v2, 20)\n    XCTAssertTrue(verifyMaxHeap(h))\n    XCTAssertEqual(h.nodes, [100, 65, 70, 10, 50])\n    \n    let v3 = h.remove(at: 4)\n    XCTAssertEqual(v3, 50)\n    XCTAssertTrue(verifyMaxHeap(h))\n    XCTAssertEqual(h.nodes, [100, 65, 70, 10])\n    \n    let v4 = h.remove(at: 0)\n    XCTAssertEqual(v4, 100)\n    XCTAssertTrue(verifyMaxHeap(h))\n    XCTAssertEqual(h.nodes, [70, 65, 10])\n    \n    XCTAssertEqual(h.peek()!, 70)\n    let v5 = h.remove()\n    XCTAssertEqual(v5, 70)\n    XCTAssertTrue(verifyMaxHeap(h))\n    XCTAssertEqual(h.nodes, [65, 10])\n    \n    XCTAssertEqual(h.peek()!, 65)\n    let v6 = h.remove()\n    XCTAssertEqual(v6, 65)\n    XCTAssertTrue(verifyMaxHeap(h))\n    XCTAssertEqual(h.nodes, [10])\n    \n    XCTAssertEqual(h.peek()!, 10)\n    let v7 = h.remove()\n    XCTAssertEqual(v7, 10)\n    XCTAssertTrue(verifyMaxHeap(h))\n    XCTAssertEqual(h.nodes, [])\n    \n    XCTAssertNil(h.peek())\n  }\n  \n  func testRemoveEmpty() {\n    var heap = Heap<Int>(sort: >)\n    let removed = heap.remove()\n    XCTAssertNil(removed)\n  }\n  \n  func testRemoveRoot() {\n    var h = Heap(array: [15, 13, 9, 5, 12, 8, 7, 4, 0, 6, 2, 1], sort: >)\n    XCTAssertTrue(verifyMaxHeap(h))\n    XCTAssertEqual(h.nodes, [15, 13, 9, 5, 12, 8, 7, 4, 0, 6, 2, 1])\n    XCTAssertEqual(h.peek()!, 15)\n    let v = h.remove()\n    XCTAssertEqual(v, 15)\n    XCTAssertTrue(verifyMaxHeap(h))\n    XCTAssertEqual(h.nodes, [13, 12, 9, 5, 6, 8, 7, 4, 0, 1, 2])\n  }\n  \n  func testRemoveRandomItems() {\n    for n in 1...40 {\n      var a = randomArray(n)\n      var h = Heap(array: a, sort: >)\n      XCTAssertTrue(verifyMaxHeap(h))\n      XCTAssertTrue(isPermutation(a, h.nodes))\n      \n      let m = (n + 1)/2\n      for k in 1...m {\n        let i = Int(arc4random_uniform(UInt32(n - k + 1)))\n        let v = h.remove(at: i)!\n        let j = a.index(of: v)!\n        a.remove(at: j)\n        \n        XCTAssertTrue(verifyMaxHeap(h))\n        XCTAssertEqual(h.count, a.count)\n        XCTAssertEqual(h.count, n - k)\n        XCTAssertTrue(isPermutation(a, h.nodes))\n      }\n    }\n  }\n  \n  func testInsert() {\n    var h = Heap(array: [15, 13, 9, 5, 12, 8, 7, 4, 0, 6, 2, 1], sort: >)\n    XCTAssertTrue(verifyMaxHeap(h))\n    XCTAssertEqual(h.nodes, [15, 13, 9, 5, 12, 8, 7, 4, 0, 6, 2, 1])\n    \n    h.insert(10)\n    XCTAssertTrue(verifyMaxHeap(h))\n    XCTAssertEqual(h.nodes, [15, 13, 10, 5, 12, 9, 7, 4, 0, 6, 2, 1, 8])\n  }\n  \n  func testInsertArrayAndRemove() {\n    var heap = Heap<Int>(sort: >)\n    heap.insert([1, 3, 2, 7, 5, 9])\n    XCTAssertEqual(heap.nodes, [9, 5, 7, 1, 3, 2])\n    \n    XCTAssertEqual(9, heap.remove())\n    XCTAssertEqual(7, heap.remove())\n    XCTAssertEqual(5, heap.remove())\n    XCTAssertEqual(3, heap.remove())\n    XCTAssertEqual(2, heap.remove())\n    XCTAssertEqual(1, heap.remove())\n    XCTAssertNil(heap.remove())\n  }\n  \n  func testReplace() {\n    var h = Heap(array: [16, 14, 10, 8, 7, 9, 3, 2, 4, 1], sort: >)\n    XCTAssertTrue(verifyMaxHeap(h))\n    \n    h.replace(index: 5, value: 13)\n    XCTAssertTrue(verifyMaxHeap(h))\n    \n    //test index out of bounds\n    h.replace(index: 20, value: 2)\n    XCTAssertTrue(verifyMaxHeap(h))\n  }\n  \n}\n"
  },
  {
    "path": "Heap/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Heap/Tests/Tests.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 51;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t7B80C3DC1C77A38C003CECC7 /* HeapTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C3DB1C77A38C003CECC7 /* HeapTests.swift */; };\n\t\t7B80C3DE1C77A393003CECC7 /* Heap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C3DD1C77A393003CECC7 /* Heap.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t7B2BBC801C779D720067B71D /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7B2BBC941C779E7B0067B71D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };\n\t\t7B80C3DB1C77A38C003CECC7 /* HeapTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeapTests.swift; sourceTree = SOURCE_ROOT; };\n\t\t7B80C3DD1C77A393003CECC7 /* Heap.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Heap.swift; path = ../Heap.swift; sourceTree = SOURCE_ROOT; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t7B2BBC7D1C779D720067B71D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t7B2BBC681C779D710067B71D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC831C779D720067B71D /* Tests */,\n\t\t\t\t7B2BBC721C779D710067B71D /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC721C779D710067B71D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC801C779D720067B71D /* Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC831C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B80C3DD1C77A393003CECC7 /* Heap.swift */,\n\t\t\t\t7B80C3DB1C77A38C003CECC7 /* HeapTests.swift */,\n\t\t\t\t7B2BBC941C779E7B0067B71D /* Info.plist */,\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tpath = TestsTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t7B2BBC7F1C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t7B2BBC7C1C779D720067B71D /* Sources */,\n\t\t\t\t7B2BBC7D1C779D720067B71D /* Frameworks */,\n\t\t\t\t7B2BBC7E1C779D720067B71D /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tproductName = TestsTests;\n\t\t\tproductReference = 7B2BBC801C779D720067B71D /* Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t7B2BBC691C779D710067B71D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0720;\n\t\t\t\tLastUpgradeCheck = 1010;\n\t\t\t\tORGANIZATIONNAME = \"Swift Algorithm Club\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t7B2BBC7F1C779D720067B71D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2;\n\t\t\t\t\t\tLastSwiftMigration = 1010;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */;\n\t\t\tcompatibilityVersion = \"Xcode 10.0\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 7B2BBC681C779D710067B71D;\n\t\t\tproductRefGroup = 7B2BBC721C779D710067B71D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t7B2BBC7F1C779D720067B71D /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t7B2BBC7E1C779D720067B71D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t7B2BBC7C1C779D720067B71D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7B80C3DC1C77A38C003CECC7 /* HeapTests.swift in Sources */,\n\t\t\t\t7B80C3DE1C77A393003CECC7 /* Heap.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t7B2BBC871C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC881C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t7B2BBC8D1C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t\t\"@loader_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC8E1C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t\t\"@loader_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC871C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC881C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC8D1C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC8E1C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 7B2BBC691C779D710067B71D /* Project object */;\n}\n"
  },
  {
    "path": "Heap/Tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Tests.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Heap/Tests/Tests.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Heap/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1010\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Heap Sort/HeapSort.swift",
    "content": "extension Heap {\n  public mutating func sort() -> [T] {\n    for i in stride(from: (nodes.count - 1), through: 1, by: -1) {\n      nodes.swapAt(0, i)\n      shiftDown(from: 0, until: i)\n    }\n    return nodes\n  }\n}\n\n/*\n Sorts an array using a heap.\n Heapsort can be performed in-place, but it is not a stable sort.\n */\npublic func heapsort<T>(_ a: [T], _ sort: @escaping (T, T) -> Bool) -> [T] {\n  let reverseOrder = { i1, i2 in sort(i2, i1) }\n  var h = Heap(array: a, sort: reverseOrder)\n  return h.sort()\n}\n"
  },
  {
    "path": "Heap Sort/README.markdown",
    "content": "# Heap Sort\n\nSorts an array from low to high using a heap.\n\nA [heap](../Heap/) is a partially sorted binary tree that is stored inside an array. The heap sort algorithm takes advantage of the structure of the heap to perform a fast sort.\n\nTo sort from lowest to highest, heap sort first converts the unsorted array to a max-heap, so that the first element in the array is the largest.\n\nLet's say the array to sort is:\n\n\t[ 5, 13, 2, 25, 7, 17, 20, 8, 4 ]\n\nThis is first turned into a max-heap that looks like this:\n\n![The max-heap](Images/MaxHeap.png)\n\nThe heap's internal array is then:\n\n\t[ 25, 13, 20, 8, 7, 17, 2, 5, 4 ]\n\nThat's hardly what you'd call sorted! But now the sorting process starts: we swap the first element (index *0*) with the last one at index *n-1*, to get:\n\n\t[ 4, 13, 20, 8, 7, 17, 2, 5, 25 ]\n\t  *                          *\n\nNow the new root node, `4`, will be smaller than its children, so we fix up the max-heap up to element *n-2* using the *shift down* or \"heapify\" procedure. After repairing the heap, the new root is now the second-largest item in the array:\n\n\t[20, 13, 17, 8, 7, 4, 2, 5 | 25]\n\nImportant: When we fix the heap, we ignore the last item at index *n-1*. That now contains the array's maximum value, so it is in its final sorted place already. The `|` bar indicates where the sorted portion of the array begins. We'll leave that part of the array alone from now on.\n\nAgain, we swap the first element with the last one (this time at index *n-2*):\n\n\t[5, 13, 17, 8, 7, 4, 2, 20 | 25]\n\t *                      *\n\nAnd fix up the heap to make it valid max-heap again:\n\n\t[17, 13, 5, 8, 7, 4, 2 | 20, 25]\n\nAs you can see, the largest items are making their way to the back. We repeat this process until we arrive at the root node and then the whole array is sorted.\n\n> **Note:** This process is very similar to [selection sort](../Selection%20Sort/), which repeatedly looks for the minimum item in the remainder of the array. Extracting the minimum or maximum value is what heaps are good at.\n\nPerformance of heap sort is **O(n log n)** in best, worst, and average case. Because we modify the array directly, heap sort can be performed in-place. But it is not a stable sort: the relative order of identical elements is not preserved.\n\nHere's how you can implement heap sort in Swift:\n\n```swift\nextension Heap {\n  public mutating func sort() -> [T] {\n    for i in stride(from: (elements.count - 1), through: 1, by: -1) {\n      swap(&elements[0], &elements[i])\n      shiftDown(0, heapSize: i)\n    }\n    return elements\n  }\n}\n```\n\nThis adds a `sort()` function to our [heap](../Heap/) implementation. To use it, you would do something like this:\n\n```swift\nvar h1 = Heap(array: [5, 13, 2, 25, 7, 17, 20, 8, 4], sort: >)\nlet a1 = h1.sort()\n```\n\nBecause we need a max-heap to sort from low-to-high, you need to give `Heap` the reverse of the sort function. To sort `<`, the `Heap` object must be created with `>` as the sort function. In other words, sorting from low-to-high creates a max-heap and turns it into a min-heap.\n\nWe can write a handy helper function for that:\n\n```swift\npublic func heapsort<T>(_ a: [T], _ sort: @escaping (T, T) -> Bool) -> [T] {\n  let reverseOrder = { i1, i2 in sort(i2, i1) }\n  var h = Heap(array: a, sort: reverseOrder)\n  return h.sort()\n}\n```\n\n*Written for Swift Algorithm Club by Matthijs Hollemans*\n"
  },
  {
    "path": "Heap Sort/Tests/HeapSortTests.swift",
    "content": "import XCTest\n\nclass HeapSortTests: XCTestCase {\n  \n  func testSort() {\n    var h1 = Heap(array: [5, 13, 2, 25, 7, 17, 20, 8, 4], sort: >)\n    let a1 = h1.sort()\n    XCTAssertEqual(a1, [2, 4, 5, 7, 8, 13, 17, 20, 25])\n    \n    let a1_ = heapsort([5, 13, 2, 25, 7, 17, 20, 8, 4], <)\n    XCTAssertEqual(a1_, [2, 4, 5, 7, 8, 13, 17, 20, 25])\n    \n    var h2 = Heap(array: [16, 14, 10, 8, 7, 8, 3, 2, 4, 1], sort: >)\n    let a2 = h2.sort()\n    XCTAssertEqual(a2, [1, 2, 3, 4, 7, 8, 8, 10, 14, 16])\n    \n    let a2_ = heapsort([16, 14, 10, 8, 7, 8, 3, 2, 4, 1], <)\n    XCTAssertEqual(a2_, [1, 2, 3, 4, 7, 8, 8, 10, 14, 16])\n    \n    var h3 = Heap(array: [1, 2, 3, 4, 5, 6], sort: <)\n    let a3 = h3.sort()\n    XCTAssertEqual(a3, [6, 5, 4, 3, 2, 1])\n    \n    let a3_ = heapsort([1, 2, 3, 4, 5, 6], >)\n    XCTAssertEqual(a3_, [6, 5, 4, 3, 2, 1])\n  }\n}\n"
  },
  {
    "path": "Heap Sort/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Heap Sort/Tests/Tests.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 51;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t7B80C3E01C77A3DB003CECC7 /* Heap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C3DF1C77A3DB003CECC7 /* Heap.swift */; };\n\t\t7B80C3E21C77A3E5003CECC7 /* HeapSort.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C3E11C77A3E5003CECC7 /* HeapSort.swift */; };\n\t\t7B80C3E41C77A3EB003CECC7 /* HeapSortTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C3E31C77A3EB003CECC7 /* HeapSortTests.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t7B2BBC801C779D720067B71D /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7B2BBC941C779E7B0067B71D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };\n\t\t7B80C3DF1C77A3DB003CECC7 /* Heap.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Heap.swift; path = ../../Heap/Heap.swift; sourceTree = SOURCE_ROOT; };\n\t\t7B80C3E11C77A3E5003CECC7 /* HeapSort.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = HeapSort.swift; path = ../HeapSort.swift; sourceTree = SOURCE_ROOT; };\n\t\t7B80C3E31C77A3EB003CECC7 /* HeapSortTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeapSortTests.swift; sourceTree = SOURCE_ROOT; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t7B2BBC7D1C779D720067B71D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t7B2BBC681C779D710067B71D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC831C779D720067B71D /* Tests */,\n\t\t\t\t7B2BBC721C779D710067B71D /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC721C779D710067B71D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC801C779D720067B71D /* Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC831C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B80C3DF1C77A3DB003CECC7 /* Heap.swift */,\n\t\t\t\t7B80C3E11C77A3E5003CECC7 /* HeapSort.swift */,\n\t\t\t\t7B80C3E31C77A3EB003CECC7 /* HeapSortTests.swift */,\n\t\t\t\t7B2BBC941C779E7B0067B71D /* Info.plist */,\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tpath = TestsTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t7B2BBC7F1C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t7B2BBC7C1C779D720067B71D /* Sources */,\n\t\t\t\t7B2BBC7D1C779D720067B71D /* Frameworks */,\n\t\t\t\t7B2BBC7E1C779D720067B71D /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tproductName = TestsTests;\n\t\t\tproductReference = 7B2BBC801C779D720067B71D /* Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t7B2BBC691C779D710067B71D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0720;\n\t\t\t\tLastUpgradeCheck = 1010;\n\t\t\t\tORGANIZATIONNAME = \"Swift Algorithm Club\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t7B2BBC7F1C779D720067B71D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2;\n\t\t\t\t\t\tLastSwiftMigration = 1010;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */;\n\t\t\tcompatibilityVersion = \"Xcode 10.0\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 7B2BBC681C779D710067B71D;\n\t\t\tproductRefGroup = 7B2BBC721C779D710067B71D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t7B2BBC7F1C779D720067B71D /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t7B2BBC7E1C779D720067B71D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t7B2BBC7C1C779D720067B71D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7B80C3E01C77A3DB003CECC7 /* Heap.swift in Sources */,\n\t\t\t\t7B80C3E41C77A3EB003CECC7 /* HeapSortTests.swift in Sources */,\n\t\t\t\t7B80C3E21C77A3E5003CECC7 /* HeapSort.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t7B2BBC871C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC881C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t7B2BBC8D1C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t\t\"@loader_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC8E1C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t\t\"@loader_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC871C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC881C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC8D1C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC8E1C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 7B2BBC691C779D710067B71D /* Project object */;\n}\n"
  },
  {
    "path": "Heap Sort/Tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Tests.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Heap Sort/Tests/Tests.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Heap Sort/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1010\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Huffman Coding/Huffman.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\nimport Foundation\n\nlet s1 = \"so much words wow many compression\"\nif let originalData = s1.data(using: .utf8) {\n  print(originalData.count)\n\n  let huffman1 = Huffman()\n  let compressedData = huffman1.compressData(data: originalData as NSData)\n  print(compressedData.length)\n\n  let frequencyTable = huffman1.frequencyTable()\n  //print(frequencyTable)\n\n  let huffman2 = Huffman()\n  let decompressedData = huffman2.decompressData(data: compressedData, frequencyTable: frequencyTable)\n  print(decompressedData.length)\n\n  let s2 = String(data: decompressedData as Data, encoding: .utf8)!\n  print(s2)\n  assert(s1 == s2)\n}\n"
  },
  {
    "path": "Huffman Coding/Huffman.playground/Sources/Heap.swift",
    "content": "//\n//  Heap.swift\n//  Written for the Swift Algorithm Club by Kevin Randrup and Matthijs Hollemans\n//\n\npublic struct Heap<T> {\n  /** The array that stores the heap's nodes. */\n  var elements = [T]()\n\n  /** Determines whether this is a max-heap (>) or min-heap (<). */\n  fileprivate var isOrderedBefore: (T, T) -> Bool\n\n  /**\n   * Creates an empty heap.\n   * The sort function determines whether this is a min-heap or max-heap.\n   * For integers, > makes a max-heap, < makes a min-heap.\n   */\n  public init(sort: @escaping (T, T) -> Bool) {\n    self.isOrderedBefore = sort\n  }\n\n  /**\n   * Creates a heap from an array. The order of the array does not matter;\n   * the elements are inserted into the heap in the order determined by the\n   * sort function.\n   */\n  public init(array: [T], sort: @escaping (T, T) -> Bool) {\n    self.isOrderedBefore = sort\n    buildHeap(array: array)\n  }\n\n  /*\n  // This version has O(n log n) performance.\n  private mutating func buildHeap(array: [T]) {\n    elements.reserveCapacity(array.count)\n    for value in array {\n      insert(value)\n    }\n  }\n  */\n\n  /**\n   * Converts an array to a max-heap or min-heap in a bottom-up manner.\n   * Performance: This runs pretty much in O(n).\n   */\n  private mutating func buildHeap(array: [T]) {\n    elements = array\n    for i in stride(from: elements.count/2 - 1, to: 0, by: -1) {\n      shiftDown(index: i, heapSize: elements.count)\n    }\n  }\n\n  public var isEmpty: Bool {\n    return elements.isEmpty\n  }\n\n  public var count: Int {\n    return elements.count\n  }\n\n  /**\n   * Returns the index of the parent of the element at index i.\n   * The element at index 0 is the root of the tree and has no parent.\n   */\n  @inline(__always) func indexOfParent(i: Int) -> Int {\n    return (i - 1) / 2\n  }\n\n  /**\n   * Returns the index of the left child of the element at index i.\n   * Note that this index can be greater than the heap size, in which case\n   * there is no left child.\n   */\n  @inline(__always) func indexOfLeftChild(i: Int) -> Int {\n    return 2*i + 1\n  }\n\n  /**\n   * Returns the index of the right child of the element at index i.\n   * Note that this index can be greater than the heap size, in which case\n   * there is no right child.\n   */\n  @inline(__always) func indexOfRightChild(i: Int) -> Int {\n    return 2*i + 2\n  }\n\n  /**\n   * Returns the maximum value in the heap (for a max-heap) or the minimum\n   * value (for a min-heap).\n   */\n  public func peek() -> T? {\n    return elements.first\n  }\n\n  /**\n   * Adds a new value to the heap. This reorders the heap so that the max-heap\n   * or min-heap property still holds. Performance: O(log n).\n   */\n  public mutating func insert(_ value: T) {\n    elements.append(value)\n    shiftUp(index: elements.count - 1)\n  }\n\n  public mutating func insert<S: Sequence>(sequence: S) where S.Iterator.Element == T {\n    for value in sequence {\n      insert(value)\n    }\n  }\n\n  /**\n   * Allows you to change an element. In a max-heap, the new element should be\n   * larger than the old one; in a min-heap it should be smaller.\n   */\n  public mutating func replace(index i: Int, value: T) {\n    assert(isOrderedBefore(value, elements[i]))\n    elements[i] = value\n    shiftUp(index: i)\n  }\n\n  /**\n   * Removes the root node from the heap. For a max-heap, this is the maximum\n   * value; for a min-heap it is the minimum value. Performance: O(log n).\n   */\n  public mutating func remove() -> T? {\n    if elements.isEmpty {\n      return nil\n    } else if elements.count == 1 {\n      return elements.removeLast()\n    } else {\n      // Use the last node to replace the first one, then fix the heap by\n      // shifting this new first node into its proper position.\n      let value = elements[0]\n      elements[0] = elements.removeLast()\n      shiftDown()\n      return value\n    }\n  }\n\n  /**\n   * Removes an arbitrary node from the heap. Performance: O(log n). You need\n   * to know the node's index, which may actually take O(n) steps to find.\n   */\n  public mutating func removeAtIndex(i: Int) -> T? {\n    let size = elements.count - 1\n    if i != size {\n      elements.swapAt(i, size)\n      shiftDown(index: i, heapSize: size)\n      shiftUp(index: i)\n    }\n    return elements.removeLast()\n  }\n\n  /**\n   * Takes a child node and looks at its parents; if a parent is not larger\n   * (max-heap) or not smaller (min-heap) than the child, we exchange them.\n   */\n  mutating func shiftUp(index: Int) {\n    var childIndex = index\n    let child = elements[childIndex]\n    var parentIndex = indexOfParent(i: childIndex)\n\n    while childIndex > 0 && isOrderedBefore(child, elements[parentIndex]) {\n      elements[childIndex] = elements[parentIndex]\n      childIndex = parentIndex\n      parentIndex = indexOfParent(i: childIndex)\n    }\n\n    elements[childIndex] = child\n  }\n\n  mutating func shiftDown() {\n    shiftDown(index: 0, heapSize: elements.count)\n  }\n\n  /**\n   * Looks at a parent node and makes sure it is still larger (max-heap) or\n   * smaller (min-heap) than its childeren.\n   */\n  mutating func shiftDown(index: Int, heapSize: Int) {\n    var parentIndex = index\n\n    while true {\n      let leftChildIndex = indexOfLeftChild(i: parentIndex)\n      let rightChildIndex = leftChildIndex + 1\n\n      // Figure out which comes first if we order them by the sort function:\n      // the parent, the left child, or the right child. If the parent comes\n      // first, we're done. If not, that element is out-of-place and we make\n      // it \"float down\" the tree until the heap property is restored.\n      var first = parentIndex\n      if leftChildIndex < heapSize && isOrderedBefore(elements[leftChildIndex], elements[first]) {\n        first = leftChildIndex\n      }\n      if rightChildIndex < heapSize && isOrderedBefore(elements[rightChildIndex], elements[first]) {\n        first = rightChildIndex\n      }\n      if first == parentIndex { return }\n\n      elements.swapAt(parentIndex, first)\n      parentIndex = first\n    }\n  }\n}\n\n// MARK: - Searching\n\nextension Heap where T: Equatable {\n  /**\n   * Searches the heap for the given element. Performance: O(n).\n   */\n  public func index(of element: T) -> Int? {\n    return index(of: element, 0)\n  }\n\n  private func index(of element: T, _ i: Int) -> Int? {\n    if i >= count { return nil }\n    if isOrderedBefore(element, elements[i]) { return nil }\n    if element == elements[i] { return i }\n    if let j = index(of: element, indexOfLeftChild(i: i)) { return j }\n    if let j = index(of: element, indexOfRightChild(i: i)) { return j }\n    return nil\n  }\n}\n"
  },
  {
    "path": "Huffman Coding/Huffman.playground/Sources/Huffman.swift",
    "content": "import Foundation\n\n/*\n  Basic implementation of Huffman encoding. It encodes bytes that occur often\n  with a smaller number of bits than bytes that occur less frequently.\n\n  Based on Al Stevens' C Programming column from Dr.Dobb's Magazine, February\n  1991 and October 1992.\n\n  Note: This code is not optimized for speed but explanation.\n*/\npublic class Huffman {\n  /* Tree nodes don't use pointers to refer to each other, but simple integer\n     indices. That allows us to use structs for the nodes. */\n  typealias NodeIndex = Int\n\n  /* A node in the compression tree. Leaf nodes represent the actual bytes that\n     are present in the input data. The count of an intermediary node is the sum\n     of the counts of all nodes below it. The root node's count is the number of\n     bytes in the original, uncompressed input data. */\n  struct Node {\n    var count = 0\n    var index: NodeIndex = -1\n    var parent: NodeIndex = -1\n    var left: NodeIndex = -1\n    var right: NodeIndex = -1\n  }\n\n  /* The tree structure. The first 256 entries are for the leaf nodes (not all\n     of those may be used, depending on the input). We add additional nodes as\n     we build the tree. */\n  var tree = [Node](repeating: Node(), count: 256)\n\n  /* This is the last node we add to the tree. */\n  var root: NodeIndex = -1\n\n  /* The frequency table describes how often a byte occurs in the input data.\n     You need it to decompress the Huffman-encoded data. The frequency table\n     should be serialized along with the compressed data. */\n  public struct Freq {\n    var byte: UInt8 = 0\n    var count = 0\n  }\n\n  public init() { }\n}\n\nextension Huffman {\n  /* To compress a block of data, first we need to count how often each byte\n     occurs. These counts are stored in the first 256 nodes in the tree, i.e.\n     the leaf nodes. The frequency table used by decompression is derived from\n     this. */\n  fileprivate func countByteFrequency(inData data: NSData) {\n    var ptr = data.bytes.assumingMemoryBound(to: UInt8.self)\n    for _ in 0..<data.length {\n      let i = Int(ptr.pointee)\n      tree[i].count += 1\n      tree[i].index = i\n      ptr = ptr.successor()\n    }\n  }\n\n  /* Takes a frequency table and rebuilds the tree. This is the first step of\n     decompression. */\n    fileprivate func restoreTree(fromTable frequencyTable: [Freq]) {\n    for freq in frequencyTable {\n      let i = Int(freq.byte)\n      tree[i].count = freq.count\n      tree[i].index = i\n    }\n    buildTree()\n  }\n\n  /* Returns the frequency table. This is the first 256 nodes from the tree but\n     only those that are actually used, without the parent/left/right pointers.\n     You would serialize this along with the compressed file. */\n  public func frequencyTable() -> [Freq] {\n    var a = [Freq]()\n    for i in 0..<256 where tree[i].count > 0 {\n      a.append(Freq(byte: UInt8(i), count: tree[i].count))\n    }\n    return a\n  }\n}\n\nextension Huffman {\n  /* Builds a Huffman tree from a frequency table. */\n  fileprivate func buildTree() {\n    // Create a min-priority queue and enqueue all used nodes.\n    var queue = PriorityQueue<Node>(sort: { $0.count < $1.count })\n    for node in tree where node.count > 0 {\n      queue.enqueue(node)\n    }\n\n    while queue.count > 1 {\n      // Find the two nodes with the smallest frequencies that do not have\n      // a parent node yet.\n      let node1 = queue.dequeue()!\n      let node2 = queue.dequeue()!\n\n      // Create a new intermediate node.\n      var parentNode = Node()\n      parentNode.count = node1.count + node2.count\n      parentNode.left = node1.index\n      parentNode.right = node2.index\n      parentNode.index = tree.count\n      tree.append(parentNode)\n\n      // Link the two nodes into their new parent node.\n      tree[node1.index].parent = parentNode.index\n      tree[node2.index].parent = parentNode.index\n\n      // Put the intermediate node back into the queue.\n      queue.enqueue(parentNode)\n    }\n\n    // The final remaining node in the queue becomes the root of the tree.\n    let rootNode = queue.dequeue()!\n    root = rootNode.index\n  }\n}\n\nextension Huffman {\n  /* Compresses the contents of an NSData object. */\n  public func compressData(data: NSData) -> NSData {\n    countByteFrequency(inData: data)\n    buildTree()\n\n    let writer = BitWriter()\n    var ptr = data.bytes.assumingMemoryBound(to: UInt8.self)\n    for _ in 0..<data.length {\n      let c = ptr.pointee\n      let i = Int(c)\n      traverseTree(writer: writer, nodeIndex: i, childIndex: -1)\n      ptr = ptr.successor()\n    }\n    writer.flush()\n    return writer.data\n  }\n\n  /* Recursively walks the tree from a leaf node up to the root, and then back\n     again. If a child is the right node, we emit a 0 bit; if it's the left node,\n     we emit a 1 bit. */\n  private func traverseTree(writer: BitWriter, nodeIndex h: Int, childIndex child: Int) {\n    if tree[h].parent != -1 {\n      traverseTree(writer: writer, nodeIndex: tree[h].parent, childIndex: h)\n    }\n    if child != -1 {\n      if child == tree[h].left {\n        writer.writeBit(bit: true)\n      } else if child == tree[h].right {\n        writer.writeBit(bit: false)\n      }\n    }\n  }\n}\n\nextension Huffman {\n  /* Takes a Huffman-compressed NSData object and outputs the uncompressed data. */\n  public func decompressData(data: NSData, frequencyTable: [Freq]) -> NSData {\n    restoreTree(fromTable: frequencyTable)\n\n    let reader = BitReader(data: data)\n    let outData = NSMutableData()\n    let byteCount = tree[root].count\n\n    var i = 0\n    while i < byteCount {\n      var b = findLeafNode(reader: reader, nodeIndex: root)\n      outData.append(&b, length: 1)\n      i += 1\n    }\n    return outData\n  }\n\n  /* Walks the tree from the root down to the leaf node. At every node, read the\n     next bit and use that to determine whether to step to the left or right.\n     When we get to the leaf node, we simply return its index, which is equal to\n     the original byte value. */\n  private func findLeafNode(reader: BitReader, nodeIndex: Int) -> UInt8 {\n    var h = nodeIndex\n    while tree[h].right != -1 {\n      if reader.readBit() {\n        h = tree[h].left\n      } else {\n        h = tree[h].right\n      }\n    }\n    return UInt8(h)\n  }\n}\n"
  },
  {
    "path": "Huffman Coding/Huffman.playground/Sources/NSData+Bits.swift",
    "content": "import Foundation\n\n/* Helper class for writing bits to an NSData object. */\npublic class BitWriter {\n  public var data = NSMutableData()\n  var outByte: UInt8 = 0\n  var outCount = 0\n\n  public func writeBit(bit: Bool) {\n    if outCount == 8 {\n      data.append(&outByte, length: 1)\n      outCount = 0\n    }\n    outByte = (outByte << 1) | (bit ? 1 : 0)\n    outCount += 1\n  }\n\n  public func flush() {\n    if outCount > 0 {\n      if outCount < 8 {\n        let diff = UInt8(8 - outCount)\n        outByte <<= diff\n      }\n      data.append(&outByte, length: 1)\n    }\n  }\n}\n\n/* Helper class for reading bits from an NSData object. */\npublic class BitReader {\n  var ptr: UnsafePointer<UInt8>\n  var inByte: UInt8 = 0\n  var inCount = 8\n\n  public init(data: NSData) {\n    ptr = data.bytes.assumingMemoryBound(to: UInt8.self)\n  }\n\n  public func readBit() -> Bool {\n    if inCount == 8 {\n      inByte = ptr.pointee    // load the next byte\n      inCount = 0\n      ptr = ptr.successor()\n    }\n    let bit = inByte & 0x80  // read the next bit\n    inByte <<= 1\n    inCount += 1\n    return bit == 0 ? false : true\n  }\n}\n"
  },
  {
    "path": "Huffman Coding/Huffman.playground/Sources/PriorityQueue.swift",
    "content": "/*\n  Priority Queue, a queue where the most \"important\" items are at the front of\n  the queue.\n\n  The heap is a natural data structure for a priority queue, so this object\n  simply wraps the Heap struct.\n\n  All operations are O(lg n).\n\n  Just like a heap can be a max-heap or min-heap, the queue can be a max-priority\n  queue (largest element first) or a min-priority queue (smallest element first).\n*/\npublic struct PriorityQueue<T> {\n  fileprivate var heap: Heap<T>\n\n  /*\n    To create a max-priority queue, supply a > sort function. For a min-priority\n    queue, use <.\n  */\n  public init(sort: @escaping (T, T) -> Bool) {\n    heap = Heap(sort: sort)\n  }\n\n  public var isEmpty: Bool {\n    return heap.isEmpty\n  }\n\n  public var count: Int {\n    return heap.count\n  }\n\n  public func peek() -> T? {\n    return heap.peek()\n  }\n\n  public mutating func enqueue(_ element: T) {\n    heap.insert(element)\n  }\n\n  public mutating func dequeue() -> T? {\n    return heap.remove()\n  }\n\n  /*\n    Allows you to change the priority of an element. In a max-priority queue,\n    the new priority should be larger than the old one; in a min-priority queue\n    it should be smaller.\n  */\n  public mutating func changePriority(index i: Int, value: T) {\n    return heap.replace(index: i, value: value)\n  }\n}\n\nextension PriorityQueue where T: Equatable {\n  public func indexOf(element: T) -> Int? {\n    return heap.index(of: element)\n  }\n}\n"
  },
  {
    "path": "Huffman Coding/Huffman.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Huffman Coding/Huffman.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Huffman Coding/Huffman.playground/timeline.xctimeline",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Timeline\n   version = \"3.0\">\n   <TimelineItems>\n      <LoggerValueHistoryTimelineItem\n         documentLocation = \"file:///Users/kachen/src/swift-algorithm-club/Huffman%20Coding/Huffman.playground#CharacterRangeLen=0&amp;CharacterRangeLoc=752&amp;EndingColumnNumber=0&amp;EndingLineNumber=28&amp;StartingColumnNumber=0&amp;StartingLineNumber=28&amp;Timestamp=523212028.643394\"\n         selectedRepresentationIndex = \"0\"\n         shouldTrackSuperviewWidth = \"NO\">\n      </LoggerValueHistoryTimelineItem>\n      <LoggerValueHistoryTimelineItem\n         documentLocation = \"file:///Users/kachen/src/swift-algorithm-club/Huffman%20Coding/Huffman.playground#CharacterRangeLen=14&amp;CharacterRangeLoc=433&amp;EndingColumnNumber=36&amp;EndingLineNumber=17&amp;StartingColumnNumber=22&amp;StartingLineNumber=17&amp;Timestamp=523212028.643973\"\n         selectedRepresentationIndex = \"0\"\n         shouldTrackSuperviewWidth = \"NO\">\n      </LoggerValueHistoryTimelineItem>\n   </TimelineItems>\n</Timeline>\n"
  },
  {
    "path": "Huffman Coding/Huffman.swift",
    "content": "import Foundation\n\n/*\n Basic implementation of Huffman encoding. It encodes bytes that occur often\n with a smaller number of bits than bytes that occur less frequently.\n \n Based on Al Stevens' C Programming column from Dr.Dobb's Magazine, February\n 1991 and October 1992.\n \n Note: This code is not optimized for speed but explanation.\n */\npublic class Huffman {\n    /* Tree nodes don't use pointers to refer to each other, but simple integer\n     indices. That allows us to use structs for the nodes. */\n    typealias NodeIndex = Int\n\n    /* A node in the compression tree. Leaf nodes represent the actual bytes that\n     are present in the input data. The count of an intermediary node is the sum\n     of the counts of all nodes below it. The root node's count is the number of\n     bytes in the original, uncompressed input data. */\n    struct Node {\n        var count = 0\n        var index: NodeIndex = -1\n        var parent: NodeIndex = -1\n        var left: NodeIndex = -1\n        var right: NodeIndex = -1\n    }\n\n    /* The tree structure. The first 256 entries are for the leaf nodes (not all\n     of those may be used, depending on the input). We add additional nodes as\n     we build the tree. */\n    var tree = [Node](repeating: Node(), count: 256)\n\n    /* This is the last node we add to the tree. */\n    var root: NodeIndex = -1\n\n    /* The frequency table describes how often a byte occurs in the input data.\n     You need it to decompress the Huffman-encoded data. The frequency table\n     should be serialized along with the compressed data. */\n    public struct Freq {\n        var byte: UInt8 = 0\n        var count = 0\n    }\n\n    public init() { }\n}\n\nextension Huffman {\n    /* To compress a block of data, first we need to count how often each byte\n     occurs. These counts are stored in the first 256 nodes in the tree, i.e.\n     the leaf nodes. The frequency table used by decompression is derived from\n     this. */\n    fileprivate func countByteFrequency(inData data: NSData) {\n        var ptr = data.bytes.assumingMemoryBound(to: UInt8.self)\n        for _ in 0..<data.length {\n            let i = Int(ptr.pointee)\n            tree[i].count += 1\n            tree[i].index = i\n            ptr = ptr.successor()\n        }\n    }\n\n    /* Takes a frequency table and rebuilds the tree. This is the first step of\n     decompression. */\n    fileprivate func restoreTree(fromTable frequencyTable: [Freq]) {\n        for freq in frequencyTable {\n            let i = Int(freq.byte)\n            tree[i].count = freq.count\n            tree[i].index = i\n        }\n        buildTree()\n    }\n\n    /* Returns the frequency table. This is the first 256 nodes from the tree but\n     only those that are actually used, without the parent/left/right pointers.\n     You would serialize this along with the compressed file. */\n    public func frequencyTable() -> [Freq] {\n        var a = [Freq]()\n        for i in 0..<256 where tree[i].count > 0 {\n            a.append(Freq(byte: UInt8(i), count: tree[i].count))\n        }\n        return a\n    }\n}\n\nextension Huffman {\n    /* Builds a Huffman tree from a frequency table. */\n    fileprivate func buildTree() {\n        // Create a min-priority queue and enqueue all used nodes.\n        var queue = PriorityQueue<Node>(sort: { $0.count < $1.count })\n        for node in tree where node.count > 0 {\n            queue.enqueue(node)\n        }\n\n        while queue.count > 1 {\n            // Find the two nodes with the smallest frequencies that do not have\n            // a parent node yet.\n            let node1 = queue.dequeue()!\n            let node2 = queue.dequeue()!\n\n            // Create a new intermediate node.\n            var parentNode = Node()\n            parentNode.count = node1.count + node2.count\n            parentNode.left = node1.index\n            parentNode.right = node2.index\n            parentNode.index = tree.count\n            tree.append(parentNode)\n\n            // Link the two nodes into their new parent node.\n            tree[node1.index].parent = parentNode.index\n            tree[node2.index].parent = parentNode.index\n\n            // Put the intermediate node back into the queue.\n            queue.enqueue(parentNode)\n        }\n\n        // The final remaining node in the queue becomes the root of the tree.\n        let rootNode = queue.dequeue()!\n        root = rootNode.index\n    }\n}\n\nextension Huffman {\n    /* Compresses the contents of an NSData object. */\n    public func compressData(data: NSData) -> NSData {\n        countByteFrequency(inData: data)\n        buildTree()\n\n        let writer = BitWriter()\n        var ptr = data.bytes.assumingMemoryBound(to: UInt8.self)\n        for _ in 0..<data.length {\n            let c = ptr.pointee\n            let i = Int(c)\n            traverseTree(writer: writer, nodeIndex: i, childIndex: -1)\n            ptr = ptr.successor()\n        }\n        writer.flush()\n        return writer.data\n    }\n\n    /* Recursively walks the tree from a leaf node up to the root, and then back\n     again. If a child is the right node, we emit a 0 bit; if it's the left node,\n     we emit a 1 bit. */\n    private func traverseTree(writer: BitWriter, nodeIndex h: Int, childIndex child: Int) {\n        if tree[h].parent != -1 {\n            traverseTree(writer: writer, nodeIndex: tree[h].parent, childIndex: h)\n        }\n        if child != -1 {\n            if child == tree[h].left {\n                writer.writeBit(bit: true)\n            } else if child == tree[h].right {\n                writer.writeBit(bit: false)\n            }\n        }\n    }\n}\n\nextension Huffman {\n    /* Takes a Huffman-compressed NSData object and outputs the uncompressed data. */\n    public func decompressData(data: NSData, frequencyTable: [Freq]) -> NSData {\n        restoreTree(fromTable: frequencyTable)\n\n        let reader = BitReader(data: data)\n        let outData = NSMutableData()\n        let byteCount = tree[root].count\n\n        var i = 0\n        while i < byteCount {\n            var b = findLeafNode(reader: reader, nodeIndex: root)\n            outData.append(&b, length: 1)\n            i += 1\n        }\n        return outData\n    }\n\n    /* Walks the tree from the root down to the leaf node. At every node, read the\n     next bit and use that to determine whether to step to the left or right.\n     When we get to the leaf node, we simply return its index, which is equal to\n     the original byte value. */\n    private func findLeafNode(reader: BitReader, nodeIndex: Int) -> UInt8 {\n        var h = nodeIndex\n        while tree[h].right != -1 {\n            if reader.readBit() {\n                h = tree[h].left\n            } else {\n                h = tree[h].right\n            }\n        }\n        return UInt8(h)\n    }\n}\n"
  },
  {
    "path": "Huffman Coding/NSData+Bits.swift",
    "content": "import Foundation\n\n/* Helper class for writing bits to an NSData object. */\npublic class BitWriter {\n    public var data = NSMutableData()\n    var outByte: UInt8 = 0\n    var outCount = 0\n\n    public func writeBit(bit: Bool) {\n        if outCount == 8 {\n            data.append(&outByte, length: 1)\n            outCount = 0\n        }\n        outByte = (outByte << 1) | (bit ? 1 : 0)\n        outCount += 1\n    }\n\n    public func flush() {\n        if outCount > 0 {\n            if outCount < 8 {\n                let diff = UInt8(8 - outCount)\n                outByte <<= diff\n            }\n            data.append(&outByte, length: 1)\n        }\n    }\n}\n\n/* Helper class for reading bits from an NSData object. */\npublic class BitReader {\n    var ptr: UnsafePointer<UInt8>\n    var inByte: UInt8 = 0\n    var inCount = 8\n\n    public init(data: NSData) {\n        ptr = data.bytes.assumingMemoryBound(to: UInt8.self)\n    }\n\n    public func readBit() -> Bool {\n        if inCount == 8 {\n            inByte = ptr.pointee    // load the next byte\n            inCount = 0\n            ptr = ptr.successor()\n        }\n        let bit = inByte & 0x80  // read the next bit\n        inByte <<= 1\n        inCount += 1\n        return bit == 0 ? false : true\n    }\n}\n"
  },
  {
    "path": "Huffman Coding/README.markdown",
    "content": "# Huffman Coding\n\nThe idea: To encode objects that occur often with a smaller number of bits than objects that occur less frequently.\n\nAlthough any type of objects can be encoded with this scheme, it is common to compress a stream of bytes. Suppose you have the following text, where each character is one byte:\n\n\tso much words wow many compression\n\nIf you count how often each byte appears, you can see some bytes occur more than others:\n\n\tspace: 5                  u: 1\n\t    o: 5                  h: 1\n\t    s: 4                  d: 1\n\t    m: 3                  a: 1\n\t    w: 3                  y: 1\n\t    c: 2                  p: 1\n\t    r: 2                  e: 1\n\t    n: 2                  i: 1\n\nWe can assign bit strings to each of these bytes. The more common a byte is, the fewer bits we assign to it. We might get something like this:\n\n\tspace: 5    010           u: 1    11001\n\t    o: 5    000\t          h: 1    10001\n\t    s: 4    101\t          d: 1    11010\n\t    m: 3    111\t          a: 1    11011\n\t    w: 3    0010          y: 1    01111\n\t    c: 2    0011          p: 1    11000\n\t    r: 2    1001          e: 1    01110\n\t    n: 2    0110          i: 1    10000\n\nNow if we replace the original bytes with these bit strings, the compressed output becomes:\n\n\t101 000 010 111 11001 0011 10001 010 0010 000 1001 11010 101\n\ts   o   _   m   u     c    h     _   w    o   r    d     s\n\n\t010 0010 000 0010 010 111 11011 0110 01111 010 0011 000 111\n\t_   w    o   w    _   m   a     n    y     _   c    o   m\n\n\t11000 1001 01110 101 101 10000 000 0110 0\n\tp     r    e     s   s   i     o   n\n\nThe extra 0-bit at the end is there to make a full number of bytes. We were able to compress the original 34 bytes into merely 16 bytes, a space savings of over 50%!\n\nTo be able to decode these bits, we need to have the original frequency table. That table needs to be transmitted or saved along with the compressed data. Otherwise, the decoder does not know how to interpret the bits. Because of the overhead of this frequency table (about 1 kilobyte), it is not beneficial to use Huffman encoding on small inputs.\n\n## How it works\n\nWhen compressing a stream of bytes, the algorithm first creates a frequency table that counts how often each byte occurs. Based on this table, the algorithm creates a binary tree that describes the bit strings for each of the input bytes.\n\nFor our example, the tree looks like this:\n\n![The compression tree](Images/Tree.png)\n\nNote that the tree has 16 leaf nodes (the grey ones), one for each byte value from the input. Each leaf node also shows the count of how often it occurs. The other nodes are \"intermediate\" nodes. The number shown in these nodes is the sum of the counts of their child nodes. The count of the root node is therefore the total number of bytes in the input.\n\nThe edges between the nodes are either \"1\" or \"0\". These correspond to the bit-encodings of the leaf nodes. Notice how each left branch is always 1 and each right branch is always 0.\n\nCompression is then a matter of looping through the input bytes and for each byte traversing the tree from the root node to that byte's leaf node. Every time we take a left branch, we emit a 1-bit. When we take a right branch, we emit a 0-bit.\n\nFor example, to go from the root node to `c`, we go right (`0`), right again (`0`), left (`1`), and left again (`1`). This gives the Huffman code as `0011` for `c`.\n\nDecompression works in exactly the opposite way. It reads the compressed bits one-by-one and traverses the tree until it reaches to a leaf node. The value of that leaf node is the uncompressed byte. For example, if the bits are `11010`, we start at the root and go left, left again, right, left, and a final right to end up at `d`.\n\n## The code\n\nBefore we get to the actual Huffman coding scheme, it is useful to have some helper code that can write individual bits to an `NSData` object. The smallest piece of data that `NSData` understands is the byte, but we are dealing in bits, so we need to translate between the two.\n\n```swift\npublic class BitWriter {\n  public var data = NSMutableData()\n  var outByte: UInt8 = 0\n  var outCount = 0\n\n  public func writeBit(bit: Bool) {\n    if outCount == 8 {\n      data.append(&outByte, length: 1)\n      outCount = 0\n    }\n    outByte = (outByte << 1) | (bit ? 1 : 0)\n    outCount += 1\n  }\n\n  public func flush() {\n    if outCount > 0 {\n      if outCount < 8 {\n        let diff = UInt8(8 - outCount)\n        outByte <<= diff\n      }\n      data.append(&outByte, length: 1)\n    }\n  }\n}\n```\n\nTo add a bit to the `NSData`, you can call `writeBit()`. This helper object stuffs each new bit into the `outByte` variable. Once you have written 8 bits, `outByte` gets added to the `NSData` object for real.\n\nThe `flush()` method is used for outputting the very last byte. There is no guarantee that the number of compressed bits is a nice round multiple of 8, in which case there may be some spare bits at the end. If so, `flush()` adds a few 0-bits to make sure that we write a full byte.\n\nHere is a similar helper object for reading individual bits from `NSData`:\n\n```swift\npublic class BitReader {\n  var ptr: UnsafePointer<UInt8>\n  var inByte: UInt8 = 0\n  var inCount = 8\n\n  public init(data: NSData) {\n    ptr = data.bytes.assumingMemoryBound(to: UInt8.self)\n  }\n\n  public func readBit() -> Bool {\n    if inCount == 8 {\n      inByte = ptr.pointee    // load the next byte\n      inCount = 0\n      ptr = ptr.successor()\n    }\n    let bit = inByte & 0x80  // read the next bit\n    inByte <<= 1\n    inCount += 1\n    return bit == 0 ? false : true\n  }\n}\n```\n\nBy using this helper object, we can read one whole byte from the `NSData` object and put it in `inByte`. Then, `readBit()` returns the individual bits from that byte. Once `readBit()` has been called 8 times, we read the next byte from the `NSData`.\n\n> **Note:** If you are unfamiliar with this type of bit manipulation, just know that these two helper objects make it simple for us to write and read bits.\n\n## The frequency table\n\nThe first step in the Huffman compression is to read the entire input stream and build a frequency table. This table contains a list of all 256 possible byte values and shows how often each of these bytes occurs in the input data.\n\nWe could store this frequency information in a dictionary or an array, but since we need to build a tree, we might store the frequency table as the leaves of the tree.\n\nHere are the definitions we need:\n\n```swift\nclass Huffman {\n  typealias NodeIndex = Int\n\n  struct Node {\n    var count = 0\n    var index: NodeIndex = -1\n    var parent: NodeIndex = -1\n    var left: NodeIndex = -1\n    var right: NodeIndex = -1\n  }\n\n  var tree = [Node](repeating: Node(), count: 256)\n\n  var root: NodeIndex = -1\n}\n```\n\nThe tree structure is stored in the `tree` array and will be made up of `Node` objects. Since this is a [binary tree](../Binary%20Tree/), each node needs two children, `left` and `right`, and a reference back to its `parent` node. Unlike a typical binary tree, these nodes do not use pointers to refer to each other but use simple integer indices in the `tree` array. (We also store the array `index` of the node itself; the reason for this will become clear later.)\n\nNote that the `tree` currently has room for 256 entries. These are for the leaf nodes because there are 256 possible byte values. Of course, not all of those may end up being used, depending on the input data. Later, we will add more nodes as we build up the actual tree. For the moment, there is not a tree yet. It includes 256 separate leaf nodes with no connections between them. All the node counts are 0.\n\nWe use the following method to count how often each byte occurs in the input data:\n\n```swift\n  fileprivate func countByteFrequency(inData data: NSData) {\n    var ptr = data.bytes.assumingMemoryBound(to: UInt8.self)\n    for _ in 0..<data.length {\n      let i = Int(ptr.pointee)\n      tree[i].count += 1\n      tree[i].index = i\n      ptr = ptr.successor()\n    }\n  }\n```\n\nThis steps through the `NSData` object from beginning to end and for each byte increments the `count` of the corresponding leaf node. After `countByteFrequency()` completes, the first 256 `Node` objects in the `tree` array represent the frequency table.\n\nTo decompress a Huffman-encoded block of data, we need to have the original frequency table. If we were writing the compressed data to a file, then somewhere in the file we should include the frequency table.\n\nWe could dump the first 256 elements from the `tree` array, but that is not efficient. Not all of these 256 elements will be used, and we do not need to serialize the `parent`, `right`, and `left` pointers. All we need is the frequency information and not the entire tree.\n\nInstead, we will add a method to export the frequency table without all the pieces we do not need:\n\n```swift\n  struct Freq {\n    var byte: UInt8 = 0\n    var count = 0\n  }\n\n  func frequencyTable() -> [Freq] {\n    var a = [Freq]()\n    for i in 0..<256 where tree[i].count > 0 {\n      a.append(Freq(byte: UInt8(i), count: tree[i].count))\n    }\n    return a\n  }\n```\n\nThe `frequencyTable()` method looks at those first 256 nodes from the tree but keeps only those that are used, without the `parent`, `left`, and `right` pointers. It returns an array of `Freq` objects. You have to serialize this array along with the compressed data, so that it can be properly decompressed later.\n\n## The tree\n\nAs a reminder, there is the compression tree for the example:\n\n![The compression tree](Images/Tree.png)\n\nThe leaf nodes represent the actual bytes that are present in the input data. The intermediary nodes connect the leaves in such a way that the path from the root to a frequently-used byte value is shorter than the path to a less common byte value. As you can see, `m`, `s`, space, and `o` are the most common letters in our input data and the highest up in the tree.\n\nTo build the tree, we do the following:\n\n1. Find the two nodes with the smallest counts that do not have a parent node yet.\n2. Create a new parent node that links these two nodes together.\n3. This repeats over and over until only one node with no parent remains. This becomes the root node of the tree.\n\nThis is an ideal place to use a [priority queue](../Priority%20Queue/). A priority queue is a data structure that is optimized, so that finding the minimum value is always fast. Here, we repeatedly need to find the node with the smallest count.\n\nThe function `buildTree()` then becomes:\n\n```swift\n  fileprivate func buildTree() {\n    var queue = PriorityQueue<Node>(sort: { $0.count < $1.count })\n    for node in tree where node.count > 0 {\n      queue.enqueue(node)                            // 1\n    }\n\n    while queue.count > 1 {\n      let node1 = queue.dequeue()!                   // 2\n      let node2 = queue.dequeue()!\n\n      var parentNode = Node()                        // 3\n      parentNode.count = node1.count + node2.count\n      parentNode.left = node1.index\n      parentNode.right = node2.index\n      parentNode.index = tree.count\n      tree.append(parentNode)\n\n      tree[node1.index].parent = parentNode.index    // 4\n      tree[node2.index].parent = parentNode.index\n\n      queue.enqueue(parentNode)                      // 5\n    }\n\n    let rootNode = queue.dequeue()!                  // 6\n    root = rootNode.index\n  }\n```\n\nHere is how it works step-by-step:\n\n1. Create a priority queue and enqueue all the leaf nodes that have at least a count of 1. (If the count is 0, then this byte value did not appear in the input data.) The `PriorityQueue` object sorts the nodes by their count, so that the node with the lowest count is always the first one that gets dequeued.\n\n2. While there are at least two nodes left in the queue, remove the two nodes that are at the front of the queue. Since this is a min-priority queue, this gives us the two nodes with the smallest counts that do not have a parent node yet.\n\n3. Create a new intermediate node that connects `node1` and `node2`. The count of this new node is the sum of the counts of `node1` and `node2`. Because the nodes are connected using array indices instead of real pointers, we use `node1.index` and `node2.index` to find these nodes in the `tree` array. (This is why a `Node` needs to know its own index.)\n\n4. Link the two nodes into their new parent node. Now this new intermediate node has become part of the tree.\n\n5. Put the new intermediate node back into the queue. At this point we are done with `node1` and `node2`, but the `parentNode` still needs to be connected to other nodes in the tree.\n\n6. Repeat steps 2-5 until there is only one node left in the queue. This becomes the root node of the tree, and we are done.\n\nThe animation shows what the process looks like:\n\n![Building the tree](Images/BuildTree.gif)\n\n> **Note:** Instead of using a priority queue, you can repeatedly iterate through the `tree` array to find the next two smallest nodes, but that makes the compressor slow as **O(n^2)**. Using the priority queue, the running time is only **O(n log n)** where **n** is the number of nodes.\n\n> **Fun fact:** Due to the nature of binary trees, if we have *x* leaf nodes we can at most add *x - 1* additional nodes to the tree. Given that at most there will be 256 leaf nodes, the tree will never contain more than 511 nodes total.\n\n## Compression\n\nNow that we know how to build the compression tree from the frequency table, we can use it to compress the contents of an `NSData` object. Here is the code:\n\n```swift\n  public func compressData(data: NSData) -> NSData {\n    countByteFrequency(inData: data)\n    buildTree()\n\n    let writer = BitWriter()\n    var ptr = data.bytes.assumingMemoryBound(to: UInt8.self)\n    for _ in 0..<data.length {\n      let c = ptr.pointee\n      let i = Int(c)\n      traverseTree(writer: writer, nodeIndex: i, childIndex: -1)\n      ptr = ptr.successor()\n    }\n    writer.flush()\n    return writer.data\n  }\n```\n\nThis first calls `countByteFrequency()` to build the frequency table and then calls `buildTree()` to put together the compression tree. It also creates a `BitWriter` object for writing individual bits.\n\nThen, it loops through the entire input and calls `traverseTree()`for each byte. This method will step through the tree nodes and for each node write a 1 or 0 bit. Finally, we return the `BitWriter`'s data object.\n\n> **Note:** Compression always requires two passes through the entire input data: first to build the frequency table, and second to convert the bytes to their compressed bit sequences.\n\nThe interesting stuff happens in `traverseTree()`. This is a recursive method:\n\n```swift\n  private func traverseTree(writer: BitWriter, nodeIndex h: Int, childIndex child: Int) {\n    if tree[h].parent != -1 {\n      traverseTree(writer: writer, nodeIndex: tree[h].parent, childIndex: h)\n    }\n    if child != -1 {\n      if child == tree[h].left {\n        writer.writeBit(bit: true)\n      } else if child == tree[h].right {\n        writer.writeBit(bit: false)\n      }\n    }\n  }\n```\n\nWhen we call this method from `compressData()`, the `nodeIndex` parameter is the array index of the leaf node for the byte that we need to encode. This method recursively walks the tree from a leaf node up to the root and then back again.\n\nAs we are going back from the root to the leaf node, we write a 1 bit or a 0 bit for every node we encounter. If a child is the left node, we emit a 1; if it is the right node, we emit a 0.\n\nIn a picture:\n\n![How compression works](Images/Compression.png)\n\nEven though the illustration of the tree shows a 0 or 1 for each edge between the nodes, the bit values 0 and 1 are not actually stored in the tree! The rule is that we write a 1 bit if we take the left branch and a 0 bit if we take the right branch, so just knowing the direction we are going in is enough to determine what bit value to write.\n\nYou use the `compressData()` method as follows:\n\n```swift\nlet s1 = \"so much words wow many compression\"\nif let originalData = s1.dataUsingEncoding(NSUTF8StringEncoding) {\n  let huffman1 = Huffman()\n  let compressedData = huffman1.compressData(originalData)\n  print(compressedData.length)\n}\n```\n\n## Decompression\n\nDecompression is the compression in reverse. However, the compressed bits are useless without the frequency table. As mentioned, the `frequencyTable()` method returns an array of `Freq` objects. If we were saving the compressed data into a file or sending it across the network, we'd also save that `[Freq]` array along with it.\n\nWe first need some way to turn the `[Freq]` array back into a compression tree:\n\n```swift\n  fileprivate func restoreTree(fromTable frequencyTable: [Freq]) {\n    for freq in frequencyTable {\n      let i = Int(freq.byte)\n      tree[i].count = freq.count\n      tree[i].index = i\n    }\n    buildTree()\n  }\n```\n\nWe convert the `Freq` objects into leaf nodes and then call `buildTree()` to do the rest.\n\nHere is the code for `decompressData()`, which takes an `NSData` object with Huffman-encoded bits and a frequency table, and it returns the original data:\n\n```swift\n  func decompressData(data: NSData, frequencyTable: [Freq]) -> NSData {\n    restoreTree(fromTable: frequencyTable)\n\n    let reader = BitReader(data: data)\n    let outData = NSMutableData()\n    let byteCount = tree[root].count\n\n    var i = 0\n    while i < byteCount {\n      var b = findLeafNode(reader: reader, nodeIndex: root)\n      outData.append(&b, length: 1)\n      i += 1\n    }\n    return outData\n  }\n```\n\nThis also uses a helper method to traverse the tree:\n\n```swift\n  private func findLeafNode(reader reader: BitReader, nodeIndex: Int) -> UInt8 {\n    var h = nodeIndex\n    while tree[h].right != -1 {\n      if reader.readBit() {\n        h = tree[h].left\n      } else {\n        h = tree[h].right\n      }\n    }\n    return UInt8(h)\n  }\n```\n\n`findLeafNode()` walks the tree from the root down to the leaf node given by `nodeIndex`. At each intermediate node, we read a new bit and then step to the left (bit is 1) or the right (bit is 0). When we get to the leaf node, we simply return its index, which is equal to the original byte value.\n\nIn a picture:\n\n![How decompression works](Images/Decompression.png)\n\nHere is how we use the decompression method:\n\n```swift\n  let frequencyTable = huffman1.frequencyTable()\n\n  let huffman2 = Huffman()\n  let decompressedData = huffman2.decompressData(compressedData, frequencyTable: frequencyTable)\n\n  let s2 = String(data: decompressedData, encoding: NSUTF8StringEncoding)!\n```\n\nFirst we get the frequency table from somewhere (in this case the `Huffman` object we used to encode the data) and then call `decompressData()`. The string that results should be equal to the one we compressed in the first place.\n\nwe can see how this works in more detail in the Playground.\n\n## See also\n\n[Huffman coding at Wikipedia](https://en.wikipedia.org/wiki/Huffman_coding)\n\nThe code is loosely based on Al Stevens' C Programming column from Dr.Dobb's Magazine, February 1991 and October 1992.\n\n*Written for Swift Algorithm Club by Matthijs Hollemans*\n"
  },
  {
    "path": "Insertion Sort/InsertionSort.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\n/// Performs the Insertion sort algorithm to a given array\n///\n/// - Parameters:\n///   - array: the array of elements to be sorted\n///   - isOrderedBefore: returns true if the elements provided are in the corect order\n/// - Returns: a sorted array containing the same elements\nfunc insertionSort<T>(_ array: [T], _ isOrderedBefore: (T, T) -> Bool) -> [T] {\n    guard array.count > 1 else { return array }\n    \n    var sortedArray = array\n    for index in 1..<sortedArray.count {\n        var currentIndex = index\n        let temp = sortedArray[currentIndex]\n        while currentIndex > 0 && isOrderedBefore(temp, sortedArray[currentIndex - 1]) {\n            sortedArray[currentIndex] = sortedArray[currentIndex - 1]\n            currentIndex -= 1\n        }\n        sortedArray[currentIndex] = temp\n    }\n    return sortedArray\n}\n\n/// Performs the Insertion sort algorithm to a given array\n///\n/// - Parameter array: the array to be sorted, conatining elements that conform to the Comparable protocol\n/// - Returns: a sorted array containing the same elements\nfunc insertionSort<T: Comparable>(_ array: [T]) -> [T] {\n    var sortedArray = array\n    for index in 1..<sortedArray.count {\n        var currentIndex = index\n        let temp = sortedArray[currentIndex]\n        while currentIndex > 0 && temp < sortedArray[currentIndex - 1] {\n            sortedArray[currentIndex] = sortedArray[currentIndex - 1]\n            currentIndex -= 1\n        }\n        sortedArray[currentIndex] = temp\n    }\n    return sortedArray\n}\n\nlet list = [ 10, -1, 3, 9, 2, 27, 8, 5, 1, 3, 0, 26 ]\nprint(insertionSort(list))\nprint(insertionSort(list, <))\nprint(insertionSort(list, >))\n"
  },
  {
    "path": "Insertion Sort/InsertionSort.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Insertion Sort/InsertionSort.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Insertion Sort/InsertionSort.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Insertion Sort/InsertionSort.swift",
    "content": "/// Performs the Insertion sort algorithm to a given array\n///\n/// - Parameters:\n///   - array: the array of elements to be sorted\n///   - isOrderedBefore: returns true if the elements provided are in the corect order\n/// - Returns: a sorted array containing the same elements\nfunc insertionSort<T>(_ array: [T], _ isOrderedBefore: (T, T) -> Bool) -> [T] {\n    guard array.count > 1 else { return array }\n    ///   - sortedArray: copy the array to save stability\n    var sortedArray = array\n    for index in 1..<sortedArray.count {\n        var currentIndex = index\n        let temp = sortedArray[currentIndex]\n        while currentIndex > 0, isOrderedBefore(temp, sortedArray[currentIndex - 1]) {\n            sortedArray[currentIndex] = sortedArray[currentIndex - 1]\n            currentIndex -= 1\n        }\n        sortedArray[currentIndex] = temp\n    }\n    return sortedArray\n}\n\n/// Performs the Insertion sort algorithm to a given array\n///\n/// - Parameter array: the array to be sorted, containing elements that conform to the Comparable protocol\n/// - Returns: a sorted array containing the same elements\nfunc insertionSort<T: Comparable>(_ array: [T]) -> [T] {\n    guard array.count > 1 else { return array }\n\n    var sortedArray = array\n    for var index in 1..<sortedArray.count {\n        let temp = sortedArray[index]\n        while index > 0, temp < sortedArray[index - 1] {\n            sortedArray[index] = sortedArray[index - 1]\n            index -= 1\n        }\n        sortedArray[index] = temp\n    }\n    return sortedArray\n}\n"
  },
  {
    "path": "Insertion Sort/README.markdown",
    "content": "# Insertion Sort\n\nGoal: Sort an array from low to high (or high to low).\n\nYou are given an array of numbers and need to put them in the right order. The insertion sort algorithm works as follows:\n\n- Put the numbers on a pile. This pile is unsorted.\n- Pick a number from the pile. It doesn't really matter which one you pick, but it's easiest to pick from the top of the pile. \n- Insert this number into a new array. \n- Pick the next number from the unsorted pile and also insert that into the new array. It either goes before or after the first number you picked, so that now these two numbers are sorted.\n- Again, pick the next number from the pile and insert it into the array in the proper sorted position.\n- Keep doing this until there are no more numbers on the pile. You end up with an empty pile and an array that is sorted.\n\nThat's why this is called an \"insertion\" sort, because you take a number from the pile and insert it in the array in its proper sorted position. \n\n## An example\n\nLet's say the numbers to sort are `[ 8, 3, 5, 4, 6 ]`. This is our unsorted pile.\n\nPick the first number, `8`, and insert it into the new array. There is nothing in that array yet, so that's easy. The sorted array is now `[ 8 ]` and the pile is `[ 3, 5, 4, 6 ]`.\n\nPick the next number from the pile, `3`, and insert it into the sorted array. It should go before the `8`, so the sorted array is now `[ 3, 8 ]` and the pile is reduced to `[ 5, 4, 6 ]`.\n\nPick the next number from the pile, `5`, and insert it into the sorted array. It goes in between the `3` and `8`. The sorted array is `[ 3, 5, 8 ]` and the pile is `[ 4, 6 ]`.\n\nRepeat this process until the pile is empty.\n\n## In-place sort\n\nThe above explanation makes it seem like you need two arrays: one for the unsorted pile and one that contains the numbers in sorted order.\n\nBut you can perform the insertion sort *in-place*, without having to create a separate array. You just keep track of which part of the array is sorted already and which part is the unsorted pile.\n\nInitially, the array is `[ 8, 3, 5, 4, 6 ]`. The `|` bar shows where the sorted portion ends and the pile begins:\n\n\t[| 8, 3, 5, 4, 6 ]\n\nThis shows that the sorted portion is empty and the pile starts at `8`.\n\nAfter processing the first number, we have:\n\n\t[ 8 | 3, 5, 4, 6 ]\n\nThe sorted portion is `[ 8 ]` and the pile is `[ 3, 5, 4, 6 ]`. The `|` bar has shifted one position to the right.\n\nThis is how the content of the array changes during the sort:\n\n\t[| 8, 3, 5, 4, 6 ]\n\t[ 8 | 3, 5, 4, 6 ]\n\t[ 3, 8 | 5, 4, 6 ]\n\t[ 3, 5, 8 | 4, 6 ]\n\t[ 3, 4, 5, 8 | 6 ]\n\t[ 3, 4, 5, 6, 8 |]\n\nIn each step, the `|` bar moves up one position. As you can see, the beginning of the array up to the `|` is always sorted. The pile shrinks by one and the sorted portion grows by one, until the pile is empty and there are no more unsorted numbers left.\n\n## How to insert\n\nAt each step you pick the top-most number from the unsorted pile and insert it into the sorted portion of the array. You must put that number in the proper place so that the beginning of the array remains sorted. How does that work?\n\nLet's say we've already done the first few elements and the array looks like this:\n\n\t[ 3, 5, 8 | 4, 6 ]\n\nThe next number to sort is `4`. We need to insert that into the sorted portion `[ 3, 5, 8 ]` somewhere. \n\nHere's one way to do this: Look at the previous element, `8`. \n\n\t[ 3, 5, 8, 4 | 6 ]\n\t        ^\n\t        \nIs this greater than `4`? Yes it is, so the `4` should come before the `8`. We swap these two numbers to get:\n\n\t[ 3, 5, 4, 8 | 6 ]\n\t        <-->\n\t       swapped\n\nWe're not done yet. The new previous element, `5`, is also greater than `4`. We also swap these two numbers:\n\n\t[ 3, 4, 5, 8 | 6 ]\n\t     <-->\n\t    swapped\n\nAgain, look at the previous element. Is `3` greater than `4`? No, it is not. That means we're done with number `4`. The beginning of the array is sorted again.\n\nThis was a description of the inner loop of the insertion sort algorithm, which you'll see in the next section. It inserts the number from the top of the pile into the sorted portion by swapping numbers.\n\n## The code\n\nHere is an implementation of insertion sort in Swift:\n\n```swift\nfunc insertionSort(_ array: [Int]) -> [Int] {\n    var sortedArray = array\t\t\t // 1\n    for index in 1..<sortedArray.count {\t\t // 2\n        var currentIndex = index\n        while currentIndex > 0 && sortedArray[currentIndex] < sortedArray[currentIndex - 1] { // 3\n            sortedArray.swapAt(currentIndex - 1, currentIndex)\n            currentIndex -= 1\n        }\n    }\n    return sortedArray\n}\n\n\n```\n\nPut this code in a playground and test it like so:\n\n```swift\nlet list = [ 10, -1, 3, 9, 2, 27, 8, 5, 1, 3, 0, 26 ]\ninsertionSort(list)\n```\n\nHere is how the code works.\n\n1. Make a copy of the array. This is necessary because we cannot modify the contents of the `array` parameter directly. Like Swift's own `sorted()`, the `insertionSort()` function will return a sorted *copy* of the original array.\n\n2. There are two loops inside this function. The outer loop looks at each of the elements in the array in turn; this is what picks the top-most number from the pile. The variable `currentIndex` is the index of where the sorted portion ends and the pile begins (the position of the `|` bar). Remember, at any given moment the beginning of the array -- from index 0 up to `currentIndex` -- is always sorted. The rest, from index `currentIndex` until the last element, is the unsorted pile.\n\n3. The inner loop looks at the element at position `currentIndex`. This is the number at the top of the pile, and it may be smaller than any of the previous elements. The inner loop steps backwards through the sorted array; every time it finds a previous number that is larger, it swaps them. When the inner loop completes, the beginning of the array is sorted again, and the sorted portion has grown by one element.\n\n> **Note:** The outer loop starts at index 1, not 0. Moving the very first element from the pile to the sorted portion doesn't actually change anything, so we might as well skip it. \n\n## No more swaps\n\nThe above version of insertion sort works fine, but it can be made a tiny bit faster by removing the call to `swap()`. \n\nYou've seen that we swap numbers to move the next element into its sorted position:\n\n\t[ 3, 5, 8, 4 | 6 ]\n\t        <-->\n            swap\n\t        \n\t[ 3, 5, 4, 8 | 6 ]\n         <-->\n\t     swap\n\nInstead of swapping with each of the previous elements, we can just shift all those elements one position to the right, and then copy the new number into the right position.\n\n\t[ 3, 5, 8, 4 | 6 ]   remember 4\n\t           *\n\t\n\t[ 3, 5, 8, 8 | 6 ]   shift 8 to the right\n\t        --->\n\t        \n\t[ 3, 5, 5, 8 | 6 ]   shift 5 to the right\n\t     --->\n\t     \n\t[ 3, 4, 5, 8 | 6 ]   copy 4 into place\n\t     *\n\nIn code that looks like this:\n\n```swift\nfunc insertionSort(_ array: [Int]) -> [Int] {\n  var sortedArray = array\n  for index in 1..<sortedArray.count {\n    var currentIndex = index\n    let temp = sortedArray[currentIndex]\n    while currentIndex > 0 && temp < sortedArray[currentIndex - 1] {\n      sortedArray[currentIndex] = sortedArray[currentIndex - 1]                // 1\n      currentIndex -= 1\n    }\n    sortedArray[currentIndex] = temp                      // 2\n  }\n  return sortedArray\n}\n```\n\nThe line at `//1` is what shifts up the previous elements by one position. At the end of the inner loop, `y` is the destination index for the new number in the sorted portion, and the line at `//2` copies this number into place.\n\n## Making it generic\n\nIt would be nice to sort other things than just numbers. We can make the datatype of the array generic and use a user-supplied function (or closure) to perform the less-than comparison. This only requires two changes to the code.\n\nThe function signature becomes:\n\n```swift\nfunc insertionSort<T>(_ array: [T], _ isOrderedBefore: (T, T) -> Bool) -> [T] {\n```\n\nThe array has type `[T]` where `T` is the placeholder type for the generics. Now `insertionSort()` will accept any kind of array, whether it contains numbers, strings, or something else.\n\nThe new parameter `isOrderedBefore: (T, T) -> Bool` is a function that takes two `T` objects and returns true if the first object comes before the second, and false if the second object should come before the first. This is exactly what Swift's built-in `sort()` function does.\n\nThe only other change is in the inner loop, which now becomes:\n\n```swift\n      while y > 0 && isOrderedBefore(temp, a[y - 1]) {\n```\n\nInstead of writing `temp < a[y - 1]`, we call the `isOrderedBefore()` function. It does the exact same thing, except we can now compare any kind of object, not just numbers.\n\nTo test this in a playground, do:\n\n```swift\nlet numbers = [ 10, -1, 3, 9, 2, 27, 8, 5, 1, 3, 0, 26 ]\ninsertionSort(numbers, <)\ninsertionSort(numbers, >)\n```\n\nThe `<` and `>` determine the sort order, low-to-high and high-to-low, respectively.\n\nOf course, you can also sort other things such as strings,\n\n```swift\nlet strings = [ \"b\", \"a\", \"d\", \"c\", \"e\" ]\ninsertionSort(strings, <)\n```\n\nor even more complex objects:\n\n```swift\nlet objects = [ obj1, obj2, obj3, ... ]\ninsertionSort(objects) { $0.priority < $1.priority }\n```\n\nThe closure tells `insertionSort()` to sort on the `priority` property of the objects.\n\nInsertion sort is a *stable* sort. A sort is stable when elements that have identical sort keys remain in the same relative order after sorting. This is not important for simple values such as numbers or strings, but it is important when sorting more complex objects. In the example above, if two objects have the same `priority`, regardless of the values of their other properties, those two objects don't get swapped around.\n\n## Performance\n\nInsertion sort is really fast if the array is already sorted. That sounds obvious, but this is not true for all search algorithms. In practice, a lot of data will already be largely -- if not entirely -- sorted and insertion sort works quite well in that case.\n\nThe worst-case and average case performance of insertion sort is **O(n^2)**. That's because there are two nested loops in this function. Other sort algorithms, such as quicksort and merge sort, have **O(n log n)** performance, which is faster on large inputs.\n\nInsertion sort is actually very fast for sorting small arrays. Some standard libraries have sort functions that switch from a quicksort to insertion sort when the partition size is 10 or less.\n\nI did a quick test comparing our `insertionSort()` with Swift's built-in `sort()`. On arrays of about 100 items or so, the difference in speed is tiny. However, as your input becomes larger, **O(n^2)** quickly starts to perform a lot worse than **O(n log n)** and insertion sort just can't keep up.\n\n## See also\n\n[Insertion sort on Wikipedia](https://en.wikipedia.org/wiki/Insertion_sort)\n\n*Written for Swift Algorithm Club by Matthijs Hollemans*\n"
  },
  {
    "path": "Insertion Sort/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Insertion Sort/Tests/InsertionSortTests.swift",
    "content": "import XCTest\n\nclass InsertionSortTests: XCTestCase {\n  func testInsertionSort() {\n    checkSortAlgorithm(insertionSort)\n  }\n}\n"
  },
  {
    "path": "Insertion Sort/Tests/Tests.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t7B80C3EA1C77A4D0003CECC7 /* SortingTestHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C3E81C77A4D0003CECC7 /* SortingTestHelpers.swift */; };\n\t\t7B80C3EC1C77A536003CECC7 /* InsertionSortTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C3EB1C77A536003CECC7 /* InsertionSortTests.swift */; };\n\t\t7B80C3EE1C77A53E003CECC7 /* InsertionSort.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C3ED1C77A53E003CECC7 /* InsertionSort.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t7B2BBC801C779D720067B71D /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7B2BBC941C779E7B0067B71D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };\n\t\t7B80C3E81C77A4D0003CECC7 /* SortingTestHelpers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SortingTestHelpers.swift; path = ../../Quicksort/Tests/SortingTestHelpers.swift; sourceTree = SOURCE_ROOT; };\n\t\t7B80C3EB1C77A536003CECC7 /* InsertionSortTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InsertionSortTests.swift; sourceTree = SOURCE_ROOT; };\n\t\t7B80C3ED1C77A53E003CECC7 /* InsertionSort.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = InsertionSort.swift; path = ../InsertionSort.swift; sourceTree = SOURCE_ROOT; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t7B2BBC7D1C779D720067B71D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t7B2BBC681C779D710067B71D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC831C779D720067B71D /* Tests */,\n\t\t\t\t7B2BBC721C779D710067B71D /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC721C779D710067B71D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC801C779D720067B71D /* Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC831C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B80C3ED1C77A53E003CECC7 /* InsertionSort.swift */,\n\t\t\t\t7B80C3EB1C77A536003CECC7 /* InsertionSortTests.swift */,\n\t\t\t\t7B80C3E81C77A4D0003CECC7 /* SortingTestHelpers.swift */,\n\t\t\t\t7B2BBC941C779E7B0067B71D /* Info.plist */,\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tpath = TestsTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t7B2BBC7F1C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t7B2BBC7C1C779D720067B71D /* Sources */,\n\t\t\t\t7B2BBC7D1C779D720067B71D /* Frameworks */,\n\t\t\t\t7B2BBC7E1C779D720067B71D /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tproductName = TestsTests;\n\t\t\tproductReference = 7B2BBC801C779D720067B71D /* Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t7B2BBC691C779D710067B71D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0720;\n\t\t\t\tLastUpgradeCheck = 1000;\n\t\t\t\tORGANIZATIONNAME = \"Swift Algorithm Club\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t7B2BBC7F1C779D720067B71D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2;\n\t\t\t\t\t\tLastSwiftMigration = 1000;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 7B2BBC681C779D710067B71D;\n\t\t\tproductRefGroup = 7B2BBC721C779D710067B71D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t7B2BBC7F1C779D720067B71D /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t7B2BBC7E1C779D720067B71D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t7B2BBC7C1C779D720067B71D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7B80C3EA1C77A4D0003CECC7 /* SortingTestHelpers.swift in Sources */,\n\t\t\t\t7B80C3EE1C77A53E003CECC7 /* InsertionSort.swift in Sources */,\n\t\t\t\t7B80C3EC1C77A536003CECC7 /* InsertionSortTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t7B2BBC871C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC881C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t7B2BBC8D1C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = On;\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC8E1C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = On;\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC871C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC881C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC8D1C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC8E1C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 7B2BBC691C779D710067B71D /* Project object */;\n}\n"
  },
  {
    "path": "Insertion Sort/Tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Tests.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Insertion Sort/Tests/Tests.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Insertion Sort/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1000\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Introsort/HeapSort.swift",
    "content": "import Foundation\n\nprivate func shiftDown<T>(_ elements: inout [T], _ index: Int, _ range: Range<Int>, by areInIncreasingOrder: (T, T) -> Bool) {\n    let countToIndex = elements.distance(from: range.lowerBound, to: index)\n    let countFromIndex = elements.distance(from: index, to: range.upperBound)\n    \n    guard countToIndex + 1 < countFromIndex else { return }\n    \n    let left = elements.index(index, offsetBy: countToIndex + 1)\n    var largest = index\n    if areInIncreasingOrder(elements[largest], elements[left]) {\n        largest = left\n    }\n    \n    if countToIndex + 2 < countFromIndex {\n        let right = elements.index(after: left)\n        if areInIncreasingOrder(elements[largest], elements[right]) {\n            largest = right\n        }\n    }\n\n    if largest != index {\n        elements.swapAt(index, largest)\n        shiftDown(&elements, largest, range, by: areInIncreasingOrder)\n    }\n    \n}\n\nprivate func heapify<T>(_ list: inout [T], _ range: Range<Int>, by areInIncreasingOrder: (T, T) -> Bool) {\n    let root = range.lowerBound\n    var node = list.index(root, offsetBy: list.distance(from: range.lowerBound, to: range.upperBound)/2)\n    \n    while node != root {\n        list.formIndex(before: &node)\n        shiftDown(&list, node, range, by: areInIncreasingOrder)\n    }\n}\n\npublic func heapsort<T>(for array: inout [T], range: Range<Int>, by areInIncreasingOrder: (T, T) -> Bool) {\n    var hi = range.upperBound\n    let lo = range.lowerBound\n    heapify(&array, range, by: areInIncreasingOrder)\n    array.formIndex(before: &hi)\n    \n    while hi != lo {\n        array.swapAt(lo, hi)\n        shiftDown(&array, lo, lo..<hi, by: areInIncreasingOrder)\n        array.formIndex(before: &hi)\n    }\n}\n"
  },
  {
    "path": "Introsort/InsertionSort.swift",
    "content": "import Foundation\n\npublic func insertionSort<T>(for array: inout [T], range: Range<Int>, by areInIncreasingOrder: (T, T) -> Bool) {\n    guard !range.isEmpty else { return }\n    \n    let start = range.lowerBound\n    var sortedEnd = start\n    \n    array.formIndex(after: &sortedEnd)\n    while sortedEnd != range.upperBound {\n        let x = array[sortedEnd]\n        \n        var i = sortedEnd\n        repeat {\n            let predecessor = array[array.index(before: i)]\n            \n            guard areInIncreasingOrder(x, predecessor) else { break }\n            array[i] = predecessor\n            array.formIndex(before: &i)\n        } while i != start\n        \n        if i != sortedEnd {\n            array[i] = x\n        }\n        array.formIndex(after: &sortedEnd)\n    }\n    \n}\n"
  },
  {
    "path": "Introsort/IntroSort.swift",
    "content": "import Foundation\n\npublic func introsort<T>(_ array: inout [T],  by areInIncreasingOrder: (T, T) -> Bool) {\n    //The depth limit is as best practice 2 * log( n )\n    let depthLimit = 2 * floor(log2(Double(array.count)))\n    \n    introSortImplementation(for: &array, range: 0..<array.count, depthLimit: Int(depthLimit), by: areInIncreasingOrder)\n}\n\n///This method is recursively executed for each partition result of the quicksort part of the algorithm\nprivate func introSortImplementation<T>(for array: inout [T], range: Range<Int>, depthLimit: Int, by areInIncreasingOrder: (T, T) -> Bool) {\n    if array.distance(from: range.lowerBound, to: range.upperBound) < 20 {\n        //if the partition count is less than 20 we can sort it using insertion sort. This algorithm in fact performs well on collections\n        //of this size, plus, at this point is quite probable that the quisksort part of the algorithm produced a partition which is\n        //nearly sorted. As we knoe insertion sort tends to O( n ) if this is the case.\n        insertionSort(for: &array, range: range, by: areInIncreasingOrder)\n    } else if depthLimit == 0 {\n        //If we reached the depth limit for this recursion branch, it's possible that we are hitting quick sort's worst case.\n        //Since quicksort degrades to O( n^2 ) in its worst case we stop using quicksort for this recursion branch and we switch to heapsort.\n        //Our preference remains quicksort, and we hope to be rare to see this condition to be true\n        heapsort(for: &array, range: range, by: areInIncreasingOrder)\n    } else {\n        //By default we use quicksort to sort our collection. The partition index method chose a pivot, and puts all the\n        //elements less than pivot on the left, and the ones bigger than pivot on the right. At the end of the operation the\n        //position of the pivot in the array is returned so that we can form the two partitions.\n        let partIdx = partitionIndex(for: &array, subRange: range, by: areInIncreasingOrder)\n        \n        //We can recursively call introsort implementation, decreasing the depthLimit for the left partition and the right partition.\n        introSortImplementation(for: &array, range: range.lowerBound..<partIdx, depthLimit: depthLimit &- 1, by: areInIncreasingOrder)\n        introSortImplementation(for: &array, range: partIdx..<range.upperBound, depthLimit: depthLimit &- 1, by: areInIncreasingOrder)\n    }\n}\n"
  },
  {
    "path": "Introsort/Introsort.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\nimport Foundation\n\nfunc introsort<T>(_ array: inout [T],  by areInIncreasingOrder: (T, T) -> Bool) {\n    //The depth limit is as best practice 2 * log( n )\n    let depthLimit = 2 * floor(log2(Double(array.count)))\n    \n    introSortImplementation(for: &array, range: 0..<array.count, depthLimit: Int(depthLimit), by: areInIncreasingOrder)\n}\n\n///This method is recursively executed for each partition result of the quicksort part of the algorithm\nprivate func introSortImplementation<T>(for array: inout [T], range: Range<Int>, depthLimit: Int, by areInIncreasingOrder: (T, T) -> Bool) {\n    if array.distance(from: range.lowerBound, to: range.upperBound) < 20 {\n        //if the partition count is less than 20 we can sort it using insertion sort. This algorithm in fact performs well on collections\n        //of this size, plus, at this point is quite probable that the quisksort part of the algorithm produced a partition which is\n        //nearly sorted. As we knoe insertion sort tends to O( n ) if this is the case.\n        insertionSort(for: &array, range: range, by: areInIncreasingOrder)\n    } else if depthLimit == 0 {\n        //If we reached the depth limit for this recursion branch, it's possible that we are hitting quick sort's worst case.\n        //Since quicksort degrades to O( n^2 ) in its worst case we stop using quicksort for this recursion branch and we switch to heapsort.\n        //Our preference remains quicksort, and we hope to be rare to see this condition to be true\n        heapsort(for: &array, range: range, by: areInIncreasingOrder)\n    } else {\n        //By default we use quicksort to sort our collection. The partition index method chose a pivot, and puts all the\n        //elements less than pivot on the left, and the ones bigger than pivot on the right. At the end of the operation the\n        //position of the pivot in the array is returned so that we can form the two partitions.\n        let partIdx = partitionIndex(for: &array, subRange: range, by: areInIncreasingOrder)\n        \n        //We can recursively call introsort implementation, decreasing the depthLimit for the left partition and the right partition.\n        introSortImplementation(for: &array, range: range.lowerBound..<partIdx, depthLimit: depthLimit &- 1, by: areInIncreasingOrder)\n        introSortImplementation(for: &array, range: partIdx..<range.upperBound, depthLimit: depthLimit &- 1, by: areInIncreasingOrder)\n    }\n}\n\nvar unsorted = randomize(n: 1000)\n\nlet swiftSorted = unsorted.sorted()\nintrosort(&unsorted, by: <)\n\nprint(\"does it work? \\(unsorted == swiftSorted)\")\n"
  },
  {
    "path": "Introsort/Introsort.playground/Sources/HeapSort.swift",
    "content": "import Foundation\n\nprivate func shiftDown<T>(_ elements: inout [T], _ index: Int, _ range: Range<Int>, by areInIncreasingOrder: (T, T) -> Bool) {\n    let countToIndex = elements.distance(from: range.lowerBound, to: index)\n    let countFromIndex = elements.distance(from: index, to: range.upperBound)\n    \n    guard countToIndex + 1 < countFromIndex else { return }\n    \n    let left = elements.index(index, offsetBy: countToIndex + 1)\n    var largest = index\n    if areInIncreasingOrder(elements[largest], elements[left]) {\n        largest = left\n    }\n    \n    if countToIndex + 2 < countFromIndex {\n        let right = elements.index(after: left)\n        if areInIncreasingOrder(elements[largest], elements[right]) {\n            largest = right\n        }\n    }\n\n    if largest != index {\n        elements.swapAt(index, largest)\n        shiftDown(&elements, largest, range, by: areInIncreasingOrder)\n    }\n    \n}\n\nprivate func heapify<T>(_ list: inout [T], _ range: Range<Int>, by areInIncreasingOrder: (T, T) -> Bool) {\n    let root = range.lowerBound\n    var node = list.index(root, offsetBy: list.distance(from: range.lowerBound, to: range.upperBound)/2)\n    \n    while node != root {\n        list.formIndex(before: &node)\n        shiftDown(&list, node, range, by: areInIncreasingOrder)\n    }\n}\n\npublic func heapsort<T>(for array: inout [T], range: Range<Int>, by areInIncreasingOrder: (T, T) -> Bool) {\n    var hi = range.upperBound\n    let lo = range.lowerBound\n    heapify(&array, range, by: areInIncreasingOrder)\n    array.formIndex(before: &hi)\n    \n    while hi != lo {\n        array.swapAt(lo, hi)\n        shiftDown(&array, lo, lo..<hi, by: areInIncreasingOrder)\n        array.formIndex(before: &hi)\n    }\n}\n"
  },
  {
    "path": "Introsort/Introsort.playground/Sources/InsertionSort.swift",
    "content": "import Foundation\n\npublic func insertionSort<T>(for array: inout [T], range: Range<Int>, by areInIncreasingOrder: (T, T) -> Bool) {\n    guard !range.isEmpty else { return }\n    \n    let start = range.lowerBound\n    var sortedEnd = start\n    \n    array.formIndex(after: &sortedEnd)\n    while sortedEnd != range.upperBound {\n        let x = array[sortedEnd]\n        \n        var i = sortedEnd\n        repeat {\n            let predecessor = array[array.index(before: i)]\n            \n            guard areInIncreasingOrder(x, predecessor) else { break }\n            array[i] = predecessor\n            array.formIndex(before: &i)\n        } while i != start\n        \n        if i != sortedEnd {\n            array[i] = x\n        }\n        array.formIndex(after: &sortedEnd)\n    }\n    \n}\n"
  },
  {
    "path": "Introsort/Introsort.playground/Sources/Partition.swift",
    "content": "import Foundation\n\npublic func partitionIndex<T>(for elements: inout [T], subRange range: Range<Int>, by areInIncreasingOrder: (T, T) -> Bool) -> Int {\n    var lo = range.lowerBound\n    var hi = elements.index(before: range.upperBound)\n    \n    // Sort the first, middle, and last elements, then use the middle value\n    // as the pivot for the partition.\n    let half = elements.distance(from: lo, to: hi) / 2\n    let mid = elements.index(lo, offsetBy: half)\n    \n    sort3(in: &elements, a: lo, b: mid, c: hi, by: areInIncreasingOrder)\n    let pivot = elements[mid]\n    \n    while true {\n        elements.formIndex(after: &lo)\n        guard findLo(in: elements, pivot: pivot, from: &lo, to: hi, by: areInIncreasingOrder) else { break }\n        elements.formIndex(before: &hi)\n        guard findHi(in: elements, pivot: pivot, from: lo, to: &hi, by: areInIncreasingOrder) else { break }\n        elements.swapAt(lo, hi)\n    }\n\n    \n    return lo\n}\n\nprivate func findLo<T>(in array: [T], pivot: T, from lo: inout Int, to hi: Int, by areInIncreasingOrder: (T, T)->Bool) -> Bool {\n    while lo != hi {\n        if !areInIncreasingOrder(array[lo], pivot) {\n            return true\n        }\n        array.formIndex(after: &lo)\n    }\n    return false\n}\n\nprivate func findHi<T>(in array: [T], pivot: T, from lo: Int, to hi: inout Int, by areInIncreasingOrder: (T, T)->Bool) -> Bool {\n    while hi != lo {\n        if areInIncreasingOrder(array[hi], pivot) { return true }\n        array.formIndex(before: &hi)\n    }\n    return false\n}\n"
  },
  {
    "path": "Introsort/Introsort.playground/Sources/Randomize.swift",
    "content": "import Foundation\n\npublic func randomize(n: Int) -> [Int] {\n    var unsorted = [Int]()\n    for _ in 0..<n {\n        unsorted.append(Int(arc4random()))\n    }\n    return unsorted\n}\n"
  },
  {
    "path": "Introsort/Introsort.playground/Sources/Sort3.swift",
    "content": "import Foundation\n\npublic func sort3<T>(in array: inout [T], a: Int, b: Int, c: Int, by areInIncreasingOrder: (T, T) -> Bool) {\n    switch (areInIncreasingOrder(array[b], array[a]),\n            areInIncreasingOrder(array[c], array[b])) {\n    case (false, false): break\n    case (true, true): array.swapAt(a, c)\n    case (true, false):\n        array.swapAt(a, b)\n        \n        if areInIncreasingOrder(array[c], array[b]) {\n            array.swapAt(b, c)\n        }\n    case (false, true):\n        array.swapAt(b, c)\n        \n        if areInIncreasingOrder(array[b], array[a]) {\n            array.swapAt(a, b)\n        }\n    }\n}\n"
  },
  {
    "path": "Introsort/Introsort.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Introsort/Partition.swift",
    "content": "import Foundation\n\npublic func partitionIndex<T>(for elements: inout [T], subRange range: Range<Int>, by areInIncreasingOrder: (T, T) -> Bool) -> Int {\n    var lo = range.lowerBound\n    var hi = elements.index(before: range.upperBound)\n    \n    // Sort the first, middle, and last elements, then use the middle value\n    // as the pivot for the partition.\n    let half = elements.distance(from: lo, to: hi) / 2\n    let mid = elements.index(lo, offsetBy: half)\n    \n    sort3(in: &elements, a: lo, b: mid, c: hi, by: areInIncreasingOrder)\n    let pivot = elements[mid]\n    \n    while true {\n        elements.formIndex(after: &lo)\n        guard findLo(in: elements, pivot: pivot, from: &lo, to: hi, by: areInIncreasingOrder) else { break }\n        elements.formIndex(before: &hi)\n        guard findHi(in: elements, pivot: pivot, from: lo, to: &hi, by: areInIncreasingOrder) else { break }\n        elements.swapAt(lo, hi)\n    }\n\n    \n    return lo\n}\n\nprivate func findLo<T>(in array: [T], pivot: T, from lo: inout Int, to hi: Int, by areInIncreasingOrder: (T, T)->Bool) -> Bool {\n    while lo != hi {\n        if !areInIncreasingOrder(array[lo], pivot) {\n            return true\n        }\n        array.formIndex(after: &lo)\n    }\n    return false\n}\n\nprivate func findHi<T>(in array: [T], pivot: T, from lo: Int, to hi: inout Int, by areInIncreasingOrder: (T, T)->Bool) -> Bool {\n    while hi != lo {\n        if areInIncreasingOrder(array[hi], pivot) { return true }\n        array.formIndex(before: &hi)\n    }\n    return false\n}\n"
  },
  {
    "path": "Introsort/README.markdown",
    "content": "# IntroSort\n\nGoal: Sort an array from low to high (or high to low).\n\nIntroSort is the algorithm used by Swift to sort a collection. Introsort is an hybrid algorithm invented by David Musser in 1993 with the purpose of giving a generic sorting algorithm for the C++ standard library. \n\nThe classic implementation of introsort uses a recursive Quicksort with a fallback to Heapsort in the case where the recursion depth level reached a certain maximum value. The maximum depends on the number of elements in the collection and it is usually 2 * log(n). The reason behind this “fallback” is that if Quicksort was not able to get the solution after 2 * log(n) recursions for a branch, probably it hit its worst case and it is degrading to complexity O( n^2 ). To optimise even further this algorithm, the Swift implementation introduce an extra step in each recursion where the partition is sorted using InsertionSort if the count of the partition is less than 20.\n\nThe number 20 is an empiric number obtained observing the behaviour of InsertionSort with lists of this size.\n\nHere's an implementation in pseudocode:\n\n```\nprocedure sort(A : array):\n    let maxdepth = ⌊log(length(A))⌋ × 2\n    introSort(A, maxdepth)\n\nprocedure introsort(A, maxdepth):\n    n ← length(A)\n    if n < 20:\n        insertionsort(A)\n    else if maxdepth = 0:\n        heapsort(A)\n    else:\n        p ← partition(A)  // the pivot is selected using median of 3\n        introsort(A[0:p], maxdepth - 1)\n        introsort(A[p+1:n], maxdepth - 1)\n```\n\n## An example\n\nLet's walk through the example. The array is initially:\n\n\t[ 10, 0, 3, 9, 2, 14, 8, 27, 1, 5, 8, -1, 26 ]\n\n\nFor this example let's assume that `maxDepth` is **2** and that the size of the partition for the insertionSort to kick in is **5**\n\nThe first iteration of introsort begins by attempting to use insertionSort. The collection has 13 elements, so it tries to do heapsort instead. The condition for heapsort to occur is if `maxdepth == 0` evaluates true. Since `maxdepth` is currently **2** for the first iteration, introsort will default to quicksort.\n\nThe `partition`  method picks the first element, the median and the last, it sorts them and uses the new median as pivot.\n\n    [ 10, 8, 26 ] -> [ 8, 10, 26 ]\n    \nOur array is now\n\n    [ 8, 0, 3, 9, 2, 14, 10, 27, 1, 5, 8, -1, 26 ]\n\n**10** is the pivot. After the choice of the pivot, the `partition` method swaps elements to get all the elements less than pivot on the left, and all the elements more or equal than pivot on the right.\n\n    [ 8, 0, 3, 9, 2, 1, 5, 8, -1, 10, 27, 14, 26 ]\n    \nBecause of the swaps, the index of of pivot is now changed and returned. The next step of introsort is to call recursively itself for the two sub arrays:\n\n    less: [ 8, 0, 3, 9, 2, 1, 5, 8, -1, 10 ]\n    greater: [ 27, 14, 26 ]\n\n## maxDepth: 1, branch: less\n\n    [ 8, 0, 3, 9, 2, 1, 5, 8, -1, 10 ]\n\nThe count of the array is still more than 5 so we don't meet yet the conditions for insertion sort to kick in. At this iteration maxDepth is decreased by one but it is still more than zero, so heapsort will not act.\n\nJust like in the previous iteration quicksort wins and the `partition` method choses a pivot and sorts the elemets less than pivot on the left and the elements more or equeal than pivot on the right.\n\n    array: [ 8, 0, 3, 9, 2, 1, 5, 8, -1, 10 ]\n    pivot candidates: [ 8, 1, 10] -> [ 1, 8, 10]\n    pivot: 8\n    before partition: [ 1, 0, 3, 9, 2, 8, 5, 8, -1, 10 ]\n    after partition: [ 1, 0, 3, -1, 2, 5, 8, 8, 9, 10 ]\n    \n    less: [ 1, 0, 3, -1, 2, 5, 8 ]\n    greater: [ 8, 9, 10 ]\n    \n## maxDepth: 0, branch: less\n\n    [ 1, 0, 3, -1, 2, 5, 8 ]\n    \nJust like before, introsort is recursively executed for `less` and greater. This time `less`has a count more than **5** so it will not be sorted with insertion sort, but the maxDepth decreased again by 1 is now 0 and heapsort takes over sorting the array.\n\n    heapsort -> [ -1, 0, 1, 2, 3, 5, 8 ]\n    \n## maxDepth: 0, branch: greater\n\n    [ 8, 9, 10 ]\n\nfollowing greater in this recursion, the count of elements is 3, which is less than 5, so this partition is sorted using insertionSort.\n\n    insertionSort -> [ 8, 9 , 10]\n    \n\n## back to maxDepth = 1, branch: greater\n\n    [ 27, 14, 26 ]\n\nAt this point the original array has mutated to be\n\n    [ -1, 0, 1, 2, 3, 5, 8, 8, 9, 10, 27, 14, 26 ]\n    \nnow the `less` partition is sorted  and since the count of the `greater` partition is 3 it will be sorted with insertion sort  `[ 14, 26, 27 ]`\n\nThe array is now successfully sorted\n\n    [ -1, 0, 1, 2, 3, 5, 8, 8, 9, 10, 14, 26, 27 ]\n\n\n## See also\n\n[Introsort on Wikipedia](https://en.wikipedia.org/wiki/Introsort)\n[Introsort comparison with other sorting algorithms](http://agostini.tech/2017/12/18/swift-sorting-algorithm/)\n[Introsort implementation from the Swift standard library](https://github.com/apple/swift/blob/09f77ff58d250f5d62855ea359fc304f40b531df/stdlib/public/core/Sort.swift.gyb)\n\n*Written for Swift Algorithm Club by Giuseppe Lanza*\n"
  },
  {
    "path": "Introsort/Randomize.swift",
    "content": "import Foundation\n\npublic func randomize(n: Int) -> [Int] {\n    var unsorted = [Int]()\n    for _ in 0..<n {\n        unsorted.append(Int(arc4random()))\n    }\n    return unsorted\n}\n"
  },
  {
    "path": "Introsort/Sort3.swift",
    "content": "import Foundation\n\npublic func sort3<T>(in array: inout [T], a: Int, b: Int, c: Int, by areInIncreasingOrder: (T, T) -> Bool) {\n    switch (areInIncreasingOrder(array[b], array[a]),\n            areInIncreasingOrder(array[c], array[b])) {\n    case (false, false): break\n    case (true, true): array.swapAt(a, c)\n    case (true, false):\n        array.swapAt(a, b)\n        \n        if areInIncreasingOrder(array[c], array[b]) {\n            array.swapAt(b, c)\n        }\n    case (false, true):\n        array.swapAt(b, c)\n        \n        if areInIncreasingOrder(array[b], array[a]) {\n            array.swapAt(a, b)\n        }\n    }\n}\n"
  },
  {
    "path": "K-Means/KMeans.swift",
    "content": "import Foundation\n\nclass KMeans<Label: Hashable> {\n  let numCenters: Int\n  let labels: [Label]\n  private(set) var centroids = [Vector]()\n\n  init(labels: [Label]) {\n    assert(labels.count > 1, \"Exception: KMeans with less than 2 centers.\")\n    self.labels = labels\n    self.numCenters = labels.count\n  }\n\n  private func indexOfNearestCenter(_ x: Vector, centers: [Vector]) -> Int {\n    var nearestDist = Double.greatestFiniteMagnitude\n    var minIndex = 0\n\n    for (idx, center) in centers.enumerated() {\n      let dist = x.distanceTo(center)\n      if dist < nearestDist {\n        minIndex = idx\n        nearestDist = dist\n      }\n    }\n    return minIndex\n  }\n\n  func trainCenters(_ points: [Vector], convergeDistance: Double) {\n    let zeroVector = Vector([Double](repeating: 0, count: points[0].length))\n\n    // Randomly take k objects from the input data to make the initial centroids.\n    var centers = reservoirSample(points, k: numCenters)\n\n    var centerMoveDist = 0.0\n    repeat {\n      // This array keeps track of which data points belong to which centroids.\n      var classification: [[Vector]] = .init(repeating: [], count: numCenters)\n\n      // For each data point, find the centroid that it is closest to.\n      for p in points {\n        let classIndex = indexOfNearestCenter(p, centers: centers)\n        classification[classIndex].append(p)\n      }\n\n      // Take the average of all the data points that belong to each centroid.\n      // This moves the centroid to a new position.\n      let newCenters = classification.map { assignedPoints in\n        assignedPoints.reduce(zeroVector, +) / Double(assignedPoints.count)\n      }\n\n      // Find out how far each centroid moved since the last iteration. If it's\n      // only a small distance, then we're done.\n      centerMoveDist = 0.0\n      for idx in 0..<numCenters {\n        centerMoveDist += centers[idx].distanceTo(newCenters[idx])\n      }\n\n      centers = newCenters\n    } while centerMoveDist > convergeDistance\n\n    centroids = centers\n  }\n\n  func fit(_ point: Vector) -> Label {\n    assert(!centroids.isEmpty, \"Exception: KMeans tried to fit on a non trained model.\")\n\n    let centroidIndex = indexOfNearestCenter(point, centers: centroids)\n    return labels[centroidIndex]\n  }\n\n  func fit(_ points: [Vector]) -> [Label] {\n    assert(!centroids.isEmpty, \"Exception: KMeans tried to fit on a non trained model.\")\n\n    return points.map(fit)\n  }\n}\n\n// Pick k random elements from samples\nfunc reservoirSample<T>(_ samples: [T], k: Int) -> [T] {\n  var result = [T]()\n\n  // Fill the result array with first k elements\n  for i in 0..<k {\n    result.append(samples[i])\n  }\n\n  // Randomly replace elements from remaining pool\n  for i in k..<samples.count {\n    let j = Int(arc4random_uniform(UInt32(i + 1)))\n    if j < k {\n      result[j] = samples[i]\n    }\n  }\n  return result\n}\n"
  },
  {
    "path": "K-Means/README.markdown",
    "content": "# k-Means Clustering\n\nGoal: Partition data into two or more clusters.\n\nThe idea behind k-Means Clustering is to take a bunch of data and determine if there are any natural clusters (groups of related objects) within the data.\n\nThe k-Means algorithm is a so-called *unsupervised* learning algorithm. We don't know in advance what patterns exist in the data -- it has no formal classification to it -- but we would like to see if we can divide the data into groups somehow.\n\nFor example, you can use k-Means to find what are the 3 most prominent colors in an image by telling it to group pixels into 3 clusters based on their color value. Or you can use it to group related news articles together, without deciding beforehand what categories to use. The algorithm will automatically figure out what the best groups are.\n\nThe \"k\" in k-Means is a number. The algorithm assumes that there are **k** centers within the data that the various data elements are scattered around. The data that is closest to these so-called **centroids** become classified or grouped together.\n\nk-Means doesn't tell you what the classifier is for each particular data group. After dividing news articles into groups, it doesn't say that group 1 is about science, group 2 is about celebrities, group 3 is about the upcoming election, etc. You only know that related news stories are now together, but not necessarily what that relationship signifies. k-Means only assists in trying to find what clusters potentially exist.\n\n## The algorithm\n\nThe k-Means algorithm is really quite simple at its core.\n\nFirst, we choose **k** random data points to be the initial centroids. Then, we repeat the following two steps until we've found our clusters:\n\n1. For each data point, find which centroid it is closest to. We assign each point to its nearest centroid.\n2. Update the centroid to the mean (i.e. the average) of its nearest data points. We move the centroid so that it really sits in the center of the cluster.\n\nWe need to repeat this multiple times because moving the centroid changes which data points belong to it. This goes back and forth for a bit until everything stabilizes. That's when we reach \"convergence\", i.e. when the centroids no longer move around.\n\nA few of the parameters that are required for k-Means:\n\n- **k**: This is the number of centroids to attempt to locate. If you want to group news articles, this is the number of groups to look for.\n- **convergence distance**: If all the centroids move less than this distance after a particular update step, we're done.\n- **distance function**: This calculates how far data points are from the centroids, to find which centroid they are closest to. There are a number of distance functions that can be used, but most commonly the Euclidean distance function is adequate (you know, Pythagoras). But often that can lead to convergence not being reached in higher dimensionally.\n\nLet's look at an example.\n\n#### Good clusters\n\nThis first example shows k-Means finding all three clusters. In all these examples the circles represent the data points and the stars represent the centroids.\n\nIn the first iteration, we choose three data points at random and put our centroids on top of them. Then in each subsequent iteration, we figure out which data points are closest to these centroids, and move the centroids to the average position of those data points. This repeats until we reach equilibrium and the centroids stop moving.\n\n![Good Clustering](Images/k_means_good.png)\n\nThe selection of initial centroids was fortuitous! We found the lower left cluster (indicated by red) and did pretty good on the center and upper left clusters.\n\n> **Note:** These examples are contrived to show the exact nature of k-Means and finding clusters. The clusters in these examples are very easily identified by human eyes: we see there is one in the lower left corner, one in the upper right corner, and maybe one in the middle. In practice, however, data may have many dimensions and may be impossible to visualize. In such cases, k-Means is much better at this job than  human eyes!\n\n#### Bad clustering\n\nThe next two examples highlight the unpredictability of k-Means and how it does not always find the best clustering.\n\n![Bad Clustering 1](Images/k_means_bad1.png)\n\nAs you can see in this example, the initial centroids were all a little too close to one another, and the blue one didn't quite get to a good place. By adjusting the convergence distance we should be able to improve the fit of our centroids to the data.\n\n![Bad Clustering 1](Images/k_means_bad2.png)\n\nIn this example, the blue cluster never really could separate from the red cluster and as such sort of got stuck down there.\n\n#### Improving bad clustering \n\nIn these examples of \"bad\" clustering, the algorithm got stuck in a local optimum. It does find clusters but they're not the best way to divide up the data. To increase your chances of success, you can run the algorithm several times, each time with different points as the initial centroids. You choose the clustering that gives the best results.\n\nTo calculate how \"good\" the clustering is, you find the distance of each data point to its cluster, and add up all these distances. The lower this number, the better! That means each cluster is really in the center of a group of data points, and all clusters are roughly the same size and are spaced evenly apart.\n\n## The code\n\nThis is what the algorithm could look like in Swift. The `points` array contains the input data as `Vector` objects. The output is an array of `Vector` objects representing the clusters that were found.\n\n```swift\nfunc kMeans(numCenters: Int, convergeDistance: Double, points: [Vector]) -> [Vector] {\n \n  // Randomly take k objects from the input data to make the initial centroids.\n  var centers = reservoirSample(points, k: numCenters)\n\n  // This loop repeats until we've reached convergence, i.e. when the centroids\n  // have moved less than convergeDistance since the last iteration.\n  var centerMoveDist = 0.0\n  repeat {\n    // In each iteration of the loop, we move the centroids to a new position.\n    // The newCenters array contains those new positions.\n    let zeros = [Double](count: points[0].length, repeatedValue: 0)\n    var newCenters = [Vector](count: numCenters, repeatedValue: Vector(zeros))\n\n    // We keep track of how many data points belong to each centroid, so we\n    // can calculate the average later.\n    var counts = [Double](count: numCenters, repeatedValue: 0)\n\n    // For each data point, find the centroid that it is closest to. We also \n    // add up the data points that belong to that centroid, in order to compute\n    // that average.\n    for p in points {\n      let c = indexOfNearestCenter(p, centers: centers)\n      newCenters[c] += p\n      counts[c] += 1\n    }\n    \n    // Take the average of all the data points that belong to each centroid.\n    // This moves the centroid to a new position.\n    for idx in 0..<numCenters {\n      newCenters[idx] /= counts[idx]\n    }\n\n    // Find out how far each centroid moved since the last iteration. If it's\n    // only a small distance, then we're done.\n    centerMoveDist = 0.0\n    for idx in 0..<numCenters {\n      centerMoveDist += centers[idx].distanceTo(newCenters[idx])\n    }\n    \n    centers = newCenters\n  } while centerMoveDist > convergeDistance\n\n  return centers\n}\n```\n\n> **Note:** The code in [KMeans.swift](KMeans.swift) is slightly more advanced than the above listing. It also assigns labels to the clusters and has a few other tricks up its sleeve. Check it out!\n\n## Performance\n\nk-Means is classified as an NP-Hard type of problem. That means it's almost impossible to find the optimal solution. The selection of the initial centroids has a big effect on how the resulting clusters may end up. Finding an exact solution is not likely -- even in 2 dimensional space.\n\nAs seen from the steps above the complexity really isn't that bad -- it is often considered to be on the order of **O(kndi)**, where **k** is the number of centroids, **n** is the number of **d**-dimensional vectors, and **i** is the number of iterations for convergence.\n\nThe amount of data has a linear effect on the running time of k-Means, but tuning how far you want the centroids to converge can have a big impact how many iterations will be done. As a general rule, **k** should be relatively small compared to the number of vectors.\n\nOften times as more data is added certain points may lie in the boundary between two centroids and as such those centroids would continue to bounce back and forth and the convergence distance would need to be tuned to prevent that.\n\n## See Also\n\n[K-Means Clustering on Wikipedia](https://en.wikipedia.org/wiki/K-means_clustering)\n\n*Written by John Gill and Matthijs Hollemans*\n"
  },
  {
    "path": "K-Means/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "K-Means/Tests/KMeansTests.swift",
    "content": "//\n//  Tests.swift\n//  Tests\n//\n//  Created by John Gill on 2/29/16.\n//\n//\n\nimport Foundation\nimport XCTest\n\nclass KMeansTests: XCTestCase {\n  func genPoints(_ numPoints: Int, numDimensions: Int) -> [Vector] {\n    var points = [Vector]()\n    for _ in 0..<numPoints {\n      var data = [Double]()\n      for _ in 0..<numDimensions {\n        data.append(Double(arc4random_uniform(UInt32(numPoints*numDimensions))))\n      }\n      points.append(Vector(data))\n    }\n    return points\n  }\n\n  func testSmall_2D() {\n    let points = genPoints(10, numDimensions: 2)\n\n    print(\"\\nCenters\")\n    let kmm = KMeans<Character>(labels: [\"A\", \"B\", \"C\"])\n    kmm.trainCenters(points, convergeDistance: 0.01)\n\n    for (label, centroid) in zip(kmm.labels, kmm.centroids) {\n      print(\"\\(label): \\(centroid)\")\n    }\n\n    print(\"\\nClassifications\")\n    for (label, point) in zip(kmm.fit(points), points) {\n      print(\"\\(label): \\(point)\")\n    }\n  }\n\n  func testSmall_10D() {\n    let points = genPoints(10, numDimensions: 10)\n\n    print(\"\\nCenters\")\n    let kmm = KMeans<Int>(labels: [1, 2, 3])\n    kmm.trainCenters(points, convergeDistance: 0.01)\n    for c in kmm.centroids {\n      print(c)\n    }\n  }\n\n  func testLarge_2D() {\n    let points = genPoints(10000, numDimensions: 2)\n\n    print(\"\\nCenters\")\n    let kmm = KMeans<Character>(labels: [\"A\", \"B\", \"C\", \"D\", \"E\"])\n    kmm.trainCenters(points, convergeDistance: 0.01)\n    for c in kmm.centroids {\n      print(c)\n    }\n  }\n\n  func testLarge_10D() {\n    let points = genPoints(10000, numDimensions: 10)\n\n    print(\"\\nCenters\")\n    let kmm = KMeans<Int>(labels: [1, 2, 3, 4, 5])\n    kmm.trainCenters(points, convergeDistance: 0.01)\n    for c in kmm.centroids {\n      print(c)\n    }\n  }\n}\n"
  },
  {
    "path": "K-Means/Tests/Tests.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\tB80894E41C852D100018730E /* KMeansTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B80894E31C852D100018730E /* KMeansTests.swift */; };\n\t\tB80894EA1C852DA00018730E /* Vector.swift in Sources */ = {isa = PBXBuildFile; fileRef = B80894E91C852DA00018730E /* Vector.swift */; };\n\t\tB80894EB1C8530830018730E /* KMeans.swift in Sources */ = {isa = PBXBuildFile; fileRef = B80894DB1C852CFA0018730E /* KMeans.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\tB80894DB1C852CFA0018730E /* KMeans.swift */ = {isa = PBXFileReference; indentWidth = 2; lastKnownFileType = sourcecode.swift; name = KMeans.swift; path = ../KMeans.swift; sourceTree = SOURCE_ROOT; tabWidth = 2; };\n\t\tB80894E01C852D100018730E /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tB80894E31C852D100018730E /* KMeansTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMeansTests.swift; sourceTree = SOURCE_ROOT; };\n\t\tB80894E51C852D100018730E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tB80894E91C852DA00018730E /* Vector.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Vector.swift; sourceTree = SOURCE_ROOT; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\tB80894DD1C852D100018730E /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\tB80894D41C852CDC0018730E = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tB80894E21C852D100018730E /* Tests */,\n\t\t\t\tB80894E11C852D100018730E /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB80894E11C852D100018730E /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tB80894E01C852D100018730E /* Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tB80894E21C852D100018730E /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tB80894DB1C852CFA0018730E /* KMeans.swift */,\n\t\t\t\tB80894E31C852D100018730E /* KMeansTests.swift */,\n\t\t\t\tB80894E91C852DA00018730E /* Vector.swift */,\n\t\t\t\tB80894E51C852D100018730E /* Info.plist */,\n\t\t\t);\n\t\t\tpath = Tests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\tB80894DF1C852D100018730E /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = B80894E61C852D100018730E /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tB80894DC1C852D100018730E /* Sources */,\n\t\t\t\tB80894DD1C852D100018730E /* Frameworks */,\n\t\t\t\tB80894DE1C852D100018730E /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tproductName = Tests;\n\t\t\tproductReference = B80894E01C852D100018730E /* Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\tB80894D51C852CDC0018730E /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0720;\n\t\t\t\tLastUpgradeCheck = 1000;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\tB80894DF1C852D100018730E = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2.1;\n\t\t\t\t\t\tLastSwiftMigration = 1000;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = B80894D81C852CDC0018730E /* Build configuration list for PBXProject \"Tests\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t);\n\t\t\tmainGroup = B80894D41C852CDC0018730E;\n\t\t\tproductRefGroup = B80894E11C852D100018730E /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\tB80894DF1C852D100018730E /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\tB80894DE1C852D100018730E /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\tB80894DC1C852D100018730E /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tB80894EA1C852DA00018730E /* Vector.swift in Sources */,\n\t\t\t\tB80894E41C852D100018730E /* KMeansTests.swift in Sources */,\n\t\t\t\tB80894EB1C8530830018730E /* KMeans.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\tB80894D91C852CDC0018730E /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tB80894DA1C852CDC0018730E /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tB80894E71C852D100018730E /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.alvahouse322.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tB80894E81C852D100018730E /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.alvahouse322.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\tB80894D81C852CDC0018730E /* Build configuration list for PBXProject \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tB80894D91C852CDC0018730E /* Debug */,\n\t\t\t\tB80894DA1C852CDC0018730E /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tB80894E61C852D100018730E /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tB80894E71C852D100018730E /* Debug */,\n\t\t\t\tB80894E81C852D100018730E /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = B80894D51C852CDC0018730E /* Project object */;\n}\n"
  },
  {
    "path": "K-Means/Tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "K-Means/Tests/Tests.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "K-Means/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1000\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"B80894DF1C852D100018730E\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"B80894DF1C852D100018730E\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"B80894DF1C852D100018730E\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"B80894DF1C852D100018730E\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "K-Means/Tests/Vector.swift",
    "content": "import Foundation\n\nstruct Vector: CustomStringConvertible, Equatable {\n  private(set) var length = 0\n  private(set) var data: [Double]\n\n  init(_ data: [Double]) {\n    self.data = data\n    self.length = data.count\n  }\n\n  var description: String {\n    return \"Vector (\\(data)\"\n  }\n\n  func distanceTo(_ other: Vector) -> Double {\n    var result = 0.0\n    for idx in 0..<length {\n      result += pow(data[idx] - other.data[idx], 2.0)\n    }\n    return sqrt(result)\n  }\n}\n\nfunc == (left: Vector, right: Vector) -> Bool {\n  for idx in 0..<left.length {\n    if left.data[idx] != right.data[idx] {\n      return false\n    }\n  }\n  return true\n}\n\nfunc + (left: Vector, right: Vector) -> Vector {\n  var results = [Double]()\n  for idx in 0..<left.length {\n    results.append(left.data[idx] + right.data[idx])\n  }\n  return Vector(results)\n}\n\nfunc += (left: inout Vector, right: Vector) {\n  left = left + right\n}\n\nfunc - (left: Vector, right: Vector) -> Vector {\n  var results = [Double]()\n  for idx in 0..<left.length {\n    results.append(left.data[idx] - right.data[idx])\n  }\n  return Vector(results)\n}\n\nfunc -= (left: inout Vector, right: Vector) {\n  left = left - right\n}\n\nfunc / (left: Vector, right: Double) -> Vector {\n  var results = [Double](repeating: 0, count: left.length)\n  for (idx, value) in left.data.enumerated() {\n    results[idx] = value / right\n  }\n  return Vector(results)\n}\n\nfunc /= (left: inout Vector, right: Double) {\n  left = left / right\n}\n"
  },
  {
    "path": "Karatsuba Multiplication/KaratsubaMultiplication.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\nimport Foundation\n\nprecedencegroup ExponentiativePrecedence {\n  higherThan: MultiplicationPrecedence\n  lowerThan: BitwiseShiftPrecedence\n  associativity: left\n}\n\ninfix operator ^^: ExponentiativePrecedence\nfunc ^^ (radix: Int, power: Int) -> Int {\n  return Int(pow(Double(radix), Double(power)))\n}\n\n// Long Multiplication - O(n^2)\nfunc multiply(_ num1: Int, by num2: Int, base: Int = 10) -> Int {\n  let num1Array = String(num1).reversed().map { Int(String($0))! }\n  let num2Array = String(num2).reversed().map { Int(String($0))! }\n  \n  var product = Array(repeating: 0, count: num1Array.count + num2Array.count)\n  \n  for i in num1Array.indices {\n    var carry = 0\n    for j in num2Array.indices {\n      product[i + j] += carry + num1Array[i] * num2Array[j]\n      carry = product[i + j] / base\n      product[i + j] %= base\n    }\n    product[i + num2Array.count] += carry\n  }\n  \n  return Int(product.reversed().map { String($0) }.reduce(\"\", +))!\n}\n\n// Karatsuba Multiplication - O(n^log2(3))\nfunc karatsuba(_ num1: Int, by num2: Int) -> Int {\n  let num1String = String(num1)\n  let num2String = String(num2)\n  \n  guard num1String.count > 1 && num2String.count > 1 else {\n    return multiply(num1, by: num2)\n  }\n  \n  let n = max(num1String.count, num2String.count)\n  let nBy2 = n / 2\n  \n  let a = num1 / 10^^nBy2\n  let b = num1 % 10^^nBy2\n  let c = num2 / 10^^nBy2\n  let d = num2 % 10^^nBy2\n  \n  let ac = karatsuba(a, by: c)\n  let bd = karatsuba(b, by: d)\n  let adPlusbc = karatsuba(a+b, by: c+d) - ac - bd\n  \n  let product = ac * 10^^(2 * nBy2) + adPlusbc * 10^^nBy2 + bd\n  \n  return product\n}\n"
  },
  {
    "path": "Karatsuba Multiplication/KaratsubaMultiplication.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios' executeOnSourceChanges='false'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Karatsuba Multiplication/KaratsubaMultiplication.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Karatsuba Multiplication/KaratsubaMultiplication.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Karatsuba Multiplication/KaratsubaMultiplication.swift",
    "content": "//\n//  KaratsubaMultiplication.swift\n//  \n//\n//  Created by Richard Ash on 9/12/16.\n//\n//\n\nimport Foundation\n\nprecedencegroup ExponentiativePrecedence {\n  higherThan: MultiplicationPrecedence\n  lowerThan: BitwiseShiftPrecedence\n  associativity: left\n}\n\ninfix operator ^^: ExponentiativePrecedence\nfunc ^^ (radix: Int, power: Int) -> Int {\n  return Int(pow(Double(radix), Double(power)))\n}\n\n// Long Multiplication - O(n^2)\nfunc multiply(_ num1: Int, by num2: Int, base: Int = 10) -> Int {\n  let num1Array = String(num1).reversed().map { Int(String($0))! }\n  let num2Array = String(num2).reversed().map { Int(String($0))! }\n\n  var product = Array(repeating: 0, count: num1Array.count + num2Array.count)\n\n  for i in num1Array.indices {\n    var carry = 0\n    for j in num2Array.indices {\n      product[i + j] += carry + num1Array[i] * num2Array[j]\n      carry = product[i + j] / base\n      product[i + j] %= base\n    }\n    product[i + num2Array.count] += carry\n  }\n\n  return Int(product.reversed().map { String($0) }.reduce(\"\", +))!\n}\n\n// Karatsuba Multiplication - O(n^log2(3))\nfunc karatsuba(_ num1: Int, by num2: Int) -> Int {\n  let num1String = String(num1)\n  let num2String = String(num2)\n\n  guard num1String.count > 1 && num2String.count > 1 else {\n    return multiply(num1, by: num2)\n  }\n\n  let n = max(num1String.count, num2String.count)\n  let nBy2 = n / 2\n\n  let a = num1 / 10^^nBy2\n  let b = num1 % 10^^nBy2\n  let c = num2 / 10^^nBy2\n  let d = num2 % 10^^nBy2\n\n  let ac = karatsuba(a, by: c)\n  let bd = karatsuba(b, by: d)\n  let adPlusbc = karatsuba(a+b, by: c+d) - ac - bd\n\n  let product = ac * 10^^(2 * nBy2) + adPlusbc * 10^^nBy2 + bd\n\n  return product\n}\n"
  },
  {
    "path": "Karatsuba Multiplication/README.markdown",
    "content": "# Karatsuba Multiplication\n\nGoal: To quickly multiply two numbers together\n\n## Long Multiplication\n\nIn grade school we learned how to multiply two numbers together via Long Multiplication. Let's try that first!\n\n### Example 1: Multiply 1234 by 5678 using Long Multiplication\n\n\t    5678\n\t   *1234\n\t  ------\n\t   22712\n\t  17034-\n\t 11356--\n\t 5678---\n\t--------\n\t 7006652\n\nSo what's the problem with Long Multiplication? Well remember the first part of our goal. To *quickly* multiply two numbers together. Long Multiplication is slow! (**O(n^2)**) \n\nYou can see where the **O(n^2)** comes from in the implementation of Long Multiplication:\n\n```swift\n// Long Multiplication\nfunc multiply(_ num1: Int, by num2: Int, base: Int = 10) -> Int {\n  let num1Array = String(num1).characters.reversed().map{ Int(String($0))! }\n  let num2Array = String(num2).characters.reversed().map{ Int(String($0))! }\n  \n  var product = Array(repeating: 0, count: num1Array.count + num2Array.count)\n\n  for i in num1Array.indices {\n    var carry = 0\n    for j in num2Array.indices {\n      product[i + j] += carry + num1Array[i] * num2Array[j]\n      carry = product[i + j] / base\n      product[i + j] %= base\n    }\n    product[i + num2Array.count] += carry\n  }\n  \n  return Int(product.reversed().map{ String($0) }.reduce(\"\", +))!\n}\n```\n\nThe double for loop is the culprit! By comparing each of the digits (as is necessary!) we set ourselves up for an **O(n^2)** running time. So Long Multiplication might not be the best algorithm after all. Can we do better?\n\n## Karatsuba Multiplication\n\nThe Karatsuba Algorithm was discovered by Anatoly Karatsuba and published in 1962. Karatsuba discovered that you could compute the product of two large numbers using three smaller products and some addition and subtraction.\n\nFor two numbers x, y, where m <= n:\n\n\tx = a*10^m + b\n\ty = c*10^m + d\n\nNow, we can say:\n\n\tx*y = (a*10^m + b) * (c*10^m + d)\n\t    = a*c*10^(2m) + (a*d + b*c)*10^(m) + b*d\n\nThis had been know since the 19th century. The problem is that the method requires 4 multiplications (`a*c`, `a*d`, `b*c`, `b*d`). Karatsuba's insight was that you only need three! (`a*c`, `b*d`, `(a+b)*(c+d)`). Now a perfectly valid question right now would be \"How is that possible!?!\" Here's the math:\n\n        (a+b)*(c+d) - a*c - b*d  = (a*c + a*d + b*c + b*d) - a*c - b*d\n                                 = (a*d + b*c)\n\nPretty cool, huh?\n\nHere's the full implementation. Note that the recursive algorithm is most efficient at m = n/2.\n\n```swift\n// Karatsuba Multiplication\nfunc karatsuba(_ num1: Int, by num2: Int) -> Int {\n  let num1String = String(num1)\n  let num2String = String(num2)\n  \n  guard num1String.count > 1 && num2String.count > 1 else {\n    return multiply(num1, by: num2)\n  }\n  \n  let n = max(num1String.count, num2String.count)\n  let nBy2 = n / 2\n  \n  let a = num1 / 10^^nBy2\n  let b = num1 % 10^^nBy2\n  let c = num2 / 10^^nBy2\n  let d = num2 % 10^^nBy2\n  \n  let ac = karatsuba(a, by: c)\n  let bd = karatsuba(b, by: d)\n  let adPlusbc = karatsuba(a+b, by: c+d) - ac - bd\n  \n  let product = ac * 10^^(2 * nBy2) + adPlusbc * 10^^nBy2 + bd\n  \n  return product\n}\n```\n\nWhat about the running time of this algorithm? Is all this extra work worth it? We can use the Master Theorem to answer this question. This leads us to `T(n) = 3*T(n/2) + c*n + d` where c & d are some constants. It follows (because 3 > 2^1) that the running time is **O(n^log2(3))** which is roughly **O(n^1.56)**. Much better! \n\n### Example 2: Multiply 1234 by 5678 using Karatsuba Multiplication\n\n\tm = 2\n\tx = 1234 = a*10^2 + b = 12*10^2 + 34\n\ty = 5678 = c*10^2 + d = 56*10^2 + 78\n\n\ta*c = 672\n\tb*d = 2652\n\t(a*d + b*c) = 2840\n\t\n\tx*y = 672*10^4 + 2840*10^2 + 2652\n\t    = 6720000 + 284000 + 2652\n\t    = 7006652\t\n \n## Resources\n\n[Wikipedia](https://en.wikipedia.org/wiki/Karatsuba_algorithm)\n\n[WolframMathWorld](http://mathworld.wolfram.com/KaratsubaMultiplication.html) \n\n[Master Theorem](https://en.wikipedia.org/wiki/Master_theorem)\n\n*Written for Swift Algorithm Club by Richard Ash*\n"
  },
  {
    "path": "Karatsuba Multiplication/Tests/KaratsubaMultiplicationTests.swift",
    "content": "//\n//  KaratsubaMultiplicationTests.swift\n//  Tests\n//\n//  Created by Afonso Graça on 8/10/18.\n//\n\nimport XCTest\n\nfinal class KaratsubaMultiplicationTests: XCTestCase {\n\n    func testReadmeExample() {\n        let subject = karatsuba(1234, by: 5678)\n\n        XCTAssertEqual(subject, 7006652)\n    }\n}\n"
  },
  {
    "path": "Karatsuba Multiplication/Tests/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Karatsuba Multiplication/Tests/Tests.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 50;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t6AF099AC216B54E200F69B16 /* KaratsubaMultiplication.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AF099AB216B54E200F69B16 /* KaratsubaMultiplication.swift */; };\n\t\t6AF099AE216B55A100F69B16 /* KaratsubaMultiplicationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AF099AD216B55A100F69B16 /* KaratsubaMultiplicationTests.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t6AF099A2216B54D500F69B16 /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t6AF099A7216B54D500F69B16 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Tests/Info.plist; sourceTree = SOURCE_ROOT; };\n\t\t6AF099AB216B54E200F69B16 /* KaratsubaMultiplication.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = KaratsubaMultiplication.swift; path = ../KaratsubaMultiplication.swift; sourceTree = \"<group>\"; };\n\t\t6AF099AD216B55A100F69B16 /* KaratsubaMultiplicationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KaratsubaMultiplicationTests.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t6AF0999F216B54D500F69B16 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t6AF09997216B545D00F69B16 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6AF099AB216B54E200F69B16 /* KaratsubaMultiplication.swift */,\n\t\t\t\t6AF099A4216B54D500F69B16 /* Tests */,\n\t\t\t\t6AF099A3216B54D500F69B16 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t6AF099A3216B54D500F69B16 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6AF099A2216B54D500F69B16 /* Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t6AF099A4216B54D500F69B16 /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t6AF099AD216B55A100F69B16 /* KaratsubaMultiplicationTests.swift */,\n\t\t\t\t6AF099A7216B54D500F69B16 /* Info.plist */,\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tsourceTree = SOURCE_ROOT;\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t6AF099A1216B54D500F69B16 /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 6AF099A8216B54D500F69B16 /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t6AF0999E216B54D500F69B16 /* Sources */,\n\t\t\t\t6AF0999F216B54D500F69B16 /* Frameworks */,\n\t\t\t\t6AF099A0216B54D500F69B16 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tproductName = Tests;\n\t\t\tproductReference = 6AF099A2216B54D500F69B16 /* Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t6AF09998216B545D00F69B16 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 1000;\n\t\t\t\tLastUpgradeCheck = 1000;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t6AF099A1216B54D500F69B16 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 10.0;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 6AF0999B216B545D00F69B16 /* Build configuration list for PBXProject \"Tests\" */;\n\t\t\tcompatibilityVersion = \"Xcode 9.3\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t);\n\t\t\tmainGroup = 6AF09997216B545D00F69B16;\n\t\t\tproductRefGroup = 6AF099A3216B54D500F69B16 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t6AF099A1216B54D500F69B16 /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t6AF099A0216B54D500F69B16 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t6AF0999E216B54D500F69B16 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t6AF099AE216B55A100F69B16 /* KaratsubaMultiplicationTests.swift in Sources */,\n\t\t\t\t6AF099AC216B54E200F69B16 /* KaratsubaMultiplication.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t6AF0999C216B545D00F69B16 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t6AF0999D216B545D00F69B16 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t6AF099A9216B54D500F69B16 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = Tests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t\t\"@loader_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.14;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t6AF099AA216B54D500F69B16 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = Tests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t\t\"@loader_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.14;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tMTL_FAST_MATH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t6AF0999B216B545D00F69B16 /* Build configuration list for PBXProject \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t6AF0999C216B545D00F69B16 /* Debug */,\n\t\t\t\t6AF0999D216B545D00F69B16 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t6AF099A8216B54D500F69B16 /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t6AF099A9216B54D500F69B16 /* Debug */,\n\t\t\t\t6AF099AA216B54D500F69B16 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 6AF09998216B545D00F69B16 /* Project object */;\n}\n"
  },
  {
    "path": "Karatsuba Multiplication/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1000\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"6AF099A1216B54D500F69B16\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Knuth-Morris-Pratt/KnuthMorrisPratt.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\nfunc ZetaAlgorithm(ptnr: String) -> [Int]? {\n  \n  let pattern = Array(ptnr)\n  let patternLength: Int = pattern.count\n  \n  guard patternLength > 0 else {\n    return nil\n  }\n  \n  var zeta: [Int] = [Int](repeating: 0, count: patternLength)\n  \n  var left: Int = 0\n  var right: Int = 0\n  var k_1: Int = 0\n  var betaLength: Int = 0\n  var textIndex: Int = 0\n  var patternIndex: Int = 0\n  \n  for k in 1 ..< patternLength {\n    if k > right {\n      patternIndex = 0\n      \n      while k + patternIndex < patternLength  &&\n        pattern[k + patternIndex] == pattern[patternIndex] {\n          patternIndex = patternIndex + 1\n      }\n      \n      zeta[k] = patternIndex\n      \n      if zeta[k] > 0 {\n        left = k\n        right = k + zeta[k] - 1\n      }\n    } else {\n      k_1 = k - left + 1\n      betaLength = right - k + 1\n      \n      if zeta[k_1 - 1] < betaLength {\n        zeta[k] = zeta[k_1 - 1]\n      } else if zeta[k_1 - 1] >= betaLength {\n        textIndex = betaLength\n        patternIndex = right + 1\n        \n        while patternIndex < patternLength && pattern[textIndex] == pattern[patternIndex] {\n          textIndex = textIndex + 1\n          patternIndex = patternIndex + 1\n        }\n        zeta[k] = patternIndex - k\n        left = k\n        right = patternIndex - 1\n      }\n    }\n  }\n  return zeta\n}\n\nextension String {\n  \n  func indexesOf(ptnr: String) -> [Int]? {\n    \n    let text = Array(self)\n    let pattern = Array(ptnr.characters)\n    \n    let textLength: Int = text.count\n    let patternLength: Int = pattern.count\n    \n    guard patternLength > 0 else {\n      return nil\n    }\n    \n    var suffixPrefix: [Int] = [Int](repeating: 0, count: patternLength)\n    var textIndex: Int = 0\n    var patternIndex: Int = 0\n    var indexes: [Int] = [Int]()\n    \n    /* Pre-processing stage: computing the table for the shifts (through Z-Algorithm) */\n    let zeta = ZetaAlgorithm(ptnr: ptnr)\n    \n    for patternIndex in (1 ..< patternLength).reversed() {\n      textIndex = patternIndex + zeta![patternIndex] - 1\n      suffixPrefix[textIndex] = zeta![patternIndex]\n    }\n    \n    /* Search stage: scanning the text for pattern matching */\n    textIndex = 0\n    patternIndex = 0\n    \n    while textIndex + (patternLength - patternIndex - 1) < textLength {\n      \n      while patternIndex < patternLength && text[textIndex] == pattern[patternIndex] {\n        textIndex = textIndex + 1\n        patternIndex = patternIndex + 1\n      }\n      \n      if patternIndex == patternLength {\n        indexes.append(textIndex - patternIndex)\n      }\n      \n      if patternIndex == 0 {\n        textIndex = textIndex + 1\n      } else {\n        patternIndex = suffixPrefix[patternIndex - 1]\n      }\n    }\n    \n    guard !indexes.isEmpty else {\n      return nil\n    }\n    return indexes\n  }\n}\n\n/* Examples */\n\nlet dna = \"ACCCGGTTTTAAAGAACCACCATAAGATATAGACAGATATAGGACAGATATAGAGACAAAACCCCATACCCCAATATTTTTTTGGGGAGAAAAACACCACAGATAGATACACAGACTACACGAGATACGACATACAGCAGCATAACGACAACAGCAGATAGACGATCATAACAGCAATCAGACCGAGCGCAGCAGCTTTTAAGCACCAGCCCCACAAAAAACGACAATFATCATCATATACAGACGACGACACGACATATCACACGACAGCATA\"\ndna.indexesOf(ptnr: \"CATA\")   // [20, 64, 130, 140, 166, 234, 255, 270]\n\nlet concert = \"🎼🎹🎹🎸🎸🎻🎻🎷🎺🎤👏👏👏\"\nconcert.indexesOf(ptnr: \"🎻🎷\")   // [6]\n"
  },
  {
    "path": "Knuth-Morris-Pratt/KnuthMorrisPratt.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Knuth-Morris-Pratt/KnuthMorrisPratt.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Knuth-Morris-Pratt/KnuthMorrisPratt.swift",
    "content": "/*  Knuth-Morris-Pratt algorithm for pattern/string matching\n \n The code is based on the book:\n \"Algorithms on String, Trees and Sequences: Computer Science and Computational Biology\"\n by Dan Gusfield\n Cambridge University Press, 1997\n */\n\nimport Foundation\n\nextension String {\n  \n  func indexesOf(ptnr: String) -> [Int]? {\n    \n    let text = Array(self)\n    let pattern = Array(ptnr)\n    \n    let textLength: Int = text.count\n    let patternLength: Int = pattern.count\n    \n    guard patternLength > 0 else {\n      return nil\n    }\n    \n    var suffixPrefix: [Int] = [Int](repeating: 0, count: patternLength)\n    var textIndex: Int = 0\n    var patternIndex: Int = 0\n    var indexes: [Int] = [Int]()\n    \n    /* Pre-processing stage: computing the table for the shifts (through Z-Algorithm) */\n    let zeta = ZetaAlgorithm(ptnr: ptnr)\n    \n    for patternIndex in (1 ..< patternLength).reversed() {\n      textIndex = patternIndex + zeta![patternIndex] - 1\n      suffixPrefix[textIndex] = zeta![patternIndex]\n    }\n    \n    /* Search stage: scanning the text for pattern matching */\n    textIndex = 0\n    patternIndex = 0\n    \n    while textIndex + (patternLength - patternIndex - 1) < textLength {\n      \n      while patternIndex < patternLength && text[textIndex] == pattern[patternIndex] {\n        textIndex = textIndex + 1\n        patternIndex = patternIndex + 1\n      }\n      \n      if patternIndex == patternLength {\n        indexes.append(textIndex - patternIndex)\n      }\n      \n      if patternIndex == 0 {\n        textIndex = textIndex + 1\n      } else {\n        patternIndex = suffixPrefix[patternIndex - 1]\n      }\n    }\n    \n    guard !indexes.isEmpty else {\n      return nil\n    }\n    return indexes\n  }\n}\n"
  },
  {
    "path": "Knuth-Morris-Pratt/README.markdown",
    "content": "# Knuth-Morris-Pratt String Search\n\nGoal: Write a linear-time string matching algorithm in Swift that returns the indexes of all the occurrencies of a given pattern.\n\nIn other words, we want to implement an `indexesOf(pattern: String)` extension on `String` that returns an array `[Int]` of integers, representing all occurrences' indexes of the search pattern, or `nil` if the pattern could not be found inside the string.\n\nFor example:\n\n```swift\nlet dna = \"ACCCGGTTTTAAAGAACCACCATAAGATATAGACAGATATAGGACAGATATAGAGACAAAACCCCATACCCCAATATTTTTTTGGGGAGAAAAACACCACAGATAGATACACAGACTACACGAGATACGACATACAGCAGCATAACGACAACAGCAGATAGACGATCATAACAGCAATCAGACCGAGCGCAGCAGCTTTTAAGCACCAGCCCCACAAAAAACGACAATFATCATCATATACAGACGACGACACGACATATCACACGACAGCATA\"\ndna.indexesOf(ptnr: \"CATA\")   // Output: [20, 64, 130, 140, 166, 234, 255, 270]\n\nlet concert = \"🎼🎹🎹🎸🎸🎻🎻🎷🎺🎤👏👏👏\"\nconcert.indexesOf(ptnr: \"🎻🎷\")   // Output: [6]\n```\n\nThe [Knuth-Morris-Pratt algorithm](https://en.wikipedia.org/wiki/Knuth–Morris–Pratt_algorithm) is considered one of the best algorithms for solving the pattern matching problem. Although in practice [Boyer-Moore](../Boyer-Moore-Horspool/) is usually preferred, the algorithm that we will introduce is simpler, and has the same (linear) running time.\n\nThe idea behind the algorithm is not too different from the [naive string search](../Brute-Force%20String%20Search/) procedure. As it, Knuth-Morris-Pratt aligns the text with the pattern and goes with character comparisons from left to right. But, instead of making a shift of one character when a mismatch occurs, it uses a more intelligent way to move the pattern along the text. In fact, the algorithm features a pattern pre-processing stage where it acquires all the informations that will make the algorithm skip redundant comparisons, resulting in larger shifts.\n\nThe pre-processing stage produces an array (called `suffixPrefix` in the code) of integers in which every element `suffixPrefix[i]` records the length of the longest proper suffix of `P[0...i]` (where `P` is the pattern) that matches a prefix of `P`. In other words, `suffixPrefix[i]` is the longest proper substring of `P` that ends at position `i` and that is a prefix of `P`. Just a quick example. Consider `P = \"abadfryaabsabadffg\"`, then `suffixPrefix[4] = 0`, `suffixPrefix[9] = 2`, `suffixPrefix[14] = 4`.\nThere are different ways to obtain the values of `SuffixPrefix` array. We will use the method based on the [Z-Algorithm](../Z-Algorithm/). This function takes in input the pattern and produces an array of integers. Each element represents the length of the longest substring starting at position `i` of `P` and that matches a prefix of `P`. You can notice that the two arrays are similar, they record the same informations but on the different places. We only have to find a method to map `Z[i]` to `suffixPrefix[j]`. It is not that difficult and this is the code that will do for us:\n\n```swift\nfor patternIndex in (1 ..< patternLength).reversed() {\n    textIndex = patternIndex + zeta![patternIndex] - 1\n    suffixPrefix[textIndex] = zeta![patternIndex]\n}\n```\n\nWe are simply computing the index of the end of the substring starting at position `i` (as we know matches a prefix of `P`). The element of `suffixPrefix` at that index then it will be set with the length of the substring.\n\nOnce the shift-array `suffixPrefix` is ready we can begin with pattern search stage. The algorithm first attempts to compare the characters of the text with those of the pattern. If it succeeds, it goes on until a mismatch occurs. When it happens, it checks if an occurrence of the pattern is present (and reports it). Otherwise, if no comparisons are made then the text cursor is moved forward, else the pattern is shifted to the right. The shift's amount is based on the `suffixPrefix` array, and it guarantees that the prefix `P[0...suffixPrefix[i]]` will match its opposing substring in the text. In this way, shifts of more than one character are often made and lot of comparisons can be avoided, saving a lot of time.\n\nHere is the code of the Knuth-Morris-Pratt algorithm:\n\n```swift\nextension String {\n\n    func indexesOf(ptnr: String) -> [Int]? {\n\n        let text = Array(self.characters)\n        let pattern = Array(ptnr.characters)\n\n        let textLength: Int = text.count\n        let patternLength: Int = pattern.count\n\n        guard patternLength > 0 else {\n            return nil\n        }\n\n        var suffixPrefix: [Int] = [Int](repeating: 0, count: patternLength)\n        var textIndex: Int = 0\n        var patternIndex: Int = 0\n        var indexes: [Int] = [Int]()\n\n        /* Pre-processing stage: computing the table for the shifts (through Z-Algorithm) */\n        let zeta = ZetaAlgorithm(ptnr: ptnr)\n\n        for patternIndex in (1 ..< patternLength).reversed() {\n            textIndex = patternIndex + zeta![patternIndex] - 1\n            suffixPrefix[textIndex] = zeta![patternIndex]\n        }\n\n        /* Search stage: scanning the text for pattern matching */\n        textIndex = 0\n        patternIndex = 0\n\n        while textIndex + (patternLength - patternIndex - 1) < textLength {\n\n            while patternIndex < patternLength && text[textIndex] == pattern[patternIndex] {\n                textIndex = textIndex + 1\n                patternIndex = patternIndex + 1\n            }\n\n            if patternIndex == patternLength {\n                indexes.append(textIndex - patternIndex)\n            }\n\n            if patternIndex == 0 {\n                textIndex = textIndex + 1\n            } else {\n                patternIndex = suffixPrefix[patternIndex - 1]\n            }\n        }\n\n        guard !indexes.isEmpty else {\n            return nil\n        }\n        return indexes\n    }\n}\n```\n\nLet's make an example reasoning with the code above. Let's consider the string `P = ACTGACTA\"`, the consequentially obtained `suffixPrefix` array equal to `[0, 0, 0, 0, 0, 0, 3, 1]`, and the text `T = \"GCACTGACTGACTGACTAG\"`. The algorithm begins with the text and the pattern aligned like below. We have to compare `T[0]` with `P[0]`.  \n\n                              1       \n                    0123456789012345678\n    text:           GCACTGACTGACTGACTAG\n    textIndex:      ^\n    pattern:        ACTGACTA\n    patternIndex:   ^\n                    x\n    suffixPrefix:   00000031\n\nWe have a mismatch and we move on comparing `T[1]` and `P[0]`. We have to check if a pattern occurrence is present but there is not. So, we have to shift the pattern right and by doing so we have to check `suffixPrefix[1 - 1]`. Its value is `0` and we restart by comparing `T[1]` with `P[0]`. Again a mismath occurs, so we go on with `T[2]` and `P[0]`.\n\n                              1      \n                    0123456789012345678\n    text:           GCACTGACTGACTGACTAG\n    textIndex:        ^\n    pattern:          ACTGACTA\n    patternIndex:     ^\n    suffixPrefix:     00000031\n\nThis time we have a match. And it continues until position `8`. Unfortunately the length of the match is not equal to the pattern length, we cannot report an occurrence. But we are still lucky because we can use the values computed in the `suffixPrefix` array now. In fact, the length of the match is `7`, and if we look at the element `suffixPrefix[7 - 1]` we discover that is `3`. This information tell us that that the prefix of `P` matches the suffix of the susbtring `T[0...8]`. So the `suffixPrefix` array guarantees us that the two substring match and that we do not have to compare their characters, so we can shift right the pattern for more than one character!\nThe comparisons restart from `T[9]` and `P[3]`.  \n\n                              1       \n                    0123456789012345678\n    text:           GCACTGACTGACTGACTAG\n    textIndex:               ^\n    pattern:              ACTGACTA\n    patternIndex:            ^\n    suffixPrefix:         00000031\n\nThey match so we continue the compares until position `13` where a misatch occurs beetwen charcter `G` and `A`. Just like before, we are lucky and we can use the `suffixPrefix` array to shift right the pattern.\n\n                              1       \n                    0123456789012345678\n    text:           GCACTGACTGACTGACTAG\n    textIndex:                   ^\n    pattern:                  ACTGACTA\n    patternIndex:                ^\n    suffixPrefix:             00000031\n\nAgain, we have to compare. But this time the comparisons finally take us to an occurrence, at position `17 - 7 = 10`.\n\n                              1       \n                    0123456789012345678\n    text:           GCACTGACTGACTGACTAG\n    textIndex:                       ^\n    pattern:                  ACTGACTA\n    patternIndex:                    ^\n    suffixPrefix:             00000031\n\nThe algorithm than tries to compare `T[18]` with `P[1]` (because we used the element `suffixPrefix[8 - 1] = 1`) but it fails and at the next iteration it ends its work.\n\n\nThe pre-processing stage involves only the pattern. The running time of the Z-Algorithm is linear and takes `O(n)`, where `n` is the length of the pattern `P`. After that, the search stage does not \"overshoot\" the length of the text `T` (call it `m`). It can be be proved that number of comparisons of the search stage is bounded by `2 * m`. The final running time of the Knuth-Morris-Pratt algorithm is `O(n + m)`.\n\n\n> **Note:** To execute the code in the [KnuthMorrisPratt.swift](./KnuthMorrisPratt.swift) you have to copy the [ZAlgorithm.swift](../Z-Algorithm/ZAlgorithm.swift) file contained in the [Z-Algorithm](../Z-Algorithm/) folder. The [KnuthMorrisPratt.playground](./KnuthMorrisPratt.playground) already includes the definition of the `Zeta` function.\n\nCredits: This code is based on the handbook [\"Algorithm on String, Trees and Sequences: Computer Science and Computational Biology\"](https://books.google.it/books/about/Algorithms_on_Strings_Trees_and_Sequence.html?id=Ofw5w1yuD8kC&redir_esc=y) by Dan Gusfield, Cambridge University Press, 1997.\n\n*Written for Swift Algorithm Club by Matteo Dunnhofer*\n"
  },
  {
    "path": "Kth Largest Element/README.markdown",
    "content": "# k-th Largest Element Problem\n\nYou're given an integer array `a`. Write an algorithm that finds the *k*-th largest element in the array.\n\nFor example, the 1-st largest element is the maximum value that occurs in the array. If the array has *n* elements, the *n*-th largest element is the minimum. The median is the *n/2*-th largest element.\n\n## The naive solution\n\nThe following solution is semi-naive. Its time complexity is **O(n log n)** since it first sorts the array, and therefore also uses additional **O(n)** space.\n\n```swift\nfunc kthLargest(a: [Int], k: Int) -> Int? {\n  let len = a.count\n  if k > 0 && k <= len {\n    let sorted = a.sorted()\n    return sorted[len - k]\n  } else {\n    return nil\n  }\n}\n```\n\nThe `kthLargest()` function takes two parameters: the array `a` consisting of integers, and `k`. It returns the *k*-th largest element.\n\nLet's take a look at an example and run through the algorithm to see how it works. Given `k = 4` and the array:\n\n```swift\n[ 7, 92, 23, 9, -1, 0, 11, 6 ]\n```\n\nInitially there's no direct way to find the k-th largest element, but after sorting the array it's rather straightforward. Here's the sorted array:\n\n```swift\n[ -1, 0, 6, 7, 9, 11, 23, 92 ]\n```\n\nNow, all we must do is take the value at index `a.count - k`:\n\n```swift\na[a.count - k] = a[8 - 4] = a[4] = 9\n```\n\nOf course, if you were looking for the k-th *smallest* element, you'd use `a[k-1]`.\n\n## A faster solution\n\nThere is a clever algorithm that combines the ideas of [binary search](../Binary%20Search/) and [quicksort](../Quicksort/) to arrive at an **O(n)** solution.\n\nRecall that binary search splits the array in half over and over again, to quickly narrow in on the value you're searching for. That's what we'll do here too.\n\nQuicksort also splits up arrays. It uses partitioning to move all smaller values to the left of the pivot and all greater values to the right. After partitioning around a certain pivot, that pivot value will already be in its final, sorted position. We can use that to our advantage here.\n\nHere's how it works: We choose a random pivot, partition the array around that pivot, then act like a binary search and only continue in the left or right partition. This repeats until we've found a pivot that happens to end up in the *k*-th position.\n\nLet's look at the original example again. We're looking for the 4-th largest element in this array:\n\n\t[ 7, 92, 23, 9, -1, 0, 11, 6 ]\n\nThe algorithm is a bit easier to follow if we look for the k-th *smallest* item instead, so let's take `k = 4` and look for the 4-th smallest element.\n\nNote that we don't have to sort the array first. We pick one of the elements at random to be the pivot, let's say `11`, and partition the array around that. We might end up with something like this:\n\n\t[ 7, 9, -1, 0, 6, 11, 92, 23 ]\n\t <------ smaller    larger -->\n\nAs you can see, all values smaller than `11` are on the left; all values larger are on the right. The pivot value `11` is now in its final place. The index of the pivot is 5, so the 4-th smallest element must be in the left partition somewhere. We can ignore the rest of the array from now on:\n\n\t[ 7, 9, -1, 0, 6, x, x, x ]\n\nAgain let's pick a random pivot, let's say `6`, and partition the array around it. We might end up with something like this:\n\n\t[ -1, 0, 6, 9, 7, x, x, x ]\n\nPivot `6` ended up at index 2, so obviously the 4-th smallest item must be in the right partition. We can ignore the left partition:\n\n\t[ x, x, x, 9, 7, x, x, x ]\n\nAgain we pick a pivot value at random, let's say `9`, and partition the array:\n\n\t[ x, x, x, 7, 9, x, x, x ]\n\nThe index of pivot `9` is 4, and that's exactly the *k* we're looking for. We're done! Notice how this only took a few steps and we did not have to sort the array first.\n\nThe following function implements these ideas:\n\n```swift\npublic func randomizedSelect<T: Comparable>(_ array: [T], order k: Int) -> T {\n  var a = array\n\n  func randomPivot<T: Comparable>(_ a: inout [T], _ low: Int, _ high: Int) -> T {\n    let pivotIndex = random(min: low, max: high)\n    a.swapAt(pivotIndex, high)\n    return a[high]\n  }\n\n  func randomizedPartition<T: Comparable>(_ a: inout [T], _ low: Int, _ high: Int) -> Int {\n    let pivot = randomPivot(&a, low, high)\n    var i = low\n    for j in low..<high {\n      if a[j] <= pivot {\n        a.swapAt(i, j)\n        i += 1\n      }\n    }\n    a.swapAt(i, high)\n    return i\n  }\n\n  func randomizedSelect<T: Comparable>(_ a: inout [T], _ low: Int, _ high: Int, _ k: Int) -> T {\n    if low < high {\n      let p = randomizedPartition(&a, low, high)\n      if k == p {\n        return a[p]\n      } else if k < p {\n        return randomizedSelect(&a, low, p - 1, k)\n      } else {\n        return randomizedSelect(&a, p + 1, high, k)\n      }\n    } else {\n      return a[low]\n    }\n  }\n\n  precondition(a.count > 0)\n  return randomizedSelect(&a, 0, a.count - 1, k)\n}\n```\n\nTo keep things readable, the functionality is split into three inner functions:\n\n- `randomPivot()` picks a random number and puts it at the end of the current partition (this is a requirement of the Lomuto partitioning scheme, see the discussion on [quicksort](../Quicksort/) for more details).\n\n- `randomizedPartition()` is Lomuto's partitioning scheme from quicksort. When this completes, the randomly chosen pivot is in its final sorted position in the array. It returns the array index of the pivot.\n\n- `randomizedSelect()` does all the hard work. It first calls the partitioning function and then decides what to do next. If the index of the pivot is equal to the *k*-th number we're looking for, we're done. If `k` is less than the pivot index, it must be in the left partition and we'll recursively try again there. Likewise for when the *k*-th number must be in the right partition.\n\nPretty cool, huh? Normally quicksort is an **O(n log n)** algorithm, but because we only partition smaller and smaller slices of the array, the running time of `randomizedSelect()` works out to **O(n)**.\n\n> **Note:** This function calculates the *k*-th smallest item in the array, where *k* starts at 0. If you want the *k*-th largest item, call it with `a.count - k`.\n\n*Written by Daniel Speiser. Additions by Matthijs Hollemans.*\n"
  },
  {
    "path": "Kth Largest Element/kthLargest.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\n\nlet a = [5, 1, 3, 2, 7, 6, 4]\n\nkthLargest(a, 0)\nkthLargest(a, 1)\nkthLargest(a, 2)\nkthLargest(a, 3)\nkthLargest(a, 4)\nkthLargest(a, 5)\nkthLargest(a, 6)\nkthLargest(a, 7)\nkthLargest(a, 8)\n\nrandomizedSelect(a, order: 0)\nrandomizedSelect(a, order: 1)\nrandomizedSelect(a, order: 2)\nrandomizedSelect(a, order: 3)\nrandomizedSelect(a, order: 4)\nrandomizedSelect(a, order: 5)\nrandomizedSelect(a, order: 6)\n"
  },
  {
    "path": "Kth Largest Element/kthLargest.playground/Sources/kthLargest.swift",
    "content": "import Foundation\n\n/*\n  Returns the k-th largest value inside of an array a.\n  This is an O(n log n) solution since we sort the array.\n*/\npublic func kthLargest(_ a: [Int], _ k: Int) -> Int? {\n  let len = a.count\n  if k > 0 && k <= len {\n    let sorted = a.sorted()\n    return sorted[len - k]\n  } else {\n    return nil\n  }\n}\n\n// MARK: - Randomized selection\n\n/*\n  Returns the i-th smallest element from the array.\n\n  This works a bit like quicksort and a bit like binary search.\n\n  The partitioning step picks a random pivot and uses Lomuto's scheme to\n  rearrange the array; afterwards, this pivot is in its final sorted position.\n\n  If this pivot index equals i, we're done. If i is smaller, then we continue\n  with the left side, otherwise we continue with the right side.\n\n  Expected running time: O(n) if the elements are distinct.\n*/\npublic func randomizedSelect<T: Comparable>(_ array: [T], order k: Int) -> T {\n  var a = array\n\n  func randomPivot<T: Comparable>(_ a: inout [T], _ low: Int, _ high: Int) -> T {\n    let pivotIndex = Int.random(in: low...high)\n    a.swapAt(pivotIndex, high)\n    return a[high]\n  }\n\n  func randomizedPartition<T: Comparable>(_ a: inout [T], _ low: Int, _ high: Int) -> Int {\n    let pivot = randomPivot(&a, low, high)\n    var i = low\n    for j in low..<high {\n      if a[j] <= pivot {\n        a.swapAt(i, j)\n        i += 1\n      }\n    }\n    a.swapAt(i, high)\n    return i\n  }\n\n  func randomizedSelect<T: Comparable>(_ a: inout [T], _ low: Int, _ high: Int, _ k: Int) -> T {\n    if low < high {\n      let p = randomizedPartition(&a, low, high)\n      if k == p {\n        return a[p]\n      } else if k < p {\n        return randomizedSelect(&a, low, p - 1, k)\n      } else {\n        return randomizedSelect(&a, p + 1, high, k)\n      }\n    } else {\n      return a[low]\n    }\n  }\n\n  precondition(a.count > 0)\n  return randomizedSelect(&a, 0, a.count - 1, k)\n}\n"
  },
  {
    "path": "Kth Largest Element/kthLargest.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Kth Largest Element/kthLargest.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Kth Largest Element/kthLargest.playground/playground.xcworkspace/xcshareddata/kthLargest.xcscmblueprint",
    "content": "{\n  \"DVTSourceControlWorkspaceBlueprintPrimaryRemoteRepositoryKey\" : \"CF309AABC690F91A443043D5C69EECB0069B5411\",\n  \"DVTSourceControlWorkspaceBlueprintWorkingCopyRepositoryLocationsKey\" : {\n\n  },\n  \"DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey\" : {\n    \"CF309AABC690F91A443043D5C69EECB0069B5411\" : 9223372036854775807,\n    \"FA0506A44181383605977F2A9C8020B861F7CE04\" : 9223372036854775807\n  },\n  \"DVTSourceControlWorkspaceBlueprintIdentifierKey\" : \"6CCD70DA-EE44-4E31-98F0-6DA8B083772A\",\n  \"DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey\" : {\n    \"CF309AABC690F91A443043D5C69EECB0069B5411\" : \"swift-algorithm-club\\/\",\n    \"FA0506A44181383605977F2A9C8020B861F7CE04\" : \"\"\n  },\n  \"DVTSourceControlWorkspaceBlueprintNameKey\" : \"kthLargest\",\n  \"DVTSourceControlWorkspaceBlueprintVersion\" : 204,\n  \"DVTSourceControlWorkspaceBlueprintRelativePathToProjectKey\" : \"Kth Largest Element\\/kthLargest.playground\",\n  \"DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey\" : [\n    {\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey\" : \"https:\\/\\/github.com\\/Deeer\\/swift-algorithm-club.git\",\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey\" : \"com.apple.dt.Xcode.sourcecontrol.Git\",\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey\" : \"CF309AABC690F91A443043D5C69EECB0069B5411\"\n    },\n    {\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey\" : \"https:\\/\\/github.com\\/Deeer\\/CuteSticker.git\",\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey\" : \"com.apple.dt.Xcode.sourcecontrol.Git\",\n      \"DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey\" : \"FA0506A44181383605977F2A9C8020B861F7CE04\"\n    }\n  ]\n}"
  },
  {
    "path": "LICENSE.txt",
    "content": "Copyright (c) 2016 Matthijs Hollemans and contributors\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n"
  },
  {
    "path": "LRU Cache/LRUCache.playground/Contents.swift",
    "content": "let cache = LRUCache<String>(2)\ncache.set(\"a\", val: 1)\ncache.set(\"b\", val: 2)\ncache.get(\"a\") // returns 1\ncache.set(\"c\", val: 3) // evicts key \"b\"\ncache.get(\"b\") // returns nil (not found)\ncache.set(\"d\", val: 4) // evicts key \"a\"\ncache.get(\"a\") // returns nil (not found)\ncache.get(\"c\") // returns 3\ncache.get(\"d\") // returns 4\n"
  },
  {
    "path": "LRU Cache/LRUCache.playground/Sources/LRUCache.swift",
    "content": "//\n//  LRUCache.swift\n//  \n//\n//  Created by Kai Chen on 16/07/2017.\n//\n//\n\nimport Foundation\n\npublic class LRUCache<KeyType: Hashable> {\n    private let maxSize: Int\n    private var cache: [KeyType: Any] = [:]\n    private var priority: LinkedList<KeyType> = LinkedList<KeyType>()\n    private var key2node: [KeyType: LinkedList<KeyType>.LinkedListNode<KeyType>] = [:]\n\n    public init(_ maxSize: Int) {\n        self.maxSize = maxSize\n    }\n\n    public func get(_ key: KeyType) -> Any? {\n        guard let val = cache[key] else {\n            return nil\n        }\n\n        remove(key)\n        insert(key, val: val)\n\n        return val\n    }\n\n    public func set(_ key: KeyType, val: Any) {\n        if cache[key] != nil {\n            remove(key)\n        } else if priority.count >= maxSize, let keyToRemove = priority.last?.value {\n            remove(keyToRemove)\n        }\n\n        insert(key, val: val)\n    }\n\n    private func remove(_ key: KeyType) {\n        cache.removeValue(forKey: key)\n        guard let node = key2node[key] else {\n            return\n        }\n        priority.remove(node: node)\n        key2node.removeValue(forKey: key)\n    }\n\n    private func insert(_ key: KeyType, val: Any) {\n        cache[key] = val\n        priority.insert(key, atIndex: 0)\n        guard let first = priority.first else {\n            return\n        }\n        key2node[key] = first\n    }\n}\n"
  },
  {
    "path": "LRU Cache/LRUCache.playground/Sources/LinkedList.swift",
    "content": "public final class LinkedList<T> {\n\n    public class LinkedListNode<T> {\n        var value: T\n        var next: LinkedListNode?\n        weak var previous: LinkedListNode?\n\n        public init(value: T) {\n            self.value = value\n        }\n    }\n\n    public typealias Node = LinkedListNode<T>\n\n    fileprivate var head: Node?\n\n    public init() {}\n\n    public var isEmpty: Bool {\n        return head == nil\n    }\n\n    public var first: Node? {\n        return head\n    }\n\n    public var last: Node? {\n        if var node = head {\n            while let next = node.next {\n                node = next\n            }\n            return node\n        } else {\n            return nil\n        }\n    }\n\n    public var count: Int {\n        if var node = head {\n            var c = 1\n            while let next = node.next {\n                node = next\n                c += 1\n            }\n            return c\n        } else {\n            return 0\n        }\n    }\n\n    public func node(atIndex index: Int) -> Node? {\n        if index >= 0 {\n            var node = head\n            var i = index\n            while node != nil {\n                if i == 0 { return node }\n                i -= 1\n                node = node!.next\n            }\n        }\n        return nil\n    }\n\n    public subscript(index: Int) -> T {\n        let node = self.node(atIndex: index)\n        assert(node != nil)\n        return node!.value\n    }\n\n    public func append(_ value: T) {\n        let newNode = Node(value: value)\n        self.append(newNode)\n    }\n\n    public func append(_ node: Node) {\n        let newNode = LinkedListNode(value: node.value)\n        if let lastNode = last {\n            newNode.previous = lastNode\n            lastNode.next = newNode\n        } else {\n            head = newNode\n        }\n    }\n\n    public func append(_ list: LinkedList) {\n        var nodeToCopy = list.head\n        while let node = nodeToCopy {\n            self.append(node.value)\n            nodeToCopy = node.next\n        }\n    }\n\n    private func nodesBeforeAndAfter(index: Int) -> (Node?, Node?) {\n        assert(index >= 0)\n\n        var i = index\n        var next = head\n        var prev: Node?\n\n        while next != nil && i > 0 {\n            i -= 1\n            prev = next\n            next = next!.next\n        }\n        assert(i == 0)  // if > 0, then specified index was too large\n\n        return (prev, next)\n    }\n\n    public func insert(_ value: T, atIndex index: Int) {\n        let newNode = Node(value: value)\n        self.insert(newNode, atIndex: index)\n    }\n\n    public func insert(_ node: Node, atIndex index: Int) {\n        let (prev, next) = nodesBeforeAndAfter(index: index)\n        let newNode = LinkedListNode(value: node.value)\n        newNode.previous = prev\n        newNode.next = next\n        prev?.next = newNode\n        next?.previous = newNode\n\n        if prev == nil {\n            head = newNode\n        }\n    }\n\n    public func insert(_ list: LinkedList, atIndex index: Int) {\n        if list.isEmpty { return }\n        var (prev, next) = nodesBeforeAndAfter(index: index)\n        var nodeToCopy = list.head\n        var newNode: Node?\n        while let node = nodeToCopy {\n            newNode = Node(value: node.value)\n            newNode?.previous = prev\n            if let previous = prev {\n                previous.next = newNode\n            } else {\n                self.head = newNode\n            }\n            nodeToCopy = nodeToCopy?.next\n            prev = newNode\n        }\n        prev?.next = next\n        next?.previous = prev\n    }\n\n    public func removeAll() {\n        head = nil\n    }\n\n    @discardableResult public func remove(node: Node) -> T {\n        let prev = node.previous\n        let next = node.next\n\n        if let prev = prev {\n            prev.next = next\n        } else {\n            head = next\n        }\n        next?.previous = prev\n\n        node.previous = nil\n        node.next = nil\n        return node.value\n    }\n\n    @discardableResult public func removeLast() -> T {\n        assert(!isEmpty)\n        return remove(node: last!)\n    }\n\n    @discardableResult public func remove(atIndex index: Int) -> T {\n        let node = self.node(atIndex: index)\n        assert(node != nil)\n        return remove(node: node!)\n    }\n}\n\nextension LinkedList: CustomStringConvertible {\n    public var description: String {\n        var s = \"[\"\n        var node = head\n        while node != nil {\n            s += \"\\(node!.value)\"\n            node = node!.next\n            if node != nil { s += \", \" }\n        }\n        return s + \"]\"\n    }\n}\n\nextension LinkedList {\n    public func reverse() {\n        var node = head\n        while let currentNode = node {\n            node = currentNode.next\n            swap(&currentNode.next, &currentNode.previous)\n            head = currentNode\n        }\n    }\n}\n\nextension LinkedList {\n    public func map<U>(transform: (T) -> U) -> LinkedList<U> {\n        let result = LinkedList<U>()\n        var node = head\n        while node != nil {\n            result.append(transform(node!.value))\n            node = node!.next\n        }\n        return result\n    }\n\n    public func filter(predicate: (T) -> Bool) -> LinkedList<T> {\n        let result = LinkedList<T>()\n        var node = head\n        while node != nil {\n            if predicate(node!.value) {\n                result.append(node!.value)\n            }\n            node = node!.next\n        }\n        return result\n    }\n}\n\nextension LinkedList {\n    convenience init(array: Array<T>) {\n        self.init()\n\n        for element in array {\n            self.append(element)\n        }\n    }\n}\n\nextension LinkedList: ExpressibleByArrayLiteral {\n  public convenience init(arrayLiteral elements: T...) {\n    self.init()\n\n    for element in elements {\n      self.append(element)\n    }\n  }\n}\n"
  },
  {
    "path": "LRU Cache/LRUCache.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "LRU Cache/LRUCache.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "LRU Cache/LRUCache.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "LRU Cache/LRUCache.swift",
    "content": "//\n//  LRUCache.swift\n//\n//\n//  Created by Kai Chen on 16/07/2017.\n//\n//\n\nimport Foundation\n\npublic class LRUCache<KeyType: Hashable> {\n  private let maxSize: Int\n  private var cache: [KeyType: Any] = [:]\n  private var priority: LinkedList<KeyType> = LinkedList<KeyType>()\n  private var key2node: [KeyType: LinkedList<KeyType>.LinkedListNode<KeyType>] = [:]\n  \n  public init(_ maxSize: Int) {\n    self.maxSize = maxSize\n  }\n  \n  public func get(_ key: KeyType) -> Any? {\n    guard let val = cache[key] else {\n      return nil\n    }\n    \n    remove(key)\n    insert(key, val: val)\n    \n    return val\n  }\n  \n  public func set(_ key: KeyType, val: Any) {\n    if cache[key] != nil {\n      remove(key)\n    } else if priority.count >= maxSize, let keyToRemove = priority.last?.value {\n      remove(keyToRemove)\n    }\n    \n    insert(key, val: val)\n  }\n  \n  private func remove(_ key: KeyType) {\n    cache.removeValue(forKey: key)\n    guard let node = key2node[key] else {\n      return\n    }\n    priority.remove(node: node)\n    key2node.removeValue(forKey: key)\n  }\n  \n  private func insert(_ key: KeyType, val: Any) {\n    cache[key] = val\n    priority.insert(key, atIndex: 0)\n    guard let first = priority.first else {\n      return\n    }\n    key2node[key] = first\n  }\n}\n"
  },
  {
    "path": "LRU Cache/Readme.md",
    "content": "# LRU Cache\n\nCaches are used to hold objects in memory. A caches size is finite; If the system doesn't have enough memory, the cache must be purged or the program will crash. [Least Recently Used][1] (LRU) is a popular algorithm in cache design.\n\nIn this implementation of the LRU Cache, a size is declared during instantiation, and any insertions that go beyond the size will purge the least recently used element of the cache. A *priority queue* is used to enforce this behavior.\n\n## The priority queue\n\nThe key to the LRU cache is the priority queue. For simplicity, you'll model the queue using a linked list. All interactions with the LRU cache should respect this queue; Calling `get` and `set` should update the priority queue to reflect the most recently accessed element.\n\n### Interesting tidbits\n\n\n#### Adding values\n\nEach time we access an element, either `set` or `get` we need to insert the element in the head of priority list. We use a helper method to handle this procedure:\n\n```swift\nprivate func insert(_ key: KeyType, val: Any) {\n\tcache[key] = val\n\tpriority.insert(key, atIndex: 0)\n\tguard let first = priority.first else {\n\t\treturn\n\t}\n\tkey2node[key] = first\n}\n```\n\n#### Purging the cache\n\nWhen the cache is full, a purge must take place starting with the least recently used element. In this case, we need to `remove` the lowest priority node. The operation is like this:\n\n```swift\nprivate func remove(_ key: KeyType) {\n\tcache.removeValue(key)\n\tguard let node = key2node[key] else {\n\t\treturn\n\t}\n\tpriority.remove(node)\n\tkey2node.removeValue(key)\n}\n```\n\n### Optimizing Performance\n\nRemoving elements from the priority queue is a frequent operation for the LRU cache. Since priority queue is modelled using a linked list, this is an expensive operation that costs `O(n)` time. This is the bottleneck for both the `set` and `get` methods.\n\nTo help alleviate this problem, a hash table is used to store the references of each node:\n\n```\nprivate var key2node: [KeyType: LinkedList<KeyType>.LinkedListNode<KeyType>] = [:]\n```\n\n*Written for the Swift Algorithm Club by Kai Chen, with additions by Kelvin Lau*\n\n\n[1]:\thttps://en.wikipedia.org/wiki/Cache_replacement_policies#LRU\n"
  },
  {
    "path": "Linear Regression/LinearRegression.playground/Contents.swift",
    "content": "// Linear Regression\n\nimport Foundation\n\nlet carAge: [Double] = [10, 8, 3, 3, 2, 1]\nlet carPrice: [Double] = [500, 400, 7000, 8500, 11000, 10500]\nvar intercept = 0.0\nvar slope = 0.0\n\nfunc predictedCarPrice(_ carAge: Double) -> Double {\n    return intercept + slope * carAge\n}\n\n// An iterative approach\n\nlet numberOfCarAdvertsWeSaw = carPrice.count\nlet numberOfIterations = 100\nlet alpha = 0.0001\n\nfor _ in 1...numberOfIterations {\n    for i in 0..<numberOfCarAdvertsWeSaw {\n        let difference = carPrice[i] - predictedCarPrice(carAge[i])\n        intercept += alpha * difference\n        slope += alpha * difference * carAge[i]\n    }\n}\n\nprint(\"A car age of 4 years is predicted to be worth £\\(Int(predictedCarPrice(4)))\")\n\n// A closed form solution\n\nfunc average(_ input: [Double]) -> Double {\n    return input.reduce(0, +) / Double(input.count)\n}\n\nfunc multiply(_ a: [Double], _ b: [Double]) -> [Double] {\n    return zip(a, b).map(*)\n}\n\nfunc linearRegression(_ xs: [Double], _ ys: [Double]) -> (Double) -> Double {\n    let sum1 = average(multiply(xs, ys)) - average(xs) * average(ys)\n    let sum2 = average(multiply(xs, xs)) - pow(average(xs), 2)\n    let slope = sum1 / sum2\n    let intercept = average(ys) - slope * average(xs)\n    return { x in intercept + slope * x }\n}\n\nlet result = linearRegression(carAge, carPrice)(4)\n\nprint(\"A car of age 4 years is predicted to be worth £\\(Int(result))\")\n"
  },
  {
    "path": "Linear Regression/LinearRegression.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Linear Regression/LinearRegression.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Linear Regression/README.markdown",
    "content": "# Linear Regression\n\nLinear regression is a technique for creating a model of the relationship between two (or more) variable quantities.\n\nFor example, let's say we are planning to sell a car. We are not sure how much money to ask for. So we look at recent advertisments for the asking prices of other cars. There are a lot of variables we could look at - for example: make, model, engine size. To simplify our task, we collect data on just the age of the car and the price:\n\nAge (in years)| Price (in £)\n--------------|-------------\n10 | 500\n8 | 400\n3 | 7,000\n3 | 8,500\n2 | 11,000\n1 | 10,500\n\nOur car is 4 years old. How can we set a price for our car based on the data in this table?\n\nLet's start by looking at the data plotted out:\n\n![graph1](Images/graph1.png)\n\nWe could imagine a straight line drawn through the points on this graph. It's not (in this case) going to go exactly through every point, but we could place the line so that it goes as close to all the points as possible.\n\nTo say this in another way, we want to make the distance from the line to each point as small as possible. This is most often done by minimizing the square of the distance from the line to each point.\n\nWe can describe the straight line in terms of two variables:\n\n1. The point at which it crosses the y-axis i.e. the predicted price of a brand new car. This is the *intercept*.\n2. The *slope* of the line - i.e. for every year of age, how much does the price change.\n\nThis is the equation for our line:\n\n`carPrice = slope * carAge + intercept`\n\n\nHow can we find the best values for the intercept and the slope? Let's look at two different ways to do this.\n\n## An iterative approach\nOne approach is to start with some arbitrary values for the intercept and the slope. We work out what small changes we make to these values to move our line closer to the data points. Then we repeat this multiple times. Eventually our line will approach the optimum position.\n\nFirst let's set up our data structures. We will use two Swift arrays for the car age and the car price:\n\n```swift\nlet carAge: [Double] = [10, 8, 3, 3, 2, 1]\nlet carPrice: [Double] = [500, 400, 7000, 8500, 11000, 10500]\n```\n\nThis is how we can represent our straight line:\n\n```swift\nvar intercept = 0.0\nvar slope = 0.0\nfunc predictedCarPrice(_ carAge: Double) -> Double {\n    return intercept + slope * carAge\n}\n\n```\nNow for the code which will perform the iterations:\n\n```swift\nlet numberOfCarAdvertsWeSaw = carPrice.count\nlet numberOfIterations = 100\nlet alpha = 0.0001\n\nfor _ in 1...numberOfIterations {\n    for i in 0..<numberOfCarAdvertsWeSaw {\n        let difference = carPrice[i] - predictedCarPrice(carAge[i])\n        intercept += alpha * difference\n        slope += alpha * difference * carAge[i]\n    }\n}\n```\n\n```alpha``` is a factor that determines how much closer we move to the correct solution with each iteration. If this factor is too large then our program will not converge on the correct solution.\n\nThe program loops through each data point (each car age and car price). For each data point it adjusts the intercept and the slope to bring them closer to the correct values. The equations used in the code to adjust the intercept and the slope are based on moving in the direction of the maximal reduction of these variables. This is a *gradient descent*.\n\nWe want to minimize the square of the distance between the line and the points. We define a function `J` which represents this distance - for simplicity we consider only one point here. This function `J` is proportional to `((slope * carAge + intercept) - carPrice)) ^ 2`.\n\nIn order to move in the direction of maximal reduction, we take the partial derivative of this function with respect to the slope, and similarly for the intercept. We multiply these derivatives by our factor alpha and then use them to adjust the values of slope and intercept on each iteration.\n\nLooking at the code, it intuitively makes sense - the larger the difference between the current predicted car Price and the actual car price, and the larger the value of ```alpha```, the greater the adjustments to the intercept and the slope.\n\nIt can take a lot of iterations to approach the ideal values. Let's look at how the intercept and slope change as we increase the number of iterations:\n\nIterations | Intercept | Slope | Predicted value of a 4 year old car\n:---------:|:---------:|:-----:|:------------------------:\n0 | 0 | 0 | 0\n2000 | 4112 | -113 | 3659 \n6000 | 8564 | -764 | 5507 \n10000 | 10517 | -1049 | 6318 \n14000 | 11374 | -1175 | 6673 \n18000 | 11750 | -1230 | 6829 \n\nHere is the same data shown as a graph. Each of the blue lines on the graph represents a row in the table above.\n\n![graph2](Images/graph2.png)\n\nAfter 18,000 iterations it looks as if the line is getting closer to what we would expect (just by looking) to be the correct line of best fit. Also, each additional 2,000 iterations has less and less effect on the final result - the values of the intercept and the slope are converging on the correct values.\n\n## A closed form solution\n\nThere is another way we can calculate the line of best fit, without having to do multiple iterations. We can solve the equations describing the least squares minimisation and just work out the intercept and slope directly. \n\nFirst we need some helper functions. This one calculates the average (the mean) of an array of Doubles:\n\n```swift\nfunc average(_ input: [Double]) -> Double {\n    return input.reduce(0, +) / Double(input.count)\n}\n```\nWe are using the ```reduce``` Swift function to sum up all the elements of the array, and then divide that by the number of elements. This gives us the mean value.\n\nWe also need to be able to multiply each element in an array by the corresponding element in another array, to create a new array. Here is a function which will do this:\n\n```swift\nfunc multiply(_ a: [Double], _ b: [Double]) -> [Double] {\n    return zip(a,b).map(*)\n}\n```\n\nWe are using the ```map``` function to multiply each element.\n\nFinally, the function which fits the line to the data:\n\n```swift\nfunc linearRegression(_ xs: [Double], _ ys: [Double]) -> (Double) -> Double {\n    let sum1 = average(multiply(ys, xs)) - average(xs) * average(ys)\n    let sum2 = average(multiply(xs, xs)) - pow(average(xs), 2)\n    let slope = sum1 / sum2\n    let intercept = average(ys) - slope * average(xs)\n    return { x in intercept + slope * x }\n}\n```\nThis function takes as arguments two arrays of Doubles, and returns a function which is the line of best fit. The formulas to calculate the slope and the intercept can be derived from our definition of the function `J`. Let's see how the output from this line fits our data:\n\n![graph3](Images/graph3.png)\n\nUsing this line, we would predict a price for our 4 year old car of £6952.\n\n\n## Summary\nWe've seen two different ways to implement a simple linear regression in Swift. An obvious question is: why bother with the iterative approach at all? \n\nWell, the line we've found doesn't fit the data perfectly. For one thing, the graph includes some negative values at high car ages! Possibly we would have to pay someone to tow away a very old car... but really these negative values just show that we have not modelled the real life situation very accurately. The relationship between the car age and the car price is not linear but instead is some other function. We also know that a car's price is not just related to its age but also other factors such as the make, model and engine size of the car. We would need to use additional variables to describe these other factors. \n\nIt turns out that in some of these more complicated models, the iterative approach is the only viable or efficient approach. This can also occur when the arrays of data are very large and may be sparsely populated with data values.\n\n*Written for Swift Algorithm Club by James Harrop*\n"
  },
  {
    "path": "Linear Search/LinearSearch.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\nfunc linearSearch<T: Equatable>(_ array: [T], _ object: T) -> Int? {\n    for (index, obj) in array.enumerated() where obj == object {\n        return index\n    }\n    return nil\n}\n\nlet array = [5, 2, 4, 7]\nlinearSearch(array, 2) \t// returns 1\nlinearSearch(array, 3) \t// returns nil\n"
  },
  {
    "path": "Linear Search/LinearSearch.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Linear Search/LinearSearch.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Linear Search/LinearSearch.swift",
    "content": "func linearSearch<T: Equatable>(_ array: [T], _ object: T) -> Int? {\n  for (index, obj) in array.enumerated() where obj == object {\n    return index\n  }\n  return nil\n}\n\nfunc linearSearch1<T: Equatable>(_ array: [T], _ object: T) -> Array<T>.Index? {\n    return array.index { $0 == object }\n}\n"
  },
  {
    "path": "Linear Search/README.markdown",
    "content": "# Linear Search\n\nGoal: Find a particular value in an array.\n\nWe have an array of generic objects. With linear search, we iterate over all the objects in the array and compare each one to the object we're looking for. If the two objects are equal, we stop and return the current array index. If not, we continue to look for the next object as long as we have objects in the array.\n\n## An example\n\nLet's say we have an array of numbers `[5, 2, 4, 7]` and we want to check if the array contains the number `2`.\n\nWe start by comparing the first number in the array, `5`, to the number we're looking for, `2`. They are obviously not the same, and so we continue to the next array element.\n\nWe compare the number `2` from the array to our number `2` and notice they are equal. Now we can stop our iteration and return 1, which is the index of the number `2` in the array.\n\n## The code\n\nHere is a simple implementation of linear search in Swift:\n\n```swift\nfunc linearSearch<T: Equatable>(_ array: [T], _ object: T) -> Int? {\n  for (index, obj) in array.enumerated() where obj == object {\n    return index\n  }\n  return nil\n}\n```\n\nPut this code in a playground and test it like so:\n\n```swift\nlet array = [5, 2, 4, 7]\nlinearSearch(array, 2) \t// This will return 1\n```\n\n## Performance\n\nLinear search runs at **O(n)**. It compares the object we are looking for with each object in the array and so the time it takes is proportional to the array length. In the worst case, we need to look at all the elements in the array.\n\nThe best-case performance is **O(1)** but this case is rare because the object we're looking for has to be positioned at the start of the array to be immediately found. You might get lucky, but most of the time you won't. On average, linear search needs to look at half the objects in the array.\n\n## See also\n\n[Linear search on Wikipedia](https://en.wikipedia.org/wiki/Linear_search)\n\n*Written by [Patrick Balestra](http://www.github.com/BalestraPatrick)*\n"
  },
  {
    "path": "Linked List/LinkedList.playground/Contents.swift",
    "content": "//: # Linked Lists\n\n// For best results, don't forget to select \"Show Rendered Markup\" from XCode's \"Editor\" menu\n\n//: Linked List Class Declaration:\n\npublic final class LinkedList<T> {\n    \n    /// Linked List's Node Class Declaration\n    public class LinkedListNode<T> {\n        var value: T\n        var next: LinkedListNode?\n        weak var previous: LinkedListNode?\n        \n        public init(value: T) {\n            self.value = value\n        }\n    }\n    \n    /// Typealiasing the node class to increase readability of code\n    public typealias Node = LinkedListNode<T>\n    \n    \n    /// The head of the Linked List\n    private(set) var head: Node?\n    \n    /// Computed property to iterate through the linked list and return the last node in the list (if any)\n    public var last: Node? {\n        guard var node = head else {\n            return nil\n        }\n        \n        while let next = node.next {\n            node = next\n        }\n        return node\n    }\n    \n    /// Computed property to check if the linked list is empty\n    public var isEmpty: Bool {\n        return head == nil\n    }\n    \n    /// Computed property to iterate through the linked list and return the total number of nodes\n    public var count: Int {\n        guard var node = head else {\n            return 0\n        }\n        \n        var count = 1\n        while let next = node.next {\n            node = next\n            count += 1\n        }\n        return count\n    }\n    \n    /// Default initializer\n    public init() {}\n    \n    \n    /// Subscript function to return the node at a specific index\n    ///\n    /// - Parameter index: Integer value of the requested value's index\n    public subscript(index: Int) -> T {\n        let node = self.node(at: index)\n        return node.value\n    }\n    \n    /// Function to return the node at a specific index. Crashes if index is out of bounds (0...self.count)\n    ///\n    /// - Parameter index: Integer value of the node's index to be returned\n    /// - Returns: LinkedListNode\n    public func node(at index: Int) -> Node {\n        assert(head != nil, \"List is empty\")\n        assert(index >= 0, \"index must be greater than 0\")\n        \n        if index == 0 {\n            return head!\n        } else {\n            var node = head!.next\n            for _ in 1..<index {\n                node = node?.next\n                if node == nil {\n                    break\n                }\n            }\n            \n            assert(node != nil, \"index is out of bounds.\")\n            return node!\n        }\n    }\n    \n    /// Append a value to the end of the list\n    ///\n    /// - Parameter value: The data value to be appended\n    public func append(_ value: T) {\n        let newNode = Node(value: value)\n        append(newNode)\n    }\n    \n    /// Append a copy of a LinkedListNode to the end of the list.\n    ///\n    /// - Parameter node: The node containing the value to be appended\n    public func append(_ node: Node) {\n        let newNode = node\n        if let lastNode = last {\n            newNode.previous = lastNode\n            lastNode.next = newNode\n        } else {\n            head = newNode\n        }\n    }\n    \n    /// Append a copy of a LinkedList to the end of the list.\n    ///\n    /// - Parameter list: The list to be copied and appended.\n    public func append(_ list: LinkedList) {\n        var nodeToCopy = list.head\n        while let node = nodeToCopy {\n            append(node.value)\n            nodeToCopy = node.next\n        }\n    }\n    \n    /// Insert a value at a specific index. Crashes if index is out of bounds (0...self.count)\n    ///\n    /// - Parameters:\n    ///   - value: The data value to be inserted\n    ///   - index: Integer value of the index to be insterted at\n    public func insert(_ value: T, at index: Int) {\n        let newNode = Node(value: value)\n        insert(newNode, at: index)\n    }\n    \n    /// Insert a copy of a node at a specific index. Crashes if index is out of bounds (0...self.count)\n    ///\n    /// - Parameters:\n    ///   - node: The node containing the value to be inserted\n    ///   - index: Integer value of the index to be inserted at\n    public func insert(_ newNode: Node, at index: Int) {\n        if index == 0 {\n            newNode.next = head\n            head?.previous = newNode\n            head = newNode\n        } else {\n            let prev = node(at: index - 1)\n            let next = prev.next\n            newNode.previous = prev\n            newNode.next = next\n            next?.previous = newNode\n            prev.next = newNode\n        }\n    }\n    \n    /// Insert a copy of a LinkedList at a specific index. Crashes if index is out of bounds (0...self.count)\n    ///\n    /// - Parameters:\n    ///   - list: The LinkedList to be copied and inserted\n    ///   - index: Integer value of the index to be inserted at\n    public func insert(_ list: LinkedList, at index: Int) {\n        if list.isEmpty { return }\n        \n        if index == 0 {\n            list.last?.next = head\n            head = list.head\n        } else {\n            let prev = node(at: index - 1)\n            let next = prev.next\n            \n            prev.next = list.head\n            list.head?.previous = prev\n            \n            list.last?.next = next\n            next?.previous = list.last\n        }\n    }\n    \n    /// Function to remove all nodes/value from the list\n    public func removeAll() {\n        head = nil\n    }\n    \n    /// Function to remove a specific node.\n    ///\n    /// - Parameter node: The node to be deleted\n    /// - Returns: The data value contained in the deleted node.\n    @discardableResult public func remove(node: Node) -> T {\n        let prev = node.previous\n        let next = node.next\n        \n        if let prev = prev {\n            prev.next = next\n        } else {\n            head = next\n        }\n        next?.previous = prev\n        \n        node.previous = nil\n        node.next = nil\n        return node.value\n    }\n    \n    /// Function to remove the last node/value in the list. Crashes if the list is empty\n    ///\n    /// - Returns: The data value contained in the deleted node.\n    @discardableResult public func removeLast() -> T {\n        assert(!isEmpty)\n        return remove(node: last!)\n    }\n    \n    /// Function to remove a node/value at a specific index. Crashes if index is out of bounds (0...self.count)\n    ///\n    /// - Parameter index: Integer value of the index of the node to be removed\n    /// - Returns: The data value contained in the deleted node\n    @discardableResult public func remove(at index: Int) -> T {\n        let node = self.node(at: index)\n        return remove(node: node)\n    }\n}\n\n//: End of the base class declarations & beginning of extensions' declarations:\n\n// MARK: - Extension to enable the standard conversion of a list to String \nextension LinkedList: CustomStringConvertible {\n    public var description: String {\n        var s = \"[\"\n        var node = head\n        while let nd = node {\n            s += \"\\(nd.value)\"\n            node = nd.next\n            if node != nil { s += \", \" }\n        }\n        return s + \"]\"\n    }\n}\n\n// MARK: - Extension to add a 'reverse' function to the list\nextension LinkedList {\n    public func reverse() {\n        var node = head\n        while let currentNode = node {\n            node = currentNode.next\n            swap(&currentNode.next, &currentNode.previous)\n            head = currentNode\n        }\n    }\n}\n\n// MARK: - An extension with an implementation of 'map' & 'filter' functions\nextension LinkedList {\n    public func map<U>(transform: (T) -> U) -> LinkedList<U> {\n        let result = LinkedList<U>()\n        var node = head\n        while let nd = node {\n            result.append(transform(nd.value))\n            node = nd.next\n        }\n        return result\n    }\n    \n    public func filter(predicate: (T) -> Bool) -> LinkedList<T> {\n        let result = LinkedList<T>()\n        var node = head\n        while let nd = node {\n            if predicate(nd.value) {\n                result.append(nd.value)\n            }\n            node = nd.next\n        }\n        return result\n    }\n}\n\n// MARK: - Extension to enable initialization from an Array\nextension LinkedList {\n    convenience init(array: Array<T>) {\n        self.init()\n        \n        array.forEach { append($0) }\n    }\n}\n\n// MARK: - Extension to enable initialization from an Array Literal\nextension LinkedList: ExpressibleByArrayLiteral {\n    public convenience init(arrayLiteral elements: T...) {\n        self.init()\n        \n        elements.forEach { append($0) }\n    }\n}\n\n// MARK: - Collection\nextension LinkedList: Collection {\n    \n    public typealias Index = LinkedListIndex<T>\n    \n    /// The position of the first element in a nonempty collection.\n    ///\n    /// If the collection is empty, `startIndex` is equal to `endIndex`.\n    /// - Complexity: O(1)\n    public var startIndex: Index {\n        get {\n            return LinkedListIndex<T>(node: head, tag: 0)\n        }\n    }\n    \n    /// The collection's \"past the end\" position---that is, the position one\n    /// greater than the last valid subscript argument.\n    /// - Complexity: O(n), where n is the number of elements in the list. This can be improved by keeping a reference\n    ///   to the last node in the collection.\n    public var endIndex: Index {\n        get {\n            if let h = self.head {\n                return LinkedListIndex<T>(node: h, tag: count)\n            } else {\n                return LinkedListIndex<T>(node: nil, tag: startIndex.tag)\n            }\n        }\n    }\n    \n    public subscript(position: Index) -> T {\n        get {\n            return position.node!.value\n        }\n    }\n    \n    public func index(after idx: Index) -> Index {\n        return LinkedListIndex<T>(node: idx.node?.next, tag: idx.tag + 1)\n    }\n}\n\n// MARK: - Collection Index\n/// Custom index type that contains a reference to the node at index 'tag'\npublic struct LinkedListIndex<T>: Comparable {\n    fileprivate let node: LinkedList<T>.LinkedListNode<T>?\n    fileprivate let tag: Int\n    \n    public static func==<T>(lhs: LinkedListIndex<T>, rhs: LinkedListIndex<T>) -> Bool {\n        return (lhs.tag == rhs.tag)\n    }\n    \n    public static func< <T>(lhs: LinkedListIndex<T>, rhs: LinkedListIndex<T>) -> Bool {\n        return (lhs.tag < rhs.tag)\n    }\n}\n//: Ok, now that the declarations are done, let's see our Linked List in action:\nlet list = LinkedList<String>()\nlist.isEmpty                  // true\nlist.head                    // nil\nlist.last                     // nil\n\nlist.append(\"Hello\")\nlist.isEmpty                  // false\nlist.head!.value             // \"Hello\"\nlist.last!.value              // \"Hello\"\nlist.count                    // 1\n\nlist.append(\"World\")\nlist.head!.value             // \"Hello\"\nlist.last!.value              // \"World\"\nlist.count                    // 2\n\nlist.head!.previous          // nil\nlist.head!.next!.value       // \"World\"\nlist.last!.previous!.value    // \"Hello\"\nlist.last!.next               // nil\n\nlist.node(at: 0).value    // \"Hello\"\nlist.node(at: 1).value    // \"World\"\n//list.node(at: 2)           // crash!\n\nlist[0]     // \"Hello\"\nlist[1]     // \"World\"\n//list[2]   // crash!\n\nlet list2 = LinkedList<String>()\nlist2.append(\"Goodbye\")\nlist2.append(\"World\")\nlist.append(list2)            // [Hello, World, Goodbye, World]\nlist2.removeAll()             // [ ]\nlist2.isEmpty                 // true\nlist.removeLast()             // \"World\"\nlist.remove(at: 2)       // \"Goodbye\"\n\nlist.insert(\"Swift\", at: 1)\nlist[0]     // \"Hello\"\nlist[1]     // \"Swift\"\nlist[2]     // \"World\"\nprint(list)\n\nlist.reverse()   // [World, Swift, Hello]\n\nlist.node(at: 0).value = \"Universe\"\nlist.node(at: 1).value = \"Swifty\"\nlet m = list.map { s in s.count }\nm    // [8, 6, 5]\nlet f = list.filter { s in s.count > 5 }\nf    // [Universe, Swifty]\n\nlist.remove(node: list.head!) // \"Universe\"\nlist.count                     // 2\nlist[0]                        // \"Swifty\"\nlist[1]                        // \"Hello\"\n\nlist.count                     // 2\nlist.removeLast()              // \"Hello\"\nlist.head?.value\nlist.count                     // 1\nlist[0]                        // \"Swifty\"\n\nlist.remove(at: 0)        // \"Swifty\"\nlist.count                     // 0\n\nlet list3 = LinkedList<String>()\nlist3.insert(\"2\", at: 0) // [2]\nlist3.count                   // 1\nlist3.insert(\"4\", at: 1) // [2,4]\nlist3.count                   // 2\nlist3.insert(\"5\", at: 2) // [2,4,5]\nlist3.count                   // 3\nlist3.insert(\"3\", at: 1) // [2,3,4,5]\nlist3.insert(\"1\", at: 0) // [1,2,3,4,5]\n\nlet list4 = LinkedList<String>()\nlist4.insert(list3, at: 0) // [1,2,3,4,5]\nlist4.count                     // 5\n\nlet list5 = LinkedList<String>()\nlist5.append(\"0\")                // [0]\nlist5.insert(\"End\", at:1)   // [0,End]\nlist5.count                      // 2\nlist5.insert(list4, at: 1)  // [0,1,2,3,4,5,End]\nlist5.count                      // 7\n\n\nlet linkedList: LinkedList<Int> = [1, 2, 3, 4] // [1, 2, 3, 4]\nlinkedList.count               // 4\nlinkedList[0]                  // 1\n\n// Infer the type from the array\nlet listArrayLiteral2: LinkedList = [\"Swift\", \"Algorithm\", \"Club\"]\nlistArrayLiteral2.count        // 3\nlistArrayLiteral2[0]           // \"Swift\"\nlistArrayLiteral2.removeLast()  // \"Club\"\n\n\n// Conformance to the Collection protocol\nlet collection: LinkedList<Int> = [1, 2, 3, 4, 5]\nlet index2 = collection.index(collection.startIndex, offsetBy: 2)\nlet value = collection[index2] // 3\n\n// Iterating in a for loop, since the Sequence protocol allows this.\nvar sum = 0\nfor element in collection {\n    sum += element\n}\nsum //15\n\n// Another way of achieving the same result though 'reduce', another method defined in an extension of Sequence. Collections are Sequences.\nlet result = collection.reduce(0) {$0 + $1} // 15\n\n\n\n\n"
  },
  {
    "path": "Linked List/LinkedList.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx' display-mode='rendered' last-migration='1000'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Linked List/LinkedList.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Linked List/LinkedList.swift",
    "content": "public final class LinkedList<T> {\n    \n    /// Linked List's Node Class Declaration\n    public class LinkedListNode<T> {\n        var value: T\n        var next: LinkedListNode?\n        weak var previous: LinkedListNode?\n        \n        public init(value: T) {\n            self.value = value\n        }\n    }\n    \n    /// Typealiasing the node class to increase readability of code\n    public typealias Node = LinkedListNode<T>\n    \n    \n    /// The head of the Linked List\n    private(set) var head: Node?\n    \n    /// Computed property to iterate through the linked list and return the last node in the list (if any)\n    public var last: Node? {\n        guard var node = head else {\n            return nil\n        }\n        \n        while let next = node.next {\n            node = next\n        }\n        return node\n    }\n    \n    /// Computed property to check if the linked list is empty\n    public var isEmpty: Bool {\n        return head == nil\n    }\n    \n    /// Computed property to iterate through the linked list and return the total number of nodes\n    public var count: Int {\n        guard var node = head else {\n            return 0\n        }\n        \n        var count = 1\n        while let next = node.next {\n            node = next\n            count += 1\n        }\n        return count\n    }\n    \n    /// Default initializer\n    public init() {}\n    \n    \n    /// Subscript function to return the node at a specific index\n    ///\n    /// - Parameter index: Integer value of the requested value's index\n    public subscript(index: Int) -> T {\n        let node = self.node(at: index)\n        return node.value\n    }\n    \n    /// Function to return the node at a specific index. Crashes if index is out of bounds (0...self.count)\n    ///\n    /// - Parameter index: Integer value of the node's index to be returned\n    /// - Returns: LinkedListNode\n    public func node(at index: Int) -> Node {\n        assert(head != nil, \"List is empty\")\n        assert(index >= 0, \"index must be greater or equal to 0\")\n        \n        if index == 0 {\n            return head!\n        } else {\n            var node = head!.next\n            for _ in 1..<index {\n                node = node?.next\n                if node == nil {\n                    break\n                }\n            }\n            \n            assert(node != nil, \"index is out of bounds.\")\n            return node!\n        }\n    }\n    \n    /// Append a value to the end of the list\n    ///\n    /// - Parameter value: The data value to be appended\n    public func append(_ value: T) {\n        let newNode = Node(value: value)\n        append(newNode)\n    }\n    \n    /// Append a copy of a LinkedListNode to the end of the list.\n    ///\n    /// - Parameter node: The node containing the value to be appended\n    public func append(_ node: Node) {\n        let newNode = node\n        if let lastNode = last {\n            newNode.previous = lastNode\n            lastNode.next = newNode\n        } else {\n            head = newNode\n        }\n    }\n    \n    /// Append a copy of a LinkedList to the end of the list.\n    ///\n    /// - Parameter list: The list to be copied and appended.\n    public func append(_ list: LinkedList) {\n        var nodeToCopy = list.head\n        while let node = nodeToCopy {\n            append(node.value)\n            nodeToCopy = node.next\n        }\n    }\n    \n    /// Insert a value at a specific index. Crashes if index is out of bounds (0...self.count)\n    ///\n    /// - Parameters:\n    ///   - value: The data value to be inserted\n    ///   - index: Integer value of the index to be insterted at\n    public func insert(_ value: T, at index: Int) {\n        let newNode = Node(value: value)\n        insert(newNode, at: index)\n    }\n    \n    /// Insert a copy of a node at a specific index. Crashes if index is out of bounds (0...self.count)\n    ///\n    /// - Parameters:\n    ///   - node: The node containing the value to be inserted\n    ///   - index: Integer value of the index to be inserted at\n    public func insert(_ newNode: Node, at index: Int) {\n        if index == 0 {\n            newNode.next = head\n            head?.previous = newNode\n            head = newNode\n        } else {\n            let prev = node(at: index - 1)\n            let next = prev.next\n            newNode.previous = prev\n            newNode.next = next\n            next?.previous = newNode\n            prev.next = newNode\n        }\n    }\n    \n    /// Insert a copy of a LinkedList at a specific index. Crashes if index is out of bounds (0...self.count)\n    ///\n    /// - Parameters:\n    ///   - list: The LinkedList to be copied and inserted\n    ///   - index: Integer value of the index to be inserted at\n    public func insert(_ list: LinkedList, at index: Int) {\n        guard !list.isEmpty else { return }\n        \n        if index == 0 {\n            list.last?.next = head\n            head = list.head\n        } else {\n            let prev = node(at: index - 1)\n            let next = prev.next\n            \n            prev.next = list.head\n            list.head?.previous = prev\n            \n            list.last?.next = next\n            next?.previous = list.last\n        }\n    }\n    \n    /// Function to remove all nodes/value from the list\n    public func removeAll() {\n        head = nil\n    }\n    \n    /// Function to remove a specific node.\n    ///\n    /// - Parameter node: The node to be deleted\n    /// - Returns: The data value contained in the deleted node.\n    @discardableResult public func remove(node: Node) -> T {\n        let prev = node.previous\n        let next = node.next\n        \n        if let prev = prev {\n            prev.next = next\n        } else {\n            head = next\n        }\n        next?.previous = prev\n        \n        node.previous = nil\n        node.next = nil\n        return node.value\n    }\n    \n    /// Function to remove the last node/value in the list. Crashes if the list is empty\n    ///\n    /// - Returns: The data value contained in the deleted node.\n    @discardableResult public func removeLast() -> T {\n        assert(!isEmpty)\n        return remove(node: last!)\n    }\n    \n    /// Function to remove a node/value at a specific index. Crashes if index is out of bounds (0...self.count)\n    ///\n    /// - Parameter index: Integer value of the index of the node to be removed\n    /// - Returns: The data value contained in the deleted node\n    @discardableResult public func remove(at index: Int) -> T {\n        let node = self.node(at: index)\n        return remove(node: node)\n    }\n}\n\n//: End of the base class declarations & beginning of extensions' declarations:\n\n// MARK: - Extension to enable the standard conversion of a list to String\nextension LinkedList: CustomStringConvertible {\n    public var description: String {\n        var s = \"[\"\n        var node = head\n        while let nd = node {\n            s += \"\\(nd.value)\"\n            node = nd.next\n            if node != nil { s += \", \" }\n        }\n        return s + \"]\"\n    }\n}\n\n// MARK: - Extension to add a 'reverse' function to the list\nextension LinkedList {\n    public func reverse() {\n        var node = head\n        while let currentNode = node {\n            node = currentNode.next\n            swap(&currentNode.next, &currentNode.previous)\n            head = currentNode\n        }\n    }\n}\n\n// MARK: - An extension with an implementation of 'map' & 'filter' functions\nextension LinkedList {\n    public func map<U>(transform: (T) -> U) -> LinkedList<U> {\n        let result = LinkedList<U>()\n        var node = head\n        while let nd = node {\n            result.append(transform(nd.value))\n            node = nd.next\n        }\n        return result\n    }\n    \n    public func filter(predicate: (T) -> Bool) -> LinkedList<T> {\n        let result = LinkedList<T>()\n        var node = head\n        while let nd = node {\n            if predicate(nd.value) {\n                result.append(nd.value)\n            }\n            node = nd.next\n        }\n        return result\n    }\n}\n\n// MARK: - Extension to enable initialization from an Array\nextension LinkedList {\n    convenience init(array: Array<T>) {\n        self.init()\n        \n        array.forEach { append($0) }\n    }\n}\n\n// MARK: - Extension to enable initialization from an Array Literal\nextension LinkedList: ExpressibleByArrayLiteral {\n    public convenience init(arrayLiteral elements: T...) {\n        self.init()\n        \n        elements.forEach { append($0) }\n    }\n}\n\n// MARK: - Collection\nextension LinkedList: Collection {\n    \n    public typealias Index = LinkedListIndex<T>\n    \n    /// The position of the first element in a nonempty collection.\n    ///\n    /// If the collection is empty, `startIndex` is equal to `endIndex`.\n    /// - Complexity: O(1)\n    public var startIndex: Index {\n        get {\n            return LinkedListIndex<T>(node: head, tag: 0)\n        }\n    }\n    \n    /// The collection's \"past the end\" position---that is, the position one\n    /// greater than the last valid subscript argument.\n    /// - Complexity: O(n), where n is the number of elements in the list. This can be improved by keeping a reference\n    ///   to the last node in the collection.\n    public var endIndex: Index {\n        get {\n            if let h = self.head {\n                return LinkedListIndex<T>(node: h, tag: count)\n            } else {\n                return LinkedListIndex<T>(node: nil, tag: startIndex.tag)\n            }\n        }\n    }\n    \n    public subscript(position: Index) -> T {\n        get {\n            return position.node!.value\n        }\n    }\n    \n    public func index(after idx: Index) -> Index {\n        return LinkedListIndex<T>(node: idx.node?.next, tag: idx.tag + 1)\n    }\n}\n\n// MARK: - Collection Index\n/// Custom index type that contains a reference to the node at index 'tag'\npublic struct LinkedListIndex<T>: Comparable {\n    fileprivate let node: LinkedList<T>.LinkedListNode<T>?\n    fileprivate let tag: Int\n    \n    public static func==<T>(lhs: LinkedListIndex<T>, rhs: LinkedListIndex<T>) -> Bool {\n        return (lhs.tag == rhs.tag)\n    }\n    \n    public static func< <T>(lhs: LinkedListIndex<T>, rhs: LinkedListIndex<T>) -> Bool {\n        return (lhs.tag < rhs.tag)\n    }\n}\n\n"
  },
  {
    "path": "Linked List/README.markdown",
    "content": "# Linked List\n\n> This topic has been tutorialized [here](https://www.raywenderlich.com/144083/swift-algorithm-club-swift-linked-list-data-structure)\n\nA linked list is a sequence of data items, just like an array. But where an array allocates a big block of memory to store the objects, the elements in a linked list are totally separate objects in memory and are connected through links:\n\n\t+--------+    +--------+    +--------+    +--------+\n\t|        |    |        |    |        |    |        |\n\t| node 0 |--->| node 1 |--->| node 2 |--->| node 3 |\n\t|        |    |        |    |        |    |        |\n\t+--------+    +--------+    +--------+    +--------+\n\nThe elements of a linked list are referred to as *nodes*. The above picture shows a *singly linked list*, where each node only has a reference -- or a \"pointer\" -- to the next node. In a *doubly linked list*, shown below, nodes also have pointers to the previous node:\n\n\t+--------+    +--------+    +--------+    +--------+\n\t|        |--->|        |--->|        |--->|        |\n\t| node 0 |    | node 1 |    | node 2 |    | node 3 |\n\t|        |<---|        |<---|        |<---|        |\n\t+--------+    +--------+    +--------+    +--------+\n\nYou need to keep track of where the list begins. That's usually done with a pointer called the *head*:\n\n\t         +--------+    +--------+    +--------+    +--------+\n\thead --->|        |--->|        |--->|        |--->|        |---> nil\n\t         | node 0 |    | node 1 |    | node 2 |    | node 3 |\n\t nil <---|        |<---|        |<---|        |<---|        |<--- tail\n\t         +--------+    +--------+    +--------+    +--------+\n\nIt's also useful to have a reference to the end of the list, known as the *tail*. Note that the \"next\" pointer of the last node is `nil`, just like the \"previous\" pointer of the very first node.\n\n## Performance of linked lists\n\nMost operations on a linked list have **O(n)** time, so linked lists are generally slower than arrays. However, they are also much more flexible -- rather than having to copy large chunks of memory around as with an array, many operations on a linked list just require you to change a few pointers.\n\nThe reason for the **O(n)** time is that you can't simply write `list[2]` to access node 2 from the list. If you don't have a reference to that node already, you have to start at the `head` and work your way down to that node by following the `next` pointers (or start at the `tail` and work your way back using the `previous` pointers).\n\nBut once you have a reference to a node, operations like insertion and deletion are really quick. It's just that finding the node is slow.\n\nThis means that when you're dealing with a linked list, you should insert new items at the front whenever possible. That is an **O(1)** operation. Likewise for inserting at the back if you're keeping track of the `tail` pointer.\n\n## Singly vs doubly linked lists\n\nA singly linked list uses a little less memory than a doubly linked list because it doesn't need to store all those `previous` pointers.\n\nBut if you have a node and you need to find its previous node, you're screwed. You have to start at the head of the list and iterate through the entire list until you get to the right node.\n\nFor many tasks, a doubly linked list makes things easier.\n\n## Why use a linked list?\n\nA typical example of where to use a linked list is when you need a [queue](../Queue/). With an array, removing elements from the front of the queue is slow because it needs to shift down all the other elements in memory. But with a linked list it's just a matter of changing `head` to point to the second element. Much faster.\n\nBut to be honest, you hardly ever need to write your own linked list these days. Still, it's useful to understand how they work; the principle of linking objects together is also used with [trees](../Tree/) and [graphs](../Graph/).\n\n## The code\n\nWe'll start by defining a type to describe the nodes:\n\n```swift\npublic class LinkedListNode<T> {\n  var value: T\n  var next: LinkedListNode?\n  weak var previous: LinkedListNode?\n\n  public init(value: T) {\n    self.value = value\n  }\n}\n```\n\nThis is a generic type, so `T` can be any kind of data that you'd like to store in the node. We'll be using strings in the examples that follow.\n\nOurs is a doubly-linked list and each node has a `next` and `previous` pointer. These can be `nil` if there are no next or previous nodes, so these variables must be optionals. (In what follows, I'll point out which functions would need to change if this was just a singly- instead of a doubly-linked list.)\n\n> **Note:** To avoid ownership cycles, we declare the `previous` pointer to be weak. If you have a node `A` that is followed by node `B` in the list, then `A` points to `B` but also `B` points to `A`. In certain circumstances, this ownership cycle can cause nodes to be kept alive even after you deleted them. We don't want that, so we make one of the pointers `weak` to break the cycle.\n\nLet's start building `LinkedList`. Here's the first bit:\n\n```swift\npublic class LinkedList<T> {\n  public typealias Node = LinkedListNode<T>\n\n  private var head: Node?\n\n  public var isEmpty: Bool {\n    return head == nil\n  }\n\n  public var first: Node? {\n    return head\n  }\n}\n```\n\nIdeally, we would want a class name to be as descriptive as possible, yet, we don't want to type a long name every time we want to use the class, therefore, we're using a typealias so inside `LinkedList` we can write the shorter `Node` instead of `LinkedListNode<T>`.\n\nThis linked list only has a `head` pointer, not a tail. Adding a tail pointer is left as an exercise for the reader. (I'll point out which functions would be different if we also had a tail pointer.)\n\nThe list is empty if `head` is nil. Because `head` is a private variable, I've added the property `first` to return a reference to the first node in the list.\n\nYou can try it out in a playground like this:\n\n```swift\nlet list = LinkedList<String>()\nlist.isEmpty   // true\nlist.first     // nil\n```\n\nLet's also add a property that gives you the last node in the list. This is where it starts to become interesting:\n\n```swift\n  public var last: Node? {\n    guard var node = head else {\n      return nil\n    }\n  \n    while let next = node.next {\n      node = next\n    }\n    return node\n  }\n```\n\nIf you're new to Swift, you've probably seen `if let` but maybe not `if var`. It does the same thing -- it unwraps the `head` optional and puts the result in a new local variable named `node`. The difference is that `node` is not a constant but an actual variable, so we can change it inside the loop.\n\nThe loop also does some Swift magic. The `while let next = node.next` bit keeps looping until `node.next` is nil. You could have written this as follows:\n\n```swift\n      var node: Node? = head\n      while node != nil && node!.next != nil {\n        node = node!.next\n      }\n```\n\nBut that doesn't feel very Swifty to me. We might as well make use of Swift's built-in support for unwrapping optionals. You'll see a bunch of these kinds of loops in the code that follows.\n\n> **Note:** If we kept a tail pointer, `last` would simply do `return tail`. But we don't, so it has to step through the entire list from beginning to the end. It's an expensive operation, especially if the list is long.\n\nOf course, `last` only returns nil because we don't have any nodes in the list. Let's add a method that adds a new node to the end of the list:\n\n```swift\n  public func append(value: T) {\n    let newNode = Node(value: value)\n    if let lastNode = last {\n      newNode.previous = lastNode\n      lastNode.next = newNode\n    } else {\n      head = newNode\n    }\n  }\n```\n\nThe `append()` method first creates a new `Node` object and then asks for the last node using the `last` property we've just added. If there is no such node, the list is still empty and we make `head` point to this new `Node`. But if we did find a valid node object, we connect the `next` and `previous` pointers to link this new node into the chain. A lot of linked list code involves this kind of `next` and `previous` pointer manipulation.\n\nLet's test it in the playground:\n\n```swift\nlist.append(\"Hello\")\nlist.isEmpty         // false\nlist.first!.value    // \"Hello\"\nlist.last!.value     // \"Hello\"\n```\n\nThe list looks like this:\n\n\t         +---------+\n\thead --->|         |---> nil\n\t         | \"Hello\" |\n\t nil <---|         |\n\t         +---------+\n\nNow add a second node:\n\n```swift\nlist.append(\"World\")\nlist.first!.value    // \"Hello\"\nlist.last!.value     // \"World\"\n```\n\nAnd the list looks like:\n\n\t         +---------+    +---------+\n\thead --->|         |--->|         |---> nil\n\t         | \"Hello\" |    | \"World\" |\n\t nil <---|         |<---|         |\n\t         +---------+    +---------+\n\nYou can verify this for yourself by looking at the `next` and `previous` pointers:\n\n```swift\nlist.first!.previous          // nil\nlist.first!.next!.value       // \"World\"\nlist.last!.previous!.value    // \"Hello\"\nlist.last!.next               // nil\n```\n\nLet's add a method to count how many nodes are in the list. This will look very similar to what we did already:\n\n```swift\n  public var count: Int {\n    guard var node = head else {\n      return 0\n    }\n  \n    var count = 1\n    while let next = node.next {\n      node = next\n      count += 1\n    }\n    return count\n  }\n```\n\nIt loops through the list in the same manner but this time increments a counter as well.\n\n> **Note:** One way to speed up `count` from **O(n)** to **O(1)** is to keep track of a variable that counts how many nodes are in the list. Whenever you add or remove a node, you also update this variable.\n\nWhat if we wanted to find the node at a specific index in the list? With an array we can just write `array[index]` and it's an **O(1)** operation. It's a bit more involved with linked lists, but again the code follows a similar pattern:\n\n```swift\n  public func node(atIndex index: Int) -> Node {\n    if index == 0 {\n      return head!\n    } else {\n      var node = head!.next\n      for _ in 1..<index {\n        node = node?.next\n        if node == nil { //(*1)\n          break\n        }\n      }\n      return node!\n    }\n  }\n```\n\nFirst we check whether the given index is 0 or not. Because if it is 0, it returns the head as it is.\nHowever, when the given index is greater than 0, it starts at head then keeps following the node.next pointers to step through the list.\nThe difference from count method at this time is that there are two termination conditions.\nOne is when the for-loop statement reaches index, and we were able to acquire the node of the given index.\nThe second is when `node.next` in for-loop statement returns nil and cause break. (*1)\nThis means that the given index is out of bounds and it causes a crash.\n\nTry it out:\n\n```swift\nlist.nodeAt(0)!.value    // \"Hello\"\nlist.nodeAt(1)!.value    // \"World\"\n// list.nodeAt(2)           // crash\n```\n\nFor fun we can implement a `subscript` method too:\n\n```swift\n  public subscript(index: Int) -> T {\n    let node = node(atIndex: index)\n    return node.value\n  }\n```\n\nNow you can write the following:\n\n```swift\nlist[0]   // \"Hello\"\nlist[1]   // \"World\"\nlist[2]   // crash!\n```\n\nIt crashes on `list[2]` because there is no node at that index.\n\nSo far we've written code to add new nodes to the end of the list, but that's slow because you need to find the end of the list first. (It would be fast if we used a tail pointer.) For this reason, if the order of the items in the list doesn't matter, you should insert at the front of the list instead. That's always an **O(1)** operation.\n\n\nLet's write a method that lets you insert a new node at any index in the list.\n\n```swift\n  public func insert(_ node: Node, atIndex index: Int) {\n   let newNode = node\n   if index == 0 {\n     newNode.next = head                      \n     head?.previous = newNode\n     head = newNode\n   } else {\n     let prev = self.node(atIndex: index-1)\n     let next = prev.next\n\n     newNode.previous = prev\n     newNode.next = prev.next\n     prev.next = newNode\n     next?.previous = newNode\n   }\n}\n```\n\nAs with node(atIndex :) method, insert(_: at:) method also branches depending on whether the given index is 0 or not.\nFirst let's look at the former case. Suppose we have the following list and the new node(C).\n\n             +---------+     +---------+\n    head --->|         |---->|         |-----//----->\n             |    A    |     |    B    |\n     nil <---|         |<----|         |<----//------\n             +---------+     +---------+ \n                 [0]             [1]\n                  \n                  \n             +---------+ \n     new --->|         |----> nil\n             |    C    |\n             |         |\n             +---------+\n    \nNow put the new node before the first node. In this way: \n\n    new.next = head\n    head.previous = new\n    \n             +---------+            +---------+     +---------+\n     new --->|         |--> head -->|         |---->|         |-----//----->\n             |    C    |            |    A    |     |    B    |\n             |         |<-----------|         |<----|         |<----//------\n             +---------+            +---------+     +---------+ \n\n\nFinally, replace the head with the new node.\n\n    head = new\n    \n             +---------+    +---------+     +---------+\n    head --->|         |--->|         |---->|         |-----//----->\n             |    C    |    |    A    |     |    B    |\n     nil <---|         |<---|         |<----|         |<----//------\n             +---------+    +---------+     +---------+ \n                 [0]            [1]             [2]\n\n\nHowever, when the given index is greater than 0, it is necessary to get the node previous and next index and insert between them.\nYou can also obtain the previous and next node using node(atIndex:) as follows:\n\n             +---------+         +---------+     +---------+    \n    head --->|         |---//--->|         |---->|         |----\n             |         |         |    A    |     |    B    |    \n     nil <---|         |---//<---|         |<----|         |<---\n             +---------+         +---------+     +---------+    \n                 [0]              [index-1]        [index]      \n                                      ^               ^ \n                                      |               | \n                                     prev            next\n    \n    prev = node(at: index-1)\n    next = prev.next\n\nNow insert new node between the prev and the next.\n\n    new.prev = prev; prev.next = new  // connect prev and new.\n    new.next = next; next.prev = new  // connect new and next.\n\n             +---------+         +---------+     +---------+     +---------+\n    head --->|         |---//--->|         |---->|         |---->|         |\n             |         |         |    A    |     |    C    |     |    B    |\n     nil <---|         |---//<---|         |<----|         |<----|         |\n             +---------+         +---------+     +---------+     +---------+\n                 [0]              [index-1]        [index]        [index+1]\n                                      ^               ^               ^\n                                      |               |               |\n                                     prev            new             next\n\n\nTry it out:\n\n```swift\nlist.insert(\"Swift\", atIndex: 1)\nlist[0]     // \"Hello\"\nlist[1]     // \"Swift\"\nlist[2]     // \"World\"\n```\n\nAlso try adding new nodes to the front and back of the list, to verify that this works properly.\n> **Note:** The `node(atIndex:)` and `insert(_: atIndex:)` functions can also be used with a singly linked list because we don't depend on the node's `previous` pointer to find the previous element.\n\nWhat else do we need? Removing nodes, of course! First we'll do `removeAll()`, which is really simple:\n\n```swift\n  public func removeAll() {\n    head = nil\n  }\n```\n\nIf you had a tail pointer, you'd set it to `nil` here too.\n\nNext we'll add some functions that let you remove individual nodes. If you already have a reference to the node, then using `remove()` is the most optimal because you don't need to iterate through the list to find the node first.\n\n```swift\n  public func remove(node: Node) -> T {\n    let prev = node.previous\n    let next = node.next\n\n    if let prev = prev {\n      prev.next = next\n    } else {\n      head = next\n    }\n    next?.previous = prev\n\n    node.previous = nil\n    node.next = nil\n    return node.value\n  }\n```\n\nWhen we take this node out of the list, we break the links to the previous node and the next node. To make the list whole again we must connect the previous node to the next node.\n\nDon't forget the `head` pointer! If this was the first node in the list then `head` needs to be updated to point to the next node. (Likewise for when you have a tail pointer and this was the last node). Of course, if there are no more nodes left, `head` should become nil.\n\nTry it out:\n\n```swift\nlist.remove(list.first!)   // \"Hello\"\nlist.count                     // 2\nlist[0]                        // \"Swift\"\nlist[1]                        // \"World\"\n```\n\nIf you don't have a reference to the node, you can use `removeLast()` or `removeAt()`:\n\n```swift\n  public func removeLast() -> T {\n    assert(!isEmpty)\n    return remove(node: last!)\n  }\n\n  public func removeAt(_ index: Int) -> T {\n    let node = nodeAt(index)\n    assert(node != nil)\n    return remove(node: node!)\n  }\n```\n\nAll these removal functions also return the value from the removed element.\n\n```swift\nlist.removeLast()              // \"World\"\nlist.count                     // 1\nlist[0]                        // \"Swift\"\n\nlist.removeAt(0)          // \"Swift\"\nlist.count                     // 0\n```\n\n> **Note:** For a singly linked list, removing the last node is slightly more complicated. You can't just use `last` to find the end of the list because you also need a reference to the second-to-last node. Instead, use the `nodesBeforeAndAfter()` helper method. If the list has a tail pointer, then `removeLast()` is really quick, but you do need to remember to make `tail` point to the previous node.\n\nThere's a few other fun things we can do with our `LinkedList` class. It's handy to have some sort of readable debug output:\n\n```swift\nextension LinkedList: CustomStringConvertible {\n  public var description: String {\n    var s = \"[\"\n    var node = head\n    while node != nil {\n      s += \"\\(node!.value)\"\n      node = node!.next\n      if node != nil { s += \", \" }\n    }\n    return s + \"]\"\n  }\n}\n```\n\nThis will print the list like so:\n\n\t[Hello, Swift, World]\n\nHow about reversing a list, so that the head becomes the tail and vice versa? There is a very fast algorithm for that:\n\nIterative Approach:\n```swift\n  public func reverse() {\n    var node = head\n    tail = node // If you had a tail pointer\n    while let currentNode = node {\n      node = currentNode.next\n      swap(&currentNode.next, &currentNode.previous)\n      head = currentNode\n    }\n  }\n```\nRecursive Approach:\n```swift\n  public func reverse(node: head) {\n    if !head || !head.next {\n      return head\n    }\n    let temp = reverse(head.next)\n    head.next.next = head\n    head.next = nil\n    return temp\n  }\n```\n\nThis loops through the entire list and simply swaps the `next` and `previous` pointers of each node. It also moves the `head` pointer to the very last element. (If you had a tail pointer you'd also need to update it.) You end up with something like this:\n\n\t         +--------+    +--------+    +--------+    +--------+\n\ttail --->|        |<---|        |<---|        |<---|        |---> nil\n\t         | node 0 |    | node 1 |    | node 2 |    | node 3 |\n\t nil <---|        |--->|        |--->|        |--->|        |<--- head\n\t         +--------+    +--------+    +--------+    +--------+\n\nArrays have `map()` and `filter()` functions, and there's no reason why linked lists shouldn't either.\n\n```swift\n  public func map<U>(transform: T -> U) -> LinkedList<U> {\n    let result = LinkedList<U>()\n    var node = head\n    while node != nil {\n      result.append(transform(node!.value))\n      node = node!.next\n    }\n    return result\n  }\n```\n\nYou can use it like this:\n\n```swift\nlet list = LinkedList<String>()\nlist.append(\"Hello\")\nlist.append(\"Swifty\")\nlist.append(\"Universe\")\n\nlet m = list.map { s in s.characters.count }\nm  // [5, 6, 8]\n```\n\nAnd here's filter:\n\n```swift\n  public func filter(predicate: T -> Bool) -> LinkedList<T> {\n    let result = LinkedList<T>()\n    var node = head\n    while node != nil {\n      if predicate(node!.value) {\n        result.append(node!.value)\n      }\n      node = node!.next\n    }\n    return result\n  }\n```\n\nAnd a silly example:\n\n```swift\nlet f = list.filter { s in s.count > 5 }\nf    // [Universe, Swifty]\n```\n\nExercise for the reader: These implementations of `map()` and `filter()` aren't very fast because they `append()` the new node to the end of the new list. Recall that append is **O(n)** because it needs to scan through the entire list to find the last node. Can you make this faster? (Hint: keep track of the last node that you added.)\n\n## An alternative approach\n\nThe version of `LinkedList` you've seen so far uses nodes that are classes and therefore have reference semantics. Nothing wrong with that, but that does make them a bit more heavyweight than Swift's other collections such as `Array` and `Dictionary`.\n\nIt is possible to implement a linked list with value semantics using an enum. That would look somewhat like this:\n\n```swift\nenum ListNode<T> {\n  indirect case node(T, next: ListNode<T>)\n  case end\n}\n```\n\nThe big difference with the enum-based version is that any modification you make to this list will result in a *new copy* being created because of [Swift's value semantics](https://developer.apple.com/swift/blog/?id=10). Whether that's what you want or not depends on the application.\n\n[I might fill out this section in more detail if there's a demand for it.]\n\n## Conforming to the Collection protocol\nTypes that conform to the Sequence protocol, whose elements can be traversed multiple times, nondestructively, and accessed by indexed subscript should conform to the Collection protocol defined in Swift's Standard Library.\n\nDoing so grants access to a very large number of properties and operations that are common when dealing collections of data. In addition to this, it lets custom types follow the patterns that are common to Swift developers.\n\nIn order to conform to this protocol, classes need to provide:\n  1 `startIndex` and `endIndex` properties.\n  2 Subscript access to elements as O(1). Diversions of this time complexity need to be documented.\n  \n```swift\n/// The position of the first element in a nonempty collection.\npublic var startIndex: Index {\n  get {\n    return LinkedListIndex<T>(node: head, tag: 0)\n  }\n}\n  \n/// The collection's \"past the end\" position---that is, the position one\n/// greater than the last valid subscript argument.\n/// - Complexity: O(n), where n is the number of elements in the list.\n///   This diverts from the protocol's expectation.\npublic var endIndex: Index {\n  get {\n    if let h = self.head {\n      return LinkedListIndex<T>(node: h, tag: count)\n    } else {\n      return LinkedListIndex<T>(node: nil, tag: startIndex.tag)\n    }\n  }\n}\n```\n\n```swift\npublic subscript(position: Index) -> T {\n  get {\n    return position.node!.value\n  }\n}\n```\n\nBecuase collections are responsible for managing their own indexes, the implementation below keeps a reference to a node in the list. A tag property in the index represents the position of the node in the list.\n\n```swift\n/// Custom index type that contains a reference to the node at index 'tag'\npublic struct LinkedListIndex<T> : Comparable\n{\n  fileprivate let node: LinkedList<T>.LinkedListNode<T>?\n  fileprivate let tag: Int\n\n  public static func==<T>(lhs: LinkedListIndex<T>, rhs: LinkedListIndex<T>) -> Bool {\n    return (lhs.tag == rhs.tag)\n  }\n\n  public static func< <T>(lhs: LinkedListIndex<T>, rhs: LinkedListIndex<T>) -> Bool {\n    return (lhs.tag < rhs.tag)\n  }\n}\n```\n\nFinally, the linked is is able to calculate the index after a given one with the following implementation.\n```swift\npublic func index(after idx: Index) -> Index {\n  return LinkedListIndex<T>(node: idx.node?.next, tag: idx.tag+1)\n}\n```\n\n## Some things to keep in mind\n\nLinked lists are flexible but many operations are **O(n)**.\n\nWhen performing operations on a linked list, you always need to be careful to update the relevant `next` and `previous` pointers, and possibly also the `head` and `tail` pointers. If you mess this up, your list will no longer be correct and your program will likely crash at some point. Be careful!\n\nWhen processing lists, you can often use recursion: process the first element and then recursively call the function again on the rest of the list. You’re done when there is no next element. This is why linked lists are the foundation of functional programming languages such as LISP.\n\n*Originally written by Matthijs Hollemans for Ray Wenderlich's Swift Algorithm Club*\n"
  },
  {
    "path": "Linked List/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Linked List/Tests/LinkedListTests.swift",
    "content": "import XCTest\n\nclass LinkedListTest: XCTestCase {\n    let numbers = [8, 2, 10, 9, 7, 5]\n    \n    fileprivate func buildList() -> LinkedList<Int> {\n        let list = LinkedList<Int>()\n        for number in numbers {\n            list.append(number)\n        }\n        return list\n    }\n    \n    func testSwift4() {\n        // last checked with Xcode 9.0b4\n        #if swift(>=4.0)\n            print(\"Hello, Swift 4!\")\n        #endif\n    }\n    \n    func testEmptyList() {\n        let list = LinkedList<Int>()\n        XCTAssertTrue(list.isEmpty)\n        XCTAssertEqual(list.count, 0)\n        XCTAssertNil(list.first)\n        XCTAssertNil(list.last)\n    }\n    \n    func testListWithOneElement() {\n        let list = LinkedList<Int>()\n        list.append(123)\n        \n        XCTAssertFalse(list.isEmpty)\n        XCTAssertEqual(list.count, 1)\n        \n        XCTAssertNotNil(list.first)\n        XCTAssertNil(list.head!.previous)\n        XCTAssertNil(list.head!.next)\n        XCTAssertEqual(list.head!.value, 123)\n        \n        XCTAssertNotNil(list.last)\n        XCTAssertNil(list.last!.previous)\n        XCTAssertNil(list.last!.next)\n        XCTAssertEqual(list.last!.value, 123)\n        \n        XCTAssertTrue(list.head === list.last)\n    }\n    \n    func testListWithTwoElements() {\n        let list = LinkedList<Int>()\n        list.append(123)\n        list.append(456)\n        \n        XCTAssertEqual(list.count, 2)\n        \n        XCTAssertNotNil(list.first)\n        XCTAssertEqual(list.head!.value, 123)\n        \n        XCTAssertNotNil(list.last)\n        XCTAssertEqual(list.last!.value, 456)\n        \n        XCTAssertTrue(list.head !== list.last)\n        \n        XCTAssertNil(list.head!.previous)\n        XCTAssertTrue(list.head!.next === list.last)\n        XCTAssertTrue(list.last!.previous === list.head)\n        XCTAssertNil(list.last!.next)\n    }\n    \n    func testListWithThreeElements() {\n        let list = LinkedList<Int>()\n        list.append(123)\n        list.append(456)\n        list.append(789)\n        \n        XCTAssertEqual(list.count, 3)\n        \n        XCTAssertNotNil(list.first)\n        XCTAssertEqual(list.head!.value, 123)\n        \n        let second = list.head!.next\n        XCTAssertNotNil(second)\n        XCTAssertEqual(second!.value, 456)\n        \n        XCTAssertNotNil(list.last)\n        XCTAssertEqual(list.last!.value, 789)\n        \n        XCTAssertNil(list.head!.previous)\n        XCTAssertTrue(list.head!.next === second)\n        XCTAssertTrue(second!.previous === list.head)\n        XCTAssertTrue(second!.next === list.last)\n        XCTAssertTrue(list.last!.previous === second)\n        XCTAssertNil(list.last!.next)\n    }\n    \n    func testNodeAtIndexInListWithOneElement() {\n        let list = LinkedList<Int>()\n        list.append(123)\n        \n        let node = list.node(at: 0)\n        XCTAssertNotNil(node)\n        XCTAssertEqual(node.value, 123)\n        XCTAssertTrue(node === list.head)\n    }\n    \n    func testNodeAtIndex() {\n        let list = buildList()\n        \n        let nodeCount = list.count\n        XCTAssertEqual(nodeCount, numbers.count)\n        \n        let first = list.node(at: 0)\n        XCTAssertNotNil(first)\n        XCTAssertTrue(first === list.head)\n        XCTAssertEqual(first.value, numbers[0])\n        \n        let last = list.node(at: nodeCount - 1)\n        XCTAssertNotNil(last)\n        XCTAssertTrue(last === list.last)\n        XCTAssertEqual(last.value, numbers[nodeCount - 1])\n        \n        for i in 0..<nodeCount {\n            let node = list.node(at: i)\n            XCTAssertNotNil(node)\n            XCTAssertEqual(node.value, numbers[i])\n        }\n    }\n    \n    func testSubscript() {\n        let list = buildList()\n        for i in 0 ..< list.count {\n            XCTAssertEqual(list[i], numbers[i])\n        }\n    }\n    \n    func testInsertAtIndexInEmptyList() {\n        let list = LinkedList<Int>()\n        list.insert(123, at: 0)\n        \n        XCTAssertFalse(list.isEmpty)\n        XCTAssertEqual(list.count, 1)\n        \n        let node = list.node(at: 0)\n        XCTAssertNotNil(node)\n        XCTAssertEqual(node.value, 123)\n    }\n    \n    func testInsertAtIndex() {\n        let list = buildList()\n        let prev = list.node(at: 2)\n        let next = list.node(at: 3)\n        let nodeCount = list.count\n        \n        list.insert(444, at: 3)\n        \n        let node = list.node(at: 3)\n        XCTAssertNotNil(node)\n        XCTAssertEqual(node.value, 444)\n        XCTAssertEqual(nodeCount + 1, list.count)\n        \n        XCTAssertFalse(prev === node)\n        XCTAssertFalse(next === node)\n        XCTAssertTrue(prev.next === node)\n        XCTAssertTrue(next.previous === node)\n    }\n    \n    func testInsertListAtIndex() {\n        let list = buildList()\n        let list2 = LinkedList<Int>()\n        list2.append(99)\n        list2.append(102)\n        list.insert(list2, at: 2)\n        XCTAssertTrue(list.count == 8)\n        XCTAssertEqual(list.node(at: 1).value, 2)\n        XCTAssertEqual(list.node(at: 2).value, 99)\n        XCTAssertEqual(list.node(at: 3).value, 102)\n        XCTAssertEqual(list.node(at: 4).value, 10)\n    }\n    \n    func testInsertListAtFirstIndex() {\n        let list = buildList()\n        let list2 = LinkedList<Int>()\n        list2.append(99)\n        list2.append(102)\n        list.insert(list2, at: 0)\n        XCTAssertTrue(list.count == 8)\n        XCTAssertEqual(list.node(at: 0).value, 99)\n        XCTAssertEqual(list.node(at: 1).value, 102)\n        XCTAssertEqual(list.node(at: 2).value, 8)\n    }\n    \n    func testInsertListAtLastIndex() {\n        let list = buildList()\n        let list2 = LinkedList<Int>()\n        list2.append(99)\n        list2.append(102)\n        list.insert(list2, at: list.count)\n        XCTAssertTrue(list.count == 8)\n        XCTAssertEqual(list.node(at: 5).value, 5)\n        XCTAssertEqual(list.node(at: 6).value, 99)\n        XCTAssertEqual(list.node(at: 7).value, 102)\n    }\n    \n    func testAppendList() {\n        let list = buildList()\n        let list2 = LinkedList<Int>()\n        list2.append(99)\n        list2.append(102)\n        list.append(list2)\n        XCTAssertTrue(list.count == 8)\n        XCTAssertEqual(list.node(at: 5).value, 5)\n        XCTAssertEqual(list.node(at: 6).value, 99)\n        XCTAssertEqual(list.node(at: 7).value, 102)\n    }\n    \n    func testAppendListToEmptyList() {\n        let list = LinkedList<Int>()\n        let list2 = LinkedList<Int>()\n        list2.append(5)\n        list2.append(10)\n        list.append(list2)\n        XCTAssertTrue(list.count == 2)\n        XCTAssertEqual(list.node(at: 0).value, 5)\n        XCTAssertEqual(list.node(at: 1).value, 10)\n    }\n    \n    func testRemoveAtIndexOnListWithOneElement() {\n        let list = LinkedList<Int>()\n        list.append(123)\n        \n        let value = list.remove(at: 0)\n        XCTAssertEqual(value, 123)\n        \n        XCTAssertTrue(list.isEmpty)\n        XCTAssertEqual(list.count, 0)\n        XCTAssertNil(list.first)\n        XCTAssertNil(list.last)\n    }\n    \n    func testRemoveAtIndex() {\n        let list = buildList()\n        let prev = list.node(at: 2)\n        let next = list.node(at: 3)\n        let nodeCount = list.count\n        \n        list.insert(444, at: 3)\n        \n        let value = list.remove(at: 3)\n        XCTAssertEqual(value, 444)\n        \n        let node = list.node(at: 3)\n        XCTAssertTrue(next === node)\n        XCTAssertTrue(prev.next === node)\n        XCTAssertTrue(node.previous === prev)\n        XCTAssertEqual(nodeCount, list.count)\n    }\n    \n    func testRemoveLastOnListWithOneElement() {\n        let list = LinkedList<Int>()\n        list.append(123)\n        \n        let value = list.removeLast()\n        XCTAssertEqual(value, 123)\n        \n        XCTAssertTrue(list.isEmpty)\n        XCTAssertEqual(list.count, 0)\n        XCTAssertNil(list.first)\n        XCTAssertNil(list.last)\n    }\n    \n    func testRemoveLast() {\n        let list = buildList()\n        let last = list.last\n        let prev = last!.previous\n        let nodeCount = list.count\n        \n        let value = list.removeLast()\n        XCTAssertEqual(value, 5)\n        \n        XCTAssertNil(last!.previous)\n        XCTAssertNil(last!.next)\n        \n        XCTAssertNil(prev!.next)\n        XCTAssertTrue(list.last === prev)\n        XCTAssertEqual(nodeCount - 1, list.count)\n    }\n    \n    func testRemoveAll() {\n        let list = buildList()\n        list.removeAll()\n        XCTAssertTrue(list.isEmpty)\n        XCTAssertEqual(list.count, 0)\n        XCTAssertNil(list.first)\n        XCTAssertNil(list.last)\n    }\n    \n    func testReverseLinkedList() {\n        let list = buildList()\n        let first = list.head\n        let last = list.last\n        let nodeCount = list.count\n        \n        list.reverse()\n        \n        XCTAssertTrue(first === list.last)\n        XCTAssertTrue(last === list.head)\n        XCTAssertEqual(nodeCount, list.count)\n    }\n    \n    func testArrayLiteralInitTypeInfer() {\n        let arrayLiteralInitInfer: LinkedList = [1.0, 2.0, 3.0]\n        \n        XCTAssertEqual(arrayLiteralInitInfer.count, 3)\n        XCTAssertEqual(arrayLiteralInitInfer.head?.value, 1.0)\n        XCTAssertEqual(arrayLiteralInitInfer.last?.value, 3.0)\n        XCTAssertEqual(arrayLiteralInitInfer[1], 2.0)\n        XCTAssertEqual(arrayLiteralInitInfer.removeLast(), 3.0)\n        XCTAssertEqual(arrayLiteralInitInfer.count, 2)\n    }\n    \n    func testArrayLiteralInitExplicit() {\n        let arrayLiteralInitExplicit: LinkedList<Int> = [1, 2, 3]\n        \n        XCTAssertEqual(arrayLiteralInitExplicit.count, 3)\n        XCTAssertEqual(arrayLiteralInitExplicit.head?.value, 1)\n        XCTAssertEqual(arrayLiteralInitExplicit.last?.value, 3)\n        XCTAssertEqual(arrayLiteralInitExplicit[1], 2)\n        XCTAssertEqual(arrayLiteralInitExplicit.removeLast(), 3)\n        XCTAssertEqual(arrayLiteralInitExplicit.count, 2)\n    }\n    \n    func testConformanceToCollectionProtocol() {\n        let collection: LinkedList<Int> = [1, 2, 3, 4, 5]\n        let index2 = collection.index(collection.startIndex, offsetBy: 2)\n        let value = collection[index2]\n        \n        XCTAssertTrue(value == 3)\n    }\n}\n"
  },
  {
    "path": "Linked List/Tests/Tests.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t7B80C3F81C77A618003CECC7 /* LinkedList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C3F71C77A618003CECC7 /* LinkedList.swift */; };\n\t\t7B80C3FA1C77A61E003CECC7 /* LinkedListTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C3F91C77A61E003CECC7 /* LinkedListTests.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t7B2BBC801C779D720067B71D /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7B2BBC941C779E7B0067B71D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };\n\t\t7B80C3F71C77A618003CECC7 /* LinkedList.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LinkedList.swift; path = ../LinkedList.swift; sourceTree = SOURCE_ROOT; };\n\t\t7B80C3F91C77A61E003CECC7 /* LinkedListTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LinkedListTests.swift; sourceTree = SOURCE_ROOT; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t7B2BBC7D1C779D720067B71D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t7B2BBC681C779D710067B71D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC831C779D720067B71D /* Tests */,\n\t\t\t\t7B2BBC721C779D710067B71D /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC721C779D710067B71D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC801C779D720067B71D /* Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC831C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B80C3F71C77A618003CECC7 /* LinkedList.swift */,\n\t\t\t\t7B80C3F91C77A61E003CECC7 /* LinkedListTests.swift */,\n\t\t\t\t7B2BBC941C779E7B0067B71D /* Info.plist */,\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tpath = TestsTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t7B2BBC7F1C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t7B2BBC7C1C779D720067B71D /* Sources */,\n\t\t\t\t7B2BBC7D1C779D720067B71D /* Frameworks */,\n\t\t\t\t7B2BBC7E1C779D720067B71D /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tproductName = TestsTests;\n\t\t\tproductReference = 7B2BBC801C779D720067B71D /* Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t7B2BBC691C779D710067B71D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0720;\n\t\t\t\tLastUpgradeCheck = 0720;\n\t\t\t\tORGANIZATIONNAME = \"Swift Algorithm Club\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t7B2BBC7F1C779D720067B71D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2;\n\t\t\t\t\t\tLastSwiftMigration = 0800;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 7B2BBC681C779D710067B71D;\n\t\t\tproductRefGroup = 7B2BBC721C779D710067B71D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t7B2BBC7F1C779D720067B71D /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t7B2BBC7E1C779D720067B71D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t7B2BBC7C1C779D720067B71D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7B80C3F81C77A618003CECC7 /* LinkedList.swift in Sources */,\n\t\t\t\t7B80C3FA1C77A61E003CECC7 /* LinkedListTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t7B2BBC871C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC881C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t7B2BBC8D1C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC8E1C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC871C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC881C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC8D1C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC8E1C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 7B2BBC691C779D710067B71D /* Project object */;\n}\n"
  },
  {
    "path": "Linked List/Tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Tests.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Linked List/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0720\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Longest Common Subsequence/LongestCommonSubsequence.playground/Contents.swift",
    "content": "// last checked with Xcode 11.4\n#if swift(>=4.0)\nprint(\"Hello, Swift 4!\")\n#endif\n\nextension String {\n  public func longestCommonSubsequence(_ other: String) -> String {\n\n    func lcsLength(_ other: String) -> [[Int]] {\n      var matrix = [[Int]](repeating: [Int](repeating: 0, count: other.count+1), count: self.count+1)\n\n      for (i, selfChar) in self.enumerated() {\n        for (j, otherChar) in other.enumerated() {\n          if otherChar == selfChar {\n            matrix[i+1][j+1] = matrix[i][j] + 1\n          } else {\n            matrix[i+1][j+1] = max(matrix[i][j+1], matrix[i+1][j])\n          }\n        }\n      }\n      return matrix\n    }\n\n    func backtrack(_ matrix: [[Int]]) -> String {\n      var i = self.count\n      var j = other.count\n      var charInSequence = self.endIndex\n\n      var lcs = String()\n\n      while i >= 1 && j >= 1 {\n        if matrix[i][j] == matrix[i][j - 1] {\n          j -= 1\n        } else if matrix[i][j] == matrix[i - 1][j] {\n          i -= 1\n          charInSequence = self.index(before: charInSequence)\n        } else {\n          i -= 1\n          j -= 1\n          charInSequence = self.index(before: charInSequence)\n          lcs.append(self[charInSequence])\n        }\n      }\n      return String(lcs.reversed())\n    }\n\n    return backtrack(lcsLength(other))\n  }\n}\n\n// Examples\n\nlet a = \"ABCBX\"\nlet b = \"ABDCAB\"\nlet c = \"KLMK\"\n\na.longestCommonSubsequence(c)   // \"\"\na.longestCommonSubsequence(\"\")  // \"\"\na.longestCommonSubsequence(b)   // \"ABCB\"\nb.longestCommonSubsequence(a)   // \"ABCB\"\na.longestCommonSubsequence(a)   // \"ABCBX\"\n\n\"Hello World\".longestCommonSubsequence(\"Bonjour le monde\")\n"
  },
  {
    "path": "Longest Common Subsequence/LongestCommonSubsequence.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Longest Common Subsequence/LongestCommonSubsequence.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Longest Common Subsequence/LongestCommonSubsequence.swift",
    "content": "extension String {\n  public func longestCommonSubsequence(_ other: String) -> String {\n\n    // Computes the length of the lcs using dynamic programming.\n    // Output is a matrix of size (n+1)x(m+1), where matrix[x][y] is the length\n    // of lcs between substring (0, x-1) of self and substring (0, y-1) of other.\n    func lcsLength(_ other: String) -> [[Int]] {\n\n      // Create matrix of size (n+1)x(m+1). The algorithm needs first row and\n      // first column to be filled with 0.\n      var matrix = [[Int]](repeating: [Int](repeating: 0, count: other.characters.count+1), count: self.characters.count+1)\n\n      for (i, selfChar) in self.characters.enumerated() {\n        for (j, otherChar) in other.characters.enumerated() {\n          if otherChar == selfChar {\n            // Common char found, add 1 to highest lcs found so far.\n            matrix[i+1][j+1] = matrix[i][j] + 1\n          } else {\n            // Not a match, propagates highest lcs length found so far.\n            matrix[i+1][j+1] = max(matrix[i][j+1], matrix[i+1][j])\n          }\n        }\n      }\n\n      // Due to propagation, lcs length is at matrix[n][m].\n      return matrix\n    }\n\n    // Backtracks from matrix[n][m] to matrix[1][1] looking for chars that are\n    // common to both strings.\n    func backtrack(_ matrix: [[Int]]) -> String {\n      var i = self.characters.count\n      var j = other.characters.count\n\n      // charInSequence is in sync with i so we can get self[i]\n      var charInSequence = self.endIndex\n\n      var lcs = String()\n\n      while i >= 1 && j >= 1 {\n        // Indicates propagation without change: no new char was added to lcs.\n        if matrix[i][j] == matrix[i][j - 1] {\n          j -= 1\n        }\n        // Indicates propagation without change: no new char was added to lcs.\n        else if matrix[i][j] == matrix[i - 1][j] {\n          i -= 1\n          // As i was decremented, move back charInSequence.\n          charInSequence = self.index(before: charInSequence)\n        }\n        // Value on the left and above are different than current cell.\n        // This means 1 was added to lcs length (line 17).\n        else {\n          i -= 1\n          j -= 1\n            charInSequence = self.index(before: charInSequence)\n\n          lcs.append(self[charInSequence])\n        }\n      }\n\n      // Due to backtrack, chars were added in reverse order: reverse it back.\n      // Append and reverse is faster than inserting at index 0.\n      return String(lcs.characters.reversed())\n    }\n\n    // Combine dynamic programming approach with backtrack to find the lcs.\n    return backtrack(lcsLength(other))\n  }\n}\n"
  },
  {
    "path": "Longest Common Subsequence/README.markdown",
    "content": "# Longest Common Subsequence\n\nThe Longest Common Subsequence (LCS) of two strings is the longest sequence of characters that appear in the same order in both strings.\n\nFor example the LCS of `\"Hello World\"` and `\"Bonjour le monde\"` is `\"oorld\"`. If you go through both strings from left-to-right, you'll find that the characters `o`, `o`, `r`, `l`, `d` appear in both strings in that order.\n\nOther possible subsequences are `\"ed\"` and `\"old\"`, but these are all shorter than `\"oorld\"`. \n\n> **Note:** This should not be confused with the Longest Common Substring problem, where the characters must form a substring of both strings, i.e they have to be immediate neighbors. With a subsequence, it's OK if the characters are not right next to each other, but they must be in the same order.\n\nOne way to find the LCS of two strings `a` and `b` is using dynamic programming and a backtracking strategy.\n\n## Finding the length of the LCS with dynamic programming\n\nFirst, we want to find the length of the longest common subsequence between strings `a` and `b`. We're not looking for the actual subsequence yet, only how long it is.\n\nTo determine the length of the LCS between all combinations of substrings of `a` and `b`, we can use a *dynamic programming* technique. Dynamic programming basically means that you compute all possibilities and store them inside a look-up table.\n\n> **Note:** During the following explanation, `n` is the length of string `a`, and `m` is the length of string `b`.\n\nTo find the lengths of all possible subsequences, we use a helper function, `lcsLength(_:)`. This creates a matrix of size `(n+1)` by `(m+1)`, where `matrix[x][y]` is the length of the LCS between the substrings `a[0...x-1]` and `b[0...y-1]`.\n\nGiven strings `\"ABCBX\"` and `\"ABDCAB\"`, the output matrix of `lcsLength(_:)` is the following:\n\n```\n|   | Ø | A | B | D | C | A | B |\n| Ø | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n| A | 0 | 1 | 1 | 1 | 1 | 1 | 1 |  \n| B | 0 | 1 | 2 | 2 | 2 | 2 | 2 |\n| C | 0 | 1 | 2 | 2 | 3 | 3 | 3 |\n| B | 0 | 1 | 2 | 2 | 3 | 3 | 4 |\n| X | 0 | 1 | 2 | 2 | 3 | 3 | 4 |\n```\n\nIn this example, if we look at `matrix[3][4]` we find the value `3`. This means the length of the LCS between `a[0...2]` and `b[0...3]`, or between `\"ABC\"` and `\"ABDC\"`, is 3. That is correct, because these two substrings have the subsequence `ABC` in common. (Note: the first row and column of the matrix are always filled with zeros.)\n\nHere is the source code for `lcsLength(_:)`; this lives in an extension on `String`:\n\n```swift\nfunc lcsLength(_ other: String) -> [[Int]] {\n\n  var matrix = [[Int]](repeating: [Int](repeating: 0, count: other.characters.count+1), count: self.characters.count+1)\n\n  for (i, selfChar) in self.characters.enumerated() {\n\tfor (j, otherChar) in other.characters.enumerated() {\n\t  if otherChar == selfChar {\n\t\t// Common char found, add 1 to highest lcs found so far.\n\t\tmatrix[i+1][j+1] = matrix[i][j] + 1\n\t  } else {\n\t\t// Not a match, propagates highest lcs length found so far.\n\t\tmatrix[i+1][j+1] = max(matrix[i][j+1], matrix[i+1][j])\n\t  }\n\t}\n  }\n\n  return matrix\n}\n```\n\nFirst, this creates a new matrix -- really a 2-dimensional array -- and fills it with zeros. Then it loops through both strings, `self` and `other`, and compares their characters in order to fill in the matrix. If two characters match, we increment the length of the subsequence. However, if two characters are different, then we \"propagate\" the highest LCS length found so far.\n\nLet's say the following is the current situation:\n\n```\n|   | Ø | A | B | D | C | A | B |\n| Ø | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n| A | 0 | 1 | 1 | 1 | 1 | 1 | 1 |  \n| B | 0 | 1 | 2 | 2 | 2 | 2 | 2 |\n| C | 0 | 1 | 2 | * |   |   |   |\n| B | 0 |   |   |   |   |   |   |\n| X | 0 |   |   |   |   |   |   |\n```\n\nThe `*` marks the two characters we're currently comparing, `C` versus `D`. These characters are not the same, so we propagate the highest length we've seen so far, which is `2`:\n\n```\n|   | Ø | A | B | D | C | A | B |\n| Ø | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n| A | 0 | 1 | 1 | 1 | 1 | 1 | 1 |  \n| B | 0 | 1 | 2 | 2 | 2 | 2 | 2 |\n| C | 0 | 1 | 2 | 2 | * |   |   |\n| B | 0 |   |   |   |   |   |   |\n| X | 0 |   |   |   |   |   |   |\n```\n\nNow we compare `C` with `C`. These are equal, and we increment the length to `3`:\n\n```\n|   | Ø | A | B | D | C | A | B |\n| Ø | 0 | 0 | 0 | 0 | 0 | 0 | 0 |\n| A | 0 | 1 | 1 | 1 | 1 | 1 | 1 |  \n| B | 0 | 1 | 2 | 2 | 2 | 2 | 2 |\n| C | 0 | 1 | 2 | 2 | 3 | * |   |\n| B | 0 |   |   |   |   |   |   |\n| X | 0 |   |   |   |   |   |   |\n```\n\nAnd so on... this is how `lcsLength(_:)` fills in the entire matrix.\n\n## Backtracking to find the actual subsequence\n\nSo far we've calculated the length of every possible subsequence. The length of the longest subsequence is found in the bottom-right corner of matrix, at `matrix[n+1][m+1]`. In the above example it is 4, so the LCS consists of 4 characters.\n\nHaving the length of every combination of substrings makes it possible to determine *which* characters are part of the LCS itself by using a backtracking strategy.\n\nBacktracking starts at `matrix[n+1][m+1]` and walks up and left (in this priority) looking for changes that do not indicate a simple propagation.\n\n```\n|   |  Ø|  A|  B|  D|  C|  A|  B|\n| Ø |  0|  0|  0|  0|  0|  0|  0|\n| A |  0|↖ 1|  1|  1|  1|  1|  1|  \n| B |  0|  1|↖ 2|← 2|  2|  2|  2|\n| C |  0|  1|  2|  2|↖ 3|← 3|  3|\n| B |  0|  1|  2|  2|  3|  3|↖ 4|\n| X |  0|  1|  2|  2|  3|  3|↑ 4|\n```\n\nEach `↖` move indicates a character (in row/column header) that is part of the LCS.\n\nIf the number on the left and above are different than the number in the current cell, no propagation happened. In that case `matrix[i][j]` indicates a common char between the strings `a` and `b`, so the characters at `a[i - 1]` and `b[j - 1]` are part of the LCS that we're looking for.\n\nOne thing to notice is, as it's running backwards, the LCS is built in reverse order. Before returning, the result is reversed to reflect the actual LCS.\n\nHere is the backtracking code:\n\n```swift\nfunc backtrack(_ matrix: [[Int]]) -> String {\n  var i = self.characters.count\n  var j = other.characters.count\n  \n  var charInSequence = self.endIndex\n  \n  var lcs = String()\n  \n  while i >= 1 && j >= 1 {\n\t// Indicates propagation without change: no new char was added to lcs.\n\tif matrix[i][j] == matrix[i][j - 1] {\n\t  j -= 1\n\t}\n\t// Indicates propagation without change: no new char was added to lcs.\n\telse if matrix[i][j] == matrix[i - 1][j] {\n\t  i -= 1\n\t  charInSequence = self.index(before: charInSequence)\n\t}\n\t// Value on the left and above are different than current cell.\n\t// This means 1 was added to lcs length.\n\telse {\n\t  i -= 1\n\t  j -= 1\n\t  charInSequence = self.index(before: charInSequence)\n\t  lcs.append(self[charInSequence])\n\t}\n  }\n  \n  return String(lcs.characters.reversed())\n}\n```  \n\nThis backtracks from `matrix[n+1][m+1]` (bottom-right corner) to `matrix[1][1]` (top-left corner), looking for characters that are common to both strings. It adds those characters to a new string, `lcs`.\n\nThe `charInSequence` variable is an index into the string given by `self`. Initially this points to the last character of the string. Each time we decrement `i`, we also move back `charInSequence`. When the two characters are found to be equal, we add the character at `self[charInSequence]` to the new `lcs` string. (We can't just write `self[i]` because `i` may not map to the current position inside the Swift string.)\n\nDue to backtracking, characters are added in reverse order, so at the end of the function we call `reversed()` to put the string in the right order. (Appending new characters to the end of the string and then reversing it once is faster than always inserting the characters at the front of the string.)\n\n## Putting it all together\n\nTo find the LCS between two strings, we first call `lcsLength(_:)` and then `backtrack(_:)`:\n\n```swift\nextension String {\n  public func longestCommonSubsequence(_ other: String) -> String {\n\n    func lcsLength(_ other: String) -> [[Int]] {\n      ...\n    }\n    \n    func backtrack(_ matrix: [[Int]]) -> String {\n      ...\n    }\n\n    return backtrack(lcsLength(other))\n  }\n}\n```\n\nTo keep everything tidy, the two helper functions are nested inside the main `longestCommonSubsequence()` function.\n\nHere's how you could try it out in a Playground:\n\n```swift\nlet a = \"ABCBX\"\nlet b = \"ABDCAB\"\na.longestCommonSubsequence(b)   // \"ABCB\"\n\nlet c = \"KLMK\"\na.longestCommonSubsequence(c)   // \"\" (no common subsequence)\n\n\"Hello World\".longestCommonSubsequence(\"Bonjour le monde\")   // \"oorld\"\n```\n\n*Written for Swift Algorithm Club by Pedro Vereza*\n"
  },
  {
    "path": "Longest Common Subsequence/Tests/LongestCommonSubsequenceTests.swift",
    "content": "import Foundation\nimport XCTest\n\nclass LongestCommonSubsequenceTests: XCTestCase {\n\n    func testLCSwithSelfIsSelf() {\n        let a = \"ABCDE\"\n\n        XCTAssertEqual(a, a.longestCommonSubsequence(a))\n    }\n\n    func testLCSWithEmptyStringIsEmptyString() {\n        let a = \"ABCDE\"\n\n        XCTAssertEqual(\"\", a.longestCommonSubsequence(\"\"))\n    }\n\n    func testLCSIsEmptyWhenNoCharMatches() {\n        let a = \"ABCDE\"\n        let b = \"WXYZ\"\n\n        XCTAssertEqual(\"\", a.longestCommonSubsequence(b))\n    }\n\n    func testLCSIsNotCommutative() {\n        let a = \"ABCDEF\"\n        let b = \"XAWDMVBEKD\"\n\n        XCTAssertEqual(\"ADE\", a.longestCommonSubsequence(b))\n        XCTAssertEqual(\"ABD\", b.longestCommonSubsequence(a))\n    }\n}\n"
  },
  {
    "path": "Longest Common Subsequence/Tests/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Longest Common Subsequence/Tests/Tests.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t4716C7AF1C93751E00F6C1C0 /* LongestCommonSubsequenceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4716C7891C936E0E00F6C1C0 /* LongestCommonSubsequenceTests.swift */; };\n\t\t4716C7B01C93751E00F6C1C0 /* LongestCommonSubsequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4716C7881C936DDD00F6C1C0 /* LongestCommonSubsequence.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t4716C7881C936DDD00F6C1C0 /* LongestCommonSubsequence.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = LongestCommonSubsequence.swift; path = ../../LongestCommonSubsequence.swift; sourceTree = \"<group>\"; };\n\t\t4716C7891C936E0E00F6C1C0 /* LongestCommonSubsequenceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = LongestCommonSubsequenceTests.swift; path = ../LongestCommonSubsequenceTests.swift; sourceTree = \"<group>\"; };\n\t\t4716C7A71C93750500F6C1C0 /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t4716C7AB1C93750500F6C1C0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t4716C7A41C93750500F6C1C0 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t4716C7811C936DCB00F6C1C0 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4716C7A81C93750500F6C1C0 /* Tests */,\n\t\t\t\t4716C78F1C93746D00F6C1C0 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t4716C78F1C93746D00F6C1C0 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4716C7A71C93750500F6C1C0 /* Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t4716C7A81C93750500F6C1C0 /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t4716C7881C936DDD00F6C1C0 /* LongestCommonSubsequence.swift */,\n\t\t\t\t4716C7891C936E0E00F6C1C0 /* LongestCommonSubsequenceTests.swift */,\n\t\t\t\t4716C7AB1C93750500F6C1C0 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = Tests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t4716C7A61C93750500F6C1C0 /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 4716C7AC1C93750500F6C1C0 /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t4716C7A31C93750500F6C1C0 /* Sources */,\n\t\t\t\t4716C7A41C93750500F6C1C0 /* Frameworks */,\n\t\t\t\t4716C7A51C93750500F6C1C0 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tproductName = Tests;\n\t\t\tproductReference = 4716C7A71C93750500F6C1C0 /* Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t4716C7821C936DCB00F6C1C0 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0720;\n\t\t\t\tLastUpgradeCheck = 0800;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t4716C7A61C93750500F6C1C0 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2.1;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 4716C7851C936DCB00F6C1C0 /* Build configuration list for PBXProject \"Tests\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t);\n\t\t\tmainGroup = 4716C7811C936DCB00F6C1C0;\n\t\t\tproductRefGroup = 4716C78F1C93746D00F6C1C0 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t4716C7A61C93750500F6C1C0 /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t4716C7A51C93750500F6C1C0 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t4716C7A31C93750500F6C1C0 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t4716C7AF1C93751E00F6C1C0 /* LongestCommonSubsequenceTests.swift in Sources */,\n\t\t\t\t4716C7B01C93751E00F6C1C0 /* LongestCommonSubsequence.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t4716C7861C936DCB00F6C1C0 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t4716C7871C936DCB00F6C1C0 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t4716C7AD1C93750500F6C1C0 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = Tests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.10;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = me.pedrovereza.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 3.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t4716C7AE1C93750500F6C1C0 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = Tests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.10;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = me.pedrovereza.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_VERSION = 3.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t4716C7851C936DCB00F6C1C0 /* Build configuration list for PBXProject \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t4716C7861C936DCB00F6C1C0 /* Debug */,\n\t\t\t\t4716C7871C936DCB00F6C1C0 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t4716C7AC1C93750500F6C1C0 /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t4716C7AD1C93750500F6C1C0 /* Debug */,\n\t\t\t\t4716C7AE1C93750500F6C1C0 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 4716C7821C936DCB00F6C1C0 /* Project object */;\n}\n"
  },
  {
    "path": "Longest Common Subsequence/Tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Longest Common Subsequence/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0800\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"4716C7A61C93750500F6C1C0\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"4716C7A61C93750500F6C1C0\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"4716C7A61C93750500F6C1C0\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"4716C7A61C93750500F6C1C0\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"4716C7A61C93750500F6C1C0\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Merge Sort/MergeSort.playground/Contents.swift",
    "content": "/* Top-down recursive version */\n\nfunc mergeSort<T: Comparable>(_ array: [T]) -> [T] {\n  guard array.count > 1 else { return array }\n  let middleIndex = array.count / 2\n  let leftArray = mergeSort(Array(array[0..<middleIndex]))\n  let rightArray = mergeSort(Array(array[middleIndex..<array.count]))\n  return merge(leftPile: leftArray, rightPile: rightArray)\n}\n\nfunc merge<T: Comparable>(leftPile: [T], rightPile: [T]) -> [T] {\n  var leftIndex = 0\n  var rightIndex = 0\n  var orderedPile = [T]()\n  if orderedPile.capacity < leftPile.count + rightPile.count {\n    orderedPile.reserveCapacity(leftPile.count + rightPile.count)\n  }\n\n  while true {\n    guard leftIndex < leftPile.endIndex else {\n      orderedPile.append(contentsOf: rightPile[rightIndex..<rightPile.endIndex])\n      break\n    }\n    guard rightIndex < rightPile.endIndex else {\n      orderedPile.append(contentsOf: leftPile[leftIndex..<leftPile.endIndex])\n      break\n    }\n    \n    if leftPile[leftIndex] < rightPile[rightIndex] {\n      orderedPile.append(leftPile[leftIndex])\n      leftIndex += 1\n    } else {\n      orderedPile.append(rightPile[rightIndex])\n      rightIndex += 1\n    }\n  }\n  return orderedPile\n}\n\nlet array = [2, 1, 5, 4, 9]\nlet sortedArray = mergeSort(array)\nlet array2 = [\"Tom\", \"Harry\", \"Ron\", \"Chandler\", \"Monica\"]\nlet sortedArray2 = mergeSort(array2)\n\n/* Bottom-up iterative version */\n\nfunc mergeSortBottomUp<T>(_ a: [T], _ isOrderedBefore: (T, T) -> Bool) -> [T] {\n  let n = a.count\n  var z = [a, a]   // the two working arrays\n  var d = 0        // z[d] is used for reading, z[1 - d] for writing\n\n  var width = 1\n  while width < n {\n\n    var i = 0\n    while i < n {\n\n      var j = i\n      var l = i\n      var r = i + width\n\n      let lmax = min(l + width, n)\n      let rmax = min(r + width, n)\n\n      while l < lmax && r < rmax {\n        if isOrderedBefore(z[d][l], z[d][r]) {\n          z[1 - d][j] = z[d][l]\n          l += 1\n        } else {\n          z[1 - d][j] = z[d][r]\n          r += 1\n        }\n        j += 1\n      }\n      while l < lmax {\n        z[1 - d][j] = z[d][l]\n        j += 1\n        l += 1\n      }\n      while r < rmax {\n        z[1 - d][j] = z[d][r]\n        j += 1\n        r += 1\n      }\n\n      i += width*2\n    }\n\n    width *= 2   // in each step, the subarray to merge becomes larger\n    d = 1 - d    // swap active array\n  }\n  return z[d]\n}\n\nmergeSortBottomUp(array, <)\n"
  },
  {
    "path": "Merge Sort/MergeSort.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Merge Sort/MergeSort.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Merge Sort/MergeSort.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Merge Sort/MergeSort.swift",
    "content": "//\n//  Mergesort.swift\n//\n//\n//  Created by Kelvin Lau on 2016-02-03.\n//\n//\n\nfunc mergeSort<T: Comparable>(_ array: [T]) -> [T] {\n  guard array.count > 1 else { return array }\n  let middleIndex = array.count / 2\n  let leftArray = mergeSort(Array(array[0..<middleIndex]))\n  let rightArray = mergeSort(Array(array[middleIndex..<array.count]))\n  return merge(leftPile: leftArray, rightPile: rightArray)\n}\n\nfunc merge<T: Comparable>(leftPile: [T], rightPile: [T]) -> [T] {\n  var leftIndex = 0\n  var rightIndex = 0\n  var orderedPile: [T] = []\n  if orderedPile.capacity < leftPile.count + rightPile.count {\n    orderedPile.reserveCapacity(leftPile.count + rightPile.count)\n  }\n\n  while true {\n      guard leftIndex < leftPile.endIndex else {\n          orderedPile.append(contentsOf: rightPile[rightIndex..<rightPile.endIndex])\n          break\n      }\n      guard rightIndex < rightPile.endIndex else {\n          orderedPile.append(contentsOf: leftPile[leftIndex..<leftPile.endIndex])\n          break\n      }\n      \n      if leftPile[leftIndex] < rightPile[rightIndex] {\n          orderedPile.append(leftPile[leftIndex])\n          leftIndex += 1\n      } else {\n          orderedPile.append(rightPile[rightIndex])\n          rightIndex += 1\n      }\n  }\n\n\n  return orderedPile\n}\n\n/*\n  This is an iterative bottom-up implementation. Instead of recursively splitting\n  up the array into smaller sublists, it immediately starts merging the individual\n  array elements.\n\n  As the algorithm works its way up, it no longer merges individual elements but\n  larger and larger subarrays, until eventually the entire array is merged and\n  sorted.\n\n  To avoid allocating many temporary array objects, it uses double-buffering with\n  just two arrays.\n*/\nfunc mergeSortBottomUp<T>(_ a: [T], _ isOrderedBefore: (T, T) -> Bool) -> [T] {\n  let n = a.count\n  var z = [a, a]   // the two working arrays\n  var d = 0        // z[d] is used for reading, z[1 - d] for writing\n\n  var width = 1\n  while width < n {\n\n    var i = 0\n    while i < n {\n\n      var j = i\n      var l = i\n      var r = i + width\n\n      let lmax = min(l + width, n)\n      let rmax = min(r + width, n)\n\n      while l < lmax && r < rmax {\n        if isOrderedBefore(z[d][l], z[d][r]) {\n          z[1 - d][j] = z[d][l]\n          l += 1\n        } else {\n          z[1 - d][j] = z[d][r]\n          r += 1\n        }\n        j += 1\n      }\n      while l < lmax {\n        z[1 - d][j] = z[d][l]\n        j += 1\n        l += 1\n      }\n      while r < rmax {\n        z[1 - d][j] = z[d][r]\n        j += 1\n        r += 1\n      }\n\n      i += width*2\n    }\n\n    width *= 2   // in each step, the subarray to merge becomes larger\n    d = 1 - d    // swap active array\n  }\n  return z[d]\n}\n"
  },
  {
    "path": "Merge Sort/README.markdown",
    "content": "# Merge Sort\n\n> This topic has been tutorialized [here](https://www.raywenderlich.com/154256/swift-algorithm-club-swift-merge-sort)\n\nGoal: Sort an array from low to high (or high to low)\n\nInvented in 1945 by John von Neumann, merge-sort is an efficient algorithm with a best, worst, and average time complexity of **O(n log n)**.\n\nThe merge-sort algorithm uses the **divide and conquer** approach which is to divide a big problem into smaller problems and solve them. I think of the merge-sort algorithm as **split first** and **merge after**.\n\nAssume you need to sort an array of *n* numbers in the right order. The merge-sort algorithm works as follows:\n\n- Put the numbers in an unsorted pile.\n- Split the pile into two. Now, you have **two unsorted piles** of numbers.\n- Keep splitting the resulting piles until you cannot split anymore. In the end, you will have *n* piles with one number in each pile.\n- Begin to **merge** the piles together by pairing them sequentially. During each merge, put the contents in sorted order. This is fairly easy because each individual pile is already sorted.\n\n## An example\n\n### Splitting\n\nAssume you are given an array of *n* numbers as`[2, 1, 5, 4, 9]`. This is an unsorted pile. The goal is to keep splitting the pile until you cannot split anymore.\n\nFirst, split the array into two halves: `[2, 1]` and `[5, 4, 9]`. Can you keep splitting them? Yes, you can!\n\nFocus on the left pile. Split`[2, 1]` into `[2]` and `[1]`. Can you keep splitting them? No. Time to check the other pile.\n\nSplit `[5, 4, 9]` into `[5]` and `[4, 9]`. Unsurprisingly, `[5]` cannot be split anymore, but `[4, 9]` can be split into `[4]` and `[9]`.\n\nThe splitting process ends with the following piles: `[2]` `[1]` `[5]` `[4]` `[9]`. Notice that each pile consists of just one element.\n\n### Merging\n\nNow that you have split the array, you should **merge** the piles together **while sorting them**. Remember, the idea is to solve many small problems rather than a big one. For each merge iteration, you must be concerned at merging one pile with another.\n\nGiven the piles `[2]` `[1]` `[5]` `[4]` `[9]`, the first pass will result in `[1, 2]` and `[4, 5]` and `[9]`. Since `[9]` is the odd one out, you cannot merge it with anything during this pass.\n\nThe next pass will merge `[1, 2]` and `[4, 5]` together. This results in `[1, 2, 4, 5]`, with the `[9]` left out again because it is the odd one out.\n\nYou are left with only two piles `[1, 2, 4, 5]` and `[9]`, finally gets its chance to merge, resulting in the sorted array as `[1, 2, 4, 5, 9]`.\n\n## Top-down implementation\n\nHere's what merge sort may look like in Swift:\n\n```swift\nfunc mergeSort(_ array: [Int]) -> [Int] {\n  guard array.count > 1 else { return array }    // 1\n\n  let middleIndex = array.count / 2              // 2\n\n  let leftArray = mergeSort(Array(array[0..<middleIndex]))             // 3\n\n  let rightArray = mergeSort(Array(array[middleIndex..<array.count]))  // 4\n\n  return merge(leftPile: leftArray, rightPile: rightArray)             // 5\n}\n```\n\nA step-by-step explanation of how the code works:\n\n1. If the array is empty or contains a single element, there is no way to split it into smaller pieces. You must just return the array.\n\n2. Find the middle index.\n\n3. Using the middle index from the previous step, recursively split the left side of the array.\n\n4. Also, recursively split the right side of the array.\n\n5. Finally, merge all the values together, making sure that it is always sorted.\n\nHere's the merging algorithm:\n\n```swift\nfunc merge(leftPile: [Int], rightPile: [Int]) -> [Int] {\n  // 1\n  var leftIndex = 0\n  var rightIndex = 0\n\n  // 2\n  var orderedPile = [Int]()\n  orderedPile.reserveCapacity(leftPile.count + rightPile.count)\n\n  // 3\n  while leftIndex < leftPile.count && rightIndex < rightPile.count {\n    if leftPile[leftIndex] < rightPile[rightIndex] {\n      orderedPile.append(leftPile[leftIndex])\n      leftIndex += 1\n    } else if leftPile[leftIndex] > rightPile[rightIndex] {\n      orderedPile.append(rightPile[rightIndex])\n      rightIndex += 1\n    } else {\n      orderedPile.append(leftPile[leftIndex])\n      leftIndex += 1\n      orderedPile.append(rightPile[rightIndex])\n      rightIndex += 1\n    }\n  }\n\n  // 4\n  while leftIndex < leftPile.count {\n    orderedPile.append(leftPile[leftIndex])\n    leftIndex += 1\n  }\n\n  while rightIndex < rightPile.count {\n    orderedPile.append(rightPile[rightIndex])\n    rightIndex += 1\n  }\n\n  return orderedPile\n}\n```\n\nThis method may look scary, but it is quite straightforward:\n\n1. You need two indexes to keep track of your progress for the two arrays while merging.\n\n2. This is the merged array. It is empty right now, but you will build it up in subsequent steps by appending elements from the other arrays. Since you already know number of elements that will end up in this array, you reserve capacity to avoid reallocation overhead later.\n\n3. This while-loop will compare the elements from the left and right sides and append them into the `orderedPile` while making sure that the result stays in order.\n\n4. If control exits from the previous while-loop, it means that either the `leftPile` or the `rightPile` has its contents completely merged into the `orderedPile`. At this point, you no longer need to do comparisons. Just append the rest of the contents of the other array until there is no more to append.\n\nAs an example of how `merge()` works, suppose that we have the following piles: `leftPile = [1, 7, 8]` and `rightPile = [3, 6, 9]`. Note that each of these piles is individually sorted already -- that is always true with merge sort. These are merged into one larger sorted pile in the following steps:\n\n\tleftPile       rightPile       orderedPile\n\t[ 1, 7, 8 ]    [ 3, 6, 9 ]     [ ]\n      l              r\n\nThe left index, here represented as `l`, points at the first item from the left pile, `1`. The right index, `r`, points at `3`. Therefore, the first item we add to `orderedPile` is `1`. We also move the left index `l` to the next item.\n\n\tleftPile       rightPile       orderedPile\n\t[ 1, 7, 8 ]    [ 3, 6, 9 ]     [ 1 ]\n      -->l           r\n\nNow `l` points at `7` but `r` is still at `3`. We add the smallest item to the ordered pile, so that is `3`. The situation is now:\n\n\tleftPile       rightPile       orderedPile\n\t[ 1, 7, 8 ]    [ 3, 6, 9 ]     [ 1, 3 ]\n         l           -->r\n\nThis process repeats. At each step, we pick the smallest item from either the `leftPile` or the `rightPile` and add the item into the `orderedPile`:\n\n\tleftPile       rightPile       orderedPile\n\t[ 1, 7, 8 ]    [ 3, 6, 9 ]     [ 1, 3, 6 ]\n         l              -->r\n\n\tleftPile       rightPile       orderedPile\n\t[ 1, 7, 8 ]    [ 3, 6, 9 ]     [ 1, 3, 6, 7 ]\n         -->l              r\n\n\tleftPile       rightPile       orderedPile\n\t[ 1, 7, 8 ]    [ 3, 6, 9 ]     [ 1, 3, 6, 7, 8 ]\n            -->l           r\n\nNow, there are no more items in the left pile. We simply add the remaining items from the right pile, and we are done. The merged pile is `[ 1, 3, 6, 7, 8, 9 ]`.\n\nNotice that, this algorithm is very simple: it moves from left-to-right through the two piles and at every step picks the smallest item. This works because we guarantee that each of the piles is already sorted.\n\n## Bottom-up implementation\n\nThe implementation of the merge-sort algorithm you have seen so far is called the \"top-down\" approach because it first splits the array into smaller piles and then merges them. When sorting an array (as opposed to, say, a linked list) you can actually skip the splitting step and immediately start merging the individual array elements. This is called the \"bottom-up\" approach.\n\nTime to step up the game a little. :-) Here is a complete bottom-up implementation in Swift:\n\n```swift\nfunc mergeSortBottomUp<T>(_ a: [T], _ isOrderedBefore: (T, T) -> Bool) -> [T] {\n  let n = a.count\n\n  var z = [a, a]      // 1\n  var d = 0\n\n  var width = 1\n  while width < n {   // 2\n\n    var i = 0\n    while i < n {     // 3\n\n      var j = i\n      var l = i\n      var r = i + width\n\n      let lmax = min(l + width, n)\n      let rmax = min(r + width, n)\n\n      while l < lmax && r < rmax {                // 4\n        if isOrderedBefore(z[d][l], z[d][r]) {\n          z[1 - d][j] = z[d][l]\n          l += 1\n        } else {\n          z[1 - d][j] = z[d][r]\n          r += 1\n        }\n        j += 1\n      }\n      while l < lmax {\n        z[1 - d][j] = z[d][l]\n        j += 1\n        l += 1\n      }\n      while r < rmax {\n        z[1 - d][j] = z[d][r]\n        j += 1\n        r += 1\n      }\n\n      i += width*2\n    }\n\n    width *= 2\n    d = 1 - d      // 5\n  }\n  return z[d]\n}\n```\n\nIt looks a lot more intimidating than the top-down version, but notice that the main body includes the same three `while` loops from `merge()`.\n\nNotable points:\n\n1. The Merge-sort algorithm needs a temporary working array because you cannot merge the left and right piles and at the same time overwrite their contents. Because allocating a new array for each merge is wasteful, we are using two working arrays, and we will switch between them using the value of `d`, which is either 0 or 1. The array `z[d]` is used for reading, and `z[1 - d]` is used for writing. This is called *double-buffering*.\n\n2. Conceptually, the bottom-up version works the same way as the top-down version. First, it merges small piles of one element each, then it merges piles of two elements each, then piles of four elements each, and so on. The size of the pile is given by `width`. Initially, `width` is `1` but at the end of each loop iteration, we multiply it by two, so this outer loop determines the size of the piles being merged, and the subarrays to merge become larger in each step.\n\n3. The inner loop steps through the piles and merges each pair of piles into a larger one. The result is written in the array given by `z[1 - d]`.\n\n4. This is the same logic as in the top-down version. The main difference is that we're using double-buffering, so values are read from `z[d]` and written into `z[1 - d]`. It also uses an `isOrderedBefore` function to compare the elements rather than just `<`, so this merge-sort algorithm is generic, and you can use it to sort any kind of object you want.\n\n5. At this point, the piles of size `width` from array `z[d]` have been merged into larger piles of size `width * 2` in array `z[1 - d]`. Here, we swap the active array, so that in the next step we'll read from the new piles we have just created.\n\nThis function is generic, so you can use it to sort any type you desire, as long as you provide a proper `isOrderedBefore` closure to compare the elements.\n\nExample of how to use it:\n\n```swift\nlet array = [2, 1, 5, 4, 9]\nmergeSortBottomUp(array, <)   // [1, 2, 4, 5, 9]\n```\n\n## Performance\n\nThe speed of the merge-sort algorithm is dependent on the size of the array it needs to sort. The larger the array, the more work it needs to do.\n\nWhether or not the initial array is sorted already does not affect the speed of the merge-sort algorithm since you will be doing the same amount splits and comparisons regardless of the initial order of the elements.\n\nTherefore, the time complexity for the best, worst, and average case will always be **O(n log n)**.\n\nA disadvantage of the merge-sort algorithm is that it needs a temporary \"working\" array equal in size to the array being sorted. It is not an **in-place** sort, unlike for example [quicksort](../Quicksort/).\n\nMost implementations of the merge-sort algorithm produce a **stable** sort. This means that array elements that have identical sort keys will stay in the same order relative to each other after sorting. This is not important for simple values such as numbers or strings, but it can be an issue when sorting more complex objects.\n\n## See also\n\n[Merge sort on Wikipedia](https://en.wikipedia.org/wiki/Merge_sort)\n\n*Written by Kelvin Lau. Additions by Matthijs Hollemans.*\n"
  },
  {
    "path": "Miller-Rabin Primality Test/MRPrimality.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\ndo {\n    // Real primes\n    try checkWithMillerRabin(5)\n    try checkWithMillerRabin(439)\n    try checkWithMillerRabin(1201)\n    try checkWithMillerRabin(143477)\n    try checkWithMillerRabin(1299869)\n    try checkWithMillerRabin(15487361)\n    try checkWithMillerRabin(179426363)\n    \n    // Fake primes\n    try checkWithMillerRabin(15)\n    try checkWithMillerRabin(435)\n    try checkWithMillerRabin(1207)\n    try checkWithMillerRabin(143473)\n    try checkWithMillerRabin(1291869)\n    try checkWithMillerRabin(15487161)\n    try checkWithMillerRabin(178426363)\n    \n    // Specifying accuracy\n    try checkWithMillerRabin(179426363, accuracy: 10)\n} catch {\n    dump(error)\n}"
  },
  {
    "path": "Miller-Rabin Primality Test/MRPrimality.playground/Sources/MillerRabin.swift",
    "content": "//\n//  MRPrimality.swift\n//\n//\n//  Created by Sahn Cha on 2016. 10. 18..\n//\n//\n\nimport Foundation\n\nenum MillerRabinError: Error {\n    case primeLowAccuracy\n    case primeLowerBorder\n    case uIntOverflow\n}\n\n/*\n The Miller–Rabin test relies on an equality or set of equalities that\n hold true for prime values, then checks whether or not they hold for\n a number that we want to test for primality.\n \n - Parameter n: an odd integer to be tested for primality;\n - Parameter k: a parameter that determines the accuracy of the test\n - throws: Can throw an error of type `MillerRabinError`.\n - Returns: composite if n is composite, otherwise probably prime\n */\npublic func checkWithMillerRabin(_ n: UInt, accuracy k: UInt = 1) throws -> Bool {\n    guard k > 0 else { throw MillerRabinError.primeLowAccuracy }\n    guard n > 0 else { throw MillerRabinError.primeLowerBorder }\n    guard n > 3 else { return true }\n    \n    // return false for all even numbers bigger than 2\n    if n % 2 == 0 {\n        return false\n    }\n    \n    let s: UInt = UInt((n - 1).trailingZeroBitCount)\n    let d: UInt = (n - 1) >> s\n    \n    guard UInt(pow(2.0, Double(s))) * d == n - 1 else { throw MillerRabinError.primeLowerBorder }\n    \n    /// Inspect whether a given witness will reveal the true identity of n.\n    func tryComposite(_ a: UInt, d: UInt, n: UInt) throws -> Bool? {\n        var x = try calculateModularExponentiation(base: a, exponent: d, modulus: n)\n        if x == 1 || x == (n - 1) {\n            return nil\n        }\n        for _ in 1..<s {\n            x = try calculateModularExponentiation(base: x, exponent: 2, modulus: n)\n            if x == 1 {\n                return false\n            } else if x == (n - 1) {\n                return nil\n            }\n        }\n        return false\n    }\n    \n    for _ in 0..<k {\n        let a = UInt.random(in: 2..<n-2)\n        if let composite = try tryComposite(a, d: d, n: n) {\n            return composite\n        }\n    }\n    \n    return true\n}\n\n/*\n Calculates the modular exponentiation based on `Applied Cryptography by Bruce Schneier.`\n in `Schneier, Bruce (1996). Applied Cryptography: Protocols, Algorithms,\n and Source Code in C, Second Edition (2nd ed.). Wiley. ISBN 978-0-471-11709-4.`\n \n - Parameter base: The natural base b.\n - Parameter base: The natural exponent e.\n - Parameter base: The natural modulus m.\n - Throws: Can throw a `uIntOverflow` if the modulus' square exceeds the memory\n limitations of UInt on the current system.\n - Returns: The modular exponentiation c.\n */\nprivate func calculateModularExponentiation(base: UInt, exponent: UInt, modulus: UInt) throws -> UInt {\n    guard modulus > 1 else { return 0 }\n    guard !(modulus-1).multipliedReportingOverflow(by: (modulus-1)).overflow else {\n        throw MillerRabinError.uIntOverflow\n    }\n    \n    var result: UInt = 1\n    var exponentCopy = exponent\n    var baseCopy = base % modulus\n    \n    while exponentCopy > 0 {\n        if exponentCopy % 2 == 1 {\n            result = (result * baseCopy) % modulus\n        }\n        exponentCopy = exponentCopy >> 1\n        baseCopy = (baseCopy * baseCopy) % modulus\n    }\n    \n    return result\n}\n"
  },
  {
    "path": "Miller-Rabin Primality Test/MRPrimality.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='macos'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Miller-Rabin Primality Test/MRPrimality.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Miller-Rabin Primality Test/MRPrimality.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Miller-Rabin Primality Test/MRPrimality.swift",
    "content": "//\n//  MRPrimality.swift\n//\n//\n//  Created by Sahn Cha on 2016. 10. 18..\n//\n//\n\nimport Foundation\n\nenum MillerRabinError: Error {\n    case primeLowAccuracy\n    case primeLowerBorder\n    case uIntOverflow\n}\n\n/*\n The Miller–Rabin test relies on an equality or set of equalities that\n hold true for prime values, then checks whether or not they hold for\n a number that we want to test for primality.\n\n - Parameter n: an odd integer to be tested for primality;\n - Parameter k: a parameter that determines the accuracy of the test\n - throws: Can throw an error of type `MillerRabinError`.\n - Returns: composite if n is composite, otherwise probably prime\n*/\nfunc checkWithMillerRabin(_ n: UInt, accuracy k: UInt = 1) throws -> Bool {\n    guard k > 0 else { throw MillerRabinError.primeLowAccuracy }\n    guard n > 0 else { throw MillerRabinError.primeLowerBorder }\n    guard n > 3 else { return true }\n\n    // return false for all even numbers bigger than 2\n    if n % 2 == 0 {\n        return false\n    }\n\n    let s: UInt = UInt((n - 1).trailingZeroBitCount)\n    let d: UInt = (n - 1) >> s\n\n    guard UInt(pow(2.0, Double(s))) * d == n - 1 else { throw EncryptionError.primeLowerBorder }\n\n    /// Inspect whether a given witness will reveal the true identity of n.\n    func tryComposite(_ a: UInt, d: UInt, n: UInt) throws -> Bool? {\n        var x = try calculateModularExponentiation(base: a, exponent: d, modulus: n)\n        if x == 1 || x == (n - 1) {\n            return nil\n        }\n        for _ in 1..<s {\n            x = try calculateModularExponentiation(base: x, exponent: 2, modulus: n)\n            if x == 1 {\n                return false\n            } else if x == (n - 1) {\n                return nil\n            }\n        }\n        return false\n    }\n\n    for _ in 0..<k {\n        let a = UInt.random(in: 2..<n-2)\n        if let composite = try tryComposite(a, d: d, n: n) {\n            return composite\n        }\n    }\n\n    return true\n}\n\n/*\n Calculates the modular exponentiation based on `Applied Cryptography by Bruce Schneier.`\n in `Schneier, Bruce (1996). Applied Cryptography: Protocols, Algorithms,\n and Source Code in C, Second Edition (2nd ed.). Wiley. ISBN 978-0-471-11709-4.`\n\n - Parameter base: The natural base b.\n - Parameter base: The natural exponent e.\n - Parameter base: The natural modulus m.\n - Throws: Can throw a `uIntOverflow` if the modulus' square exceeds the memory\n  limitations of UInt on the current system.\n - Returns: The modular exponentiation c.\n*/\nprivate func calculateModularExponentiation(base: UInt, exponent: UInt, modulus: UInt) throws -> UInt {\n    guard modulus > 1 else { return 0 }\n    guard !(modulus-1).multipliedReportingOverflow(by: (modulus-1)).overflow else {\n        throw MillerRabinError.uIntOverflow\n    }\n\n    var result: UInt = 1\n    var exponentCopy = exponent\n    var baseCopy = base % modulus\n\n    while exponentCopy > 0 {\n        if exponentCopy % 2 == 1 {\n            result = (result * baseCopy) % modulus\n        }\n        exponentCopy = exponentCopy >> 1\n        baseCopy = (baseCopy * baseCopy) % modulus\n    }\n\n    return result\n}\n"
  },
  {
    "path": "Miller-Rabin Primality Test/README.markdown",
    "content": "# Miller-Rabin Primality Test\n\nIn 1976, Gray Miller introduced an algorithm, through his ph.d thesis[1], which determines a primality of the given number. The original algorithm was deterministic under the Extended Reimann Hypothesis, which is yet to be proven. After four years, Michael O. Rabin improved the algorithm[2] by using probabilistic approach and it no longer assumes the unproven hypothesis.\n\n## Probabilistic\n\nThe result of the test is simply a boolean. However, `true` does not implicate _the number is prime_. In fact, it means _the number is **probably** prime_. But `false` does mean _the number is composite_.\n\nIn order to increase the accuracy of the test, it needs to be iterated few times. If it returns `true` in every single iteration, then we can say with confidence that _the number is pro......bably prime_.\n\n## Algorithm\n\nLet `n` be the given number, and write `n-1` as `2^s·d`, where `d` is odd. And choose a random number `a` within the range from `2` to `n - 1`.\n\nNow make a sequence, in modulo `n`, as following:\n\n> a^d, a^(2·d), a^(4·d), ... , a^((2^(s-1))·d), a^((2^s)·d) = a^(n-1)\n\nAnd we say the number `n` passes the test, _probably prime_, if 1) `a^d` is congruence to `1` in modulo `n`, or 2) `a^((2^k)·d)` is congruence to `-1` for some `k = 1, 2, ..., s-1`.\n\n### Pseudo Code\n\nThe following pseudo code is excerpted from Wikipedia[3]:\n\n![Image of Pseudocode](./Images/img_pseudo.png)\n\n## Usage\n\n```swift\ncheckWithMillerRabin(7)                      // test if 7 is prime. (default iteration = 1)\ncheckWithMillerRabin(7, accuracy: 10)       // test if 7 is prime && iterate 10 times.\n```\n\n## Reference\n1. G. L. Miller, \"Riemann's Hypothesis and Tests for Primality\". _J. Comput. System Sci._ 13 (1976), 300-317.\n2. M. O. Rabin, \"Probabilistic algorithm for testing primality\". _Journal of Number Theory._ 12 (1980), 128-138.\n3. Miller–Rabin primality test - Wikipedia, the free encyclopedia\n\n_Written for Swift Algorithm Club by **Sahn Cha**, @scha00_\n_Code updated by **Simon C. Krüger**._\n\n[1]: https://cs.uwaterloo.ca/research/tr/1975/CS-75-27.pdf\n[2]: http://www.sciencedirect.com/science/article/pii/0022314X80900840\n[3]: https://en.wikipedia.org/wiki/Miller–Rabin_primality_test\n"
  },
  {
    "path": "Minimum Edit Distance/MinimumEditDistance.playground/Contents.swift",
    "content": "\n// Minimum Edit Distance\n\nextension String {\n    \n    public func minimumEditDistance(other: String) -> Int {\n        let m = self.count\n        let n = other.count\n        var matrix = [[Int]](repeating: [Int](repeating: 0, count: n + 1), count: m + 1)\n        \n        // initialize matrix\n        for index in 1...m {\n            // the distance of any first string to an empty second string\n            matrix[index][0] = index\n        }\n        \n        for index in 1...n {\n            // the distance of any second string to an empty first string\n            matrix[0][index] = index\n        }\n        \n        // compute Levenshtein distance\n        for (i, selfChar) in self.enumerated() {\n            for (j, otherChar) in other.enumerated() {\n                if otherChar == selfChar {\n                    // substitution of equal symbols with cost 0\n                    matrix[i + 1][j + 1] = matrix[i][j]\n                } else {\n                    // minimum of the cost of insertion, deletion, or substitution \n                    // added to the already computed costs in the corresponding cells\n                    matrix[i + 1][j + 1] = Swift.min(matrix[i][j] + 1, matrix[i + 1][j] + 1, matrix[i][j + 1] + 1)\n                }\n            }\n        }\n        return matrix[m][n]\n    }\n}\n\n\"Door\".minimumEditDistance(other: \"Dolls\")\n"
  },
  {
    "path": "Minimum Edit Distance/MinimumEditDistance.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Minimum Edit Distance/MinimumEditDistance.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Minimum Edit Distance/README.markdown",
    "content": "# Minimum Edit Distance\n\nThe minimum edit distance is a possibility to measure the similarity of two strings *w* and *u* by counting costs of operations which are necessary to transform *w* into *u* (or vice versa).\n\n### Algorithm using Levenshtein distance\n\nA common distance measure is given by the *Levenshtein distance*, which allows the following three transformation operations:\n\n* **Insertion** (*ε→x*) of a single symbol *x* with **cost 1**,\n* **Deletion** (*x→ε*) of a single symbol *x* with **cost 1**, and\n* **Substitution** (*x→y*) of two single symbols *x, y* with **cost 1** if *x≠y* and with **cost 0** otherwise.\n\nWhen transforming a string by a sequence of operations, the costs of the single operations are added to obtain the (minimal) edit distance. For example, the string *Door* can be transformed by the operations *o→l*, *r→l*, *ε→s* to the string *Dolls*, which results in a minimum edit distance of 3.\n\nTo avoid exponential time complexity, the minimum edit distance of two strings in the usual is computed using *dynamic programming*. For this in a matrix\n\n```swift\nvar matrix = [[Int]](repeating: [Int](repeating: 0, count: n + 1), count: m + 1)\n```\n\nalready computed minimal edit distances of prefixes of *w* and *u* (of length *m* and *n*, respectively) are used to fill the matrix. In a first step the matrix is initialized by filling the first row and the first column as follows:\n\n```swift\n// initialize matrix\nfor index in 1...m {\n    // the distance of any first string to an empty second string\n    matrix[index][0] = index\n}\n\nfor index in 1...n {\n    // the distance of any second string to an empty first string\n    matrix[0][index] = index\n}\n```\n\nThen in each cell the minimum of the cost of insertion, deletion, or substitution added to the already computed costs in the corresponding cells is chosen. In this way the matrix is filled iteratively:\n\n```swift\n// compute Levenshtein distance\nfor (i, selfChar) in self.enumerated() {\n    for (j, otherChar) in other.enumerated() {\n        if otherChar == selfChar {\n            // substitution of equal symbols with cost 0\n            matrix[i + 1][j + 1] = matrix[i][j]\n        } else {\n            // minimum of the cost of insertion, deletion, or substitution \n            // added to the already computed costs in the corresponding cells\n            matrix[i + 1][j + 1] = Swift.min(matrix[i][j] + 1, matrix[i + 1][j] + 1, matrix[i][j + 1] + 1)\n        } \n    }\n}\n```\n\nAfter applying this algorithm, the minimal edit distance can be read from the rightmost bottom cell and is returned.\n\n```swift\nreturn matrix[m][n]\n```\n\nThis algorithm has a time complexity of Θ(*mn*).\n\n**TODO**: Other distance measures.\n\n*Written for Swift Algorithm Club by Luisa Herrmann*\n"
  },
  {
    "path": "Minimum Spanning Tree/Kruskal.swift",
    "content": "//\n//  Kruskal.swift\n//  \n//\n//  Created by xiang xin on 16/3/17.\n//\n//\n\nfunc minimumSpanningTreeKruskal<T>(graph: Graph<T>) -> (cost: Int, tree: Graph<T>) {\n  var cost: Int = 0\n  var tree = Graph<T>()\n  let sortedEdgeListByWeight = graph.edgeList.sorted(by: { $0.weight < $1.weight })\n  \n  var unionFind = UnionFind<T>()\n  for vertex in graph.vertices {\n    unionFind.addSetWith(vertex)\n  }\n  \n  for edge in sortedEdgeListByWeight {\n    let v1 = edge.vertex1\n    let v2 = edge.vertex2\n    if !unionFind.inSameSet(v1, and: v2) {\n      cost += edge.weight\n      tree.addEdge(edge)\n      unionFind.unionSetsContaining(v1, and: v2)\n    }\n  }\n  \n  return (cost: cost, tree: tree)\n}\n"
  },
  {
    "path": "Minimum Spanning Tree/MinimumSpanningTree.playground/Contents.swift",
    "content": "/**\n The following code demonstrates getting MST of the graph below by both\n Kruskal's and Prim's algorithms.\n */\n\nfunc minimumSpanningTreeKruskal<T>(graph: Graph<T>) -> (cost: Int, tree: Graph<T>) {\n    var cost: Int = 0\n    var tree = Graph<T>()\n    let sortedEdgeListByWeight = graph.edgeList.sorted(by: { $0.weight < $1.weight })\n    \n    var unionFind = UnionFind<T>()\n    for vertex in graph.vertices {\n        unionFind.addSetWith(vertex)\n    }\n    \n    for edge in sortedEdgeListByWeight {\n        let v1 = edge.vertex1\n        let v2 = edge.vertex2\n        if !unionFind.inSameSet(v1, and: v2) {\n            cost += edge.weight\n            tree.addEdge(edge)\n            unionFind.unionSetsContaining(v1, and: v2)\n        }\n    }\n    \n    return (cost: cost, tree: tree)\n}\n\nfunc minimumSpanningTreePrim<T>(graph: Graph<T>) -> (cost: Int, tree: Graph<T>) {\n    var cost: Int = 0\n    var tree = Graph<T>()\n    \n    guard let start = graph.vertices.first else {\n        return (cost: cost, tree: tree)\n    }\n    \n    var visited = Set<T>()\n    var priorityQueue = PriorityQueue<(vertex: T, weight: Int, parent: T?)>(\n        sort: { $0.weight < $1.weight })\n    \n    priorityQueue.enqueue((vertex: start, weight: 0, parent: nil))\n    while let head = priorityQueue.dequeue() {\n        let vertex = head.vertex\n        if visited.contains(vertex) {\n            continue\n        }\n        visited.insert(vertex)\n        \n        cost += head.weight\n        if let prev = head.parent {\n            tree.addEdge(vertex1: prev, vertex2: vertex, weight: head.weight)\n        }\n        \n        if let neighbours = graph.adjList[vertex] {\n            for neighbour in neighbours {\n                let nextVertex = neighbour.vertex\n                if !visited.contains(nextVertex) {\n                    priorityQueue.enqueue((vertex: nextVertex, weight: neighbour.weight, parent: vertex))\n                }\n            }\n        }\n    }\n    \n    return (cost: cost, tree: tree)\n}\n\n/*:\n ![Graph](mst.png)\n */\n\nvar graph = Graph<Int>()\ngraph.addEdge(vertex1: 1, vertex2: 2, weight: 6)\ngraph.addEdge(vertex1: 1, vertex2: 3, weight: 1)\ngraph.addEdge(vertex1: 1, vertex2: 4, weight: 5)\ngraph.addEdge(vertex1: 2, vertex2: 3, weight: 5)\ngraph.addEdge(vertex1: 2, vertex2: 5, weight: 3)\ngraph.addEdge(vertex1: 3, vertex2: 4, weight: 5)\ngraph.addEdge(vertex1: 3, vertex2: 5, weight: 6)\ngraph.addEdge(vertex1: 3, vertex2: 6, weight: 4)\ngraph.addEdge(vertex1: 4, vertex2: 6, weight: 2)\ngraph.addEdge(vertex1: 5, vertex2: 6, weight: 6)\n\nprint(\"===== Kruskal's =====\")\nlet result1 = minimumSpanningTreeKruskal(graph: graph)\nprint(\"Minimum spanning tree total weight: \\(result1.cost)\")\nprint(\"Minimum spanning tree:\")\nprint(result1.tree)\n\nprint(\"===== Prim's =====\")\nlet result2 = minimumSpanningTreePrim(graph: graph)\nprint(\"Minimum spanning tree total weight: \\(result2.cost)\")\nprint(\"Minimum spanning tree:\")\nprint(result2.tree)\n"
  },
  {
    "path": "Minimum Spanning Tree/MinimumSpanningTree.playground/Sources/Graph.swift",
    "content": "// Undirected edge\npublic struct Edge<T>: CustomStringConvertible {\n  public let vertex1: T\n  public let vertex2: T\n  public let weight: Int\n\n  public var description: String {\n    return \"[\\(vertex1)-\\(vertex2), \\(weight)]\"\n  }\n}\n\n// Undirected weighted graph\npublic struct Graph<T: Hashable>: CustomStringConvertible {\n\n  public private(set) var edgeList: [Edge<T>]\n  public private(set) var vertices: Set<T>\n  public private(set) var adjList: [T: [(vertex: T, weight: Int)]]\n\n  public init() {\n    edgeList = [Edge<T>]()\n    vertices = Set<T>()\n    adjList = [T: [(vertex: T, weight: Int)]]()\n  }\n\n  public var description: String {\n    var description = \"\"\n    for edge in edgeList {\n      description += edge.description + \"\\n\"\n    }\n    return description\n  }\n\n  public mutating func addEdge(vertex1 v1: T, vertex2 v2: T, weight w: Int) {\n    edgeList.append(Edge(vertex1: v1, vertex2: v2, weight: w))\n    vertices.insert(v1)\n    vertices.insert(v2)\n\n    adjList[v1] = adjList[v1] ?? []\n    adjList[v1]?.append((vertex: v2, weight: w))\n\n    adjList[v2] = adjList[v2] ?? []\n    adjList[v2]?.append((vertex: v1, weight: w))\n  }\n\n  public mutating func addEdge(_ edge: Edge<T>) {\n    addEdge(vertex1: edge.vertex1, vertex2: edge.vertex2, weight: edge.weight)\n  }\n}\n"
  },
  {
    "path": "Minimum Spanning Tree/MinimumSpanningTree.playground/Sources/Heap.swift",
    "content": "//\n//  Heap.swift\n//  Written for the Swift Algorithm Club by Kevin Randrup and Matthijs Hollemans\n//\n\npublic struct Heap<T> {\n  /** The array that stores the heap's nodes. */\n  var elements = [T]()\n\n  /** Determines whether this is a max-heap (>) or min-heap (<). */\n  fileprivate var isOrderedBefore: (T, T) -> Bool\n\n  /**\n   * Creates an empty heap.\n   * The sort function determines whether this is a min-heap or max-heap.\n   * For integers, > makes a max-heap, < makes a min-heap.\n   */\n  public init(sort: @escaping (T, T) -> Bool) {\n    self.isOrderedBefore = sort\n  }\n\n  /**\n   * Creates a heap from an array. The order of the array does not matter;\n   * the elements are inserted into the heap in the order determined by the\n   * sort function.\n   */\n  public init(array: [T], sort: @escaping (T, T) -> Bool) {\n    self.isOrderedBefore = sort\n    buildHeap(fromArray: array)\n  }\n\n  /*\n  // This version has O(n log n) performance.\n  private mutating func buildHeap(array: [T]) {\n    elements.reserveCapacity(array.count)\n    for value in array {\n      insert(value)\n    }\n  }\n  */\n\n  /**\n   * Converts an array to a max-heap or min-heap in a bottom-up manner.\n   * Performance: This runs pretty much in O(n).\n   */\n  fileprivate mutating func buildHeap(fromArray array: [T]) {\n    elements = array\n    for i in stride(from: (elements.count/2 - 1), through: 0, by: -1) {\n      shiftDown(i, heapSize: elements.count)\n    }\n  }\n\n  public var isEmpty: Bool {\n    return elements.isEmpty\n  }\n\n  public var count: Int {\n    return elements.count\n  }\n\n  /**\n   * Returns the index of the parent of the element at index i.\n   * The element at index 0 is the root of the tree and has no parent.\n   */\n  @inline(__always) func parentIndex(ofIndex i: Int) -> Int {\n    return (i - 1) / 2\n  }\n\n  /**\n   * Returns the index of the left child of the element at index i.\n   * Note that this index can be greater than the heap size, in which case\n   * there is no left child.\n   */\n  @inline(__always) func leftChildIndex(ofIndex i: Int) -> Int {\n    return 2*i + 1\n  }\n\n  /**\n   * Returns the index of the right child of the element at index i.\n   * Note that this index can be greater than the heap size, in which case\n   * there is no right child.\n   */\n  @inline(__always) func rightChildIndex(ofIndex i: Int) -> Int {\n    return 2*i + 2\n  }\n\n  /**\n   * Returns the maximum value in the heap (for a max-heap) or the minimum\n   * value (for a min-heap).\n   */\n  public func peek() -> T? {\n    return elements.first\n  }\n\n  /**\n   * Adds a new value to the heap. This reorders the heap so that the max-heap\n   * or min-heap property still holds. Performance: O(log n).\n   */\n  public mutating func insert(_ value: T) {\n    elements.append(value)\n    shiftUp(elements.count - 1)\n  }\n\n  public mutating func insert<S: Sequence>(_ sequence: S) where S.Iterator.Element == T {\n    for value in sequence {\n      insert(value)\n    }\n  }\n\n  /**\n   * Allows you to change an element. In a max-heap, the new element should be\n   * larger than the old one; in a min-heap it should be smaller.\n   */\n  public mutating func replace(index i: Int, value: T) {\n    guard i < elements.count else { return }\n\n    assert(isOrderedBefore(value, elements[i]))\n    elements[i] = value\n    shiftUp(i)\n  }\n\n  /**\n   * Removes the root node from the heap. For a max-heap, this is the maximum\n   * value; for a min-heap it is the minimum value. Performance: O(log n).\n   */\n  @discardableResult public mutating func remove() -> T? {\n    if elements.isEmpty {\n      return nil\n    } else if elements.count == 1 {\n      return elements.removeLast()\n    } else {\n      // Use the last node to replace the first one, then fix the heap by\n      // shifting this new first node into its proper position.\n      let value = elements[0]\n      elements[0] = elements.removeLast()\n      shiftDown()\n      return value\n    }\n  }\n\n  /**\n   * Removes an arbitrary node from the heap. Performance: O(log n). You need\n   * to know the node's index, which may actually take O(n) steps to find.\n   */\n  public mutating func removeAt(_ index: Int) -> T? {\n    guard index < elements.count else { return nil }\n\n    let size = elements.count - 1\n    if index != size {\n      elements.swapAt(index,size)\n      shiftDown(index, heapSize: size)\n      shiftUp(index)\n    }\n    return elements.removeLast()\n  }\n\n  /**\n   * Takes a child node and looks at its parents; if a parent is not larger\n   * (max-heap) or not smaller (min-heap) than the child, we exchange them.\n   */\n  mutating func shiftUp(_ index: Int) {\n    var childIndex = index\n    let child = elements[childIndex]\n    var parentIndex = self.parentIndex(ofIndex: childIndex)\n\n    while childIndex > 0 && isOrderedBefore(child, elements[parentIndex]) {\n      elements[childIndex] = elements[parentIndex]\n      childIndex = parentIndex\n      parentIndex = self.parentIndex(ofIndex: childIndex)\n    }\n\n    elements[childIndex] = child\n  }\n\n  mutating func shiftDown() {\n    shiftDown(0, heapSize: elements.count)\n  }\n\n  /**\n   * Looks at a parent node and makes sure it is still larger (max-heap) or\n   * smaller (min-heap) than its childeren.\n   */\n  mutating func shiftDown(_ index: Int, heapSize: Int) {\n    var parentIndex = index\n\n    while true {\n      let leftChildIndex = self.leftChildIndex(ofIndex: parentIndex)\n      let rightChildIndex = leftChildIndex + 1\n\n      // Figure out which comes first if we order them by the sort function:\n      // the parent, the left child, or the right child. If the parent comes\n      // first, we're done. If not, that element is out-of-place and we make\n      // it \"float down\" the tree until the heap property is restored.\n      var first = parentIndex\n      if leftChildIndex < heapSize && isOrderedBefore(elements[leftChildIndex], elements[first]) {\n        first = leftChildIndex\n      }\n      if rightChildIndex < heapSize && isOrderedBefore(elements[rightChildIndex], elements[first]) {\n        first = rightChildIndex\n      }\n      if first == parentIndex { return }\n\n      elements.swapAt(parentIndex,first)\n      parentIndex = first\n    }\n  }\n}\n\n// MARK: - Searching\n\nextension Heap where T: Equatable {\n  /**\n   * Searches the heap for the given element. Performance: O(n).\n   */\n  public func index(of element: T) -> Int? {\n    return index(of: element, 0)\n  }\n\n  fileprivate func index(of element: T, _ i: Int) -> Int? {\n    if i >= count { return nil }\n    if isOrderedBefore(element, elements[i]) { return nil }\n    if element == elements[i] { return i }\n    if let j = index(of: element, self.leftChildIndex(ofIndex: i)) { return j }\n    if let j = index(of: element, self.rightChildIndex(ofIndex: i)) { return j }\n    return nil\n  }\n}\n"
  },
  {
    "path": "Minimum Spanning Tree/MinimumSpanningTree.playground/Sources/PriorityQueue.swift",
    "content": "/*\n  Priority Queue, a queue where the most \"important\" items are at the front of\n  the queue.\n\n  The heap is a natural data structure for a priority queue, so this object\n  simply wraps the Heap struct.\n\n  All operations are O(lg n).\n\n  Just like a heap can be a max-heap or min-heap, the queue can be a max-priority\n  queue (largest element first) or a min-priority queue (smallest element first).\n*/\npublic struct PriorityQueue<T> {\n  fileprivate var heap: Heap<T>\n\n  /*\n    To create a max-priority queue, supply a > sort function. For a min-priority\n    queue, use <.\n  */\n  public init(sort: @escaping (T, T) -> Bool) {\n    heap = Heap(sort: sort)\n  }\n\n  public var isEmpty: Bool {\n    return heap.isEmpty\n  }\n\n  public var count: Int {\n    return heap.count\n  }\n\n  public func peek() -> T? {\n    return heap.peek()\n  }\n\n  public mutating func enqueue(_ element: T) {\n    heap.insert(element)\n  }\n\n  public mutating func dequeue() -> T? {\n    return heap.remove()\n  }\n\n  /*\n    Allows you to change the priority of an element. In a max-priority queue,\n    the new priority should be larger than the old one; in a min-priority queue\n    it should be smaller.\n  */\n  public mutating func changePriority(index i: Int, value: T) {\n    return heap.replace(index: i, value: value)\n  }\n}\n\nextension PriorityQueue where T: Equatable {\n  public func index(of element: T) -> Int? {\n    return heap.index(of: element)\n  }\n}\n"
  },
  {
    "path": "Minimum Spanning Tree/MinimumSpanningTree.playground/Sources/UnionFind.swift",
    "content": "/*\n Union-Find Data Structure\n\n Performance:\n adding new set is almost O(1)\n finding set of element is almost O(1)\n union sets is almost O(1)\n */\n\npublic struct UnionFind<T: Hashable> {\n  private var index = [T: Int]()\n  private var parent = [Int]()\n  private var size = [Int]()\n\n  public init() {}\n\n  public mutating func addSetWith(_ element: T) {\n    index[element] = parent.count\n    parent.append(parent.count)\n    size.append(1)\n  }\n\n  private mutating func setByIndex(_ index: Int) -> Int {\n    if parent[index] == index {\n      return index\n    } else {\n      parent[index] = setByIndex(parent[index])\n      return parent[index]\n    }\n  }\n\n  public mutating func setOf(_ element: T) -> Int? {\n    if let indexOfElement = index[element] {\n      return setByIndex(indexOfElement)\n    } else {\n      return nil\n    }\n  }\n\n  public mutating func unionSetsContaining(_ firstElement: T, and secondElement: T) {\n    if let firstSet = setOf(firstElement), let secondSet = setOf(secondElement) {\n      if firstSet != secondSet {\n        if size[firstSet] < size[secondSet] {\n          parent[firstSet] = secondSet\n          size[secondSet] += size[firstSet]\n        } else {\n          parent[secondSet] = firstSet\n          size[firstSet] += size[secondSet]\n        }\n      }\n    }\n  }\n\n  public mutating func inSameSet(_ firstElement: T, and secondElement: T) -> Bool {\n    if let firstSet = setOf(firstElement), let secondSet = setOf(secondElement) {\n      return firstSet == secondSet\n    } else {\n      return false\n    }\n  }\n}\n"
  },
  {
    "path": "Minimum Spanning Tree/MinimumSpanningTree.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios' display-mode='rendered'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Minimum Spanning Tree/MinimumSpanningTree.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Minimum Spanning Tree/MinimumSpanningTree.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Minimum Spanning Tree/Prim.swift",
    "content": "//\n//  Prim.swift\n//  \n//\n//  Created by xiang xin on 16/3/17.\n//\n//\n\nfunc minimumSpanningTreePrim<T>(graph: Graph<T>) -> (cost: Int, tree: Graph<T>) {\n  var cost: Int = 0\n  var tree = Graph<T>()\n  \n  guard let start = graph.vertices.first else {\n    return (cost: cost, tree: tree)\n  }\n  \n  var visited = Set<T>()\n  var priorityQueue = PriorityQueue<(vertex: T, weight: Int, parent: T?)>(\n    sort: { $0.weight < $1.weight })\n  \n  priorityQueue.enqueue((vertex: start, weight: 0, parent: nil))\n  while let head = priorityQueue.dequeue() {\n    let vertex = head.vertex\n    if visited.contains(vertex) {\n      continue\n    }\n    visited.insert(vertex)\n    \n    cost += head.weight\n    if let prev = head.parent {\n      tree.addEdge(vertex1: prev, vertex2: vertex, weight: head.weight)\n    }\n    \n    if let neighbours = graph.adjList[vertex] {\n      for neighbour in neighbours {\n        let nextVertex = neighbour.vertex\n        if !visited.contains(nextVertex) {\n          priorityQueue.enqueue((vertex: nextVertex, weight: neighbour.weight, parent: vertex))\n        }\n      }\n    }\n  }\n  \n  return (cost: cost, tree: tree)\n}\n"
  },
  {
    "path": "Minimum Spanning Tree/README.markdown",
    "content": "# Minimum Spanning Tree (Weighted Graph)\n\n> This topic has been tutorialized [here](https://www.raywenderlich.com/169392/swift-algorithm-club-minimum-spanning-tree-with-prims-algorithm)\n\nA [minimum spanning tree](https://en.wikipedia.org/wiki/Minimum_spanning_tree) (MST) of a connected undirected weighted graph has a subset of the edges from the original graph that connects all the vertices together, without any cycles and with the minimum possible total edge weight. There can be more than one MSTs of a graph.\n\nThere are two popular algorithms to calculate MST of a graph - [Kruskal's algorithm](https://en.wikipedia.org/wiki/Kruskal's_algorithm) and [Prim's algorithm](https://en.wikipedia.org/wiki/Prim's_algorithm). Both algorithms have a total time complexity of `O(ElogE)` where `E` is the number of edges from the original graph.\n\n### Kruskal's Algorithm\nSort the edges base on weight. Greedily select the smallest one each time and add into the MST as long as it doesn't form a cycle.\nKruskal's algoritm uses [Union Find](https://github.com/raywenderlich/swift-algorithm-club/tree/master/Union-Find) data structure to check whether any additional edge causes a cycle. The logic is to put all connected vertices into the same set (in Union Find's concept). If the two vertices from a new edge do not belong to the same set, then it's safe to add that edge into the MST.\n\nThe following graph demonstrates the steps:\n\n![Graph](Images/kruskal.png)\n\nPreparation\n```swift\n// Initialize the values to be returned and Union Find data structure.\nvar cost: Int = 0\nvar tree = Graph<T>()\nvar unionFind = UnionFind<T>()\nfor vertex in graph.vertices {\n\n// Initially all vertices are disconnected.\n// Each of them belongs to it's individual set.\n  unionFind.addSetWith(vertex)\n}\n```\n\nSort the edges\n```swift\nlet sortedEdgeListByWeight = graph.edgeList.sorted(by: { $0.weight < $1.weight })\n```\n\nTake one edge at a time and try to insert it into the MST. \n```swift\nfor edge in sortedEdgeListByWeight {\n  let v1 = edge.vertex1\n  let v2 = edge.vertex2 \n  \n  // Same set means the two vertices of this edge were already connected in the MST.\n  // Adding this one will cause a cycle.\n  if !unionFind.inSameSet(v1, and: v2) {\n    // Add the edge into the MST and update the final cost.\n    cost += edge.weight\n    tree.addEdge(edge)\n    \n    // Put the two vertices into the same set.\n    unionFind.unionSetsContaining(v1, and: v2)\n  }\n}\n```\n### Prim's Algorithm\nPrim's algorithm doesn't pre-sort all edges. Instead, it uses a [Priority Queue](https://github.com/raywenderlich/swift-algorithm-club/tree/master/Priority%20Queue) to maintain a running sorted next-possile vertices.\nStarting from one vertex, loop through all unvisited neighbours and enqueue a pair of values for each neighbour - the vertex and the weight of edge connecting current vertex to the neighbour. Each time it greedily select the top of the priority queue (the one with least weight value) and add the edge into the final MST if the enqueued neighbour hasn't been already visited.\n\nThe following graph demonstrates the steps:\n\n![Graph](Images/prim.png)\n\nPreparation\n```swift\n// Initialize the values to be returned and Priority Queue data structure.\nvar cost: Int = 0\nvar tree = Graph<T>()\nvar visited = Set<T>()\n\n// In addition to the (neighbour vertex, weight) pair, parent is added for the purpose of printing out the MST later.\n// parent is basically current vertex. aka. the previous vertex before neigbour vertex gets visited.\nvar priorityQueue = PriorityQueue<(vertex: T, weight: Int, parent: T?)>(sort: { $0.weight < $1.weight })\n```\n\nStart from any vertex\n```swift\npriorityQueue.enqueue((vertex: graph.vertices.first!, weight: 0, parent: nil))\n```\n\n```swift\n// Take from the top of the priority queue ensures getting the least weight edge.\nwhile let head = priorityQueue.dequeue() {\n  let vertex = head.vertex\n  if visited.contains(vertex) {\n    continue\n  }\n\n  // If the vertex hasn't been visited before, its edge (parent-vertex) is selected for MST.\n  visited.insert(vertex)\n  cost += head.weight\n  if let prev = head.parent { // The first vertex doesn't have a parent.\n    tree.addEdge(vertex1: prev, vertex2: vertex, weight: head.weight)\n  }\n\n  // Add all unvisted neighbours into the priority queue.\n  if let neighbours = graph.adjList[vertex] {\n    for neighbour in neighbours {\n      let nextVertex = neighbour.vertex\n      if !visited.contains(nextVertex) {\n        priorityQueue.enqueue((vertex: nextVertex, weight: neighbour.weight, parent: vertex))\n      }\n    }\n  }\n}\n```\n"
  },
  {
    "path": "Minimum Spanning Tree (Unweighted)/MinimumSpanningTree.playground/Pages/Minimum spanning tree example.xcplaygroundpage/Contents.swift",
    "content": "func breadthFirstSearchMinimumSpanningTree(_ graph: Graph, source: Node) -> Graph {\n  let minimumSpanningTree = graph.duplicate()\n\n  var queue = Queue<Node>()\n  let sourceInMinimumSpanningTree = minimumSpanningTree.findNodeWithLabel(source.label)\n  queue.enqueue(sourceInMinimumSpanningTree)\n  sourceInMinimumSpanningTree.visited = true\n\n  while let current = queue.dequeue() {\n    for edge in current.neighbors {\n      let neighborNode = edge.neighbor\n      if !neighborNode.visited {\n        neighborNode.visited = true\n        queue.enqueue(neighborNode)\n      } else {\n        current.remove(edge)\n      }\n    }\n  }\n\n  return minimumSpanningTree\n}\n\n/*:\n![Graph](Minimum_Spanning_Tree.png)\n*/\n\nlet graph = Graph()\n\nlet nodeA = graph.addNode(\"a\")\nlet nodeB = graph.addNode(\"b\")\nlet nodeC = graph.addNode(\"c\")\nlet nodeD = graph.addNode(\"d\")\nlet nodeE = graph.addNode(\"e\")\nlet nodeF = graph.addNode(\"f\")\nlet nodeG = graph.addNode(\"g\")\nlet nodeH = graph.addNode(\"h\")\nlet nodeI = graph.addNode(\"i\")\n\ngraph.addEdge(nodeA, neighbor: nodeB)\ngraph.addEdge(nodeA, neighbor: nodeH)\ngraph.addEdge(nodeB, neighbor: nodeA)\ngraph.addEdge(nodeB, neighbor: nodeC)\ngraph.addEdge(nodeB, neighbor: nodeH)\ngraph.addEdge(nodeC, neighbor: nodeB)\ngraph.addEdge(nodeC, neighbor: nodeD)\ngraph.addEdge(nodeC, neighbor: nodeF)\ngraph.addEdge(nodeC, neighbor: nodeI)\ngraph.addEdge(nodeD, neighbor: nodeC)\ngraph.addEdge(nodeD, neighbor: nodeE)\ngraph.addEdge(nodeD, neighbor: nodeF)\ngraph.addEdge(nodeE, neighbor: nodeD)\ngraph.addEdge(nodeE, neighbor: nodeF)\ngraph.addEdge(nodeF, neighbor: nodeC)\ngraph.addEdge(nodeF, neighbor: nodeD)\ngraph.addEdge(nodeF, neighbor: nodeE)\ngraph.addEdge(nodeF, neighbor: nodeG)\ngraph.addEdge(nodeG, neighbor: nodeF)\ngraph.addEdge(nodeG, neighbor: nodeH)\ngraph.addEdge(nodeG, neighbor: nodeI)\ngraph.addEdge(nodeH, neighbor: nodeA)\ngraph.addEdge(nodeH, neighbor: nodeB)\ngraph.addEdge(nodeH, neighbor: nodeG)\ngraph.addEdge(nodeH, neighbor: nodeI)\ngraph.addEdge(nodeI, neighbor: nodeC)\ngraph.addEdge(nodeI, neighbor: nodeG)\ngraph.addEdge(nodeI, neighbor: nodeH)\n\nlet minimumSpanningTree = breadthFirstSearchMinimumSpanningTree(graph, source: nodeA)\nprint(minimumSpanningTree)\n"
  },
  {
    "path": "Minimum Spanning Tree (Unweighted)/MinimumSpanningTree.playground/Sources/Edge.swift",
    "content": "public class Edge: Equatable {\n  public var neighbor: Node\n\n  public init(neighbor: Node) {\n    self.neighbor = neighbor\n  }\n}\n\npublic func == (lhs: Edge, rhs: Edge) -> Bool {\n  return lhs.neighbor == rhs.neighbor\n}\n"
  },
  {
    "path": "Minimum Spanning Tree (Unweighted)/MinimumSpanningTree.playground/Sources/Graph.swift",
    "content": "public class Graph: CustomStringConvertible, Equatable {\n  public private(set) var nodes: [Node]\n\n  public init() {\n    self.nodes = []\n  }\n\n  public func addNode(_ label: String) -> Node {\n    let node = Node(label: label)\n    nodes.append(node)\n    return node\n  }\n\n  public func addEdge(_ source: Node, neighbor: Node) {\n    let edge = Edge(neighbor: neighbor)\n    source.neighbors.append(edge)\n  }\n\n  public var description: String {\n    var description = \"\"\n\n    for node in nodes {\n      if !node.neighbors.isEmpty {\n        description += \"[node: \\(node.label) edges: \\(node.neighbors.map { $0.neighbor.label})]\"\n      }\n    }\n    return description\n  }\n\n  public func findNodeWithLabel(_ label: String) -> Node {\n    return nodes.filter { $0.label == label }.first!\n  }\n\n  public func duplicate() -> Graph {\n    let duplicated = Graph()\n\n    for node in nodes {\n        _ = duplicated.addNode(node.label)\n    }\n\n    for node in nodes {\n      for edge in node.neighbors {\n        let source = duplicated.findNodeWithLabel(node.label)\n        let neighbour = duplicated.findNodeWithLabel(edge.neighbor.label)\n        duplicated.addEdge(source, neighbor: neighbour)\n      }\n    }\n\n    return duplicated\n  }\n}\n\npublic func == (lhs: Graph, rhs: Graph) -> Bool {\n  return lhs.nodes == rhs.nodes\n}\n"
  },
  {
    "path": "Minimum Spanning Tree (Unweighted)/MinimumSpanningTree.playground/Sources/Node.swift",
    "content": "public class Node: CustomStringConvertible, Equatable {\n  public var neighbors: [Edge]\n\n  public private(set) var label: String\n  public var distance: Int?\n  public var visited: Bool\n\n  public init(label: String) {\n    self.label = label\n    neighbors = []\n    visited = false\n  }\n\n  public var description: String {\n    if let distance = distance {\n      return \"Node(label: \\(label), distance: \\(distance))\"\n    }\n    return \"Node(label: \\(label), distance: infinity)\"\n  }\n\n  public var hasDistance: Bool {\n    return distance != nil\n  }\n\n  public func remove(_ edge: Edge) {\n    neighbors.remove(at: neighbors.index { $0 === edge }!)\n  }\n}\n\npublic func == (lhs: Node, rhs: Node) -> Bool {\n  return lhs.label == rhs.label && lhs.neighbors == rhs.neighbors\n}\n"
  },
  {
    "path": "Minimum Spanning Tree (Unweighted)/MinimumSpanningTree.playground/Sources/Queue.swift",
    "content": "public struct Queue<T> {\n  private var array: [T]\n\n  public init() {\n    array = []\n  }\n\n  public var isEmpty: Bool {\n    return array.isEmpty\n  }\n\n  public var count: Int {\n    return array.count\n  }\n\n  public mutating func enqueue(_ element: T) {\n    array.append(element)\n  }\n\n  public mutating func dequeue() -> T? {\n    if isEmpty {\n      return nil\n    } else {\n      return array.removeFirst()\n    }\n  }\n\n  public func peek() -> T? {\n    return array.first\n  }\n}\n"
  },
  {
    "path": "Minimum Spanning Tree (Unweighted)/MinimumSpanningTree.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='6.0' target-platform='ios' display-mode='rendered'/>"
  },
  {
    "path": "Minimum Spanning Tree (Unweighted)/MinimumSpanningTree.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Minimum Spanning Tree (Unweighted)/MinimumSpanningTree.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Minimum Spanning Tree (Unweighted)/MinimumSpanningTree.swift",
    "content": "func breadthFirstSearchMinimumSpanningTree(_ graph: Graph, source: Node) -> Graph {\n  let minimumSpanningTree = graph.duplicate()\n\n  var queue = Queue<Node>()\n  let sourceInMinimumSpanningTree = minimumSpanningTree.findNodeWithLabel(source.label)\n  queue.enqueue(sourceInMinimumSpanningTree)\n  sourceInMinimumSpanningTree.visited = true\n\n  while let current = queue.dequeue() {\n    for edge in current.neighbors {\n      let neighborNode = edge.neighbor\n      if !neighborNode.visited {\n        neighborNode.visited = true\n        queue.enqueue(neighborNode)\n      } else {\n        current.remove(edge)\n      }\n    }\n  }\n\n  return minimumSpanningTree\n}\n"
  },
  {
    "path": "Minimum Spanning Tree (Unweighted)/README.markdown",
    "content": "# Minimum Spanning Tree (Unweighted Graph)\n\nA minimum spanning tree describes a path that contains the smallest number of edges that are needed to visit every node in the graph.\n\nTake a look at the following graph:\n\n![Graph](Images/Graph.png)\n\nIf we start from node `a` and want to visit every other node, then what is the most efficient path to do that? We can calculate this with the minimum spanning tree algorithm.\n\nHere is the minimum spanning tree for the graph. It is represented by the bold edges:\n\n![Minimum spanning tree](Images/MinimumSpanningTree.png)\n\nDrawn as a more conventional tree it looks like this:\n\n![An actual tree](Images/Tree.png)\n\nTo calculate the minimum spanning tree on an unweighted graph, we can use the [breadth-first search](../Breadth-First%20Search/) algorithm. Breadth-first search starts at a source node and traverses the graph by exploring the immediate neighbor nodes first, before moving to the next level neighbors. If we tweak this algorithm by selectively removing edges, then it can convert the graph into the minimum spanning tree.\n\nLet's step through the example. We start with the source node `a`, add it to a queue and mark it as visited.\n\n```swift\nqueue.enqueue(a)\na.visited = true\n```\n\nThe queue is now `[ a ]`. As is usual with breadth-first search, we dequeue the node at the front of the queue, `a`, and enqueue its immediate neighbor nodes `b` and `h`. We mark them as visited too.\n\n```swift\nqueue.dequeue()   // a\nqueue.enqueue(b)\nb.visited = true\nqueue.enqueue(h)\nh.visited = true\n```\n\nThe queue is now `[ b, h ]`. Dequeue `b` and enqueue the neighbor node `c`. Mark it as visited. Remove the edge from `b` to `h` because `h` has already been visited.\n\n```swift\nqueue.dequeue()   // b\nqueue.enqueue(c)\nc.visited = true\nb.removeEdgeTo(h)\n```\n\nThe queue is now `[ h, c ]`. Dequeue `h` and enqueue the neighbor nodes `g` and `i`, and mark them as visited.\n\n```swift\nqueue.dequeue()   // h\nqueue.enqueue(g)\ng.visited = true\nqueue.enqueue(i)\ni.visited = true\n```\n\nThe queue is now `[ c, g, i ]`. Dequeue `c` and enqueue the neighbor nodes `d` and `f`, and mark them as visited. Remove the edge between `c` and `i` because `i` has already been visited.\n\n```swift\nqueue.dequeue()   // c\nqueue.enqueue(d)\nd.visited = true\nqueue.enqueue(f)\nf.visited = true\nc.removeEdgeTo(i)\n```\n\nThe queue is now `[ g, i, d, f ]`. Dequeue `g`. All of its neighbors have been discovered already, so there is nothing to enqueue. Remove the edges from `g` to `f`, as well as `g` to `i`, because `f` and `i` have already been discovered.\n\n```swift\nqueue.dequeue()   // g\ng.removeEdgeTo(f)\ng.removeEdgeTo(i)\n```\n\nThe queue is now `[ i, d, f ]`. Dequeue `i`. Nothing else to do for this node.\n\n```swift\nqueue.dequeue()   // i\n```\n\nThe queue is now `[ d, f ]`. Dequeue `d` and enqueue the neighbor node `e`. Mark it as visited. Remove the edge from `d` to `f` because `f` has already been visited.\n\n```swift\nqueue.dequeue()   // d\nqueue.enqueue(e)\ne.visited = true\nd.removeEdgeTo(f)\n```\n\nThe queue is now `[ f, e ]`. Dequeue `f`. Remove the edge between `f` and `e` because `e` has already been visited.\n\n```swift\nqueue.dequeue()   // f\nf.removeEdgeTo(e)\n```\n\nThe queue is now `[ e ]`. Dequeue `e`.\n\n```swift\nqueue.dequeue()   // e\n```\n\nThe queue is empty, which means the minimum spanning tree has been computed.\n\nHere's the code:\n\n```swift\nfunc breadthFirstSearchMinimumSpanningTree(graph: Graph, source: Node) -> Graph {\n  let minimumSpanningTree = graph.duplicate()\n\n  var queue = Queue<Node>()\n  let sourceInMinimumSpanningTree = minimumSpanningTree.findNodeWithLabel(source.label)\n  queue.enqueue(sourceInMinimumSpanningTree)\n  sourceInMinimumSpanningTree.visited = true\n\n  while let current = queue.dequeue() {\n    for edge in current.neighbors {\n      let neighborNode = edge.neighbor\n      if !neighborNode.visited {\n        neighborNode.visited = true\n        queue.enqueue(neighborNode)\n      } else {\n        current.remove(edge)\n      }\n    }\n  }\n\n  return minimumSpanningTree\n}\n```\n\nThis function returns a new `Graph` object that describes just the minimum spanning tree. In the figure, that would be the graph containing just the bold edges.\n\nPut this code in a playground and test it like so:\n\n```swift\nlet graph = Graph()\n\nlet nodeA = graph.addNode(\"a\")\nlet nodeB = graph.addNode(\"b\")\nlet nodeC = graph.addNode(\"c\")\nlet nodeD = graph.addNode(\"d\")\nlet nodeE = graph.addNode(\"e\")\nlet nodeF = graph.addNode(\"f\")\nlet nodeG = graph.addNode(\"g\")\nlet nodeH = graph.addNode(\"h\")\nlet nodeI = graph.addNode(\"i\")\n\ngraph.addEdge(nodeA, neighbor: nodeB)\ngraph.addEdge(nodeA, neighbor: nodeH)\ngraph.addEdge(nodeB, neighbor: nodeA)\ngraph.addEdge(nodeB, neighbor: nodeC)\ngraph.addEdge(nodeB, neighbor: nodeH)\ngraph.addEdge(nodeC, neighbor: nodeB)\ngraph.addEdge(nodeC, neighbor: nodeD)\ngraph.addEdge(nodeC, neighbor: nodeF)\ngraph.addEdge(nodeC, neighbor: nodeI)\ngraph.addEdge(nodeD, neighbor: nodeC)\ngraph.addEdge(nodeD, neighbor: nodeE)\ngraph.addEdge(nodeD, neighbor: nodeF)\ngraph.addEdge(nodeE, neighbor: nodeD)\ngraph.addEdge(nodeE, neighbor: nodeF)\ngraph.addEdge(nodeF, neighbor: nodeC)\ngraph.addEdge(nodeF, neighbor: nodeD)\ngraph.addEdge(nodeF, neighbor: nodeE)\ngraph.addEdge(nodeF, neighbor: nodeG)\ngraph.addEdge(nodeG, neighbor: nodeF)\ngraph.addEdge(nodeG, neighbor: nodeH)\ngraph.addEdge(nodeG, neighbor: nodeI)\ngraph.addEdge(nodeH, neighbor: nodeA)\ngraph.addEdge(nodeH, neighbor: nodeB)\ngraph.addEdge(nodeH, neighbor: nodeG)\ngraph.addEdge(nodeH, neighbor: nodeI)\ngraph.addEdge(nodeI, neighbor: nodeC)\ngraph.addEdge(nodeI, neighbor: nodeG)\ngraph.addEdge(nodeI, neighbor: nodeH)\n\nlet minimumSpanningTree = breadthFirstSearchMinimumSpanningTree(graph, source: nodeA)\n\nprint(minimumSpanningTree) // [node: a edges: [\"b\", \"h\"]]\n                           // [node: b edges: [\"c\"]]\n                           // [node: c edges: [\"d\", \"f\"]]\n                           // [node: d edges: [\"e\"]]\n                           // [node: h edges: [\"g\", \"i\"]]\n```\n\n> **Note:** On an unweighed graph, any spanning tree is always a minimal spanning tree. This means you can also use a [depth-first search](../Depth-First%20Search) to find the minimum spanning tree.\n\n*Written by [Chris Pilcher](https://github.com/chris-pilcher) and Matthijs Hollemans*\n"
  },
  {
    "path": "Minimum Spanning Tree (Unweighted)/Tests/Graph.swift",
    "content": "// MARK: - Edge\n\npublic class Edge: Equatable {\n  public var neighbor: Node\n\n  public init(neighbor: Node) {\n    self.neighbor = neighbor\n  }\n}\n\npublic func == (lhs: Edge, rhs: Edge) -> Bool {\n  return lhs.neighbor == rhs.neighbor\n}\n\n// MARK: - Node\n\npublic class Node: CustomStringConvertible, Equatable {\n  public var neighbors: [Edge]\n\n  public private(set) var label: String\n  public var distance: Int?\n  public var visited: Bool\n\n  public init(label: String) {\n    self.label = label\n    neighbors = []\n    visited = false\n  }\n\n  public var description: String {\n    if let distance = distance {\n      return \"Node(label: \\(label), distance: \\(distance))\"\n    }\n    return \"Node(label: \\(label), distance: infinity)\"\n  }\n\n  public var hasDistance: Bool {\n    return distance != nil\n  }\n\n  public func remove(_ edge: Edge) {\n    neighbors.remove(at: neighbors.index { $0 === edge }!)\n  }\n}\n\npublic func == (lhs: Node, rhs: Node) -> Bool {\n  return lhs.label == rhs.label && lhs.neighbors == rhs.neighbors\n}\n\n// MARK: - Graph\n\npublic class Graph: CustomStringConvertible, Equatable {\n  public private(set) var nodes: [Node]\n\n  public init() {\n    self.nodes = []\n  }\n\n  public func addNode(_ label: String) -> Node {\n    let node = Node(label: label)\n    nodes.append(node)\n    return node\n  }\n\n  public func addEdge(_ source: Node, neighbor: Node) {\n    let edge = Edge(neighbor: neighbor)\n    source.neighbors.append(edge)\n  }\n\n  public var description: String {\n    var description = \"\"\n\n    for node in nodes {\n      if !node.neighbors.isEmpty {\n        description += \"[node: \\(node.label) edges: \\(node.neighbors.map { $0.neighbor.label})]\"\n      }\n    }\n    return description\n  }\n\n  public func findNodeWithLabel(_ label: String) -> Node {\n    return nodes.filter { $0.label == label }.first!\n  }\n\n  public func duplicate() -> Graph {\n    let duplicated = Graph()\n\n    for node in nodes {\n      _ = duplicated.addNode(node.label)\n    }\n\n    for node in nodes {\n      for edge in node.neighbors {\n        let source = duplicated.findNodeWithLabel(node.label)\n        let neighbour = duplicated.findNodeWithLabel(edge.neighbor.label)\n        duplicated.addEdge(source, neighbor: neighbour)\n      }\n    }\n\n    return duplicated\n  }\n}\n\npublic func == (lhs: Graph, rhs: Graph) -> Bool {\n  return lhs.nodes == rhs.nodes\n}\n"
  },
  {
    "path": "Minimum Spanning Tree (Unweighted)/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Minimum Spanning Tree (Unweighted)/Tests/MinimumSpanningTreeTests.swift",
    "content": "import XCTest\n\nclass MinimumSpanningTreeTests: XCTestCase {\n\n  func testMinimumSpanningTreeReturnsSameTreeWhenGivenTree() {\n    let tree = Graph()\n    let nodeA = tree.addNode(\"a\")\n    let nodeB = tree.addNode(\"b\")\n    let nodeC = tree.addNode(\"c\")\n    let nodeD = tree.addNode(\"d\")\n    let nodeE = tree.addNode(\"e\")\n    let nodeF = tree.addNode(\"f\")\n    let nodeG = tree.addNode(\"g\")\n    let nodeH = tree.addNode(\"h\")\n    tree.addEdge(nodeA, neighbor: nodeB)\n    tree.addEdge(nodeA, neighbor: nodeC)\n    tree.addEdge(nodeB, neighbor: nodeD)\n    tree.addEdge(nodeB, neighbor: nodeE)\n    tree.addEdge(nodeC, neighbor: nodeF)\n    tree.addEdge(nodeC, neighbor: nodeG)\n    tree.addEdge(nodeE, neighbor: nodeH)\n\n    let minimumSpanningTree = breadthFirstSearchMinimumSpanningTree(tree, source: nodeA)\n\n    XCTAssertEqual(minimumSpanningTree, tree)\n  }\n\n  func testMinimumSpanningTreeReturnsMinimumSpanningTreeWhenGivenGraph() {\n    let graphAndSourceNode = createGraph()\n    let expectedMinimumSpanningTree = createMinimumSpanningTree()\n\n    let actualMinimumSpanningTree = breadthFirstSearchMinimumSpanningTree(graphAndSourceNode.graph,\n                                                                  source: graphAndSourceNode.source)\n\n    XCTAssertEqual(actualMinimumSpanningTree, expectedMinimumSpanningTree)\n  }\n\n  func createGraph() -> (graph: Graph, source: Node) {\n    let graph = Graph()\n\n    let nodeA = graph.addNode(\"a\")\n    let nodeB = graph.addNode(\"b\")\n    let nodeC = graph.addNode(\"c\")\n    let nodeD = graph.addNode(\"d\")\n    let nodeE = graph.addNode(\"e\")\n    let nodeF = graph.addNode(\"f\")\n    let nodeG = graph.addNode(\"g\")\n    let nodeH = graph.addNode(\"h\")\n    let nodeI = graph.addNode(\"i\")\n\n    graph.addEdge(nodeA, neighbor: nodeB)\n    graph.addEdge(nodeA, neighbor: nodeH)\n    graph.addEdge(nodeB, neighbor: nodeA)\n    graph.addEdge(nodeB, neighbor: nodeC)\n    graph.addEdge(nodeB, neighbor: nodeH)\n    graph.addEdge(nodeC, neighbor: nodeB)\n    graph.addEdge(nodeC, neighbor: nodeD)\n    graph.addEdge(nodeC, neighbor: nodeF)\n    graph.addEdge(nodeC, neighbor: nodeI)\n    graph.addEdge(nodeD, neighbor: nodeC)\n    graph.addEdge(nodeD, neighbor: nodeE)\n    graph.addEdge(nodeD, neighbor: nodeF)\n    graph.addEdge(nodeE, neighbor: nodeD)\n    graph.addEdge(nodeE, neighbor: nodeF)\n    graph.addEdge(nodeF, neighbor: nodeC)\n    graph.addEdge(nodeF, neighbor: nodeD)\n    graph.addEdge(nodeF, neighbor: nodeE)\n    graph.addEdge(nodeF, neighbor: nodeG)\n    graph.addEdge(nodeG, neighbor: nodeF)\n    graph.addEdge(nodeG, neighbor: nodeH)\n    graph.addEdge(nodeG, neighbor: nodeI)\n    graph.addEdge(nodeH, neighbor: nodeA)\n    graph.addEdge(nodeH, neighbor: nodeB)\n    graph.addEdge(nodeH, neighbor: nodeG)\n    graph.addEdge(nodeH, neighbor: nodeI)\n    graph.addEdge(nodeI, neighbor: nodeC)\n    graph.addEdge(nodeI, neighbor: nodeG)\n    graph.addEdge(nodeI, neighbor: nodeH)\n\n    return (graph, nodeA)\n  }\n\n  func createMinimumSpanningTree() -> Graph {\n    let minimumSpanningTree = Graph()\n\n    let nodeA = minimumSpanningTree.addNode(\"a\")\n    let nodeB = minimumSpanningTree.addNode(\"b\")\n    let nodeC = minimumSpanningTree.addNode(\"c\")\n    let nodeD = minimumSpanningTree.addNode(\"d\")\n    let nodeE = minimumSpanningTree.addNode(\"e\")\n    let nodeF = minimumSpanningTree.addNode(\"f\")\n    let nodeG = minimumSpanningTree.addNode(\"g\")\n    let nodeH = minimumSpanningTree.addNode(\"h\")\n    let nodeI = minimumSpanningTree.addNode(\"i\")\n\n    minimumSpanningTree.addEdge(nodeA, neighbor: nodeB)\n    minimumSpanningTree.addEdge(nodeA, neighbor: nodeH)\n    minimumSpanningTree.addEdge(nodeB, neighbor: nodeC)\n    minimumSpanningTree.addEdge(nodeH, neighbor: nodeG)\n    minimumSpanningTree.addEdge(nodeH, neighbor: nodeI)\n    minimumSpanningTree.addEdge(nodeC, neighbor: nodeD)\n    minimumSpanningTree.addEdge(nodeC, neighbor: nodeF)\n    minimumSpanningTree.addEdge(nodeD, neighbor: nodeE)\n\n    return minimumSpanningTree\n  }\n}\n"
  },
  {
    "path": "Minimum Spanning Tree (Unweighted)/Tests/Queue.swift",
    "content": "public struct Queue<T> {\n  private var array: [T]\n\n  public init() {\n    array = []\n  }\n\n  public var isEmpty: Bool {\n    return array.isEmpty\n  }\n\n  public var count: Int {\n    return array.count\n  }\n\n  public mutating func enqueue(_ element: T) {\n    array.append(element)\n  }\n\n  public mutating func dequeue() -> T? {\n    if isEmpty {\n      return nil\n    } else {\n      return array.removeFirst()\n    }\n  }\n\n  public func peek() -> T? {\n    return array.first\n  }\n}\n"
  },
  {
    "path": "Minimum Spanning Tree (Unweighted)/Tests/Tests.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t83AACB421C844CED00DDAFC7 /* MinimumSpanningTreeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83AACB411C844CED00DDAFC7 /* MinimumSpanningTreeTests.swift */; };\n\t\t83F9C9691C84437C00B3A87F /* MinimumSpanningTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83F9C9661C84437C00B3A87F /* MinimumSpanningTree.swift */; };\n\t\t83F9C9721C84449D00B3A87F /* Graph.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83F9C96E1C84449D00B3A87F /* Graph.swift */; };\n\t\t83F9C9741C84449D00B3A87F /* Queue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83F9C9701C84449D00B3A87F /* Queue.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t7B2BBC801C779D720067B71D /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7B2BBC941C779E7B0067B71D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };\n\t\t83AACB411C844CED00DDAFC7 /* MinimumSpanningTreeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MinimumSpanningTreeTests.swift; sourceTree = SOURCE_ROOT; };\n\t\t83F9C9661C84437C00B3A87F /* MinimumSpanningTree.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MinimumSpanningTree.swift; path = ../MinimumSpanningTree.swift; sourceTree = SOURCE_ROOT; };\n\t\t83F9C96E1C84449D00B3A87F /* Graph.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Graph.swift; sourceTree = SOURCE_ROOT; };\n\t\t83F9C9701C84449D00B3A87F /* Queue.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Queue.swift; sourceTree = SOURCE_ROOT; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t7B2BBC7D1C779D720067B71D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t7B2BBC681C779D710067B71D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC831C779D720067B71D /* Tests */,\n\t\t\t\t7B2BBC721C779D710067B71D /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC721C779D710067B71D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC801C779D720067B71D /* Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC831C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t83F9C9661C84437C00B3A87F /* MinimumSpanningTree.swift */,\n\t\t\t\t83AACB411C844CED00DDAFC7 /* MinimumSpanningTreeTests.swift */,\n\t\t\t\t83F9C96E1C84449D00B3A87F /* Graph.swift */,\n\t\t\t\t83F9C9701C84449D00B3A87F /* Queue.swift */,\n\t\t\t\t7B2BBC941C779E7B0067B71D /* Info.plist */,\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tpath = TestsTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t7B2BBC7F1C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t7B2BBC7C1C779D720067B71D /* Sources */,\n\t\t\t\t7B2BBC7D1C779D720067B71D /* Frameworks */,\n\t\t\t\t7B2BBC7E1C779D720067B71D /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tproductName = TestsTests;\n\t\t\tproductReference = 7B2BBC801C779D720067B71D /* Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t7B2BBC691C779D710067B71D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0720;\n\t\t\t\tLastUpgradeCheck = 1000;\n\t\t\t\tORGANIZATIONNAME = \"Swift Algorithm Club\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t7B2BBC7F1C779D720067B71D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2;\n\t\t\t\t\t\tLastSwiftMigration = 1000;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 7B2BBC681C779D710067B71D;\n\t\t\tproductRefGroup = 7B2BBC721C779D710067B71D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t7B2BBC7F1C779D720067B71D /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t7B2BBC7E1C779D720067B71D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t7B2BBC7C1C779D720067B71D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t83AACB421C844CED00DDAFC7 /* MinimumSpanningTreeTests.swift in Sources */,\n\t\t\t\t83F9C9721C84449D00B3A87F /* Graph.swift in Sources */,\n\t\t\t\t83F9C9691C84437C00B3A87F /* MinimumSpanningTree.swift in Sources */,\n\t\t\t\t83F9C9741C84449D00B3A87F /* Queue.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t7B2BBC871C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC881C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t7B2BBC8D1C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Default;\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC8E1C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Default;\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC871C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC881C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC8D1C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC8E1C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 7B2BBC691C779D710067B71D /* Project object */;\n}\n"
  },
  {
    "path": "Minimum Spanning Tree (Unweighted)/Tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Minimum Spanning Tree (Unweighted)/Tests/Tests.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Minimum Spanning Tree (Unweighted)/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1000\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "MinimumCoinChange/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2017 Jacopo Mangiavacchi\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "MinimumCoinChange/Package.swift",
    "content": "// swift-tools-version:3.1\n\nimport PackageDescription\n\nlet package = Package(\n    name: \"MinimumCoinChange\"\n)\n"
  },
  {
    "path": "MinimumCoinChange/README.md",
    "content": "# Minimum Coin Change\nMinimum Coin Change problem algorithm implemented in Swift comparing dynamic programming algorithm design to traditional greedy approach.\n\nWritten for Swift Algorithm Club by Jacopo Mangiavacchi\n\n![Coins](eurocoins.gif)\n\n# Introduction\n\nIn the traditional coin change problem you have to find all the different ways to change some given money in a particular amount of coins using a given amount of set of coins (i.e. 1 cent, 2 cents, 5 cents, 10 cents etc.).\n\nFor example using Euro cents the total of 4 cents value of money can be changed in these possible ways:\n\n- Four 1 cent coins\n- Two 2 cent coins\n- One 2 cent coin and two 1 cent coins\n\nThe minimum coin change problem is a variation of the generic coin change problem where you need to find the best option for changing the money returning the less number of coins.\n\nFor example using Euro cents the best possible change for 4 cents are two 2 cent coins with a total of two coins.\n\n\n# Greedy Solution\n\nA simple approach for implementing the Minimum Coin Change algorithm in a very efficient way is to start subtracting from the input value the greater possible coin value from the given amount of set of coins available and iterate subtracting the next greater possible coin value on the resulting difference.\n\nFor example from the total of 4 Euro cents of the example above you can subtract initially 2 cents as  the other biggest coins value (from 5 cents to above) are to bigger for the current 4 Euro cent value. Once used the first 2 cents coin you iterate again with the same logic for the rest of 2 cents and select another 2 cents coin and finally return the two 2 cents coins as the best change.\n\nMost of the time the result for this greedy approach is optimal but for some set of coins the result will not be the optimal.\n\nIndeed, if we use the a set of these three different coins set with values 1, 3 and 4 and execute this  greedy algorithm for asking the best change for the value 6 we will get one coin of 4 and two coins of 1 instead of two coins of 3.\n\n\n# Dynamic Programming Solution\n\nA classic dynamic programming strategy will iterate selecting in order a possible coin from the given amount of set of coins and finding using recursive calls the minimum coin change on the difference from the passed value and the selected coin. For any interaction the algorithm select from all possible combinations the one with the less number of coins used.\n\nThe dynamic programming approach will always select the optimal change but it will require a number of steps that is at least quadratic in the goal amount to change.\n\nIn this Swift implementation in order to optimize the overall performance we use an internal data structure for caching the result for best minimum coin change for previous values.\n\n"
  },
  {
    "path": "MinimumCoinChange/Sources/MinimumCoinChange.swift",
    "content": "//\n//  Minimum Coin Change Problem Playground\n//  Compare Greedy Algorithm and Dynamic Programming Algorithm in Swift\n//\n//  Created by Jacopo Mangiavacchi on 04/03/17.\n//\n\nimport Foundation\n\npublic enum MinimumCoinChangeError: Error {\n    case noRestPossibleForTheGivenValue\n}\n\npublic struct MinimumCoinChange {\n    internal let sortedCoinSet: [Int]\n\n    public init(coinSet: [Int]) {\n        self.sortedCoinSet = coinSet.sorted(by: { $0 > $1})\n    }\n\n    //Greedy Algorithm\n    public func changeGreedy(_ value: Int) throws -> [Int] {\n        guard value > 0 else { return [] }\n\n        var change: [Int] = []\n        var newValue = value\n\n        for coin in sortedCoinSet {\n            while newValue - coin >= 0 {\n                change.append(coin)\n                newValue -= coin\n            }\n\n            if newValue == 0 {\n                break\n            }\n        }\n\n        if newValue > 0 {\n            throw MinimumCoinChangeError.noRestPossibleForTheGivenValue\n        }\n\n        return change\n    }\n\n    //Dynamic Programming Algorithm\n    public func changeDynamic(_ value: Int) throws -> [Int] {\n        guard value > 0 else { return [] }\n\n        var cache: [Int : [Int]] = [:]\n\n        func _changeDynamic(_ value: Int) -> [Int] {\n            guard value > 0 else { return [] }\n\n            if let cached = cache[value] {\n                return cached\n            }\n\n            var potentialChangeArray: [[Int]] = []\n\n            for coin in sortedCoinSet {\n                if value - coin >= 0 {\n                    var potentialChange: [Int] = [coin]\n                    potentialChange.append(contentsOf: _changeDynamic(value - coin))\n\n                    if potentialChange.reduce(0, +) == value {\n                        potentialChangeArray.append(potentialChange)\n                    }\n                }\n            }\n\n            if potentialChangeArray.count > 0 {\n                let sortedPotentialChangeArray = potentialChangeArray.sorted(by: { $0.count < $1.count })\n                cache[value] = sortedPotentialChangeArray[0]\n                return sortedPotentialChangeArray[0]\n            }\n\n            return []\n        }\n\n        let change: [Int] = _changeDynamic(value)\n\n        if change.reduce(0, +) != value {\n            throw MinimumCoinChangeError.noRestPossibleForTheGivenValue\n        }\n\n        return change\n    }\n}\n"
  },
  {
    "path": "MinimumCoinChange/Tests/LinuxMain.swift",
    "content": "import XCTest\n@testable import MinimumCoinChangeTests\n\nXCTMain([\n    testCase(MinimumCoinChangeTests.allTests),\n])\n"
  },
  {
    "path": "MinimumCoinChange/Tests/MinimumCoinChangeTests/MinimumCoinChangeTests.swift",
    "content": "import XCTest\n@testable import MinimumCoinChange\n\nclass MinimumCoinChangeTests: XCTestCase {\n  func testSwift4() {\n    // last checked with Xcode 9.0b4\n    #if swift(>=4.0)\n      print(\"Hello, Swift 4!\")\n    #endif\n  }\n  \n  func testExample() {\n    let mcc = MinimumCoinChange(coinSet: [1, 2, 5, 10, 20, 25])\n    print(\"Coin set: \\(mcc.sortedCoinSet)\")\n    \n    do {\n      for i in 0..<100 {\n        let greedy = try mcc.changeGreedy(i)\n        let dynamic = try mcc.changeDynamic(i)\n        \n        XCTAssertEqual(greedy.reduce(0, +), dynamic.reduce(0, +), \"Greedy and Dynamic return two different changes\")\n        \n        if greedy.count != dynamic.count {\n          print(\"\\(i): greedy = \\(greedy) dynamic = \\(dynamic)\")\n        }\n      }\n    } catch {\n      XCTFail(\"Test Failed: impossible to change with the given coin set\")\n    }\n  }\n  \n  static var allTests = [\n    (\"testExample\", testExample),\n    ]\n}\n"
  },
  {
    "path": "Monty Hall Problem/MontyHall.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\nimport Foundation\n\nfunc random(_ n: Int) -> Int {\n  return Int(arc4random_uniform(UInt32(n)))\n}\n\nlet numberOfDoors = 3\n\nvar rounds = 0\nvar winOriginalChoice = 0\nvar winChangedMind = 0\n\nfunc playRound() {\n  // The door with the prize.\n  let prizeDoor = random(numberOfDoors)\n\n  // The door the player chooses.\n  let chooseDoor = random(numberOfDoors)\n\n  // The door that Monty opens. This must be empty and not the one the player chose.\n  var openDoor = -1\n  repeat {\n    openDoor = random(numberOfDoors)\n  } while openDoor == prizeDoor || openDoor == chooseDoor\n\n  // What happens when the player changes his mind and picks the other door.\n  var changeMind = -1\n  repeat {\n    changeMind = random(numberOfDoors)\n  } while changeMind == openDoor || changeMind == chooseDoor\n\n  // Figure out which choice was the winner.\n  if chooseDoor == prizeDoor {\n    winOriginalChoice += 1\n  }\n  if changeMind == prizeDoor {\n    winChangedMind += 1\n  }\n\n  rounds += 1\n}\n\n// Run the simulation a large number of times.\nfor _ in 1...5000 {\n  playRound()\n}\n\nlet stubbornPct = Double(winOriginalChoice)/Double(rounds)\nlet changedMindPct = Double(winChangedMind)/Double(rounds)\n\nprint(String(format: \"Played %d rounds, stubborn: %g%% vs changed mind: %g%%\", rounds, stubbornPct, changedMindPct))\n"
  },
  {
    "path": "Monty Hall Problem/MontyHall.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Monty Hall Problem/MontyHall.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Monty Hall Problem/README.markdown",
    "content": "# The Monty Hall Problem\n\nCongrats! You've reached the final round of the popular [Monty Hall game show](https://en.wikipedia.org/wiki/Let%27s_Make_a_Deal). Monty, the show host, gives you the choice between 3 doors. Behind one of the doors is a prize (a new car? a trip to Hawaii? a microwave oven?), the other two are empty.\n\nAfter you make your choice, Monty decides to make things a bit more interesting and opens one of the two doors that you didn't pick. Of course, the one he opens is empty. There are now two doors left, behind one of which is the coveted prize.\n\nNow Monty gives you the opportunity to change your mind. Should you stick with your original choice, should you pick the other door, or doesn't it matter?\n\nYou'd think that changing your answer wouldn't improve your chances... but it does!\n\nThis is a very nonintuitive result. Maybe you have trouble believing this is true. Don't worry, when this problem was first proposed many professional mathematicians didn't believe it either, so you're in good company.\n\nThere's a simple way to verify this claim: we can write a program to test it out! We should be able to show who wins more often by playing the game a large number of times.\n\nHere's the code (see the [playground](MontyHall.playground/Contents.swift) for the full thing). First, we randomly choose the door that has the prize:\n\n```swift\n  let prizeDoor = random(3)\n```\n\nWe also randomly pick the choice of the player:\n\n```swift\n  let chooseDoor = random(3)\n```\n\nNext, Monty opens one of the empty doors. Obviously, he won't choose the door that the player chose or the one with the prize.\n\n```swift\n  var openDoor = -1\n  repeat {\n    openDoor = random(3)\n  } while openDoor == prizeDoor || openDoor == chooseDoor\n```  \n\nThere are only two closed doors left, one of which has the prize. What happens when the player changes his mind and picks the other door?\n\n```swift\n  var changeMind = -1\n  repeat {\n    changeMind = random(3)\n  } while changeMind == openDoor || changeMind == chooseDoor\n```\n\nNow we see which choice was the right one:\n\n```swift\n  if chooseDoor == prizeDoor {\n    winOriginalChoice += 1\n  }\n  if changeMind == prizeDoor {\n    winChangedMind += 1\n  }\n```\n\nIf the prize is behind the player's original door choice, we increment `winOriginalChoice`. If the prize is behind the other door, then the player would have won if he changed his mind, and so we increment `winChangedMind`.\n\nAnd that's all there is to it.\n\nIf you run the above code 1000 times or so, you'll find that the probability of choosing the prize without changing your mind is about 33%. But if you *do* change your mind, the probability of winning is 67% -- that is twice as large!\n\nTry it out in the playground if you still don't believe it. ;-)\n\nHere's why: When you first make a choice, your chances of picking the prize are 1 out of 3, or 33%\n\nAfter Monty opens one of the doors, this gives you new information. However, it doesn't change the probability of your original choice being the winner. That chance remains 33% because you made that choice when you didn't know yet what was behind this open door.\n\nSince probabilities always need to add up to 100%, the chance that the prize is behind the other door is now 100 - 33 = 67%. So, as strange as it may sound, you're better off switching doors!\n\nThis is hard to wrap your head around, but easily shown using a simulation that runs a significant number of times. Probability is weird.\n\nBy the way, you can simplify the code to this:\n\n```swift\n  let prizeDoor = random(3)\n  let chooseDoor = random(3)\n  if chooseDoor == prizeDoor {\n    winOriginalChoice += 1\n  } else {\n    winChangedMind += 1\n  }\n```\n\nNow it's no longer a simulation but the logic is equivalent. You can clearly see that the `chooseDoor` only wins 1/3rd of the time -- because it's a random number between 1 and 3 -- so changing your mind must win the other 2/3rds of the time.\n\n[Monty Hall Problem on Wikipedia](https://en.wikipedia.org/wiki/Monty_Hall_problem)\n\n*Written for Swift Algorithm Club by Matthijs Hollemans*\n"
  },
  {
    "path": "Multiset/Multiset.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\nimport Cocoa\n\nvar set = Multiset<String>()\n\nset.add(\"Foo\")\nset.add(\"Foo\")\nset.add(\"Bar\")\nset.add(\"Baz\")\n\nset.count\nset.count(for: \"Foo\")\n\nset.allItems\n\nvar set2 = Multiset<String>()\nset2.add(\"Foo\")\nset2.add(\"Foo\")\n\nset2.isSubSet(of: set) // true\nset.isSubSet(of: set2) // false\n\n// Convenience constructor: pass a Collection of Hashables to the constructor\nvar cacti = Multiset<Character>(\"cacti\")\ncacti.allItems\nvar tactical = Multiset<Character>(\"tactical\")\ncacti.isSubSet(of: tactical) // true\ntactical.isSubSet(of: cacti) // false\n\n// Test ExpressibleByArrayLiteral protocol\nlet set3: Multiset<String> = [\"foo\", \"bar\"]\nset3.count(for: \"foo\")\n\n// Test Equatable protocol\nlet set4 = Multiset<String>(set3.allItems)\nset4 == set3 // true\nset4 == set // false\n"
  },
  {
    "path": "Multiset/Multiset.playground/Sources/Multiset.swift",
    "content": "//\n//  Multiset.swift\n//  Multiset\n//\n//  Created by Simon Whitaker on 28/08/2017.\n//\n\nimport Foundation\n\npublic struct Multiset<T: Hashable> {\n  private var storage: [T: UInt] = [:]\n  public private(set) var count: UInt = 0\n\n  public init() {}\n\n  public init<C: Collection>(_ collection: C) where C.Element == T {\n    for element in collection {\n      self.add(element)\n    }\n  }\n\n  public mutating func add (_ elem: T) {\n    storage[elem, default: 0] += 1\n    count += 1\n  }\n\n  public mutating func remove (_ elem: T) {\n    if let currentCount = storage[elem] {\n      if currentCount > 1 {\n        storage[elem] = currentCount - 1\n      } else {\n        storage.removeValue(forKey: elem)\n      }\n      count -= 1\n    }\n  }\n\n  public func isSubSet (of superset: Multiset<T>) -> Bool {\n    for (key, count) in storage {\n      let supersetcount = superset.storage[key] ?? 0\n      if count > supersetcount {\n        return false\n      }\n    }\n    return true\n  }\n\n  public func count(for key: T) -> UInt {\n    return storage[key] ?? 0\n  }\n\n  public var allItems: [T] {\n    var result = [T]()\n    for (key, count) in storage {\n      for _ in 0 ..< count {\n        result.append(key)\n      }\n    }\n    return result\n  }\n}\n\n// MARK: - Equatable\nextension Multiset: Equatable {\n  public static func == (lhs: Multiset<T>, rhs: Multiset<T>) -> Bool {\n    if lhs.storage.count != rhs.storage.count {\n      return false\n    }\n    for (lkey, lcount) in lhs.storage {\n      let rcount = rhs.storage[lkey] ?? 0\n      if lcount != rcount {\n        return false\n      }\n    }\n    return true\n  }\n}\n\n// MARK: - ExpressibleByArrayLiteral\nextension Multiset: ExpressibleByArrayLiteral {\n  public init(arrayLiteral elements: T...) {\n    self.init(elements)\n  }\n}\n"
  },
  {
    "path": "Multiset/Multiset.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='macos'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Multiset/README.markdown",
    "content": "# Multiset\n\nA multiset (also known as a bag) is a data structure similar to a regular set, but it can store multiple instances of the same element.\n\nFor example, if I added the elements 1, 2, 2 to a regular set, the set would only contain two items, since adding 2 a second time has no effect.\n\n```\nvar set = Set<Int>()\nset.add(1) // set is now [1]\nset.add(2) // set is now [1, 2]\nset.add(2) // set is still [1, 2]\n```\n\nBy comparison, after adding the elements 1, 2, 2 to a multiset, it would contain three items.\n\n```\nvar set = Multiset<Int>()\nset.add(1) // set is now [1]\nset.add(2) // set is now [1, 2]\nset.add(2) // set is now [1, 2, 2]\n```\n\nYou might be thinking that this looks an awful lot like an array. So why would you use a multiset? Let's consider the differences between the two…\n\n- Ordering: arrays maintain the order of items added to them, multisets do not\n- Testing for membership: testing whether an element is a member of the collection is O(N) for arrays, O(1) for multisets.\n- Testing for subset: testing whether collection X is a subset of collection Y is a simple operation for a multiset, but complex for arrays\n\nTypical operations on a multiset are:\n\n- Add an element\n- Remove an element\n- Get the count for an element (the number of times it's been added)\n- Get the count for the whole set (the number of items that have been added)\n- Check whether it is a subset of another multiset\n\nOne real-world use of multisets is to determine whether one string is a partial anagram of another. For example, the word \"cacti\" is a partial anagrams of \"tactical\". (In other words, I can rearrange the letters of \"tactical\" to make \"cacti\", with some letters left over.)\n\n``` swift\nvar cacti = Multiset<Character>(\"cacti\")\nvar tactical = Multiset<Character>(\"tactical\")\ncacti.isSubSet(of: tactical) // true!\n```\n\n## Implementation\n\nUnder the hood, this implementation of Multiset uses a dictionary to store a mapping of elements to the number of times they've been added.\n\nHere's the essence of it:\n\n``` swift\npublic struct Multiset<Element: Hashable> {\n  private var storage: [Element: UInt] = [:]\n  \n  public init() {}\n```\n\nAnd here's how you'd use this class to create a multiset of strings:\n\n``` swift\nvar set = Multiset<String>()\n```\n\nAdding an element is a case of incrementing the counter for that element, or setting it to 1 if it doesn't already exist:\n\n``` swift\npublic mutating func add (_ elem: Element) {\n  storage[elem, default: 0] += 1\n}\n```\n\nHere's how you'd use this method to add to the set we created earlier:\n\n```swift\nset.add(\"foo\")\nset.add(\"foo\") \nset.allItems // returns [\"foo\", \"foo\"]\n```\n\nOur set now contains two elements, both the string \"foo\".\n\nRemoving an element works much the same way as adding; decrement the counter for the element, or remove it from the underlying dictionary if its value is 1 before removal.\n\n``` swift\npublic mutating func remove (_ elem: Element) {\n  if let currentCount = storage[elem] {\n    if currentCount > 1 {\n      storage[elem] = currentCount - 1\n    } else {\n      storage.removeValue(forKey: elem)\n    }\n  }\n}\n```\n\nGetting the count for an item is simple: we just return the value for the given item in the internal dictionary.\n\n``` swift\npublic func count(for key: Element) -> UInt {\n  return storage[key] ?? 0\n}\n```\n\n*Written for the Swift Algorithm Club by Simon Whitaker*\n"
  },
  {
    "path": "Myers Difference Algorithm/MyersDifferenceAlgorithm.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\nimport Foundation\n\nlet shortestEditDistance: ([String], [String]) -> Int = MyersDifferenceAlgorithm.calculateShortestEditDistance(from:to:)\n\n/***\n All elements are same, so any scripts do not need.\n So, the edit distance is 0\n ***/\nshortestEditDistance([\"1\", \"2\", \"3\"], [\"1\", \"2\", \"3\"])\n\n/***\n Last element \"3\" should be inserted.\n So, the edit distance is 1\n ***/\nshortestEditDistance([\"1\", \"2\"], [\"1\", \"2\", \"3\"])\n\n/***\n First, remove \"1\", then insert \"1\" after \"2\".\n So, the edit distance is 2\n***/\nshortestEditDistance([\"1\", \"2\", \"3\"], [\"2\", \"1\", \"3\"])\n"
  },
  {
    "path": "Myers Difference Algorithm/MyersDifferenceAlgorithm.playground/Sources/MyersDifferenceAlgorithm.swift",
    "content": "//\n//  MyersDifferenceAlgorithm.swift\n//\n//  Created by Yuya Horita on 2018/02/27.\n//  Copyright © 2018年 hy. All rights reserved.\n//\n\nimport Foundation\n\npublic struct MyersDifferenceAlgorithm<E: Equatable> {\n    public static func calculateShortestEditDistance(from fromArray: Array<E>, to toArray: Array<E>) -> Int {\n        let fromCount = fromArray.count\n        let toCount = toArray.count\n        let totalCount = toCount + fromCount\n        var furthestReaching = Array(repeating: 0, count: 2 * totalCount + 1)\n        \n        let isReachedAtSink: (Int, Int) -> Bool = { x, y in\n            return x == fromCount && y == toCount\n        }\n        \n        let snake: (Int, Int, Int) -> Int = { x, D, k in\n            var _x = x\n            while _x < fromCount && _x - k < toCount && fromArray[_x] == toArray[_x - k] {\n                _x += 1\n            }\n            return _x\n        }\n        \n        for D in 0...totalCount {\n            for k in stride(from: -D, through: D, by: 2) {\n                let index = k + totalCount\n                \n                // (x, D, k) => the x position on the k_line where the number of scripts is D\n                // scripts means insertion or deletion\n                var x = 0\n                if D == 0 { }\n                    // k == -D, D will be the boundary k_line\n                    // when k == -D, moving right on the Edit Graph(is delete script) from k - 1_line where D - 1 is unavailable.\n                    // when k == D, moving bottom on the Edit Graph(is insert script) from k + 1_line where D - 1 is unavailable.\n                    // furthestReaching x position has higher calculating priority. (x, D - 1, k - 1), (x, D - 1, k + 1)\n                else if k == -D || k != D && furthestReaching[index - 1] < furthestReaching[index + 1] {\n                    // Getting initial x position\n                    // ,using the furthestReaching X position on the k + 1_line where D - 1\n                    // ,meaning get (x, D, k) by (x, D - 1, k + 1) + moving bottom + snake\n                    // this moving bottom on the edit graph is compatible with insert script\n                    x = furthestReaching[index + 1]\n                } else {\n                    // Getting initial x position\n                    // ,using the futrhest X position on the k - 1_line where D - 1\n                    // ,meaning get (x, D, k) by (x, D - 1, k - 1) + moving right + snake\n                    // this moving right on the edit graph is compatible with delete script\n                    x = furthestReaching[index - 1] + 1\n                }\n                \n                // snake\n                // diagonal moving can be performed with 0 cost.\n                // `same` script is needed ?\n                let _x = snake(x, D, k)\n                \n                if isReachedAtSink(_x, _x - k) { return D }\n                furthestReaching[index] = _x\n            }\n        }\n        \n        fatalError(\"Never comes here\")\n    }\n}\n"
  },
  {
    "path": "Myers Difference Algorithm/MyersDifferenceAlgorithm.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Myers Difference Algorithm/MyersDifferenceAlgorithm.swift",
    "content": "//\n//  MyersDifferenceAlgorithm.swift\n//\n//  Created by Yuya Horita on 2018/02/27.\n//  Copyright © 2018年 hy. All rights reserved.\n//\n\nimport Foundation\n\npublic struct MyersDifferenceAlgorithm<E: Equatable> {\n    public static func calculateShortestEditDistance(from fromArray: Array<E>, to toArray: Array<E>) -> Int {\n        let fromCount = fromArray.count\n        let toCount = toArray.count\n        let totalCount = toCount + fromCount\n        var furthestReaching = Array(repeating: 0, count: 2 * totalCount + 1)\n        \n        let isReachedAtSink: (Int, Int) -> Bool = { x, y in\n            return x == fromCount && y == toCount\n        }\n        \n        let snake: (Int, Int, Int) -> Int = { x, D, k in\n            var _x = x\n            while _x < fromCount && _x - k < toCount && fromArray[_x] == toArray[_x - k] {\n                _x += 1\n            }\n            return _x\n        }\n        \n        for D in 0...totalCount {\n            for k in stride(from: -D, through: D, by: 2) {\n                let index = k + totalCount\n                \n                // (x, D, k) => the x position on the k_line where the number of scripts is D\n                // scripts means insertion or deletion\n                var x = 0\n                if D == 0 { }\n                    // k == -D, D will be the boundary k_line\n                    // when k == -D, moving right on the Edit Graph(is delete script) from k - 1_line where D - 1 is unavailable.\n                    // when k == D, moving bottom on the Edit Graph(is insert script) from k + 1_line where D - 1 is unavailable.\n                    // furthestReaching x position has higher calculating priority. (x, D - 1, k - 1), (x, D - 1, k + 1)\n                else if k == -D || k != D && furthestReaching[index - 1] < furthestReaching[index + 1] {\n                    // Getting initial x position\n                    // ,using the furthestReaching X position on the k + 1_line where D - 1\n                    // ,meaning get (x, D, k) by (x, D - 1, k + 1) + moving bottom + snake\n                    // this moving bottom on the edit graph is compatible with insert script\n                    x = furthestReaching[index + 1]\n                } else {\n                    // Getting initial x position\n                    // ,using the futrhest X position on the k - 1_line where D - 1\n                    // ,meaning get (x, D, k) by (x, D - 1, k - 1) + moving right + snake\n                    // this moving right on the edit graph is compatible with delete script\n                    x = furthestReaching[index - 1] + 1\n                }\n                \n                // snake\n                // diagonal moving can be performed with 0 cost.\n                // `same` script is needed ?\n                let _x = snake(x, D, k)\n                \n                if isReachedAtSink(_x, _x - k) { return D }\n                furthestReaching[index] = _x\n            }\n        }\n        \n        fatalError(\"Never comes here\")\n    }\n}\n"
  },
  {
    "path": "Myers Difference Algorithm/README.md",
    "content": "#  Myers Difference Algorithm\n\nMyers Difference Algorithm(MDA) is an algorithm that finds a longest common subsequence(LCS) or shortest edit scripts(SES) of two sequences. The common subsequence of two sequences is the sequence of elements that appear in the same order in both sequences. For example, let's assume you have two arrays:\n\n```\nlet firstArray = [1, 2, 3]\nlet secondArray = [2, 3, 4]\n```\n\nThe common subsequences of these two arrays are `[2]`, and `[2, 3]`. The longest common sequence in this case is `[2, 3]`. MDA can accomplish this in O(ND) time, where N is the sum of the lengths of the two sequences. \n\n## Finding the length of the Longest Common Subsequence with Myers Algorithm on Edit Graph\n\n### Edit Graph\n\nMDA uses an **Edit Graph** to solve the LCS/SES problem. Below is a illustration depicting an edit graph:\n\n<img src='Images/EditGraph.png' height=\"400\">\n\nThe x-axis at the top of the graph represents one of the sequences, `X`. The y-axis at the left side of the graph represents the other sequence, `Y`. Hence, the two sequences in question is the following:\n\n```\nX = [A, B, C, A, B, B, A]\nY = [C, B, A, B, A, C]\n```\n\nMDA generates the edit graph through the following steps:\n\n1. Line the element of sequence `X` on the x axis. And do for `Y` on the y axis.\n2. Make grid and vertex at each point in the grid (x, y), `x in [0, N] and y in [0, M]`. `N` is the length of sequence `X`, `M` is of `Y`\n3. Line for `x - y = k`, this line called k-line. Black dot line is this and pink number is the value of k.\n3. Check the points `(i, j)`, where `X[i] = Y[j]`, called match point, light green one.\n4. Connect vertex `(i - 1, j - 1)` and vertex `(i, j)`, where `(i, j)` is match point, then diagonal edge appears.\n\nEach elements on the figure shows that,\n- `Red number and dotted lines`: The red number is the value of k and dotted lines are k-line.\n- `Green dots: The match points`, which is the point `(i, j)` where `X[i] == Y[j]`\n- `Blue line`: The shortest path from source to sink, which is the path we are going to find finally.\n\n> **Note:** Here, the sequences' start index is 1 not 0, so `X[1] = A`, `Y[1] = C`\n\nWe discuss about which path is the shortest from `source` to `sink`. Can move on the edges on the graph. I mean we can move on  the grid, horizontal and vertical edges, and the diagonal edges.\n\nThe movements are compatible with the `Edit Scripts`, insert or delete. The word `Edit Scripts` appeared here, as referred at Introduction, SES is Shortest Edit Scripts.\n\nLet's get back on track. On this edit graph, the horizontal movement to vertex `(i, j)` is compatible with the script  `delete at index i from X`, the vertical movement to vertex `(i, j)` is compatible with the script `insert the element of Y at index j to immediately after the element of X at index i`. How about for the diagonal movement?. This movement to vertex `(i, j)` means `X[i] = Y[j]`, so no script needs.\n\n- horizontal movement -> delete\n- vertical movement -> insert\n- diagonal movement -> no script because both are same.\n\nNext, add cost 1 for non-diagonal movement, because they can be compatible with script. And 0 for diagonal movement, same means no script.\n\nThe total cost for the minimum path, exploring from `source` to `sink`, is the same as the length of the Longest Common Subsequence or Shortest Edit Script.\n\nSo, LCS/SES problem can be solved by finding the shortest path from `source` to `sink`.\n\n### Myers Algorithm\n\nAs mentioned above, the problem of finding a shortest edit script can be reduced to finding a path from `source (0, 0)` to `sink (N, M)` with the fewest number of horizontal and vertical edges. Let `D-path` be a path starting at `source` that has exactly `D` non-diagonal edges, or must move non-diagonally D-times.\n\nFor example, A 0-path consists solely of diagonal edges. This means both sequences are completely same.\n\nBy a simple induction, D-path must consist of a (D-1)-path followed by a non-diagonal edge and then diagonal edges, which called `snake`. The minimum value of D is 0, both sequences being same. To the contrary, the maximum value of D is N + M because delete all elements from X and insert all elements from Y to X is the worst case edit scripts. For getting D, or the length of SES, running loop from 0 to N + M is enough.\n\n```swift\nfor D in 0...N + M\n```\n\nNext, thinking about, where is the furthest reaching point for D-path on k-line. Like below, moving horizontally from k-line reaches (k+1)-line, moving vertically from k-line reaches (k-1)-line. Red chalky line shows that.\n\n<img src='Images/EditGraph_k_move.png' height=\"400\">\n\nSo, threre are several end points of D-path, or D-path can end on several k-line. We need the information to get the next path ((D+1)-path) as mentioned above. In fact, D-path must end on\nk-line, where k in { -D, -D + 2, ....., D - 2, D }. This is so simple, starting point, `source` is `(0, 0)` on (k=0)-line. D is the number of non-diagonal edges and non-diagonal movement changes current k-line to (kpm1)-line. Because 0 is even number, if D is even number D-path will end on (even_k)-line, if D is odd number D-path will end on (odd_k)-line.\n\nSearching loop outline will be below.\n\n```swift\nfor D in 0...N + M {\n    for k in stride(from: -D, through: D, by: 2) {\n        //Find the end point of the furthest reaching D-path in k-line.\n        if furthestReachingX == N && furthestReachingY == M {\n            // The D-path is the shortest path\n            // D is the length of Shortest Edit Script\n            return\n        }\n    }\n}\n```\n\nThe D-path on k-line can be decomposed into\n- a furthest reaching (D-1)-path on (k-1)-line, followed by a horizontal edge, followed by `snake`.\n- a furthest reaching (D-1)-path on (k+1)-line, followed by a vertical edge, followed by `snake`.\nas discussed above.\n\nThe Myers Algorithm key point are these.\n- D-path must end on k-line, where k in { -D, -D + 2, ....., D - 2, D }\n- The D-path on k-line can be decomposed into two patterns\n\nthanks for these, the number of calculation become less.\n\n```swift\npublic struct MyersDifferenceAlgorithm<E: Equatable> {\n    public static func calculateShortestEditDistance(from fromArray: Array<E>, to toArray: Array<E>) -> Int {\n        let fromCount = fromArray.count\n        let toCount = toArray.count\n        let totalCount = toCount + fromCount\n        var furthestReaching = Array(repeating: 0, count: 2 * totalCount + 1)\n\n        let isReachedAtSink: (Int, Int) -> Bool = { x, y in\n            return x == fromCount && y == toCount\n        }\n\n        let snake: (Int, Int, Int) -> Int = { x, D, k in\n            var _x = x\n            while _x < fromCount && _x - k < toCount && fromArray[_x] == toArray[_x - k] {\n                _x += 1\n            }\n            return _x\n        }\n\n        for D in 0...totalCount {\n            for k in stride(from: -D, through: D, by: 2) {\n                let index = k + totalCount\n            \n                // (x, D, k) => the x position on the k_line where the number of scripts is D\n                // scripts means insertion or deletion\n                var x = 0\n                if D == 0 { }\n                    // k == -D, D will be the boundary k_line\n                    // when k == -D, moving right on the Edit Graph(is delete script) from k - 1_line where D - 1 is unavailable.\n                    // when k == D, moving bottom on the Edit Graph(is insert script) from k + 1_line where D - 1 is unavailable.\n                    // furthestReaching x position has higher calculating priority. (x, D - 1, k - 1), (x, D - 1, k + 1)\n                else if k == -D || k != D && furthestReaching[index - 1] < furthestReaching[index + 1] {\n                    // Getting initial x position\n                    // ,using the furthestReaching X position on the k + 1_line where D - 1\n                    // ,meaning get (x, D, k) by (x, D - 1, k + 1) + moving bottom + snake\n                    // this moving bottom on the edit graph is compatible with insert script\n                    x = furthestReaching[index + 1]\n                } else {\n                    // Getting initial x position\n                    // ,using the futrhest X position on the k - 1_line where D - 1\n                    // ,meaning get (x, D, k) by (x, D - 1, k - 1) + moving right + snake\n                    // this moving right on the edit graph is compatible with delete script\n                    x = furthestReaching[index - 1] + 1\n                }\n                \n                // snake\n                // diagonal moving can be performed with 0 cost.\n                // `same` script is needed ?\n                let _x = snake(x, D, k)\n                \n                if isReachedAtSink(_x, _x - k) { return D }\n                furthestReaching[index] = _x\n            }\n        }\n\n        fatalError(\"Never comes here\")\n    }\n}\n```\n"
  },
  {
    "path": "Naive Bayes Classifier/NaiveBayes.playground/Contents.swift",
    "content": "import Foundation\n\n// last checked with Xcode 9.0b4\n#if swift(>=4.0)\nprint(\"Hello, Swift 4!\")\n#endif\n\n/*:\n ## Naive Bayes Classifier\n\n This playground uses the given algorithm and utilizes its features with some example datasets\n\n ### Gaussian Naive Bayes\n - Note:\n When using Gaussian NB you have to have continuous features (Double).\n\n For this example we are going to use a famous dataset with different types of wine. The labels of the features can be viewed [here](https://gist.github.com/tijptjik/9408623)\n */\nguard let wineCSV = Bundle.main.path(forResource: \"wine\", ofType: \"csv\") else {\n    print(\"Resource could not be found!\")\n    exit(0)\n}\n\nguard let csv = try? String(contentsOfFile: wineCSV) else {\n    print(\"File could not be read!\")\n    exit(0)\n}\n\n/*:\n Reading the .csv file line per line\n */\nlet rows = csv.characters.split(separator: \"\\r\\n\").map { String($0) }\n/*:\n Splitting on the ; sign and converting the value to a Double\n\n - Important:\n Do not force unwrap the mapped values in your real application. Carefully convert them! This is just for the sake of showing how the algorithm works.\n */\nlet wineData = rows.map { row -> [Double] in\n    let split = row.characters.split(separator: \";\")\n    return split.map { Double(String($0))! }\n}\n\n/*:\n The algorithm wants the classes and the data seperated since this gives a huge performance boost. Also I haven't implemented this in the NB class itself since it is not in the scope of it.\n */\nlet rowOfClasses = 0\nlet classes = wineData.map { Int($0[rowOfClasses]) }\nlet data = wineData.map { row in\n    return row.enumerated().filter { $0.offset != rowOfClasses }.map { $0.element }\n}\n\n/*:\n Again use `guard` on the result of a `try?` or simply `do-try-catch` because this would crash your application if an error occured.\n\n The array in the `classifyProba` method I passed is a former entry in the .csv file which I removed in order to classify it.\n */\nlet wineBayes = try! NaiveBayes(type: .gaussian, data: data, classes: classes).train()\nlet result = wineBayes.classifyProba(with: [12.85, 1.6, 2.52, 17.8, 95, 2.48, 2.37, 0.26, 1.46, 3.93, 1.09, 3.63, 1015])\n/*:\n I can assure you that ***class 1*** is the correct result and as you can see the classifier thinks that its ***99.99%*** likely too.\n\n ### Multinomial Naive Bayes\n\n - Note:\n When using Multinomial NB you have to have categorical features (Int).\n\n Now this dataset is commonly used to describe the classification problem and it is categorical which means you don't have real values you just have categorical data as stated before. The structure of this dataset is as follows.\n\n Outlook,Temperature,Humidity,Windy\n\n ***Outlook***: 0 = rainy, 1 = overcast, 2 = sunny\n\n ***Temperature***: 0 = hot, 1 = mild, 2 = cool\n\n ***Humidity***: 0 = high, 1 = normal\n\n ***Windy***: 0 = false, 1 = true\n\n The classes are either he will play golf or not depending on the weather conditions. (0 = won't play, 1 = will play)\n */\n\nlet golfData = [\n    [0, 0, 0, 0],\n    [0, 0, 0, 1],\n    [1, 0, 0, 0],\n    [2, 1, 0, 0],\n    [2, 2, 1, 0],\n    [2, 2, 1, 1],\n    [1, 2, 1, 1],\n    [0, 1, 0, 0],\n    [0, 2, 1, 0],\n    [2, 1, 1, 0],\n    [0, 1, 1, 1],\n    [1, 1, 0, 1],\n    [1, 0, 1, 0],\n    [2, 1, 0, 1]\n]\nlet golfClasses =  [0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0]\n\nlet golfNaive = try! NaiveBayes(type: .multinomial, data: golfData, classes: golfClasses).train()\n\n/*:\n The weather conditions is as follows now: Outlook=rainy, Temperature=cool, Humidity=high, Windy=true\n */\nlet golfResult = golfNaive.classifyProba(with: [0, 2, 0, 1])\n\n/*:\n Naive Bayes tells us that the golf player will ***not*** play with a likelihood of almost ***80%***. Which is true of course.\n */\n"
  },
  {
    "path": "Naive Bayes Classifier/NaiveBayes.playground/Resources/wine.csv",
    "content": "1;14.23;1.71;2.43;15.6;127;2.8;3.06;.28;2.29;5.64;1.04;3.92;1065\r\n1;13.2;1.78;2.14;11.2;100;2.65;2.76;.26;1.28;4.38;1.05;3.4;1050\r\n1;13.16;2.36;2.67;18.6;101;2.8;3.24;.3;2.81;5.68;1.03;3.17;1185\r\n1;14.37;1.95;2.5;16.8;113;3.85;3.49;.24;2.18;7.8;.86;3.45;1480\r\n1;13.24;2.59;2.87;21;118;2.8;2.69;.39;1.82;4.32;1.04;2.93;735\r\n1;14.2;1.76;2.45;15.2;112;3.27;3.39;.34;1.97;6.75;1.05;2.85;1450\r\n1;14.39;1.87;2.45;14.6;96;2.5;2.52;.3;1.98;5.25;1.02;3.58;1290\r\n1;14.06;2.15;2.61;17.6;121;2.6;2.51;.31;1.25;5.05;1.06;3.58;1295\r\n1;14.83;1.64;2.17;14;97;2.8;2.98;.29;1.98;5.2;1.08;2.85;1045\r\n1;13.86;1.35;2.27;16;98;2.98;3.15;.22;1.85;7.22;1.01;3.55;1045\r\n1;14.1;2.16;2.3;18;105;2.95;3.32;.22;2.38;5.75;1.25;3.17;1510\r\n1;14.12;1.48;2.32;16.8;95;2.2;2.43;.26;1.57;5;1.17;2.82;1280\r\n1;13.75;1.73;2.41;16;89;2.6;2.76;.29;1.81;5.6;1.15;2.9;1320\r\n1;14.75;1.73;2.39;11.4;91;3.1;3.69;.43;2.81;5.4;1.25;2.73;1150\r\n1;14.38;1.87;2.38;12;102;3.3;3.64;.29;2.96;7.5;1.2;3;1547\r\n1;13.63;1.81;2.7;17.2;112;2.85;2.91;.3;1.46;7.3;1.28;2.88;1310\r\n1;14.3;1.92;2.72;20;120;2.8;3.14;.33;1.97;6.2;1.07;2.65;1280\r\n1;13.83;1.57;2.62;20;115;2.95;3.4;.4;1.72;6.6;1.13;2.57;1130\r\n1;14.19;1.59;2.48;16.5;108;3.3;3.93;.32;1.86;8.7;1.23;2.82;1680\r\n1;13.64;3.1;2.56;15.2;116;2.7;3.03;.17;1.66;5.1;.96;3.36;845\r\n1;14.06;1.63;2.28;16;126;3;3.17;.24;2.1;5.65;1.09;3.71;780\r\n1;12.93;3.8;2.65;18.6;102;2.41;2.41;.25;1.98;4.5;1.03;3.52;770\r\n1;13.71;1.86;2.36;16.6;101;2.61;2.88;.27;1.69;3.8;1.11;4;1035\r\n1;13.5;1.81;2.61;20;96;2.53;2.61;.28;1.66;3.52;1.12;3.82;845\r\n1;13.05;2.05;3.22;25;124;2.63;2.68;.47;1.92;3.58;1.13;3.2;830\r\n1;13.39;1.77;2.62;16.1;93;2.85;2.94;.34;1.45;4.8;.92;3.22;1195\r\n1;13.3;1.72;2.14;17;94;2.4;2.19;.27;1.35;3.95;1.02;2.77;1285\r\n1;13.87;1.9;2.8;19.4;107;2.95;2.97;.37;1.76;4.5;1.25;3.4;915\r\n1;14.02;1.68;2.21;16;96;2.65;2.33;.26;1.98;4.7;1.04;3.59;1035\r\n1;13.73;1.5;2.7;22.5;101;3;3.25;.29;2.38;5.7;1.19;2.71;1285\r\n1;13.58;1.66;2.36;19.1;106;2.86;3.19;.22;1.95;6.9;1.09;2.88;1515\r\n1;13.68;1.83;2.36;17.2;104;2.42;2.69;.42;1.97;3.84;1.23;2.87;990\r\n1;13.76;1.53;2.7;19.5;132;2.95;2.74;.5;1.35;5.4;1.25;3;1235\r\n1;13.51;1.8;2.65;19;110;2.35;2.53;.29;1.54;4.2;1.1;2.87;1095\r\n1;13.48;1.81;2.41;20.5;100;2.7;2.98;.26;1.86;5.1;1.04;3.47;920\r\n1;13.28;1.64;2.84;15.5;110;2.6;2.68;.34;1.36;4.6;1.09;2.78;880\r\n1;13.05;1.65;2.55;18;98;2.45;2.43;.29;1.44;4.25;1.12;2.51;1105\r\n1;13.07;1.5;2.1;15.5;98;2.4;2.64;.28;1.37;3.7;1.18;2.69;1020\r\n1;14.22;3.99;2.51;13.2;128;3;3.04;.2;2.08;5.1;.89;3.53;760\r\n1;13.56;1.71;2.31;16.2;117;3.15;3.29;.34;2.34;6.13;.95;3.38;795\r\n1;13.41;3.84;2.12;18.8;90;2.45;2.68;.27;1.48;4.28;.91;3;1035\r\n1;13.88;1.89;2.59;15;101;3.25;3.56;.17;1.7;5.43;.88;3.56;1095\r\n1;13.24;3.98;2.29;17.5;103;2.64;2.63;.32;1.66;4.36;.82;3;680\r\n1;13.05;1.77;2.1;17;107;3;3;.28;2.03;5.04;.88;3.35;885\r\n1;14.21;4.04;2.44;18.9;111;2.85;2.65;.3;1.25;5.24;.87;3.33;1080\r\n1;14.38;3.59;2.28;16;102;3.25;3.17;.27;2.19;4.9;1.04;3.44;1065\r\n1;13.9;1.68;2.12;16;101;3.1;3.39;.21;2.14;6.1;.91;3.33;985\r\n1;14.1;2.02;2.4;18.8;103;2.75;2.92;.32;2.38;6.2;1.07;2.75;1060\r\n1;13.94;1.73;2.27;17.4;108;2.88;3.54;.32;2.08;8.90;1.12;3.1;1260\r\n1;13.05;1.73;2.04;12.4;92;2.72;3.27;.17;2.91;7.2;1.12;2.91;1150\r\n1;13.83;1.65;2.6;17.2;94;2.45;2.99;.22;2.29;5.6;1.24;3.37;1265\r\n1;13.82;1.75;2.42;14;111;3.88;3.74;.32;1.87;7.05;1.01;3.26;1190\r\n1;13.77;1.9;2.68;17.1;115;3;2.79;.39;1.68;6.3;1.13;2.93;1375\r\n1;13.74;1.67;2.25;16.4;118;2.6;2.9;.21;1.62;5.85;.92;3.2;1060\r\n1;13.56;1.73;2.46;20.5;116;2.96;2.78;.2;2.45;6.25;.98;3.03;1120\r\n1;14.22;1.7;2.3;16.3;118;3.2;3;.26;2.03;6.38;.94;3.31;970\r\n1;13.29;1.97;2.68;16.8;102;3;3.23;.31;1.66;6;1.07;2.84;1270\r\n1;13.72;1.43;2.5;16.7;108;3.4;3.67;.19;2.04;6.8;.89;2.87;1285\r\n2;12.37;.94;1.36;10.6;88;1.98;.57;.28;.42;1.95;1.05;1.82;520\r\n2;12.33;1.1;2.28;16;101;2.05;1.09;.63;.41;3.27;1.25;1.67;680\r\n2;12.64;1.36;2.02;16.8;100;2.02;1.41;.53;.62;5.75;.98;1.59;450\r\n2;13.67;1.25;1.92;18;94;2.1;1.79;.32;.73;3.8;1.23;2.46;630\r\n2;12.37;1.13;2.16;19;87;3.5;3.1;.19;1.87;4.45;1.22;2.87;420\r\n2;12.17;1.45;2.53;19;104;1.89;1.75;.45;1.03;2.95;1.45;2.23;355\r\n2;12.37;1.21;2.56;18.1;98;2.42;2.65;.37;2.08;4.6;1.19;2.3;678\r\n2;13.11;1.01;1.7;15;78;2.98;3.18;.26;2.28;5.3;1.12;3.18;502\r\n2;12.37;1.17;1.92;19.6;78;2.11;2;.27;1.04;4.68;1.12;3.48;510\r\n2;13.34;.94;2.36;17;110;2.53;1.3;.55;.42;3.17;1.02;1.93;750\r\n2;12.21;1.19;1.75;16.8;151;1.85;1.28;.14;2.5;2.85;1.28;3.07;718\r\n2;12.29;1.61;2.21;20.4;103;1.1;1.02;.37;1.46;3.05;906;1.82;870\r\n2;13.86;1.51;2.67;25;86;2.95;2.86;.21;1.87;3.38;1.36;3.16;410\r\n2;13.49;1.66;2.24;24;87;1.88;1.84;.27;1.03;3.74;.98;2.78;472\r\n2;12.99;1.67;2.6;30;139;3.3;2.89;.21;1.96;3.35;1.31;3.5;985\r\n2;11.96;1.09;2.3;21;101;3.38;2.14;.13;1.65;3.21;.99;3.13;886\r\n2;11.66;1.88;1.92;16;97;1.61;1.57;.34;1.15;3.8;1.23;2.14;428\r\n2;13.03;.9;1.71;16;86;1.95;2.03;.24;1.46;4.6;1.19;2.48;392\r\n2;11.84;2.89;2.23;18;112;1.72;1.32;.43;.95;2.65;.96;2.52;500\r\n2;12.33;.99;1.95;14.8;136;1.9;1.85;.35;2.76;3.4;1.06;2.31;750\r\n2;12.7;3.87;2.4;23;101;2.83;2.55;.43;1.95;2.57;1.19;3.13;463\r\n2;12;.92;2;19;86;2.42;2.26;.3;1.43;2.5;1.38;3.12;278\r\n2;12.72;1.81;2.2;18.8;86;2.2;2.53;.26;1.77;3.9;1.16;3.14;714\r\n2;12.08;1.13;2.51;24;78;2;1.58;.4;1.4;2.2;1.31;2.72;630\r\n2;13.05;3.86;2.32;22.5;85;1.65;1.59;.61;1.62;4.8;.84;2.01;515\r\n2;11.84;.89;2.58;18;94;2.2;2.21;.22;2.35;3.05;.79;3.08;520\r\n2;12.67;.98;2.24;18;99;2.2;1.94;.3;1.46;2.62;1.23;3.16;450\r\n2;12.16;1.61;2.31;22.8;90;1.78;1.69;.43;1.56;2.45;1.33;2.26;495\r\n2;11.65;1.67;2.62;26;88;1.92;1.61;.4;1.34;2.6;1.36;3.21;562\r\n2;11.64;2.06;2.46;21.6;84;1.95;1.69;.48;1.35;2.8;1;2.75;680\r\n2;12.08;1.33;2.3;23.6;70;2.2;1.59;.42;1.38;1.74;1.07;3.21;625\r\n2;12.08;1.83;2.32;18.5;81;1.6;1.5;.52;1.64;2.4;1.08;2.27;480\r\n2;12;1.51;2.42;22;86;1.45;1.25;.5;1.63;3.6;1.05;2.65;450\r\n2;12.69;1.53;2.26;20.7;80;1.38;1.46;.58;1.62;3.05;.96;2.06;495\r\n2;12.29;2.83;2.22;18;88;2.45;2.25;.25;1.99;2.15;1.15;3.3;290\r\n2;11.62;1.99;2.28;18;98;3.02;2.26;.17;1.35;3.25;1.16;2.96;345\r\n2;12.47;1.52;2.2;19;162;2.5;2.27;.32;3.28;2.6;1.16;2.63;937\r\n2;11.81;2.12;2.74;21.5;134;1.6;.99;.14;1.56;2.5;.95;2.26;625\r\n2;12.29;1.41;1.98;16;85;2.55;2.5;.29;1.77;2.9;1.23;2.74;428\r\n2;12.37;1.07;2.1;18.5;88;3.52;3.75;.24;1.95;4.5;1.04;2.77;660\r\n2;12.29;3.17;2.21;18;88;2.85;2.99;.45;2.81;2.3;1.42;2.83;406\r\n2;12.08;2.08;1.7;17.5;97;2.23;2.17;.26;1.4;3.3;1.27;2.96;710\r\n2;12.6;1.34;1.9;18.5;88;1.45;1.36;.29;1.35;2.45;1.04;2.77;562\r\n2;12.34;2.45;2.46;21;98;2.56;2.11;.34;1.31;2.8;.8;3.38;438\r\n2;11.82;1.72;1.88;19.5;86;2.5;1.64;.37;1.42;2.06;.94;2.44;415\r\n2;12.51;1.73;1.98;20.5;85;2.2;1.92;.32;1.48;2.94;1.04;3.57;672\r\n2;12.42;2.55;2.27;22;90;1.68;1.84;.66;1.42;2.7;.86;3.3;315\r\n2;12.25;1.73;2.12;19;80;1.65;2.03;.37;1.63;3.4;1;3.17;510\r\n2;12.72;1.75;2.28;22.5;84;1.38;1.76;.48;1.63;3.3;.88;2.42;488\r\n2;12.22;1.29;1.94;19;92;2.36;2.04;.39;2.08;2.7;.86;3.02;312\r\n2;11.61;1.35;2.7;20;94;2.74;2.92;.29;2.49;2.65;.96;3.26;680\r\n2;11.46;3.74;1.82;19.5;107;3.18;2.58;.24;3.58;2.9;.75;2.81;562\r\n2;12.52;2.43;2.17;21;88;2.55;2.27;.26;1.22;2;.9;2.78;325\r\n2;11.76;2.68;2.92;20;103;1.75;2.03;.6;1.05;3.8;1.23;2.5;607\r\n2;11.41;.74;2.5;21;88;2.48;2.01;.42;1.44;3.08;1.1;2.31;434\r\n2;12.08;1.39;2.5;22.5;84;2.56;2.29;.43;1.04;2.9;.93;3.19;385\r\n2;11.03;1.51;2.2;21.5;85;2.46;2.17;.52;2.01;1.9;1.71;2.87;407\r\n2;11.82;1.47;1.99;20.8;86;1.98;1.6;.3;1.53;1.95;.95;3.33;495\r\n2;12.42;1.61;2.19;22.5;108;2;2.09;.34;1.61;2.06;1.06;2.96;345\r\n2;12.77;3.43;1.98;16;80;1.63;1.25;.43;.83;3.4;.7;2.12;372\r\n2;12;3.43;2;19;87;2;1.64;.37;1.87;1.28;.93;3.05;564\r\n2;11.45;2.4;2.42;20;96;2.9;2.79;.32;1.83;3.25;.8;3.39;625\r\n2;11.56;2.05;3.23;28.5;119;3.18;5.08;.47;1.87;6;.93;3.69;465\r\n2;12.42;4.43;2.73;26.5;102;2.2;2.13;.43;1.71;2.08;.92;3.12;365\r\n2;13.05;5.8;2.13;21.5;86;2.62;2.65;.3;2.01;2.6;.73;3.1;380\r\n2;11.87;4.31;2.39;21;82;2.86;3.03;.21;2.91;2.8;.75;3.64;380\r\n2;12.07;2.16;2.17;21;85;2.6;2.65;.37;1.35;2.76;.86;3.28;378\r\n2;12.43;1.53;2.29;21.5;86;2.74;3.15;.39;1.77;3.94;.69;2.84;352\r\n2;11.79;2.13;2.78;28.5;92;2.13;2.24;.58;1.76;3;.97;2.44;466\r\n2;12.37;1.63;2.3;24.5;88;2.22;2.45;.4;1.9;2.12;.89;2.78;342\r\n2;12.04;4.3;2.38;22;80;2.1;1.75;.42;1.35;2.6;.79;2.57;580\r\n3;12.86;1.35;2.32;18;122;1.51;1.25;.21;.94;4.1;.76;1.29;630\r\n3;12.88;2.99;2.4;20;104;1.3;1.22;.24;.83;5.4;.74;1.42;530\r\n3;12.81;2.31;2.4;24;98;1.15;1.09;.27;.83;5.7;.66;1.36;560\r\n3;12.7;3.55;2.36;21.5;106;1.7;1.2;.17;.84;5;.78;1.29;600\r\n3;12.51;1.24;2.25;17.5;85;2;.58;.6;1.25;5.45;.75;1.51;650\r\n3;12.6;2.46;2.2;18.5;94;1.62;.66;.63;.94;7.1;.73;1.58;695\r\n3;12.25;4.72;2.54;21;89;1.38;.47;.53;.8;3.85;.75;1.27;720\r\n3;12.53;5.51;2.64;25;96;1.79;.6;.63;1.1;5;.82;1.69;515\r\n3;13.49;3.59;2.19;19.5;88;1.62;.48;.58;.88;5.7;.81;1.82;580\r\n3;12.84;2.96;2.61;24;101;2.32;.6;.53;.81;4.92;.89;2.15;590\r\n3;12.93;2.81;2.7;21;96;1.54;.5;.53;.75;4.6;.77;2.31;600\r\n3;13.36;2.56;2.35;20;89;1.4;.5;.37;.64;5.6;.7;2.47;780\r\n3;13.52;3.17;2.72;23.5;97;1.55;.52;.5;.55;4.35;.89;2.06;520\r\n3;13.62;4.95;2.35;20;92;2;.8;.47;1.02;4.4;.91;2.05;550\r\n3;12.25;3.88;2.2;18.5;112;1.38;.78;.29;1.14;8.21;.65;2;855\r\n3;13.16;3.57;2.15;21;102;1.5;.55;.43;1.3;4;.6;1.68;830\r\n3;13.88;5.04;2.23;20;80;.98;.34;.4;.68;4.9;.58;1.33;415\r\n3;12.87;4.61;2.48;21.5;86;1.7;.65;.47;.86;7.65;.54;1.86;625\r\n3;13.32;3.24;2.38;21.5;92;1.93;.76;.45;1.25;8.42;.55;1.62;650\r\n3;13.08;3.9;2.36;21.5;113;1.41;1.39;.34;1.14;9.40;.57;1.33;550\r\n3;13.5;3.12;2.62;24;123;1.4;1.57;.22;1.25;8.60;.59;1.3;500\r\n3;12.79;2.67;2.48;22;112;1.48;1.36;.24;1.26;10.8;.48;1.47;480\r\n3;13.11;1.9;2.75;25.5;116;2.2;1.28;.26;1.56;7.1;.61;1.33;425\r\n3;13.23;3.3;2.28;18.5;98;1.8;.83;.61;1.87;10.52;.56;1.51;675\r\n3;12.58;1.29;2.1;20;103;1.48;.58;.53;1.4;7.6;.58;1.55;640\r\n3;13.17;5.19;2.32;22;93;1.74;.63;.61;1.55;7.9;.6;1.48;725\r\n3;13.84;4.12;2.38;19.5;89;1.8;.83;.48;1.56;9.01;.57;1.64;480\r\n3;12.45;3.03;2.64;27;97;1.9;.58;.63;1.14;7.5;.67;1.73;880\r\n3;14.34;1.68;2.7;25;98;2.8;1.31;.53;2.7;13;.57;1.96;660\r\n3;13.48;1.67;2.64;22.5;89;2.6;1.1;.52;2.29;11.75;.57;1.78;620\r\n3;12.36;3.83;2.38;21;88;2.3;.92;.5;1.04;7.65;.56;1.58;520\r\n3;13.69;3.26;2.54;20;107;1.83;.56;.5;.8;5.88;.96;1.82;680\r\n3;12.85;3.27;2.58;22;106;1.65;.6;.6;.96;5.58;.87;2.11;570\r\n3;12.96;3.45;2.35;18.5;106;1.39;.7;.4;.94;5.28;.68;1.75;675\r\n3;13.78;2.76;2.3;22;90;1.35;.68;.41;1.03;9.58;.7;1.68;615\r\n3;13.73;4.36;2.26;22.5;88;1.28;.47;.52;1.15;6.62;.78;1.75;520\r\n3;13.45;3.7;2.6;23;111;1.7;.92;.43;1.46;10.68;.85;1.56;695\r\n3;12.82;3.37;2.3;19.5;88;1.48;.66;.4;.97;10.26;.72;1.75;685\r\n3;13.58;2.58;2.69;24.5;105;1.55;.84;.39;1.54;8.66;.74;1.8;750\r\n3;13.4;4.6;2.86;25;112;1.98;.96;.27;1.11;8.5;.67;1.92;630\r\n3;12.2;3.03;2.32;19;96;1.25;.49;.4;.73;5.5;.66;1.83;510\r\n3;12.77;2.39;2.28;19.5;86;1.39;.51;.48;.64;9.899999;.57;1.63;470\r\n3;14.16;2.51;2.48;20;91;1.68;.7;.44;1.24;9.7;.62;1.71;660\r\n3;13.71;5.65;2.45;20.5;95;1.68;.61;.52;1.06;7.7;.64;1.74;740\r\n3;13.4;3.91;2.48;23;102;1.8;.75;.43;1.41;7.3;.7;1.56;750\r\n3;13.27;4.28;2.26;20;120;1.59;.69;.43;1.35;10.2;.59;1.56;835\r\n3;13.17;2.59;2.37;20;120;1.65;.68;.53;1.46;9.3;.6;1.62;840\r\n3;14.13;4.1;2.74;24.5;96;2.05;.76;.56;1.35;9.2;.61;1.6;560"
  },
  {
    "path": "Naive Bayes Classifier/NaiveBayes.playground/Sources/NaiveBayes.swift",
    "content": "//\n//  NaiveBayes.swift\n//  NaiveBayes\n//\n//  Created by Philipp Gabriel on 14.04.17.\n//  Copyright © 2017 ph1ps. All rights reserved.\n//\n\nimport Foundation\n\nextension String: Error {}\n\nextension Array where Element == Double {\n\n    func mean() -> Double {\n        return self.reduce(0, +) / Double(count)\n    }\n\n    func standardDeviation() -> Double {\n        let calculatedMean = mean()\n\n        let sum = self.reduce(0.0) { (previous, next) in\n            return previous + pow(next - calculatedMean, 2)\n        }\n\n        return sqrt(sum / Double(count - 1))\n    }\n}\n\nextension Array where Element == Int {\n\n    func uniques() -> Set<Element> {\n        return Set(self)\n    }\n\n}\n\npublic enum NBType {\n\n    case gaussian\n    case multinomial\n    //case bernoulli --> TODO\n\n    func calcLikelihood(variables: [Any], input: Any) -> Double? {\n\n        if case .gaussian = self {\n\n            guard let input = input as? Double else {\n                return nil\n            }\n\n            guard let mean = variables[0] as? Double else {\n                return nil\n            }\n\n            guard let stDev = variables[1] as? Double else {\n                return nil\n            }\n\n            let eulerPart = pow(M_E, -1 * pow(input - mean, 2) / (2 * pow(stDev, 2)))\n            let distribution = eulerPart / sqrt(2 * .pi) / stDev\n\n            return distribution\n\n        } else if case .multinomial = self {\n\n            guard let variables = variables as? [(category: Int, probability: Double)] else {\n                return nil\n            }\n\n            guard let input = input as? Int else {\n                return nil\n            }\n\n            return variables.first { variable in\n                return variable.category == input\n                }?.probability\n\n        }\n\n        return nil\n    }\n\n    func train(values: [Any]) -> [Any]? {\n\n        if case .gaussian = self {\n\n            guard let values = values as? [Double] else {\n                return nil\n            }\n\n            return [values.mean(), values.standardDeviation()]\n\n        } else if case .multinomial = self {\n\n            guard let values = values as? [Int] else {\n                return nil\n            }\n\n            let count = values.count\n            let categoryProba = values.uniques().map { value -> (Int, Double) in\n                return (value, Double(values.filter { $0 == value }.count) / Double(count))\n            }\n            return categoryProba\n        }\n\n        return nil\n    }\n}\n\npublic class NaiveBayes<T> {\n\n    var variables: [Int: [(feature: Int, variables: [Any])]]\n    var type: NBType\n\n    var data: [[T]]\n    var classes: [Int]\n\n    public init(type: NBType, data: [[T]], classes: [Int]) throws {\n        self.type = type\n        self.data = data\n        self.classes = classes\n        self.variables = [Int: [(Int, [Any])]]()\n\n        if case .gaussian = type, T.self != Double.self {\n            throw \"When using Gaussian NB you have to have continuous features (Double)\"\n        } else if case .multinomial = type, T.self != Int.self {\n            throw \"When using Multinomial NB you have to have categorical features (Int)\"\n        }\n    }\n\n    public func train() throws -> Self {\n\n        for `class` in classes.uniques() {\n            variables[`class`] = [(Int, [Any])]()\n\n            let classDependent = data.enumerated().filter { (offset, _) in\n                return classes[offset] == `class`\n            }\n\n            for feature in 0..<data[0].count {\n\n                let featureDependent = classDependent.map { $0.element[feature] }\n\n                guard let trained = type.train(values: featureDependent) else {\n                    throw \"Critical! Data could not be casted even though it was checked at init\"\n                }\n\n                variables[`class`]?.append((feature, trained))\n            }\n        }\n\n        return self\n    }\n\n    public func classify(with input: [T]) -> Int {\n        let likelihoods = classifyProba(with: input).max { (first, second) -> Bool in\n            return first.1 < second.1\n        }\n\n        guard let `class` = likelihoods?.0 else {\n            return -1\n        }\n\n        return `class`\n    }\n\n    public func classifyProba(with input: [T]) -> [(Int, Double)] {\n\n        var probaClass = [Int: Double]()\n        let amount = classes.count\n\n        classes.forEach { `class` in\n            let individual = classes.filter { $0 == `class` }.count\n            probaClass[`class`] = Double(individual) / Double(amount)\n        }\n\n        let classesAndFeatures = variables.map { (`class`, value) -> (Int, [Double]) in\n            let distribution = value.map { (feature, variables) -> Double in\n                return type.calcLikelihood(variables: variables, input: input[feature]) ?? 0.0\n            }\n            return (`class`, distribution)\n        }\n\n        let likelihoods = classesAndFeatures.map { (`class`, distribution) in\n            return (`class`, distribution.reduce(1, *) * (probaClass[`class`] ?? 0.0))\n        }\n\n        let sum = likelihoods.map { $0.1 }.reduce(0, +)\n        let normalized = likelihoods.map { (`class`, likelihood) in\n            return (`class`, likelihood / sum)\n        }\n\n        return normalized\n    }\n}\n"
  },
  {
    "path": "Naive Bayes Classifier/NaiveBayes.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios' display-mode='rendered'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Naive Bayes Classifier/NaiveBayes.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Naive Bayes Classifier/NaiveBayes.playground/timeline.xctimeline",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Timeline\n   version = \"3.0\">\n   <TimelineItems>\n      <LoggerValueHistoryTimelineItem\n         documentLocation = \"#CharacterRangeLen=1&amp;CharacterRangeLoc=2051&amp;EndingColumnNumber=14&amp;EndingLineNumber=53&amp;StartingColumnNumber=1&amp;StartingLineNumber=53&amp;Timestamp=514147811.827527\"\n         selectedRepresentationIndex = \"0\"\n         shouldTrackSuperviewWidth = \"NO\">\n      </LoggerValueHistoryTimelineItem>\n      <LoggerValueHistoryTimelineItem\n         documentLocation = \"#CharacterRangeLen=6&amp;CharacterRangeLoc=1936&amp;EndingColumnNumber=11&amp;EndingLineNumber=53&amp;StartingColumnNumber=5&amp;StartingLineNumber=53&amp;Timestamp=514147811.848778\"\n         selectedRepresentationIndex = \"0\"\n         shouldTrackSuperviewWidth = \"NO\">\n      </LoggerValueHistoryTimelineItem>\n      <LoggerValueHistoryTimelineItem\n         documentLocation = \"#CharacterRangeLen=10&amp;CharacterRangeLoc=3424&amp;EndingColumnNumber=15&amp;EndingLineNumber=100&amp;StartingColumnNumber=5&amp;StartingLineNumber=100&amp;Timestamp=514149150.852782\"\n         selectedRepresentationIndex = \"0\"\n         shouldTrackSuperviewWidth = \"NO\">\n      </LoggerValueHistoryTimelineItem>\n      <LoggerValueHistoryTimelineItem\n         documentLocation = \"#CharacterRangeLen=10&amp;CharacterRangeLoc=3410&amp;EndingColumnNumber=15&amp;EndingLineNumber=100&amp;StartingColumnNumber=5&amp;StartingLineNumber=100&amp;Timestamp=514208705.303681\"\n         selectedRepresentationIndex = \"0\"\n         shouldTrackSuperviewWidth = \"NO\">\n      </LoggerValueHistoryTimelineItem>\n      <LoggerValueHistoryTimelineItem\n         documentLocation = \"#CharacterRangeLen=6&amp;CharacterRangeLoc=1931&amp;EndingColumnNumber=11&amp;EndingLineNumber=53&amp;StartingColumnNumber=5&amp;StartingLineNumber=53&amp;Timestamp=514208705.303681\"\n         selectedRepresentationIndex = \"0\"\n         shouldTrackSuperviewWidth = \"NO\">\n      </LoggerValueHistoryTimelineItem>\n   </TimelineItems>\n</Timeline>\n"
  },
  {
    "path": "Naive Bayes Classifier/NaiveBayes.swift",
    "content": "//\n//  NaiveBayes.swift\n//  NaiveBayes\n//\n//  Created by Philipp Gabriel on 14.04.17.\n//  Copyright © 2017 ph1ps. All rights reserved.\n//\n\nimport Foundation\n\nextension String: Error {}\n\nextension Array where Element == Double {\n\n    func mean() -> Double {\n        return self.reduce(0, +) / Double(count)\n    }\n\n    func standardDeviation() -> Double {\n        let calculatedMean = mean()\n\n        let sum = self.reduce(0.0) { (previous, next) in\n            return previous + pow(next - calculatedMean, 2)\n        }\n\n        return sqrt(sum / Double(count - 1))\n    }\n}\n\nextension Array where Element == Int {\n\n    func uniques() -> Set<Element> {\n        return Set(self)\n    }\n\n}\n\nenum NBType {\n\n    case gaussian\n    case multinomial\n    //case bernoulli --> TODO\n\n    func calcLikelihood(variables: [Any], input: Any) -> Double? {\n\n        if case .gaussian = self {\n\n            guard let input = input as? Double else {\n                return nil\n            }\n\n            guard let mean = variables[0] as? Double else {\n                return nil\n            }\n\n            guard let stDev = variables[1] as? Double else {\n                return nil\n            }\n\n            let eulerPart = pow(M_E, -1 * pow(input - mean, 2) / (2 * pow(stDev, 2)))\n            let distribution = eulerPart / sqrt(2 * .pi) / stDev\n\n            return distribution\n\n        } else if case .multinomial = self {\n\n            guard let variables = variables as? [(category: Int, probability: Double)] else {\n                return nil\n            }\n\n            guard let input = input as? Int else {\n                return nil\n            }\n\n            return variables.first { variable in\n                return variable.category == input\n                }?.probability\n\n        }\n\n        return nil\n    }\n\n    func train(values: [Any]) -> [Any]? {\n\n        if case .gaussian = self {\n\n            guard let values = values as? [Double] else {\n                return nil\n            }\n\n            return [values.mean(), values.standardDeviation()]\n\n        } else if case .multinomial = self {\n\n            guard let values = values as? [Int] else {\n                return nil\n            }\n\n            let count = values.count\n            let categoryProba = values.uniques().map { value -> (Int, Double) in\n                return (value, Double(values.filter { $0 == value }.count) / Double(count))\n            }\n            return categoryProba\n        }\n\n        return nil\n    }\n}\n\nclass NaiveBayes<T> {\n\n    var variables: [Int: [(feature: Int, variables: [Any])]]\n    var type: NBType\n\n    var data: [[T]]\n    var classes: [Int]\n\n    init(type: NBType, data: [[T]], classes: [Int]) throws {\n        self.type = type\n        self.data = data\n        self.classes = classes\n        self.variables = [Int: [(Int, [Any])]]()\n\n        if case .gaussian = type, T.self != Double.self {\n            throw \"When using Gaussian NB you have to have continuous features (Double)\"\n        } else if case .multinomial = type, T.self != Int.self {\n            throw \"When using Multinomial NB you have to have categorical features (Int)\"\n        }\n    }\n\n    func train() throws -> Self {\n\n        for `class` in classes.uniques() {\n            variables[`class`] = [(Int, [Any])]()\n\n            let classDependent = data.enumerated().filter { (offset, _) in\n                return classes[offset] == `class`\n            }\n\n            for feature in 0..<data[0].count {\n\n                let featureDependent = classDependent.map { $0.element[feature] }\n\n                guard let trained = type.train(values: featureDependent) else {\n                    throw \"Critical! Data could not be casted even though it was checked at init\"\n                }\n\n                variables[`class`]?.append((feature, trained))\n            }\n        }\n\n        return self\n    }\n\n    func classify(with input: [T]) -> Int {\n        let likelihoods = classifyProba(with: input).max { (first, second) -> Bool in\n            return first.1 < second.1\n        }\n\n        guard let `class` = likelihoods?.0 else {\n            return -1\n        }\n\n        return `class`\n    }\n\n    func classifyProba(with input: [T]) -> [(Int, Double)] {\n\n        var probaClass = [Int: Double]()\n        let amount = classes.count\n\n        classes.forEach { `class` in\n            let individual = classes.filter { $0 == `class` }.count\n            probaClass[`class`] = Double(individual) / Double(amount)\n        }\n\n        let classesAndFeatures = variables.map { (`class`, value) -> (Int, [Double]) in\n            let distribution = value.map { (feature, variables) -> Double in\n                return type.calcLikelihood(variables: variables, input: input[feature]) ?? 0.0\n            }\n            return (`class`, distribution)\n        }\n\n        let likelihoods = classesAndFeatures.map { (`class`, distribution) in\n            return (`class`, distribution.reduce(1, *) * (probaClass[`class`] ?? 0.0))\n        }\n\n        let sum = likelihoods.map { $0.1 }.reduce(0, +)\n        let normalized = likelihoods.map { (`class`, likelihood) in\n            return (`class`, likelihood / sum)\n        }\n\n        return normalized\n    }\n}\n"
  },
  {
    "path": "Naive Bayes Classifier/README.md",
    "content": "# Naive Bayes Classifier\n\n> ***Disclaimer:*** Do not get scared of complicated formulas or terms, I will describe them right after I use them. Also the math skills you need to understand this are very basic.\n\nThe goal of a classifier is to predict the class of a given data entry based on previously fed data and its features. \n\nNow what is a class or a feature? The best I can do is to describe it with a table. \nThis is a dataset that uses height, weight and foot size of a person to illustrate the relationship between those values and the sex.\n\n| Sex       | height (feet)          | weight(lbs)  | foot size (inches) |\n| ------------- |:-------------:|:-----:|:---:|\n| male      | 6     | 180 | 12  |\n| male      | 5.92  | 190 | 11  |\n| male      | 5.58  | 170 | 12  |\n| male      | 5.92  | 165 | 10  |\n| female    | 5     | 100 | 6   |\n| female    | 5.5   | 150 | 8   |\n| female    | 5.42  | 130 | 7   |\n| female    | 5.75  | 150 | 9   |\n\nThe ***classes*** of this table is the data in the sex column (male/female). You \"classify\" the rest of the data and bind them to a sex.\n\nThe ***features*** of this table are the labels of the other columns (height, weight, foot size) and the numbers right under the labels.\n\nNow that I've told you what a classifier is I will tell you what exactly a ***Naive Bayes classifier*** is. There are a lot of other classifiers out there but what's so special about this specific is that it only needs a very small dataset to get good results. The others like Random Forests normally need a very large dataset.\n\nWhy isn't this algorithm used more you might ask (or not). Because it is normally ***outperformed*** in accuracy by ***Random Forests*** or ***Boosted Trees***.\n\n## Theory\n\nThe Naive Bayes classifier utilizes the ***Bayes Theorem*** (as its name suggests) which looks like this.\n\n![](images/bayes.gif)\n\n***P*** always means the probability of something.\n\n***A*** is the class, ***B*** is the data depending on a feature and the ***pipe*** symbol means given. \n\nP(A | B) therefore is: probability of the class given the data (which is dependent on the feature).\n\nThis is all you have to know about the Bayes Theorem. The important thing for us is now how to calculate all those variables, plug them into this formula and you are ready to classify data.\n\n### **P(A)**\nThis is the probability of the class. To get back to the example I gave before: Let's say we want to classify this data entry:\n\n| height (feet)          | weight(lbs)  | foot size (inches) |\n|:-------------:|:-----:|:---:|\n| 6     | 130 | 8  |\n\nWhat Naive Bayes classifier now does: it checks the probability for every class possible which is in our case either male or female. Look back at the original table and count the male and the female entries. Then divide them by the overall count of data entries.\n\nP(male) = 4 / 8 = 0.5\n\nP(female) = 4 / 8 = 0.5\n\nThis should be a very easy task to do. Basically just the probability of all classes.\n\n### **P(B)**\nThis variable is not needed in a Naive Bayes classifier. It is the probability of the data. It does not change, therefore it is a constant. And what can you do with a constant? Exactly! Discard it. This saves time and code.\n\n### **P(B | A)**\nThis is the probability of the data given the class. To calculate this I have to introduce you to the subtypes of NB. You have to decide which you use depending on your data which you want to classify.\n\n### **Gaussian Naive Bayes**\nIf you have a dataset like the one I showed you before (continuous features -> `Double`s) you have to use this subtype. There are 3 formulas you need for Gaussian NB to calculate P(B | A).\n\n![mean](images/mean.gif)\n\n![standard deviation](images/standard_deviation.gif)\n\n![normal distribution](images/normal_distribution.gif)\n\nand **P(x | y) = P(B | A)**\n\nAgain, very complicated looking formulas but they are very easy. The first formula with µ is just the mean of the data (adding all data points and dividing them by the count). The second with σ is the standard deviation. You might have heard of it somewhen in school. It is just the sum of all values minus the mean, squared and that divided by the count of the data minus 1 and a sqaure root around it. The third equation is the Gaussian or normal distribution if you want to read more about it I suggest reading [this](https://en.wikipedia.org/wiki/Normal_distribution).\n\nWhy the Gaussian distribution? Because we assume that the continuous values associated with each class are distributed according to the Gaussian distribution. Simple as that.\n\n### **Multinomial Naive Bayes**\n\nWhat do we do if we have this for examples:\n\n![tennis or golf](images/tennis_dataset.png)\n\nWe can't just calculate the mean of sunny, overcast and rainy. This is why we need the categorical model which is the multinomial NB. This is the last formula, I promise!\n\n![multinomial](images/multinomial.gif)\n\nNow this is the number of times feature **i** appears in a sample **N** of class **y** in the data set divided by the count of the sample just depending on the class **y**. That θ is also just a fancy way of writing P(B | A).\n\nYou might have noticed that there is still the α in this formula. This solves a problem called \"zero-frequency-problem\". Because what happens if there is no sample with feature **i** and class **y**? The whole equation would result in 0 (because 0 / something is always 0). This is a huge problem but there is a simple solution to this. Just add 1 to any count of the sample (α = 1).\n\n## Those formulas in action\n\nEnough talking! This is the code. If you want a deeper explanation of how the code works just look at the Playground I provided.\n\n![code example](images/code_example.png)\n\n*Written for Swift Algorithm Club by Philipp Gabriel*"
  },
  {
    "path": "Octree/Octree.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\nimport UIKit\nimport simd\n\nlet boxMin = vector_double3(0, 2, 6)\nlet boxMax = vector_double3(5, 10, 9)\nlet box = Box(boxMin: boxMin, boxMax: boxMax)\nvar octree = Octree<Int>(boundingBox: box, minimumCellSize: 5.0)\nvar five = octree.add(5, at: vector_double3(3,4,8))\noctree.add(8, at: vector_double3(3,4,8.2))\noctree.add(10, at: vector_double3(3,4,8.2))\noctree.add(7, at: vector_double3(2,5,8))\noctree.add(2, at: vector_double3(1,6,7))\n\nvar cont = octree.elements(at: vector_double3(3,4,8.2))\noctree.remove(8)\noctree.elements(at: vector_double3(3,4,8))\n\nlet boxMin2 = vector_double3(1,3,7)\nlet boxMax2 = vector_double3(4,9,8)\nlet box2 = Box(boxMin: boxMin2, boxMax: boxMax2)\nbox.isContained(in: box2)\nbox.intersects(box2)\n\nlet boxMin3 = vector_double3(3,8,8)\nlet boxMax3 = vector_double3(10,12,20)\nlet box3 = Box(boxMin: boxMin3, boxMax: boxMax3)\nbox3.intersects(box3)\n\noctree.elements(in: box)\noctree.elements(in: box2)\nprint(octree)\n"
  },
  {
    "path": "Octree/Octree.playground/Sources/Octree.swift",
    "content": "import Foundation\nimport simd\n\npublic struct Box: CustomStringConvertible {\n    public var boxMin: vector_double3\n    public var boxMax: vector_double3\n    \n    public init(boxMin: vector_double3, boxMax: vector_double3) {\n        self.boxMin = boxMin\n        self.boxMax = boxMax\n    }\n    \n    public var boxSize: vector_double3 {\n        return boxMax - boxMin\n    }\n    \n    var halfBoxSize: vector_double3 {\n        return boxSize/2\n    }\n    \n    var frontLeftTop: Box {\n        let boxMin = self.boxMin + vector_double3(0, halfBoxSize.y, halfBoxSize.z)\n        let boxMax = self.boxMax - vector_double3(halfBoxSize.x, 0, 0)\n        return Box(boxMin: boxMin, boxMax: boxMax)\n    }\n    var frontLeftBottom: Box {\n        let boxMin = self.boxMin + vector_double3(0, 0, halfBoxSize.z)\n        let boxMax = self.boxMax - vector_double3(halfBoxSize.x, halfBoxSize.y, 0)\n        return Box(boxMin: boxMin, boxMax: boxMax)\n    }\n    var frontRightTop: Box {\n        let boxMin = self.boxMin + vector_double3(halfBoxSize.x, halfBoxSize.y, halfBoxSize.z)\n        let boxMax = self.boxMax - vector_double3(0, 0, 0)\n        return Box(boxMin: boxMin, boxMax: boxMax)\n    }\n    var frontRightBottom: Box {\n        let boxMin = self.boxMin + vector_double3(halfBoxSize.x, 0, halfBoxSize.z)\n        let boxMax = self.boxMax - vector_double3(0, halfBoxSize.y, 0)\n        return Box(boxMin: boxMin, boxMax: boxMax)\n    }\n    var backLeftTop: Box {\n        let boxMin = self.boxMin + vector_double3(0, halfBoxSize.y, 0)\n        let boxMax = self.boxMax - vector_double3(halfBoxSize.x, 0, halfBoxSize.z)\n        return Box(boxMin: boxMin, boxMax: boxMax)\n    }\n    var backLeftBottom: Box {\n        let boxMin = self.boxMin + vector_double3(0, 0, 0)\n        let boxMax = self.boxMax - vector_double3(halfBoxSize.x, halfBoxSize.y, halfBoxSize.z)\n        return Box(boxMin: boxMin, boxMax: boxMax)\n    }\n    var backRightTop: Box {\n        let boxMin = self.boxMin + vector_double3(halfBoxSize.x, halfBoxSize.y, 0)\n        let boxMax = self.boxMax - vector_double3(0, 0, halfBoxSize.z)\n        return Box(boxMin: boxMin, boxMax: boxMax)\n    }\n    var backRightBottom: Box {\n        let boxMin = self.boxMin + vector_double3(halfBoxSize.x, 0, 0)\n        let boxMax = self.boxMax - vector_double3(0, halfBoxSize.y, halfBoxSize.z)\n        return Box(boxMin: boxMin, boxMax: boxMax)\n    }\n    \n    public func contains(_ point: vector_double3) -> Bool {\n        return (boxMin.x <= point.x && point.x <= boxMax.x) && (boxMin.y <= point.y && point.y <= boxMax.y) && (boxMin.z <= point.z && point.z <= boxMax.z)\n    }\n    \n    public func contains(_ box: Box) -> Bool {\n        return\n            self.boxMin.x <= box.boxMin.x &&\n                self.boxMin.y <= box.boxMin.y &&\n                self.boxMin.z <= box.boxMin.z &&\n                self.boxMax.x >= box.boxMax.x &&\n                self.boxMax.y >= box.boxMax.y &&\n                self.boxMax.z >= box.boxMax.z\n    }\n    \n    public func isContained(in box: Box) -> Bool {\n        return\n            self.boxMin.x >= box.boxMin.x &&\n                self.boxMin.y >= box.boxMin.y &&\n                self.boxMin.z >= box.boxMin.z &&\n                self.boxMax.x <= box.boxMax.x &&\n                self.boxMax.y <= box.boxMax.y &&\n                self.boxMax.z <= box.boxMax.z\n    }\n    \n    /* This intersect function does not handle all possibilities such as two beams\n     of different diameter crossing each other half way. But it does cover all cases\n     needed for an octree as the bounding box has to contain the given intersect box */\n    public func intersects(_ box: Box) -> Bool {\n        let corners = [\n            vector_double3(boxMin.x, boxMax.y, boxMax.z), //frontLeftTop\n            vector_double3(boxMin.x, boxMin.y, boxMax.z), //frontLeftBottom\n            vector_double3(boxMax.x, boxMax.y, boxMax.z), //frontRightTop\n            vector_double3(boxMax.x, boxMin.y, boxMax.z), //frontRightBottom\n            vector_double3(boxMin.x, boxMax.y, boxMin.z), //backLeftTop\n            vector_double3(boxMin.x, boxMin.y, boxMin.z), //backLeftBottom\n            vector_double3(boxMax.x, boxMax.y, boxMin.z), //backRightTop\n            vector_double3(boxMax.x, boxMin.y, boxMin.z)  //backRightBottom\n        ]\n        for corner in corners {\n            if box.contains(corner) {\n                return true\n            }\n        }\n        return false\n    }\n    \n    public var description: String {\n        return \"Box from:\\(boxMin) to:\\(boxMax)\"\n    }\n}\n\npublic class OctreeNode<T: Equatable>: CustomStringConvertible {\n    let box: Box\n    var point: vector_double3!\n    var elements: [T]!\n    var type: NodeType = .leaf\n    \n    enum NodeType {\n        case leaf\n        case `internal`(children: Children)\n    }\n    \n    public var description: String {\n        switch type {\n        case .leaf:\n            return \"leaf node with \\(box) elements: \\(elements)\"\n        case .internal:\n            return \"internal node with \\(box)\"\n        }\n    }\n    \n    var recursiveDescription: String {\n        return recursiveDescription(withTabCount: 0)\n    }\n    \n    private func recursiveDescription(withTabCount count: Int) -> String {\n        let indent = String(repeating: \"\\t\", count: count)\n        var result = \"\\(indent)\" + description + \"\\n\"\n        switch type {\n        case .internal(let children):\n            for child in children {\n                result += child.recursiveDescription(withTabCount: count + 1)\n            }\n        default:\n            break\n        }\n        return result\n    }\n    \n    struct Children: Sequence {\n        let frontLeftTop: OctreeNode\n        let frontLeftBottom: OctreeNode\n        let frontRightTop: OctreeNode\n        let frontRightBottom: OctreeNode\n        let backLeftTop: OctreeNode\n        let backLeftBottom: OctreeNode\n        let backRightTop: OctreeNode\n        let backRightBottom: OctreeNode\n        \n        init(parentNode: OctreeNode) {\n            frontLeftTop = OctreeNode(box: parentNode.box.frontLeftTop)\n            frontLeftBottom = OctreeNode(box: parentNode.box.frontLeftBottom)\n            frontRightTop = OctreeNode(box: parentNode.box.frontRightTop)\n            frontRightBottom = OctreeNode(box: parentNode.box.frontRightBottom)\n            backLeftTop = OctreeNode(box: parentNode.box.backLeftTop)\n            backLeftBottom = OctreeNode(box: parentNode.box.backLeftBottom)\n            backRightTop = OctreeNode(box: parentNode.box.backRightTop)\n            backRightBottom = OctreeNode(box: parentNode.box.backRightBottom)\n        }\n        \n        struct ChildrenIterator: IteratorProtocol {\n            var index = 0\n            let children: Children\n            \n            init(children: Children) {\n                self.children = children\n            }\n            \n            mutating func next() -> OctreeNode? {\n                defer { index += 1 }\n                switch index {\n                case 0: return children.frontLeftTop\n                case 1: return children.frontLeftBottom\n                case 2: return children.frontRightTop\n                case 3: return children.frontRightBottom\n                case 4: return children.backLeftTop\n                case 5: return children.backLeftBottom\n                case 6: return children.backRightTop\n                case 7: return children.backRightBottom\n                default: return nil\n                }\n            }\n        }\n        \n        func makeIterator() -> ChildrenIterator {\n            return ChildrenIterator(children: self)\n        }\n    }\n    \n    init(box: Box) {\n        self.box = box\n    }\n    \n    @discardableResult\n    func add(_ element: T, at point: vector_double3) -> OctreeNode {\n        return tryAdd(element, at: point)!\n    }\n    \n    private func tryAdd(_ element: T, at point: vector_double3) -> OctreeNode? {\n        if !box.contains(point) {\n            return nil\n        }\n        \n        switch type {\n        case .internal(let children):\n            // pass the point to one of the children\n            for child in children {\n                if let child = child.tryAdd(element, at: point) {\n                    return child\n                }\n            }\n            \n            fatalError(\"box.contains evaluted to true, but none of the children added the point\")\n        case .leaf:\n            if self.point != nil {\n                // leaf already has an asigned point\n                if self.point == point {\n                    self.elements.append(element)\n                    return self\n                } else {\n                    return subdivide(adding: element, at: point)\n                }\n            } else {\n                self.elements = [element]\n                self.point = point\n                return self\n            }\n        }\n    }\n    \n    func add(_ elements: [T], at point: vector_double3) {\n        for element in elements {\n            self.add(element, at: point)\n        }\n    }\n    \n    @discardableResult\n    func remove(_ element: T) -> Bool {\n        switch type {\n        case .leaf:\n            if let elements = self.elements {\n                // leaf contains one ore more elements\n                if let index = elements.index(of: element) {\n                    // leaf contains the element we want to remove\n                    self.elements.remove(at: index)\n                    // if elements is now empty remove it\n                    if self.elements.isEmpty {\n                        self.elements = nil\n                    }\n                    return true\n                }\n            }\n            return false\n        case .internal(let children):\n            for child in children  {\n                if child.remove(element) {\n                    return true\n                }\n            }\n            return false\n        }\n    }\n    \n    func elements(at point: vector_double3) -> [T]? {\n        switch type {\n        case .leaf:\n            if self.point == point {\n                return self.elements\n            }\n        case .internal(let children):\n            for child in children {\n                if child.box.contains(point) {\n                    return child.elements(at: point)\n                }\n            }\n        }\n        // tree does not contain given point\n        return nil\n    }\n    \n    func elements(in box: Box) -> [T]? {\n        var values: [T] = []\n        switch type {\n        case .leaf:\n            // check if leaf has an assigned point\n            if let point = self.point {\n                // check if point is inside given box\n                if box.contains(point) {\n                    values += elements ?? []\n                }\n            }\n        case .internal(let children):\n            for child in children {\n                if child.box.isContained(in: box) {\n                    // child is contained in box\n                    // add all children of child\n                    values += child.elements(in: child.box) ?? []\n                } else if child.box.contains(box) || child.box.intersects(box) {\n                    // child contains at least part of box\n                    values += child.elements(in: box) ?? []\n                }\n                // child does not contain any part of given box\n            }\n        }\n        if values.isEmpty { return nil }\n        return values\n    }\n    \n    private func subdivide(adding element: T, at point: vector_double3) -> OctreeNode? {\n        precondition(self.elements != nil, \"Subdividing while leaf does not contain a element\")\n        precondition(self.point != nil, \"Subdividing while leaf does not contain a point\")\n        switch type {\n        case .leaf:\n            type = .internal(children: Children(parentNode: self))\n            // add element previously contained in leaf to children\n            self.add(self.elements, at: self.point)\n            self.elements = nil\n            self.point = nil\n            // add new element to children\n            return self.add(element, at: point)\n        case .internal:\n            preconditionFailure(\"Calling subdivide on an internal node\")\n        }\n    }\n}\n\npublic class Octree<T: Equatable>: CustomStringConvertible {\n    var root: OctreeNode<T>\n    \n    public var description: String {\n        return \"Octree\\n\" + root.recursiveDescription\n    }\n    \n    public init(boundingBox: Box, minimumCellSize: Double) {\n        root = OctreeNode<T>(box: boundingBox)\n    }\n    \n    @discardableResult\n    public func add(_ element: T, at point: vector_double3) -> OctreeNode<T> {\n        return root.add(element, at: point)\n    }\n    \n    @discardableResult\n    public func remove(_ element: T, using node: OctreeNode<T>) -> Bool {\n        return node.remove(element)\n    }\n    \n    @discardableResult\n    public func remove(_ element: T) -> Bool {\n        return root.remove(element)\n    }\n    \n    public func elements(at point: vector_double3) -> [T]? {\n        return root.elements(at: point)\n    }\n    \n    public func elements(in box: Box) -> [T]? {\n        precondition(root.box.contains(box), \"box is outside of octree bounds\")\n        return root.elements(in: box)\n    }\n}\n"
  },
  {
    "path": "Octree/Octree.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Octree/Octree.playground/timeline.xctimeline",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Timeline\n   version = \"3.0\">\n   <TimelineItems>\n      <LoggerValueHistoryTimelineItem\n         documentLocation = \"file:///Users/jaap/code/swift-algorithm-club/Octree/Octree.playground#CharacterRangeLen=17&amp;CharacterRangeLoc=968&amp;EndingColumnNumber=13&amp;EndingLineNumber=32&amp;StartingColumnNumber=22&amp;StartingLineNumber=31&amp;Timestamp=529255572.908338\"\n         selectedRepresentationIndex = \"0\"\n         shouldTrackSuperviewWidth = \"NO\">\n      </LoggerValueHistoryTimelineItem>\n      <LoggerValueHistoryTimelineItem\n         documentLocation = \"file:///Users/jaap/code/swift-algorithm-club/Octree/Octree.playground#CharacterRangeLen=32&amp;CharacterRangeLoc=455&amp;EndingColumnNumber=0&amp;EndingLineNumber=14&amp;StartingColumnNumber=9&amp;StartingLineNumber=13&amp;Timestamp=529255572.908505\"\n         selectedRepresentationIndex = \"0\"\n         shouldTrackSuperviewWidth = \"NO\">\n      </LoggerValueHistoryTimelineItem>\n   </TimelineItems>\n</Timeline>\n"
  },
  {
    "path": "Octree/README.md",
    "content": "# OcTree\n\nAn octree is a [tree](https://github.com/raywenderlich/swift-algorithm-club/tree/master/Tree) in which each internal (not leaf) node has eight children. Often used for collision detection in games for example.\n\n### Problem\n\nConsider the following problem: your need to store a number of objects in 3D space (each at a certain location with `X`, `Y` and `Z` coordinates) and then you need to answer which objects lie in a certain 3D region. A naive solution would be to store the points inside an array and then iterate over the points and check each one individually. This solution runs in O(n) though.\n\n### A Better Approach\n\nOctrees are most commonly used to partition a three-dimensional space by recursively subdividing it into 8 regions. Let's see how we can use an Octree to store some values.\n\nEach node in the tree represents a box-like region. Leaf nodes store a single point in that region with an array of objects assigned to that point.\n\nOnce an object within the same region (but at a different point) is added the leaf node turns into an internal node and 8 child nodes (leaves) are added to it. All points previously contained in the node are passed to its corresponding children and stored. Thus only leaves contain actual points and values.\n\nTo find the points that lie in a given region we can now traverse the tree from top to bottom and collect the suitable points from nodes.\n\nBoth adding a point and searching can still take up to O(n) in the worst case, since the tree isn't balanced in any way. However, on average it runs significantly faster (something comparable to O(log n)).\n\n### See also\n\nMore info on [Wiki](https://en.wikipedia.org/wiki/Octree)\nApple's implementation of [GKOctree](https://developer.apple.com/documentation/gameplaykit/gkoctree)\n\n*Written for Swift Algorithm Club by Jaap Wijnen*\n*Heavily inspired by Timur Galimov's Quadtree implementation and Apple's GKOctree implementation\n"
  },
  {
    "path": "Ordered Array/OrderedArray.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\n\n\npublic struct OrderedArray<T: Comparable> {\n  fileprivate var array = [T]()\n\n  public init(array: [T]) {\n    self.array = array.sorted()\n  }\n\n  public var isEmpty: Bool {\n    return array.isEmpty\n  }\n\n  public var count: Int {\n    return array.count\n  }\n\n  public subscript(index: Int) -> T {\n    return array[index]\n  }\n\n  public mutating func removeAtIndex(index: Int) -> T {\n    return array.remove(at: index)\n  }\n\n  public mutating func removeAll() {\n    array.removeAll()\n  }\n\n  public mutating func insert(_ newElement: T) -> Int {\n    let i = findInsertionPoint(newElement)\n    array.insert(newElement, at: i)\n    return i\n  }\n\n  /*\n  // Slow version that looks at every element in the array.\n  private func findInsertionPoint(newElement: T) -> Int {\n    for i in 0..<array.count {\n      if newElement <= array[i] {\n        return i\n      }\n    }\n    return array.count\n  }\n  */\n\n  // Fast version that uses a binary search.\n  private func findInsertionPoint(_ newElement: T) -> Int {\n    var startIndex = 0\n    var endIndex = array.count\n\n    while startIndex < endIndex {\n        let midIndex = startIndex + (endIndex - startIndex) / 2\n        if array[midIndex] == newElement {\n            return midIndex\n        } else if array[midIndex] < newElement {\n            startIndex = midIndex + 1\n        } else {\n            endIndex = midIndex\n        }\n    }\n    return startIndex\n  }\n}\n\nextension OrderedArray: CustomStringConvertible {\n  public var description: String {\n    return array.description\n  }\n}\n\nvar a = OrderedArray<Int>(array: [5, 1, 3, 9, 7, -1])\na              // [-1, 1, 3, 5, 7, 9]\n\na.insert(4)    // inserted at index 3\na              // [-1, 1, 3, 4, 5, 7, 9]\n\na.insert(-2)   // inserted at index 0\na.insert(10)   // inserted at index 8\na              // [-2, -1, 1, 3, 4, 5, 7, 9, 10]\n"
  },
  {
    "path": "Ordered Array/OrderedArray.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Ordered Array/OrderedArray.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Ordered Array/OrderedArray.swift",
    "content": "/*\n  An ordered array. When you add a new item to this array, it is inserted in\n  sorted position.\n*/\npublic struct OrderedArray<T: Comparable> {\n  private var array = [T]()\n\n  public init(array: [T]) {\n    self.array = array.sort()\n  }\n\n  public var isEmpty: Bool {\n    return array.isEmpty\n  }\n\n  public var count: Int {\n    return array.count\n  }\n\n  public subscript(index: Int) -> T {\n    return array[index]\n  }\n\n  public mutating func removeAtIndex(index: Int) -> T {\n    return array.removeAtIndex(index)\n  }\n\n  public mutating func removeAll() {\n    array.removeAll()\n  }\n\n  public mutating func insert(newElement: T) -> Int {\n    let i = findInsertionPoint(newElement)\n    array.insert(newElement, atIndex: i)\n    return i\n  }\n\n  private func findInsertionPoint(newElement: T) -> Int {\n    var range = 0..<array.count\n    while range.startIndex < range.endIndex {\n      let midIndex = range.startIndex + (range.endIndex - range.startIndex) / 2\n      if array[midIndex] == newElement {\n        return midIndex\n      } else if array[midIndex] < newElement {\n        range.startIndex = midIndex + 1\n      } else {\n        range.endIndex = midIndex\n      }\n    }\n    return range.startIndex\n  }\n}\n\nextension OrderedArray: CustomStringConvertible {\n  public var description: String {\n    return array.description\n  }\n}\n"
  },
  {
    "path": "Ordered Array/README.markdown",
    "content": "# Ordered Array\n\nThis is an array that is always sorted from low to high. Whenever you add a new item to this array, it is inserted in its sorted position.\n\nAn ordered array is useful for when you want your data to be sorted and you're inserting new items relatively rarely. In that case, it's faster than sorting the entire array. However, if you need to change the array often, it's probably faster to use a regular array and sort it manually.\n\nThe implementation is quite basic. It's simply a wrapper around Swift's built-in array:\n\n```swift\npublic struct OrderedArray<T: Comparable> {\n  fileprivate var array = [T]()\n\n  public init(array: [T]) {\n    self.array = array.sorted()\n  }\n\n  public var isEmpty: Bool {\n    return array.isEmpty\n  }\n\n  public var count: Int {\n    return array.count\n  }\n\n  public subscript(index: Int) -> T {\n    return array[index]\n  }\n\n  public mutating func removeAtIndex(index: Int) -> T {\n    return array.remove(at: index)\n  }\n\n  public mutating func removeAll() {\n    array.removeAll()\n  }\n}\n\nextension OrderedArray: CustomStringConvertible {\n  public var description: String {\n    return array.description\n  }\n}\n```\n\nAs you can see, all these methods simply call the corresponding method on the internal `array` variable.\n\nWhat remains is the `insert()` function. Here is an initial stab at it:\n\n```swift\n  public mutating func insert(_ newElement: T) -> Int {\n    let i = findInsertionPoint(newElement)\n    array.insert(newElement, at: i)\n    return i\n  }\n\n  private func findInsertionPoint(_ newElement: T) -> Int {\n    for i in 0..<array.count {\n      if newElement <= array[i] {\n        return i\n      }\n    }\n    return array.count  // insert at the end\n  }\n```\n\nThe helper function `findInsertionPoint()` simply iterates through the entire array, looking for the right place to insert the new element.\n\n> **Note:** Quite conveniently, `array.insert(... atIndex: array.count)` adds the new object to the end of the array, so if no suitable insertion point was found we can simply return `array.count` as the index.\n\nHere's how you can test it in a playground:\n\n```swift\nvar a = OrderedArray<Int>(array: [5, 1, 3, 9, 7, -1])\na              // [-1, 1, 3, 5, 7, 9]\n\na.insert(4)    // inserted at index 3\na              // [-1, 1, 3, 4, 5, 7, 9]\n\na.insert(-2)   // inserted at index 0\na.insert(10)   // inserted at index 8\na              // [-2, -1, 1, 3, 4, 5, 7, 9, 10]\n```\n\nThe array's contents will always be sorted from low to high, now matter what.\n\nUnfortunately, the current `findInsertionPoint()` function is a bit slow. In the worst case, it needs to scan through the entire array. We can speed this up by using a [binary search](../Binary%20Search) to find the insertion point.\n\nHere is the new version:\n\n```swift\n  private func findInsertionPoint(_ newElement: T) -> Int {\n    var startIndex = 0\n    var endIndex = array.count\n\n    while startIndex < endIndex {\n        let midIndex = startIndex + (endIndex - startIndex) / 2\n        if array[midIndex] == newElement {\n            return midIndex\n        } else if array[midIndex] < newElement {\n            startIndex = midIndex + 1\n        } else {\n            endIndex = midIndex\n        }\n    }\n    return startIndex\n  }\n```\n\nThe big difference with a regular binary search is that this doesn't return `nil` when the value can't be found, but the array index where the element would have been. That's where we insert the new object.\n\nNote that using binary search doesn't change the worst-case running time complexity of `insert()`. The binary search itself takes only **O(log n)** time, but inserting a new object in the middle of an array still involves shifting all remaining elements in memory. So overall, the time complexity is still **O(n)**. But in practice this new version definitely is a lot faster, especially on large arrays.\n\nA more complete and production ready [SortedArray](https://github.com/ole/SortedArray) is avalible from [Ole Begemann](https://github.com/ole). The [accompanying article](https://oleb.net/blog/2017/02/sorted-array/) explains the advantages and tradeoffs.\n\n*Written for Swift Algorithm Club by Matthijs Hollemans*\n"
  },
  {
    "path": "Ordered Set/OrderedSet.playground/Contents.swift",
    "content": "let s = OrderedSet<Int>()\n\ns.add(1)\ns.add(2)\ns.add(-1)\ns.add(0)\ns.insert(4, at: 3)\n\nprint(s.all()) // [1, 2, -1, 4, 0]\n\ns.set(-1, at: 0) // We already have -1 in index: 2, so we will do nothing here\n\nprint(s.all()) // [1, 2, -1, 4, 0]\n\ns.remove(-1)\n\nprint(s.all()) // [1, 2, 4, 0]\n\nprint(s.object(at: 1)) // 2\n\nprint(s.object(at: 2)) // 4\n\n"
  },
  {
    "path": "Ordered Set/OrderedSet.playground/Sources/OrderedSet.swift",
    "content": "public class OrderedSet<T: Hashable> {\n  private var objects: [T] = []\n  private var indexOfKey: [T: Int] = [:]\n  \n  public init() {}\n  \n  // O(1)\n  public func add(_ object: T) {\n    guard indexOfKey[object] == nil else {\n      return\n    }\n    \n    objects.append(object)\n    indexOfKey[object] = objects.count - 1\n  }\n  \n  // O(n)\n  public func insert(_ object: T, at index: Int) {\n    assert(index < objects.count, \"Index should be smaller than object count\")\n    assert(index >= 0, \"Index should be bigger than 0\")\n    \n    guard indexOfKey[object] == nil else {\n      return\n    }\n    \n    objects.insert(object, at: index)\n    indexOfKey[object] = index\n    for i in index+1..<objects.count {\n      indexOfKey[objects[i]] = i\n    }\n  }\n  \n  // O(1)\n  public func object(at index: Int) -> T {\n    assert(index < objects.count, \"Index should be smaller than object count\")\n    assert(index >= 0, \"Index should be bigger than 0\")\n    \n    return objects[index]\n  }\n  \n  // O(1)\n  public func set(_ object: T, at index: Int) {\n    assert(index < objects.count, \"Index should be smaller than object count\")\n    assert(index >= 0, \"Index should be bigger than 0\")\n    \n    guard indexOfKey[object] == nil else {\n      return\n    }\n    \n    indexOfKey.removeValue(forKey: objects[index])\n    indexOfKey[object] = index\n    objects[index] = object\n  }\n  \n  // O(1)\n  public func indexOf(_ object: T) -> Int {\n    return indexOfKey[object] ?? -1\n  }\n  \n  // O(n)\n  public func remove(_ object: T) {\n    guard let index = indexOfKey[object] else {\n      return\n    }\n    \n    indexOfKey.removeValue(forKey: object)\n    objects.remove(at: index)\n    for i in index..<objects.count {\n      indexOfKey[objects[i]] = i\n    }\n  }\n  \n  public func all() -> [T] {\n    return objects\n  }\n}\n"
  },
  {
    "path": "Ordered Set/OrderedSet.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Ordered Set/OrderedSet.swift",
    "content": "public class OrderedSet<T: Hashable> {\n  private var objects: [T] = []\n  private var indexOfKey: [T: Int] = [:]\n  \n  public init() {}\n  \n  // O(1)\n  public func add(_ object: T) {\n    guard indexOfKey[object] == nil else {\n      return\n    }\n    \n    objects.append(object)\n    indexOfKey[object] = objects.count - 1\n  }\n  \n  // O(n)\n  public func insert(_ object: T, at index: Int) {\n    assert(index < objects.count, \"Index should be smaller than object count\")\n    assert(index >= 0, \"Index should be bigger than 0\")\n    \n    guard indexOfKey[object] == nil else {\n      return\n    }\n    \n    objects.insert(object, at: index)\n    indexOfKey[object] = index\n    for i in index+1..<objects.count {\n      indexOfKey[objects[i]] = i\n    }\n  }\n  \n  // O(1)\n  public func object(at index: Int) -> T {\n    assert(index < objects.count, \"Index should be smaller than object count\")\n    assert(index >= 0, \"Index should be bigger than 0\")\n    \n    return objects[index]\n  }\n  \n  // O(1)\n  public func set(_ object: T, at index: Int) {\n    assert(index < objects.count, \"Index should be smaller than object count\")\n    assert(index >= 0, \"Index should be bigger than 0\")\n    \n    guard indexOfKey[object] == nil else {\n      return\n    }\n    \n    indexOfKey.removeValue(forKey: objects[index])\n    indexOfKey[object] = index\n    objects[index] = object\n  }\n  \n  // O(1)\n  public func indexOf(_ object: T) -> Int {\n    return indexOfKey[object] ?? -1\n  }\n  \n  // O(n)\n  public func remove(_ object: T) {\n    guard let index = indexOfKey[object] else {\n      return\n    }\n    \n    indexOfKey.removeValue(forKey: object)\n    objects.remove(at: index)\n    for i in index..<objects.count {\n      indexOfKey[objects[i]] = i\n    }\n  }\n  \n  public func all() -> [T] {\n    return objects\n  }\n}\n\n"
  },
  {
    "path": "Ordered Set/README.markdown",
    "content": "# Ordered Set\n\nLet's look into how to implement [Ordered Set](https://developer.apple.com/documentation/foundation/nsorderedset).\n\nHere is the example about how it works\n\n```swift\nlet s = AppleOrderedSet<Int>()\n\ns.add(1)\ns.add(2)\ns.add(-1)\ns.add(0)\ns.insert(4, at: 3)\n\nprint(s.all()) // [1, 2, -1, 4, 0]\n\ns.set(-1, at: 0) // We already have -1 in index: 2, so we will do nothing here\n\nprint(s.all()) // [1, 2, -1, 4, 0]\n\ns.remove(-1)\n\nprint(s.all()) // [1, 2, 4, 0]\n\nprint(s.object(at: 1)) // 2\n\nprint(s.object(at: 2)) // 4\n```\n\nThe significant difference is the the array is not sorted. The elements in the array are the same when insert them. Image the array without duplicates and with `O(logn)` or `O(1)` search time.\n\nThe idea here is using a data structure to provide `O(1)` or `O(logn)` time complexity, so it's easy to think about hash table.\n\n```swift\nvar indexOfKey: [T: Int]\nvar objects: [T]\n```\n\n`indexOfKey` is used to track the index of the element. `objects` is array holding elements.\n\nWe will go through some key functions details here.\n\n### Add\n\nUpdate `indexOfKey` and insert element in the end of `objects`\n\n```swift\n// O(1)\npublic func add(_ object: T) {\n\tguard indexOfKey[object] == nil else {\n\t\treturn\n\t}\n\n\tobjects.append(object)\n\tindexOfKey[object] = objects.count - 1\n}\n```\n\n### Insert\n\nInsert in a random place of the array will cost `O(n)` time.\n\n```swift\n// O(n)\npublic func insert(_ object: T, at index: Int) {\n\tassert(index < objects.count, \"Index should be smaller than object count\")\n\tassert(index >= 0, \"Index should be bigger than 0\")\n\n\tguard indexOfKey[object] == nil else {\n\t\treturn\n\t}\n\n\tobjects.insert(object, at: index)\n\tindexOfKey[object] = index\n\tfor i in index+1..<objects.count {\n\t\tindexOfKey[objects[i]] = i\n\t}\n}\n```\n\n###  Set\n\nIf the `object` already existed in the `OrderedSet`, do nothing. Otherwise, we need to update the `indexOfkey` and `objects`.\n\n```swift\n// O(1)\npublic func set(_ object: T, at index: Int) {\n\tassert(index < objects.count, \"Index should be smaller than object count\")\n\tassert(index >= 0, \"Index should be bigger than 0\")\n\n\tguard indexOfKey[object] == nil else {\n\t\treturn\n\t}\n\n\tindexOfKey.removeValue(forKey: objects[index])\n\tindexOfKey[object] = index\n\tobjects[index] = object\n}\n```\n\n### Remove\n\nRemove element in the array will cost `O(n)`. At the same time, we need to update all elements's index after the removed element.\n\n```swift\n// O(n)\npublic func remove(_ object: T) {\n\tguard let index = indexOfKey[object] else {\n\t\treturn \n\t}\n\n\tindexOfKey.removeValue(forKey: object)\n\tobjects.remove(at: index)\n\tfor i in index..<objects.count {\n\t\tindexOfKey[objects[i]] = i\n\t}\n}\n```\n\n*Written By Kai Chen*\n"
  },
  {
    "path": "Palindromes/Palindromes.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\nimport Foundation\n\n// true\nisPalindrome(\"A man, a plan, a canal, Panama!\")\nisPalindrome(\"abbcbba\")\nisPalindrome(\"racecar\")\nisPalindrome(\"Madam, I'm Adam\")\nisPalindrome(\"Madam in Eden, I'm Adam\")\nisPalindrome(\"Never odd or even\")\nisPalindrome(\"5885\")\nisPalindrome(\"5 8 8 5\")\nisPalindrome(\"58 85\")\nisPalindrome(\"৯৯\")\nisPalindrome(\"In girum imus nocte et consumimur igni\")\n\n// false\nisPalindrome(\"\\\\\\\\\")\nisPalindrome(\"desserts\")\nisPalindrome(\"😀😀\")\nisPalindrome(\"\")\nisPalindrome(\"a\")\nisPalindrome(\"power\")\n"
  },
  {
    "path": "Palindromes/Palindromes.playground/Sources/Palindrome.swift",
    "content": "import Foundation\n\n/**\n Validate that a string is a plaindrome\n - parameter str: The string to validate\n - returns: `true` if string is plaindrome, `false` if string is not\n */\npublic func isPalindrome(_ str: String) -> Bool {\n    let strippedString = str.replacingOccurrences(of: \"\\\\W\", with: \"\", options: .regularExpression, range: nil)\n    let length = strippedString.count\n    \n    if length > 1 {\n        return palindrome(strippedString.lowercased(), left: 0, right: length - 1)\n    }\n    return false\n}\n\n/**\n Compares a strings left side character against right side character following\n - parameter str: The string to compare characters of\n - parameter left: Index of left side to compare, must be less than or equal to right\n - parameter right: Index of right side to compare, must be greater than or equal to left\n - returns: `true` if left side and right side have all been compared and they all match, `false` if a left and right aren't equal\n */\nprivate func palindrome(_ str: String, left: Int, right: Int) -> Bool {\n    if left >= right {\n        return true\n    }\n    \n    let lhs = str[str.index(str.startIndex, offsetBy: left)]\n    let rhs = str[str.index(str.startIndex, offsetBy: right)]\n    \n    if lhs != rhs {\n        return false\n    }\n    \n    return palindrome(str, left: left + 1, right: right - 1)\n}\n"
  },
  {
    "path": "Palindromes/Palindromes.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Palindromes/Palindromes.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Palindromes/Palindromes.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Palindromes/README.markdown",
    "content": "# Palindromes\n\nA palindrome is a word or phrase that is spelled the exact same when reading it forwards or backward. Palindromes are allowed to be lowercase or uppercase, contain spaces, punctuation, and word dividers.\n\nAlgorithms that check for palindromes are a common programming interview question. \n\n## Example \n\nThe word racecar is a valid palindrome, as it is a word spelled the same when backgrounds and forwards. The examples below shows valid cases of the palindrome `racecar`.\n\n```\nraceCar\nr a c e c a r\nr?a?c?e?c?a?r?\nRACEcar\n```\n\n## Algorithm \n\nTo check for palindromes, a string's characters are compared starting from the beginning and end then moving inward toward the middle of the string while maintaining the same distance apart. In this implementation of a palindrome algorithm, recursion is used to check each of the characters on the left-hand side and right-hand side moving inward.\n\n## The code \n\nHere is a recursive implementation of this in Swift: \n\n```swift\nfunc isPalindrome(_ str: String) -> Bool {\n  let strippedString = str.replacingOccurrences(of: \"\\\\W\", with: \"\", options: .regularExpression, range: nil)\n  let length = strippedString.count\n\n  if length > 1 {\n    return palindrome(strippedString.lowercased(), left: 0, right: length - 1)\n  }\n\n  return false\n}\n\nprivate func palindrome(_ str: String, left: Int, right: Int) -> Bool {\n  if left >= right {\n    return true\n  }\n\n  let lhs = str[str.index(str.startIndex, offsetBy: left)]\n  let rhs = str[str.index(str.startIndex, offsetBy: right)]\n\n  if lhs != rhs {\n    return false\n  }\n\n  return palindrome(str, left: left + 1, right: right - 1)\n}\n```\n\nThis algorithm has a two-step process.\n\n1. The first step is to pass the string to validate as a palindrome into the `isPalindrome` method. This method first removes occurrences of non-word pattern matches `\\W` [Regex reference](http://regexr.com). It is written with two \\\\ to escape the \\ in the String literal. \n\n```swift\nlet strippedString = str.replacingOccurrences(of: \"\\\\W\", with: \"\", options: .regularExpression, range: nil)\n```\n\nThe length of the string is then checked to make sure that the string after being stripped of non-word characters is still in a valid length. It is then passed into the next step after being lowercased.\n\n2. The second step is to pass the string in a recursive method. This method takes a string, a left index, and a right index. The method checks the characters of the string using the indexes to compare each character on both sides. The method checks if the left is greater or equal to the right if so the entire string has been run through without returning false so the string is equal on both sides thus returning true. \n```swift\nif left >= right {\n  return true\n}\n```\nIf the check doesn't pass it continues to get the characters at the specified indexes and compare each. If they are not the same the method returns false and exits. \n```swift\nlet lhs = str[str.index(str.startIndex, offsetBy: left)]\nlet rhs = str[str.index(str.startIndex, offsetBy: right)]\n\nif lhs != rhs {\n  return false\n}\n```\nIf they are the same the method calls itself again and updates the indexes accordingly to continue to check the rest of the string. \n```swift\nreturn palindrome(str, left: left + 1, right: right - 1)\n```\n\nStep 1:\n`race?C ar -> raceCar -> racecar`\n\nStep 2:\n```\n|     |\nracecar -> r == r\n\n |   |\nracecar -> a == a\n\n  | |\nracecar -> c == c\n\n   |\nracecar -> left index == right index -> return true\n```\n\n## Additional Resources\n\n[Palindrome Wikipedia](https://en.wikipedia.org/wiki/Palindrome)\n\n\n*Written by [Joshua Alvarado](https://github.com/lostatseajoshua)*\n"
  },
  {
    "path": "Palindromes/Test/Palindrome.swift",
    "content": "import Foundation\n\nfunc isPalindrome(_ str: String) -> Bool {\n    let strippedString = str.replacingOccurrences(of: \"\\\\W\", with: \"\", options: .regularExpression, range: nil)\n    let length = strippedString.count\n\n    if length > 1 {\n        return palindrome(strippedString.lowercased(), left: 0, right: length - 1)\n    }\n    return false\n}\n\nprivate func palindrome(_ str: String, left: Int, right: Int) -> Bool {\n    if left >= right {\n        return true\n    }\n\n    let lhs = str[str.index(str.startIndex, offsetBy: left)]\n    let rhs = str[str.index(str.startIndex, offsetBy: right)]\n\n    if lhs != rhs {\n        return false\n    }\n\n    return palindrome(str, left: left + 1, right: right - 1)\n}\n"
  },
  {
    "path": "Palindromes/Test/Test/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Palindromes/Test/Test/Test.swift",
    "content": "//\n//  PalindromeTests.swift\n//  Test\n//\n//  Created by Joshua Alvarado on 12/23/16.\n//  Copyright © 2016 Joshua Alvarado. All rights reserved.\n//\n\nimport XCTest\n\nclass PalindromeTests: XCTestCase {\n\n    override func setUp() {\n        super.setUp()\n        // Put setup code here. This method is called before the invocation of each test method in the class.\n    }\n\n    override func tearDown() {\n        // Put teardown code here. This method is called after the invocation of each test method in the class.\n        super.tearDown()\n    }\n\n    func testExample() {\n        // This is an example of a functional test case.\n        // Use XCTAssert and related functions to verify your tests produce the correct results.\n    }\n\n    func testPerformanceExample() {\n        // This is an example of a performance test case.\n        self.measure {\n            // Put the code you want to measure the time of here.\n            _ = isPalindrome(\"abbcbba\")\n            _ = isPalindrome(\"asdkfaksjdfasjkdfhaslkjdfakjsdfhakljsdhflkjasdfhkasdjhfklajsdfhkljasdf\")\n            _ = isPalindrome(\"abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababa\")\n        }\n    }\n\n    func testPalindromeWord() {\n        XCTAssertTrue(isPalindrome(\"abbcbba\"))\n        XCTAssertTrue(isPalindrome(\"racecar\"))\n    }\n\n    func testPalindromeSentence() {\n        XCTAssertTrue(isPalindrome(\"A man, a plan, a canal, Panama!\"))\n        XCTAssertTrue(isPalindrome(\"Madam, I'm Adam\"))\n        XCTAssertTrue(isPalindrome(\"Madam in Eden, I'm Adam\"))\n        XCTAssertTrue(isPalindrome(\"In girum imus nocte et consumimur igni\"))\n        XCTAssertTrue(isPalindrome(\"Never odd or even\"))\n    }\n\n    func testPalindromeNumber() {\n        XCTAssertTrue(isPalindrome(\"5885\"))\n        XCTAssertTrue(isPalindrome(\"5 8 8 5\"))\n        XCTAssertTrue(isPalindrome(\"58 85\"))\n    }\n\n    func testSpecialCharacters() {\n        XCTAssertTrue(isPalindrome(\"৯৯\"))\n    }\n\n    func testNonPalindromes() {\n        XCTAssertFalse(isPalindrome(\"\\\\\\\\\"))\n        XCTAssertFalse(isPalindrome(\"desserts\"))\n        XCTAssertFalse(isPalindrome(\"😀😀\"))\n        XCTAssertFalse(isPalindrome(\"\"))\n        XCTAssertFalse(isPalindrome(\"a\"))\n        XCTAssertFalse(isPalindrome(\"power\"))\n    }\n}\n"
  },
  {
    "path": "Palindromes/Test/Test.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t9437D8841E0D960A00A38FB8 /* Test.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9437D8831E0D960A00A38FB8 /* Test.swift */; };\n\t\t9437D88B1E0D969500A38FB8 /* Palindrome.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9437D8791E0D948A00A38FB8 /* Palindrome.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t9437D8791E0D948A00A38FB8 /* Palindrome.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Palindrome.swift; sourceTree = \"<group>\"; };\n\t\t9437D8811E0D960A00A38FB8 /* Test.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Test.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t9437D8831E0D960A00A38FB8 /* Test.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Test.swift; sourceTree = \"<group>\"; };\n\t\t9437D8851E0D960A00A38FB8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t9437D87E1E0D960A00A38FB8 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t9437D8651E0D945200A38FB8 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9437D8791E0D948A00A38FB8 /* Palindrome.swift */,\n\t\t\t\t9437D8821E0D960A00A38FB8 /* Test */,\n\t\t\t\t9437D86F1E0D945200A38FB8 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9437D86F1E0D945200A38FB8 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9437D8811E0D960A00A38FB8 /* Test.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t9437D8821E0D960A00A38FB8 /* Test */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t9437D8831E0D960A00A38FB8 /* Test.swift */,\n\t\t\t\t9437D8851E0D960A00A38FB8 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = Test;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t9437D8801E0D960A00A38FB8 /* Test */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 9437D8861E0D960A00A38FB8 /* Build configuration list for PBXNativeTarget \"Test\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t9437D87D1E0D960A00A38FB8 /* Sources */,\n\t\t\t\t9437D87E1E0D960A00A38FB8 /* Frameworks */,\n\t\t\t\t9437D87F1E0D960A00A38FB8 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Test;\n\t\t\tproductName = Test;\n\t\t\tproductReference = 9437D8811E0D960A00A38FB8 /* Test.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t9437D8661E0D945200A38FB8 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0820;\n\t\t\t\tLastUpgradeCheck = 1000;\n\t\t\t\tORGANIZATIONNAME = \"Joshua Alvarado\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t9437D8801E0D960A00A38FB8 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.2;\n\t\t\t\t\t\tLastSwiftMigration = 1000;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 9437D8691E0D945200A38FB8 /* Build configuration list for PBXProject \"Test\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t);\n\t\t\tmainGroup = 9437D8651E0D945200A38FB8;\n\t\t\tproductRefGroup = 9437D86F1E0D945200A38FB8 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t9437D8801E0D960A00A38FB8 /* Test */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t9437D87F1E0D960A00A38FB8 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t9437D87D1E0D960A00A38FB8 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t9437D88B1E0D969500A38FB8 /* Palindrome.swift in Sources */,\n\t\t\t\t9437D8841E0D960A00A38FB8 /* Test.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t9437D8721E0D945200A38FB8 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t9437D8731E0D945200A38FB8 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t9437D8871E0D960A00A38FB8 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Test/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = self.edu.Test;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Default;\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t9437D8881E0D960A00A38FB8 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Test/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = self.edu.Test;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Default;\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t9437D8691E0D945200A38FB8 /* Build configuration list for PBXProject \"Test\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t9437D8721E0D945200A38FB8 /* Debug */,\n\t\t\t\t9437D8731E0D945200A38FB8 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t9437D8861E0D960A00A38FB8 /* Build configuration list for PBXNativeTarget \"Test\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t9437D8871E0D960A00A38FB8 /* Debug */,\n\t\t\t\t9437D8881E0D960A00A38FB8 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 9437D8661E0D945200A38FB8 /* Project object */;\n}\n"
  },
  {
    "path": "Palindromes/Test/Test.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Test.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Palindromes/Test/Test.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Palindromes/Test/Test.xcodeproj/xcshareddata/xcschemes/Test.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1000\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"9437D8801E0D960A00A38FB8\"\n               BuildableName = \"Test.xctest\"\n               BlueprintName = \"Test\"\n               ReferencedContainer = \"container:Test.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"9437D8801E0D960A00A38FB8\"\n               BuildableName = \"Test.xctest\"\n               BlueprintName = \"Test\"\n               ReferencedContainer = \"container:Test.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"9437D8801E0D960A00A38FB8\"\n            BuildableName = \"Test.xctest\"\n            BlueprintName = \"Test\"\n            ReferencedContainer = \"container:Test.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"9437D8801E0D960A00A38FB8\"\n            BuildableName = \"Test.xctest\"\n            BlueprintName = \"Test\"\n            ReferencedContainer = \"container:Test.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"9437D8801E0D960A00A38FB8\"\n            BuildableName = \"Test.xctest\"\n            BlueprintName = \"Test\"\n            ReferencedContainer = \"container:Test.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Points Lines Planes/Points Lines Planes/2D/Line2D.swift",
    "content": "//\n//  Line2D.swift\n//  Points Lines Planes\n//\n//  Created by Jaap Wijnen on 24-10-17.\n//\n\nstruct Line2D: Equatable {\n    \n    var slope: Slope\n    var offset: Double\n    var direction: Direction\n    \n    enum Slope: Equatable {\n        case finite(slope: Double)\n        case infinite(offset: Double)\n    }\n    \n    enum Direction: Equatable {\n        case increasing\n        case decreasing\n    }\n    \n    init(from p1: Point2D, to p2: Point2D) {\n        if p1 == p2 { fatalError(\"Points can not be equal when creating a line between them\") }\n        if p1.x == p2.x {\n            self.slope = .infinite(offset: p1.x)\n            self.offset = 0\n            self.direction = p1.y < p2.y ? .increasing : .decreasing\n            \n            return\n        }\n        \n        let slope = (p1.y - p2.y)/(p1.x - p2.x)\n        self.slope = .finite(slope: slope)\n        offset = (p1.y + p2.y - slope * (p1.x + p2.x))/2\n        if slope >= 0 {\n            // so a horizontal line going left to right is called increasing\n            self.direction = p1.x < p2.x ? .increasing : .decreasing\n        } else {\n            self.direction = p1.x < p2.x ? .decreasing : .increasing\n        }\n    }\n    \n    fileprivate init(slope: Slope, offset: Double, direction: Direction) {\n        self.slope = slope\n        self.offset = offset\n        self.direction = direction\n    }\n    \n    // returns y coordinate on line for given x\n    func y(at x: Double) -> Double {\n        switch self.slope {\n        case .finite(let slope):\n            return slope * x + self.offset\n        case .infinite:\n            fatalError(\"y can be anywhere on vertical line\")\n        }\n    }\n    \n    // returns x coordinate on line for given y\n    func x(at y: Double) -> Double {\n        switch self.slope {\n        case .finite(let slope):\n            if slope == 0 {\n                fatalError(\"x can be anywhere on horizontal line\")\n            }\n            return (y - self.offset)/slope\n        case .infinite(let offset):\n            return offset\n        }\n    }\n    \n    // finds intersection point between two lines. returns nil when lines don't intersect or lie on top of each other.\n    func intersect(with line: Line2D) -> Point2D? {\n        if self == line { return nil }\n        switch (self.slope, line.slope) {\n        case (.infinite, .infinite):\n            // lines are either parallel or on top of each other.\n            return nil\n        case (.finite(let slope1), .finite(let slope2)):\n            if slope1 == slope2 { return nil } // lines are parallel\n            // lines are not parallel calculate intersection point\n            let x = (line.offset - self.offset)/(slope1 - slope2)\n            let y = (slope1 + slope2) * x + self.offset + line.offset\n            return Point2D(x: x, y: y)\n        case (.infinite(let offset), .finite):\n            // one line is vertical so we only check what y value the other line has at that point\n            let x = offset\n            let y = line.y(at: x)\n            return Point2D(x: x, y: y)\n        case (.finite, .infinite(let offset)):\n            // one line is vertical so we only check what y value the other line has at that point\n            // lines are switched with respect to case above this one\n            let x = offset\n            let y = self.y(at: x)\n            return Point2D(x: x, y: y)\n        }\n    }\n    \n    // returns a line perpendicular to self at the given y coordinate\n    // direction of perpendicular lines always changes clockwise\n    func perpendicularLineAt(y: Double) -> Line2D {\n        return perpendicularLineAt(p: Point2D(x: self.x(at: y), y: y))\n    }\n    \n    // returns a line perpendicular to self at the given x coordinate\n    // direction of perpendicular lines always changes clockwise\n    func perpendicularLineAt(x: Double) -> Line2D {\n        return perpendicularLineAt(p: Point2D(x: x, y: self.y(at: x)))\n    }\n    \n    private func perpendicularLineAt(p: Point2D) -> Line2D {\n        switch self.slope {\n        case .finite(let slope):\n            if slope == 0 {\n                // line is horizontal so new line will be vertical\n                let dir: Direction = self.direction == .increasing ? .decreasing : .increasing\n                return Line2D(slope: .infinite(offset: p.x), offset: 0, direction: dir)\n            }\n            \n            // line is neither horizontal nor vertical\n            // we make a new line through the point p with new slope -1/slope\n            let offset = (slope + 1/slope)*p.x + self.offset\n            \n            // determine direction of new line based on direction of the old line and its slope\n            let dir: Direction\n            switch self.direction {\n            case .increasing:\n                dir = slope > 0 ? .decreasing : .increasing\n            case .decreasing:\n                dir = slope > 0 ? .increasing : .decreasing\n            }\n            return Line2D(slope: .finite(slope: -1/slope), offset: offset, direction: dir)\n        case .infinite:\n            // line is vertical so new line will be horizontal\n            let dir: Direction = self.direction == .increasing ? .increasing : .decreasing\n            return Line2D(slope: .finite(slope: 0), offset: p.y, direction: dir)\n        }\n    }\n}\n"
  },
  {
    "path": "Points Lines Planes/Points Lines Planes/2D/Point2D.swift",
    "content": "//\n//  Point2D.swift\n//  Points Lines Planes\n//\n//  Created by Jaap Wijnen on 24-10-17.\n//\n\nstruct Point2D: Equatable {\n    var x: Double\n    var y: Double\n    \n    // returns true if point is on or right of line\n    func isRight(of line: Line2D) -> Bool {\n        switch line.slope {\n        case .finite:\n            let y = line.y(at: self.x)\n            switch line.direction {\n            case .increasing:\n                return y >= self.y\n            case .decreasing:\n                return y <= self.y\n            }\n        case .infinite(let offset):\n            switch line.direction {\n            case .increasing:\n                return self.x >= offset\n            case .decreasing:\n                return self.x <= offset\n            }\n        }\n    }\n    \n    func isLeft(of line: Line2D) -> Bool {\n        return !self.isRight(of: line)\n    }\n}\n"
  },
  {
    "path": "Points Lines Planes/Points Lines Planes/main.swift",
    "content": "//\n//  main.swift\n//  Points Lines Planes\n//\n//  Created by Jaap Wijnen on 23-10-17.\n//\n\nlet p0 = Point2D(x: 0, y: 2)\nlet p1 = Point2D(x: 1, y: 1)\nlet p2 = Point2D(x: 1, y: 3)\nlet p3 = Point2D(x: 3, y: 1)\nlet p4 = Point2D(x: 3, y: 3)\n\nlet horLine = Line2D(from: p1, to: p3)\nlet verLine = Line2D(from: p1, to: p2)\nlet line45 = Line2D(from: p1, to: p4)\n\nprint(horLine.intersect(with: verLine))\nprint(p0.isRight(of: line45))\nprint(p0.isRight(of: horLine))\nprint(p0.isRight(of: verLine))\nlet lineperp = horLine.perpendicularLineAt(x: 2)\nprint(lineperp)\n\n"
  },
  {
    "path": "Points Lines Planes/Points Lines Planes.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 48;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t8EA8A3BB1F9F7B6300FD8BC0 /* Point2D.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8EA8A3BA1F9F7B6300FD8BC0 /* Point2D.swift */; };\n\t\t8EA8A3BD1F9F7B7100FD8BC0 /* Line2D.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8EA8A3BC1F9F7B7100FD8BC0 /* Line2D.swift */; };\n\t\t8EF612481F9E00E000267358 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8EF612471F9E00E000267358 /* main.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t8EF612421F9E00E000267358 /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = /usr/share/man/man1/;\n\t\t\tdstSubfolderSpec = 0;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 1;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t8EA8A3BA1F9F7B6300FD8BC0 /* Point2D.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Point2D.swift; sourceTree = \"<group>\"; };\n\t\t8EA8A3BC1F9F7B7100FD8BC0 /* Line2D.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Line2D.swift; sourceTree = \"<group>\"; };\n\t\t8EF612441F9E00E000267358 /* Points Lines Planes */ = {isa = PBXFileReference; explicitFileType = \"compiled.mach-o.executable\"; includeInIndex = 0; path = \"Points Lines Planes\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t8EF612471F9E00E000267358 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t8EF612411F9E00E000267358 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t8EA8A3C21F9F7C9000FD8BC0 /* 2D */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8EA8A3BA1F9F7B6300FD8BC0 /* Point2D.swift */,\n\t\t\t\t8EA8A3BC1F9F7B7100FD8BC0 /* Line2D.swift */,\n\t\t\t);\n\t\t\tpath = 2D;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t8EF6123B1F9E00DF00267358 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8EF612461F9E00E000267358 /* Points Lines Planes */,\n\t\t\t\t8EF612451F9E00E000267358 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t8EF612451F9E00E000267358 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8EF612441F9E00E000267358 /* Points Lines Planes */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t8EF612461F9E00E000267358 /* Points Lines Planes */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t8EF612471F9E00E000267358 /* main.swift */,\n\t\t\t\t8EA8A3C21F9F7C9000FD8BC0 /* 2D */,\n\t\t\t);\n\t\t\tpath = \"Points Lines Planes\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t8EF612431F9E00E000267358 /* Points Lines Planes */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 8EF6124B1F9E00E000267358 /* Build configuration list for PBXNativeTarget \"Points Lines Planes\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t8EF612401F9E00E000267358 /* Sources */,\n\t\t\t\t8EF612411F9E00E000267358 /* Frameworks */,\n\t\t\t\t8EF612421F9E00E000267358 /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"Points Lines Planes\";\n\t\t\tproductName = \"Points Lines Planes\";\n\t\t\tproductReference = 8EF612441F9E00E000267358 /* Points Lines Planes */;\n\t\t\tproductType = \"com.apple.product-type.tool\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t8EF6123C1F9E00DF00267358 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0900;\n\t\t\t\tLastUpgradeCheck = 0900;\n\t\t\t\tORGANIZATIONNAME = Workmoose;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t8EF612431F9E00E000267358 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 9.0.1;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 8EF6123F1F9E00DF00267358 /* Build configuration list for PBXProject \"Points Lines Planes\" */;\n\t\t\tcompatibilityVersion = \"Xcode 8.0\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t);\n\t\t\tmainGroup = 8EF6123B1F9E00DF00267358;\n\t\t\tproductRefGroup = 8EF612451F9E00E000267358 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t8EF612431F9E00E000267358 /* Points Lines Planes */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t8EF612401F9E00E000267358 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8EA8A3BB1F9F7B6300FD8BC0 /* Point2D.swift in Sources */,\n\t\t\t\t8EF612481F9E00E000267358 /* main.swift in Sources */,\n\t\t\t\t8EA8A3BD1F9F7B7100FD8BC0 /* Line2D.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t8EF612491F9E00E000267358 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"Mac Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.13;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t8EF6124A1F9E00E000267358 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"Mac Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.13;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t8EF6124C1F9E00E000267358 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = 7C4LVS3ZVC;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t8EF6124D1F9E00E000267358 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = 7C4LVS3ZVC;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t8EF6123F1F9E00DF00267358 /* Build configuration list for PBXProject \"Points Lines Planes\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t8EF612491F9E00E000267358 /* Debug */,\n\t\t\t\t8EF6124A1F9E00E000267358 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t8EF6124B1F9E00E000267358 /* Build configuration list for PBXNativeTarget \"Points Lines Planes\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t8EF6124C1F9E00E000267358 /* Debug */,\n\t\t\t\t8EF6124D1F9E00E000267358 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 8EF6123C1F9E00DF00267358 /* Project object */;\n}\n"
  },
  {
    "path": "Points Lines Planes/Points Lines Planes.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Points Lines Planes.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Points Lines Planes/README.md",
    "content": "# Points Lines (Planes)\nThis implements data structures for points lines and planes(not yet) in (for now) 2D space and a few functions to play around with them. This was originally written to improve on the Convex Hull algorithm but I thought it might be a nice addition in itself. Im planning to add 3D implementations as well.\n\n# implementation\nTwo `struct`s are implemented the `Point2D` and `Line2D`.\n\n```\nstruct Point2D: {\n  var x: Double\n  var y: double\n}\n```\n\n```\nstruct Line2D {\n  var slope: Slope\n  var offset: Double\n  var direction: Direction\n}\n```\nHere `Slope` is an enum to account for vertical lines.\nslope is infinite for vertical lines, offset is the x coordinate where the line crosses the line `y=0`.\nslope is finite for any other line and contains a double with the actual value of the slope.\n```\nenum Slope {\n  case finite(slope: Double)\n  case infinite(offset: Double)\n}\n```\n`Line2D` also contains a `Direction` enum. This is introduced in order to make lines directional in order to be able to determine what is left and right of a certain line. It is `.increasing` if the line points in positive y direction and `.decreasing` if it points in the negative y direction.\n\n`Line2D`'s offset is the the y-coordinate where the line crosses the vertical `x=0` line.\n\n*Written for the Swift Algorithm Club by Jaap Wijnen.*\n"
  },
  {
    "path": "Priority Queue/PriorityQueue.swift",
    "content": "/*\n  Priority Queue, a queue where the most \"important\" items are at the front of\n  the queue.\n\n  The heap is a natural data structure for a priority queue, so this object\n  simply wraps the Heap struct.\n\n  All operations are O(lg n).\n\n  Just like a heap can be a max-heap or min-heap, the queue can be a max-priority\n  queue (largest element first) or a min-priority queue (smallest element first).\n*/\npublic struct PriorityQueue<T> {\n  fileprivate var heap: Heap<T>\n\n  /*\n    To create a max-priority queue, supply a > sort function. For a min-priority\n    queue, use <.\n  */\n  public init(sort: @escaping (T, T) -> Bool) {\n    heap = Heap(sort: sort)\n  }\n\n  public var isEmpty: Bool {\n    return heap.isEmpty\n  }\n\n  public var count: Int {\n    return heap.count\n  }\n\n  public func peek() -> T? {\n    return heap.peek()\n  }\n\n  public mutating func enqueue(_ element: T) {\n    heap.insert(element)\n  }\n\n  public mutating func dequeue() -> T? {\n    return heap.remove()\n  }\n\n  /*\n    Allows you to change the priority of an element. In a max-priority queue,\n    the new priority should be larger than the old one; in a min-priority queue\n    it should be smaller.\n  */\n  public mutating func changePriority(index i: Int, value: T) {\n    return heap.replace(index: i, value: value)\n  }\n}\n\nextension PriorityQueue where T: Equatable {\n  public func index(of element: T) -> Int? {\n    return heap.index(of: element)\n  }\n}\n"
  },
  {
    "path": "Priority Queue/README.markdown",
    "content": "# Priority Queue\n\nA priority queue is a [queue](../Queue/) where the most important element is always at the front.\n\nThe queue can be a *max-priority* queue (largest element first) or a *min-priority* queue (smallest element first).\n\n## Why use a priority queue?\n\nPriority queues are useful for algorithms that need to process a (large) number of items and where you repeatedly need to identify which one is now the biggest or smallest -- or however you define \"most important\".\n\nExamples of algorithms that can benefit from a priority queue:\n\n- Event-driven simulations. Each event is given a timestamp and you want events to be performed in order of their timestamps. The priority queue makes it easy to find the next event that needs to be simulated.\n- Dijkstra's algorithm for graph searching uses a priority queue to calculate the minimum cost.\n- [Huffman coding](../Huffman%20Coding/) for data compression. This algorithm builds up a compression tree. It repeatedly needs to find the two nodes with the smallest frequencies that do not have a parent node yet.\n- A* pathfinding for artificial intelligence.\n- Lots of other places!\n\nWith a regular queue or plain old array you'd need to scan the entire sequence over and over to find the next largest item. A priority queue is optimized for this sort of thing.\n\n## What can you do with a priority queue?\n\nCommon operations on a priority queue:\n\n- **Enqueue**: inserts a new element into the queue.\n- **Dequeue**: removes and returns the queue's most important element.\n- **Find Minimum** or **Find Maximum**: returns the most important element but does not remove it.\n- **Change Priority**: for when your algorithm decides that an element has become more important while it's already in the queue.\n\n## How to implement a priority queue\n\nThere are different ways to implement priority queues:\n\n- As a [sorted array](../Ordered%20Array/). The most important item is at the end of the array. Downside: inserting new items is slow because they must be inserted in sorted order.\n- As a balanced [binary search tree](../Binary%20Search%20Tree/). This is great for making a double-ended priority queue because it implements both \"find minimum\" and \"find maximum\" efficiently.\n- As a [heap](../Heap/). The heap is a natural data structure for a priority queue. In fact, the two terms are often used as synonyms. A heap is more efficient than a sorted array because a heap only has to be partially sorted. All heap operations are **O(log n)**.\n\nHere's a Swift priority queue based on a heap:\n\n```swift\npublic struct PriorityQueue<T> {\n  fileprivate var heap: Heap<T>\n\n  public init(sort: (T, T) -> Bool) {\n    heap = Heap(sort: sort)\n  }\n\n  public var isEmpty: Bool {\n    return heap.isEmpty\n  }\n\n  public var count: Int {\n    return heap.count\n  }\n\n  public func peek() -> T? {\n    return heap.peek()\n  }\n\n  public mutating func enqueue(element: T) {\n    heap.insert(element)\n  }\n\n  public mutating func dequeue() -> T? {\n    return heap.remove()\n  }\n\n  public mutating func changePriority(index i: Int, value: T) {\n    return heap.replace(index: i, value: value)\n  }\n}\n```\n\nAs you can see, there's nothing much to it. Making a priority queue is easy if you have a [heap](../Heap/) because a heap *is* pretty much a priority queue.\n\n## See also\n\n[Priority Queue on Wikipedia](https://en.wikipedia.org/wiki/Priority_queue)\n\n*Written for Swift Algorithm Club by Matthijs Hollemans*\n"
  },
  {
    "path": "Priority Queue/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Priority Queue/Tests/PriorityQueueTests.swift",
    "content": "import Foundation\nimport XCTest\n\nprivate struct Message {\n  let text: String\n  let priority: Int\n}\n\nprivate func < (m1: Message, m2: Message) -> Bool {\n  return m1.priority < m2.priority\n}\n\nclass PriorityQueueTest: XCTestCase {\n  func testSwift4() {\n    // last checked with Xcode 9.0b4\n    #if swift(>=4.0)\n      print(\"Hello, Swift 4!\")\n    #endif\n  }\n  \n  func testEmpty() {\n    var queue = PriorityQueue<Message>(sort: <)\n    XCTAssertTrue(queue.isEmpty)\n    XCTAssertEqual(queue.count, 0)\n    XCTAssertNil(queue.peek())\n    XCTAssertNil(queue.dequeue())\n  }\n\n  func testOneElement() {\n    var queue = PriorityQueue<Message>(sort: <)\n\n    queue.enqueue(Message(text: \"hello\", priority: 100))\n    XCTAssertFalse(queue.isEmpty)\n    XCTAssertEqual(queue.count, 1)\n    XCTAssertEqual(queue.peek()!.priority, 100)\n\n    let result = queue.dequeue()\n    XCTAssertEqual(result!.priority, 100)\n    XCTAssertTrue(queue.isEmpty)\n    XCTAssertEqual(queue.count, 0)\n    XCTAssertNil(queue.peek())\n  }\n\n  func testTwoElementsInOrder() {\n    var queue = PriorityQueue<Message>(sort: <)\n\n    queue.enqueue(Message(text: \"hello\", priority: 100))\n    queue.enqueue(Message(text: \"world\", priority: 200))\n    XCTAssertFalse(queue.isEmpty)\n    XCTAssertEqual(queue.count, 2)\n    XCTAssertEqual(queue.peek()!.priority, 100)\n\n    let result1 = queue.dequeue()\n    XCTAssertEqual(result1!.priority, 100)\n    XCTAssertFalse(queue.isEmpty)\n    XCTAssertEqual(queue.count, 1)\n    XCTAssertEqual(queue.peek()!.priority, 200)\n\n    let result2 = queue.dequeue()\n    XCTAssertEqual(result2!.priority, 200)\n    XCTAssertTrue(queue.isEmpty)\n    XCTAssertEqual(queue.count, 0)\n    XCTAssertNil(queue.peek())\n  }\n\n  func testTwoElementsOutOfOrder() {\n    var queue = PriorityQueue<Message>(sort: <)\n\n    queue.enqueue(Message(text: \"world\", priority: 200))\n    queue.enqueue(Message(text: \"hello\", priority: 100))\n    XCTAssertFalse(queue.isEmpty)\n    XCTAssertEqual(queue.count, 2)\n    XCTAssertEqual(queue.peek()!.priority, 100)\n\n    let result1 = queue.dequeue()\n    XCTAssertEqual(result1!.priority, 100)\n    XCTAssertFalse(queue.isEmpty)\n    XCTAssertEqual(queue.count, 1)\n    XCTAssertEqual(queue.peek()!.priority, 200)\n\n    let result2 = queue.dequeue()\n    XCTAssertEqual(result2!.priority, 200)\n    XCTAssertTrue(queue.isEmpty)\n    XCTAssertEqual(queue.count, 0)\n    XCTAssertNil(queue.peek())\n  }\n}\n"
  },
  {
    "path": "Priority Queue/Tests/Tests.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t7B80C3FC1C77A658003CECC7 /* PriorityQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C3FB1C77A658003CECC7 /* PriorityQueue.swift */; };\n\t\t7B80C3FE1C77A65E003CECC7 /* PriorityQueueTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C3FD1C77A65E003CECC7 /* PriorityQueueTests.swift */; };\n\t\t7B80C4001C77A67B003CECC7 /* Heap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C3FF1C77A67B003CECC7 /* Heap.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t7B2BBC801C779D720067B71D /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7B2BBC941C779E7B0067B71D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };\n\t\t7B80C3FB1C77A658003CECC7 /* PriorityQueue.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = PriorityQueue.swift; path = ../PriorityQueue.swift; sourceTree = SOURCE_ROOT; };\n\t\t7B80C3FD1C77A65E003CECC7 /* PriorityQueueTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PriorityQueueTests.swift; sourceTree = SOURCE_ROOT; };\n\t\t7B80C3FF1C77A67B003CECC7 /* Heap.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Heap.swift; path = ../../Heap/Heap.swift; sourceTree = SOURCE_ROOT; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t7B2BBC7D1C779D720067B71D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t7B2BBC681C779D710067B71D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC831C779D720067B71D /* Tests */,\n\t\t\t\t7B2BBC721C779D710067B71D /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC721C779D710067B71D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC801C779D720067B71D /* Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC831C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B80C3FF1C77A67B003CECC7 /* Heap.swift */,\n\t\t\t\t7B80C3FB1C77A658003CECC7 /* PriorityQueue.swift */,\n\t\t\t\t7B80C3FD1C77A65E003CECC7 /* PriorityQueueTests.swift */,\n\t\t\t\t7B2BBC941C779E7B0067B71D /* Info.plist */,\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tpath = TestsTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t7B2BBC7F1C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t7B2BBC7C1C779D720067B71D /* Sources */,\n\t\t\t\t7B2BBC7D1C779D720067B71D /* Frameworks */,\n\t\t\t\t7B2BBC7E1C779D720067B71D /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tproductName = TestsTests;\n\t\t\tproductReference = 7B2BBC801C779D720067B71D /* Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t7B2BBC691C779D710067B71D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0720;\n\t\t\t\tLastUpgradeCheck = 0800;\n\t\t\t\tORGANIZATIONNAME = \"Swift Algorithm Club\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t7B2BBC7F1C779D720067B71D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2;\n\t\t\t\t\t\tLastSwiftMigration = 0820;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 7B2BBC681C779D710067B71D;\n\t\t\tproductRefGroup = 7B2BBC721C779D710067B71D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t7B2BBC7F1C779D720067B71D /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t7B2BBC7E1C779D720067B71D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t7B2BBC7C1C779D720067B71D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7B80C4001C77A67B003CECC7 /* Heap.swift in Sources */,\n\t\t\t\t7B80C3FE1C77A65E003CECC7 /* PriorityQueueTests.swift in Sources */,\n\t\t\t\t7B80C3FC1C77A658003CECC7 /* PriorityQueue.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t7B2BBC871C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC881C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t7B2BBC8D1C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC8E1C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC871C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC881C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC8D1C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC8E1C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 7B2BBC691C779D710067B71D /* Project object */;\n}\n"
  },
  {
    "path": "Priority Queue/Tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Tests.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Priority Queue/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0800\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "QuadTree/QuadTree.playground/Contents.swift",
    "content": "import Foundation\n\nlet tree = QuadTree(rect: Rect(origin: Point(0, 0), size: Size(xLength: 10, yLength: 10)))\n\nfor _ in 0..<40 {\n  let randomX = Double(arc4random_uniform(100)) / 10\n  let randomY = Double(arc4random_uniform(100)) / 10\n  let point = Point(randomX, randomY)\n  tree.add(point: point)\n}\n\nprint(tree)\nprint(tree.points(inRect: Rect(origin: Point(1, 1), size: Size(xLength: 5, yLength: 5))))\n"
  },
  {
    "path": "QuadTree/QuadTree.playground/Sources/QuadTree.swift",
    "content": "public struct Point {\n  let x: Double\n  let y: Double\n\n  public init(_ x: Double, _ y: Double) {\n    self.x = x\n    self.y = y\n  }\n}\n\nextension Point: CustomStringConvertible {\n  public var description: String {\n    return \"Point(\\(x), \\(y))\"\n  }\n}\n\npublic struct Size: CustomStringConvertible {\n  var xLength: Double\n  var yLength: Double\n\n  public init(xLength: Double, yLength: Double) {\n    precondition(xLength >= 0, \"xLength can not be negative\")\n    precondition(yLength >= 0, \"yLength can not be negative\")\n    self.xLength = xLength\n    self.yLength = yLength\n  }\n\n  var half: Size {\n    return Size(xLength: xLength / 2, yLength: yLength / 2)\n  }\n\n  public var description: String {\n    return \"Size(\\(xLength), \\(yLength))\"\n  }\n}\n\npublic struct Rect {\n  // left top vertice\n  var origin: Point\n  var size: Size\n\n  public init(origin: Point, size: Size) {\n    self.origin = origin\n    self.size = size\n  }\n\n  var minX: Double {\n    return origin.x\n  }\n\n  var minY: Double {\n    return origin.y\n  }\n\n  var maxX: Double {\n    return origin.x + size.xLength\n  }\n\n  var maxY: Double {\n    return origin.y + size.yLength\n  }\n\n  func containts(point: Point) -> Bool {\n    return (minX <= point.x && point.x <= maxX) &&\n      (minY <= point.y && point.y <= maxY)\n  }\n\n  var leftTopRect: Rect {\n    return Rect(origin: origin, size: size.half)\n  }\n\n  var leftBottomRect: Rect {\n    return Rect(origin: Point(origin.x, origin.y + size.half.yLength), size: size.half)\n  }\n\n  var rightTopRect: Rect {\n    return Rect(origin: Point(origin.x + size.half.xLength, origin.y), size: size.half)\n  }\n\n  var rightBottomRect: Rect {\n    return Rect(origin: Point(origin.x + size.half.xLength, origin.y + size.half.yLength), size: size.half)\n  }\n\n  func intersects(rect: Rect) -> Bool {\n\n    func lineSegmentsIntersect(lStart: Double, lEnd: Double, rStart: Double, rEnd: Double) -> Bool {\n      return max(lStart, rStart) <= min(lEnd, rEnd)\n    }\n    // to intersect, both horizontal and vertical projections need to intersect\n    // horizontal\n    if !lineSegmentsIntersect(lStart: minX, lEnd: maxX, rStart: rect.minX, rEnd: rect.maxX) {\n      return false\n    }\n\n    // vertical\n    return lineSegmentsIntersect(lStart: minY, lEnd: maxY, rStart: rect.minY, rEnd: rect.maxY)\n  }\n}\n\nextension Rect: CustomStringConvertible {\n  public var description: String {\n    return \"Rect(\\(origin), \\(size))\"\n  }\n}\n\nprotocol PointsContainer {\n  func add(point: Point) -> Bool\n  func points(inRect rect: Rect) -> [Point]\n}\n\nclass QuadTreeNode {\n\n  enum NodeType {\n    case leaf\n    case `internal`(children: Children)\n  }\n\n  struct Children: Sequence {\n    let leftTop: QuadTreeNode\n    let leftBottom: QuadTreeNode\n    let rightTop: QuadTreeNode\n    let rightBottom: QuadTreeNode\n\n    init(parentNode: QuadTreeNode) {\n      leftTop = QuadTreeNode(rect: parentNode.rect.leftTopRect)\n      leftBottom = QuadTreeNode(rect: parentNode.rect.leftBottomRect)\n      rightTop = QuadTreeNode(rect: parentNode.rect.rightTopRect)\n      rightBottom = QuadTreeNode(rect: parentNode.rect.rightBottomRect)\n    }\n\n    struct ChildrenIterator: IteratorProtocol {\n      private var index = 0\n      private let children: Children\n\n      init(children: Children) {\n        self.children = children\n      }\n\n      mutating func next() -> QuadTreeNode? {\n\n        defer { index += 1 }\n\n        switch index {\n        case 0: return children.leftTop\n        case 1: return children.leftBottom\n        case 2: return children.rightTop\n        case 3: return children.rightBottom\n        default: return nil\n        }\n      }\n    }\n\n    public func makeIterator() -> ChildrenIterator {\n      return ChildrenIterator(children: self)\n    }\n  }\n\n  var points: [Point] = []\n  let rect: Rect\n  var type: NodeType = .leaf\n\n  static let maxPointCapacity = 3\n\n  init(rect: Rect) {\n    self.rect = rect\n  }\n\n  var recursiveDescription: String {\n    return recursiveDescription(withTabCount: 0)\n  }\n\n  private func recursiveDescription(withTabCount count: Int) -> String {\n    let indent = String(repeating: \"\\t\", count: count)\n    var result = \"\\(indent)\" + description + \"\\n\"\n    switch type {\n    case .internal(let children):\n      for child in children {\n        result += child.recursiveDescription(withTabCount: count + 1)\n      }\n    default:\n      break\n    }\n    return result\n  }\n}\n\nextension QuadTreeNode: PointsContainer {\n\n  @discardableResult\n  func add(point: Point) -> Bool {\n    if !rect.containts(point: point) {\n      return false\n    }\n\n    switch type {\n    case .internal(let children):\n      // pass the point to one of the children\n      for child in children {\n        if child.add(point: point) {\n          return true\n        }\n      }\n\n      fatalError(\"rect.containts evaluted to true, but none of the children added the point\")\n    case .leaf:\n      points.append(point)\n      // if the max capacity was reached, become an internal node\n      if points.count == QuadTreeNode.maxPointCapacity {\n        subdivide()\n      }\n    }\n    return true\n  }\n\n  private func subdivide() {\n    switch type {\n    case .leaf:\n      type = .internal(children: Children(parentNode: self))\n    case .internal:\n      preconditionFailure(\"Calling subdivide on an internal node\")\n    }\n  }\n\n  func points(inRect rect: Rect) -> [Point] {\n\n    // if the node's rect and the given rect don't intersect, return an empty array,\n    // because there can't be any points that lie the node's (or its children's) rect and\n    // in the given rect\n    if !self.rect.intersects(rect: rect) {\n      return []\n    }\n\n    var result: [Point] = []\n\n    // collect the node's points that lie in the rect\n    for point in points {\n      if rect.containts(point: point) {\n        result.append(point)\n      }\n    }\n\n    switch type {\n    case .leaf:\n      break\n    case .internal(let children):\n      // recursively add children's points that lie in the rect\n      for childNode in children {\n        result.append(contentsOf: childNode.points(inRect: rect))\n      }\n    }\n\n    return result\n  }\n}\n\nextension QuadTreeNode: CustomStringConvertible {\n  var description: String {\n    switch type {\n    case .leaf:\n      return \"leaf \\(rect) Points: \\(points)\"\n    case .internal:\n      return \"parent \\(rect) Points: \\(points)\"\n    }\n  }\n}\n\npublic class QuadTree: PointsContainer {\n\n  let root: QuadTreeNode\n\n  public init(rect: Rect) {\n    self.root = QuadTreeNode(rect: rect)\n  }\n\n  @discardableResult\n  public func add(point: Point) -> Bool {\n    return root.add(point: point)\n  }\n\n  public func points(inRect rect: Rect) -> [Point] {\n    return root.points(inRect: rect)\n  }\n}\n\nextension QuadTree: CustomStringConvertible {\n  public var description: String {\n    return \"Quad tree\\n\" + root.recursiveDescription\n  }\n}\n"
  },
  {
    "path": "QuadTree/QuadTree.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "QuadTree/QuadTree.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "QuadTree/README.md",
    "content": "# QuadTree\n\nA quadtree is a [tree](https://github.com/raywenderlich/swift-algorithm-club/tree/master/Tree) in which each internal (not leaf) node has four children.\n\n<img src=\"https://github.com/timaktimak/swift-algorithm-club/blob/master/QuadTree/Images/quadtree.png\" width=\"500\">\n\n### Problem\n\nConsider the following problem: your need to store a number of points (each point is a pair of `X` and `Y` coordinates) and then you need to answer which points lie in a certain rectangular region. A naive solution would be to store the points inside an array and then iterate over the points and check each one individually. This solution runs in O(n) though.\n\n### A Better Approach\n\nQuadtrees are most commonly used to partition a two-dimensional space by recursively subdividing it into four regions(quadrants). Let's see how we can use a Quadtree to store the points.\n\nEach node in the tree represents a rectangular region and stores a limited number(`maxPointCapacity`) of points that all lie in its region.\n\n```swift\nclass QuadTreeNode {\n\n  enum NodeType {\n    case leaf\n    case `internal`(children: Children)\n  }\n\n  struct Children {\n    let leftTop: QuadTreeNode\n    let leftBottom: QuadTreeNode\n    let rightTop: QuadTreeNode\n    let rightBottom: QuadTreeNode\n\n    ...\n  }\n\n  var points: [Point] = []\n  let rect: Rect\n  var type: NodeType = .leaf\n\n  static let maxPointCapacity = 3\n\n  init(rect: Rect) {\n    self.rect = rect\n  }\n\n  ...\n}\n\n```\nOnce the limit in a leaf node is reached, four child nodes are added to the node and they represent `topLeft`, `topRight`, `bottomLeft`, `bottomRight` quadrants of the node's rect; each of the consequent points in the rect will be passed to one of the children. Thus, new points are always added to leaf nodes.\n\n```swift\nextension QuadTreeNode {\n\n  @discardableResult\n  func add(point: Point) -> Bool {\n\n    if !rect.contains(point: point) {\n      return false\n    }\n\n    switch type {\n    case .internal(let children):\n      // pass the point to one of the children\n      for child in children {\n        if child.add(point: point) {\n          return true\n        }\n      }\n      return false // should never happen\n    case .leaf:\n      points.append(point)\n      // if the max capacity was reached, become an internal node\n      if points.count == QuadTreeNode.maxPointCapacity {\n        subdivide()\n      }\n    }\n    return true\n  }\n\n  private func subdivide() {\n    switch type {\n    case .leaf:\n      type = .internal(children: Children(parentNode: self))\n    case .internal:\n      preconditionFailure(\"Calling subdivide on an internal node\")\n    }\n  }\n}\n\nextension Children {\n\n  init(parentNode: QuadTreeNode) {\n    leftTop = QuadTreeNode(rect: parentNode.rect.leftTopRect)\n    leftBottom = QuadTreeNode(rect: parentNode.rect.leftBottomRect)\n    rightTop = QuadTreeNode(rect: parentNode.rect.rightTopRect)\n    rightBottom = QuadTreeNode(rect: parentNode.rect.rightBottomRect)\n  }\n}\n\n```\n\nTo find the points that lie in a given region we can now traverse the tree from top to bottom and collect the suitable points from nodes.\n\n```swift\n\nclass QuadTree {\n\n  ...\n\n  let root: QuadTreeNode\n\n   public func points(inRect rect: Rect) -> [Point] {\n    return root.points(inRect: rect)\n  }\n}\n\nextension QuadTreeNode {\n  func points(inRect rect: Rect) -> [Point] {\n\n    // if the node's rect and the given rect don't intersect, return an empty array,\n    // because there can't be any points that lie the node's (or its children's) rect and\n    // in the given rect\n    if !self.rect.intersects(rect: rect) {\n      return []\n    }\n\n    var result: [Point] = []\n\n    // collect the node's points that lie in the rect\n    for point in points {\n      if rect.contains(point: point) {\n        result.append(point)\n      }\n    }\n\n    switch type {\n    case .leaf:\n      break\n    case .internal(children: let children):\n      // recursively add children's points that lie in the rect\n      for childNode in children {\n        result.append(contentsOf: childNode.points(inRect: rect))\n      }\n    }\n\n    return result\n  }\n}\n\n```\n\nBoth adding a point and searching can still take up to O(n) in the worst case, since the tree isn't balanced in any way. However, on average it runs significantly faster (something comparable to O(log n)).\n\n### See also\n\nDisplaying a large amount of objects in a MapView - a great use case for a Quadtree ([Thoughtbot Article](https://robots.thoughtbot.com/how-to-handle-large-amounts-of-data-on-maps))\n\nMore info on [Wikipedia](https://en.wikipedia.org/wiki/Quadtree)\n\n*Written for Swift Algorithm Club by Timur Galimov*\n"
  },
  {
    "path": "QuadTree/Tests/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "QuadTree/Tests/Tests/Tests.swift",
    "content": "//\n//  Tests.swift\n//  Tests\n//\n//  Created by Timur Galimov on 12/02/2017.\n//\n//\n\nimport XCTest\n\nextension Point: Equatable {\n\n}\n\npublic func == (lhs: Point, rhs: Point) -> Bool {\n  return lhs.x == rhs.x && lhs.y == rhs.y\n}\n\nclass Tests: XCTestCase {\n\n  func testRectContains() {\n    let rect = Rect(origin: Point(0, 0), size: Size(xLength: 3, yLength: 3))\n\n    XCTAssertTrue(rect.containts(point: Point(1, 1)))\n    XCTAssertTrue(rect.containts(point: Point(0, 0)))\n    XCTAssertTrue(rect.containts(point: Point(0, 3)))\n    XCTAssertTrue(rect.containts(point: Point(3, 3)))\n\n    XCTAssertFalse(rect.containts(point: Point(-1, 1)))\n    XCTAssertFalse(rect.containts(point: Point(-0.1, 0.1)))\n    XCTAssertFalse(rect.containts(point: Point(0, 3.1)))\n    XCTAssertFalse(rect.containts(point: Point(-4, 1)))\n  }\n\n  func testIntersects() {\n    let rect = Rect(origin: Point(0, 0), size: Size(xLength: 5, yLength: 5))\n    let rect2 = Rect(origin: Point(1, 1), size: Size(xLength: 1, yLength: 1))\n    XCTAssertTrue(rect.intersects(rect: rect2))\n\n    let rect3 = Rect(origin: Point(1, 0), size: Size(xLength: 1, yLength: 10))\n    let rect4 = Rect(origin: Point(0, 1), size: Size(xLength: 10, yLength: 1))\n    XCTAssertTrue(rect3.intersects(rect: rect4))\n\n    let rect5 = Rect(origin: Point(0, 0), size: Size(xLength: 4, yLength: 4))\n    let rect6 = Rect(origin: Point(2, 2), size: Size(xLength: 4, yLength: 4))\n    XCTAssertTrue(rect5.intersects(rect: rect6))\n\n    let rect7 = Rect(origin: Point(0, 0), size: Size(xLength: 4, yLength: 4))\n    let rect8 = Rect(origin: Point(4, 4), size: Size(xLength: 1, yLength: 1))\n    XCTAssertTrue(rect7.intersects(rect: rect8))\n\n    let rect9 = Rect(origin: Point(-1, -1), size: Size(xLength: 0.5, yLength: 0.5))\n    let rect10 = Rect(origin: Point(0, 0), size: Size(xLength: 1, yLength: 1))\n    XCTAssertFalse(rect9.intersects(rect: rect10))\n\n    let rect11 = Rect(origin: Point(0, 0), size: Size(xLength: 2, yLength: 1))\n    let rect12 = Rect(origin: Point(3, 0), size: Size(xLength: 1, yLength: 1))\n    XCTAssertFalse(rect11.intersects(rect: rect12))\n  }\n\n  func testQuadTree() {\n    let rect = Rect(origin: Point(0, 0), size: Size(xLength: 5, yLength: 5))\n    let qt = QuadTree(rect: rect)\n\n    XCTAssertTrue(qt.points(inRect: rect) == [Point]())\n\n    XCTAssertFalse(qt.add(point: Point(-0.1, 0.1)))\n\n    XCTAssertTrue(qt.points(inRect: rect) == [Point]())\n\n    XCTAssertTrue(qt.add(point: Point(1, 1)))\n    XCTAssertTrue(qt.add(point: Point(3, 3)))\n    XCTAssertTrue(qt.add(point: Point(4, 4)))\n    XCTAssertTrue(qt.add(point: Point(0.5, 0.5)))\n\n    XCTAssertFalse(qt.add(point: Point(5.5, 0)))\n    XCTAssertFalse(qt.add(point: Point(5.5, 1)))\n    XCTAssertFalse(qt.add(point: Point(5.5, 2)))\n\n    XCTAssertTrue(qt.add(point: Point(1.5, 1.5)))\n\n    let rect2 = Rect(origin: Point(0, 0), size: Size(xLength: 2, yLength: 2))\n    XCTAssertTrue(qt.points(inRect: rect2) == [Point(1, 1), Point(0.5, 0.5), Point(1.5, 1.5)])\n  }\n}\n"
  },
  {
    "path": "QuadTree/Tests/Tests.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t82EF3AAE1E50E77800013ECB /* Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82EF3AAD1E50E77800013ECB /* Tests.swift */; };\n\t\t82EF3AB51E50E82400013ECB /* QuadTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82EF3AB41E50E82400013ECB /* QuadTree.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t82EF3AAA1E50E77800013ECB /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t82EF3AAD1E50E77800013ECB /* Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests.swift; sourceTree = \"<group>\"; };\n\t\t82EF3AAF1E50E77800013ECB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t82EF3AB41E50E82400013ECB /* QuadTree.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = QuadTree.swift; path = ../QuadTree.playground/Sources/QuadTree.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t82EF3AA71E50E77800013ECB /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t82EF3A9F1E50E74900013ECB = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t82EF3AB41E50E82400013ECB /* QuadTree.swift */,\n\t\t\t\t82EF3AAC1E50E77800013ECB /* Tests */,\n\t\t\t\t82EF3AAB1E50E77800013ECB /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t82EF3AAB1E50E77800013ECB /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t82EF3AAA1E50E77800013ECB /* Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t82EF3AAC1E50E77800013ECB /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t82EF3AAD1E50E77800013ECB /* Tests.swift */,\n\t\t\t\t82EF3AAF1E50E77800013ECB /* Info.plist */,\n\t\t\t);\n\t\t\tpath = Tests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t82EF3AA91E50E77800013ECB /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 82EF3AB01E50E77800013ECB /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t82EF3AA61E50E77800013ECB /* Sources */,\n\t\t\t\t82EF3AA71E50E77800013ECB /* Frameworks */,\n\t\t\t\t82EF3AA81E50E77800013ECB /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tproductName = Tests;\n\t\t\tproductReference = 82EF3AAA1E50E77800013ECB /* Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t82EF3AA01E50E74900013ECB /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0820;\n\t\t\t\tLastUpgradeCheck = 0820;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t82EF3AA91E50E77800013ECB = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.2.1;\n\t\t\t\t\t\tDevelopmentTeam = 34BUG46ZSN;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 82EF3AA31E50E74900013ECB /* Build configuration list for PBXProject \"Tests\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t);\n\t\t\tmainGroup = 82EF3A9F1E50E74900013ECB;\n\t\t\tproductRefGroup = 82EF3AAB1E50E77800013ECB /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t82EF3AA91E50E77800013ECB /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t82EF3AA81E50E77800013ECB /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t82EF3AA61E50E77800013ECB /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t82EF3AB51E50E82400013ECB /* QuadTree.swift in Sources */,\n\t\t\t\t82EF3AAE1E50E77800013ECB /* Tests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t82EF3AA41E50E74900013ECB /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t82EF3AA51E50E74900013ECB /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t82EF3AB11E50E77800013ECB /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tDEVELOPMENT_TEAM = 34BUG46ZSN;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = Tests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 3.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t82EF3AB21E50E77800013ECB /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tDEVELOPMENT_TEAM = 34BUG46ZSN;\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = Tests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 3.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t82EF3AA31E50E74900013ECB /* Build configuration list for PBXProject \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t82EF3AA41E50E74900013ECB /* Debug */,\n\t\t\t\t82EF3AA51E50E74900013ECB /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t82EF3AB01E50E77800013ECB /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t82EF3AB11E50E77800013ECB /* Debug */,\n\t\t\t\t82EF3AB21E50E77800013ECB /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 82EF3AA01E50E74900013ECB /* Project object */;\n}\n"
  },
  {
    "path": "QuadTree/Tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Tests.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Queue/Queue-Optimized.swift",
    "content": "/*\n  First-in first-out queue (FIFO)\n\n  New elements are added to the end of the queue. Dequeuing pulls elements from\n  the front of the queue.\n\n  Enqueuing and dequeuing are O(1) operations.\n*/\npublic struct Queue<T> {\n  fileprivate var array = [T?]()\n  fileprivate var head = 0\n\n  public var isEmpty: Bool {\n    return count == 0\n  }\n\n  public var count: Int {\n    return array.count - head\n  }\n\n  public mutating func enqueue(_ element: T) {\n    array.append(element)\n  }\n\n  public mutating func dequeue() -> T? {\n    guard let element = array[guarded: head] else { return nil }\n\n    array[head] = nil\n    head += 1\n\n    let percentage = Double(head)/Double(array.count)\n    if array.count > 50 && percentage > 0.25 {\n      array.removeFirst(head)\n      head = 0\n    }\n\n    return element\n  }\n\n  public var front: T? {\n    if isEmpty {\n      return nil\n    } else {\n      return array[head]\n    }\n  }\n}\n\nextension Array {\n    subscript(guarded idx: Int) -> Element? {\n        guard (startIndex..<endIndex).contains(idx) else {\n            return nil\n        }\n        return self[idx]\n    }\n}\n"
  },
  {
    "path": "Queue/Queue-Simple.swift",
    "content": "/*\n  First-in first-out queue (FIFO)\n\n  New elements are added to the end of the queue. Dequeuing pulls elements from\n  the front of the queue.\n\n  Enqueuing is an O(1) operation, dequeuing is O(n). Note: If the queue had been\n  implemented with a linked list, then both would be O(1).\n*/\npublic struct Queue<T> {\n  fileprivate var array = [T]()\n\n  public var count: Int {\n    return array.count\n  }\n\n  public var isEmpty: Bool {\n    return array.isEmpty\n  }\n\n  public mutating func enqueue(_ element: T) {\n    array.append(element)\n  }\n\n  public mutating func dequeue() -> T? {\n    if isEmpty {\n      return nil\n    } else {\n      return array.removeFirst()\n    }\n  }\n\n  public var front: T? {\n    return array.first\n  }\n}\n"
  },
  {
    "path": "Queue/Queue.playground/Contents.swift",
    "content": "/*\n  Queue\n\n  A queue is a list where you can only insert new items at the back and\n  remove items from the front. This ensures that the first item you enqueue\n  is also the first item you dequeue. First come, first serve!\n\n  A queue gives you a FIFO or first-in, first-out order. The element you\n  inserted first is also the first one to come out again. It's only fair!\n\n  In this implementation, enqueuing is an O(1) operation, dequeuing is O(n).\n*/\n\npublic struct Queue<T> {\n  fileprivate var array = [T]()\n\n  public var isEmpty: Bool {\n    return array.isEmpty\n  }\n\n  public var count: Int {\n    return array.count\n  }\n\n  public mutating func enqueue(_ element: T) {\n    array.append(element)\n  }\n\n  public mutating func dequeue() -> T? {\n    if isEmpty {\n      return nil\n    } else {\n      return array.removeFirst()\n    }\n  }\n\n  public var front: T? {\n    return array.first\n  }\n}\n\n// Create a queue and put some elements on it already.\nvar queueOfNames = Queue(array: [\"Carl\", \"Lisa\", \"Stephanie\", \"Jeff\", \"Wade\"])\n\n// Adds an element to the end of the queue.\nqueueOfNames.enqueue(\"Mike\")\n\n// Queue is now [\"Carl\", \"Lisa\", \"Stephanie\", \"Jeff\", \"Wade\", \"Mike\"]\nprint(queueOfNames.array)\n\n// Remove and return the first element in the queue. This returns \"Carl\".\nqueueOfNames.dequeue()\n\n// Return the first element in the queue.\n// Returns \"Lisa\" since \"Carl\" was dequeued on the previous line.\nqueueOfNames.front\n\n// Check to see if the queue is empty.\n// Returns \"false\" since the queue still has elements in it.\nqueueOfNames.isEmpty\n"
  },
  {
    "path": "Queue/Queue.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Queue/Queue.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Queue/Queue.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Queue/README.markdown",
    "content": "# Queue\n\n> This topic has been tutorialized [here](https://www.raywenderlich.com/148141/swift-algorithm-club-swift-queue-data-structure)\n\nA queue is a list where you can only insert new items at the back and remove items from the front. This ensures that the first item you enqueue is also the first item you dequeue. First come, first serve!\n\nWhy would you need this? Well, in many algorithms you want to add objects to a temporary list and pull them off this list later. Often the order in which you add and remove these objects matters.\n\nA queue gives you a FIFO or first-in, first-out order. The element you inserted first is the first one to come out. It is only fair! (A similar data structure, the [stack](../Stack/), is LIFO or last-in first-out.)\n\nHere is an example to enqueue a number:\n\n```swift\nqueue.enqueue(10)\n```\n\nThe queue is now `[ 10 ]`. Add the next number to the queue:\n\n```swift\nqueue.enqueue(3)\n```\n\nThe queue is now `[ 10, 3 ]`. Add one more number:\n\n```swift\nqueue.enqueue(57)\n```\n\nThe queue is now `[ 10, 3, 57 ]`. Let's dequeue to pull the first element off the front of the queue:\n\n```swift\nqueue.dequeue()\n```\n\nThis returns `10` because that was the first number we inserted. The queue is now `[ 3, 57 ]`. Everyone moved up by one place.\n\n```swift\nqueue.dequeue()\n```\n\nThis returns `3`, the next dequeue returns `57`, and so on. If the queue is empty, dequeuing returns `nil` or in some implementations it gives an error message.\n\n> **Note:** A queue is not always the best choice. If the order in which the items are added and removed from the list is not important, you can use a [stack](../Stack/) instead of a queue. Stacks are simpler and faster.\n\n## The code\n\nHere is a simplistic implementation of a queue in Swift. It is a wrapper around an array to enqueue, dequeue, and peek at the front-most item:\n\n```swift\npublic struct Queue<T> {\n  fileprivate var array = [T]()\n\n  public var isEmpty: Bool {\n    return array.isEmpty\n  }\n  \n  public var count: Int {\n    return array.count\n  }\n\n  public mutating func enqueue(_ element: T) {\n    array.append(element)\n  }\n  \n  public mutating func dequeue() -> T? {\n    if isEmpty {\n      return nil\n    } else {\n      return array.removeFirst()\n    }\n  }\n  \n  public var front: T? {\n    return array.first\n  }\n}\n```\n\nThis queue works well, but it is not optimal.\n\nEnqueuing is an **O(1)** operation because adding to the end of an array always takes the same amount of time regardless of the size of the array.\n\nYou might be wondering why appending items to an array is **O(1)** or a constant-time operation. That is because an array in Swift always has some empty space at the end. If we do the following:\n\n```swift\nvar queue = Queue<String>()\nqueue.enqueue(\"Ada\")\nqueue.enqueue(\"Steve\")\nqueue.enqueue(\"Tim\")\n```\n\nthen the array might actually look like this:\n\n\t[ \"Ada\", \"Steve\", \"Tim\", xxx, xxx, xxx ]\n\nwhere `xxx` is memory that is reserved but not filled in yet. Adding a new element to the array overwrites the next unused spot:\n\n\t[ \"Ada\", \"Steve\", \"Tim\", \"Grace\", xxx, xxx ]\n\nThis results by copying memory from one place to another which is a constant-time operation.\n\nThere are only a limited number of unused spots at the end of the array. When the last `xxx` gets used, and you want to add another item, the array needs to resize to make more room.\n\nResizing includes allocating new memory and copying all the existing data over to the new array. This is an **O(n)** process which is relatively slow. Since it happens occasionally, the time for appending a new element to the end of the array is still **O(1)** on average or **O(1)** \"amortized\".\n\nThe story for dequeueing is different. To dequeue, we remove the element from the *beginning* of the array. This is always an **O(n)** operation because it requires all remaining array elements to be shifted in memory.\n\nIn our example, dequeuing the first element `\"Ada\"` copies `\"Steve\"` in the place of `\"Ada\"`, `\"Tim\"` in the place of `\"Steve\"`, and `\"Grace\"` in the place of `\"Tim\"`:\n\n\tbefore   [ \"Ada\", \"Steve\", \"Tim\", \"Grace\", xxx, xxx ]\n\t                   /       /      /\n\t                  /       /      /\n\t                 /       /      /\n\t                /       /      /\n\t after   [ \"Steve\", \"Tim\", \"Grace\", xxx, xxx, xxx ]\n \nMoving all these elements in memory is always an **O(n)** operation. So with our simple implementation of a queue, enqueuing is efficient, but dequeueing leaves something to be desired...\n\n## A more efficient queue\n\nTo make dequeuing efficient, we can also reserve some extra free space but this time at the front of the array. We must write this code ourselves because the built-in Swift array does not support it.\n\nThe main idea is whenever we dequeue an item, we do not shift the contents of the array to the front (slow) but mark the item's position in the array as empty (fast). After dequeuing `\"Ada\"`, the array is:\n\n\t[ xxx, \"Steve\", \"Tim\", \"Grace\", xxx, xxx ]\n\nAfter dequeuing `\"Steve\"`, the array is:\n\n\t[ xxx, xxx, \"Tim\", \"Grace\", xxx, xxx ]\n\nBecause these empty spots at the front never get reused, you can periodically trim the array by moving the remaining elements to the front:\n\n\t[ \"Tim\", \"Grace\", xxx, xxx, xxx, xxx ]\n\nThis trimming procedure involves shifting memory which is an **O(n)** operation. Because this only happens once in a while, dequeuing is **O(1)** on average.\n\nHere is how you can implement this version of `Queue`:\n\n```swift\npublic struct Queue<T> {\n  fileprivate var array = [T?]()\n  fileprivate var head = 0\n  \n  public var isEmpty: Bool {\n    return count == 0\n  }\n\n  public var count: Int {\n    return array.count - head\n  }\n  \n  public mutating func enqueue(_ element: T) {\n    array.append(element)\n  }\n  \n  public mutating func dequeue() -> T? {\n    guard head < array.count, let element = array[head] else { return nil }\n\n    array[head] = nil\n    head += 1\n\n    let percentage = Double(head)/Double(array.count)\n    if array.count > 50 && percentage > 0.25 {\n      array.removeFirst(head)\n      head = 0\n    }\n    \n    return element\n  }\n  \n  public var front: T? {\n    if isEmpty {\n      return nil\n    } else {\n      return array[head]\n    }\n  }\n}\n```\n\nThe array now stores objects of type `T?` instead of just `T` because we need to mark array elements as being empty. The `head` variable is the index in the array of the front-most object.\n\nMost of the new functionality sits in `dequeue()`. When we dequeue an item, we first set `array[head]` to `nil` to remove the object from the array. Then, we increment `head` because the next item has become the front one.\n\nWe go from this:\n\n\t[ \"Ada\", \"Steve\", \"Tim\", \"Grace\", xxx, xxx ]\n\t  head\n\nto this:\n\n\t[ xxx, \"Steve\", \"Tim\", \"Grace\", xxx, xxx ]\n\t        head\n\nIt is like if in a supermarket the people in the checkout lane do not shuffle forward towards the cash register, but the cash register moves up the queue.\n\nIf we never remove those empty spots at the front then the array will keep growing as we enqueue and dequeue elements. To periodically trim down the array, we do the following:\n\n```swift\n    let percentage = Double(head)/Double(array.count)\n    if array.count > 50 && percentage > 0.25 {\n      array.removeFirst(head)\n      head = 0\n    }\n```\n\nThis calculates the percentage of empty spots at the beginning as a ratio of the total array size. If more than 25% of the array is unused, we chop off that wasted space. However, if the array is small we do not resize it all the time, so there must be at least 50 elements in the array before we try to trim it. \n\n> **Note:** I just pulled these numbers out of thin air -- you may need to tweak them based on the behavior of your app in a production environment.\n\nTo test this in a playground, do the following:\n\n```swift\nvar q = Queue<String>()\nq.array                   // [] empty array\n\nq.enqueue(\"Ada\")\nq.enqueue(\"Steve\")\nq.enqueue(\"Tim\")\nq.array             // [{Some \"Ada\"}, {Some \"Steve\"}, {Some \"Tim\"}]\nq.count             // 3\n\nq.dequeue()         // \"Ada\"\nq.array             // [nil, {Some \"Steve\"}, {Some \"Tim\"}]\nq.count             // 2\n\nq.dequeue()         // \"Steve\"\nq.array             // [nil, nil, {Some \"Tim\"}]\nq.count             // 1\n\nq.enqueue(\"Grace\")\nq.array             // [nil, nil, {Some \"Tim\"}, {Some \"Grace\"}]\nq.count             // 2\n```\n\nTo test the trimming behavior, replace the line,\n\n```swift\n    if array.count > 50 && percentage > 0.25 {\n```\n\nwith:\n\n```swift\n    if head > 2 {\n```\n\nNow if you dequeue another object, the array will look as follows:\n\n```swift\nq.dequeue()         // \"Tim\"\nq.array             // [{Some \"Grace\"}]\nq.count             // 1\n```\n\nThe `nil` objects at the front have been removed, and the array is no longer wasting space. This new version of `Queue` is not more complicated than the first one but dequeuing is now also an **O(1)** operation, just because we were aware about how we used the array.\n\n## See also\n\nThere are many ways to create a queue. Alternative implementations use a [linked list](../Linked%20List/), a [circular buffer](../Ring%20Buffer/), or a [heap](../Heap/). \n\nVariations on this theme are [deque](../Deque/), a double-ended queue where you can enqueue and dequeue at both ends, and [priority queue](../Priority%20Queue/), a sorted queue where the \"most important\" item is always at the front.\n\n*Written for Swift Algorithm Club by Matthijs Hollemans*\n"
  },
  {
    "path": "Queue/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Queue/Tests/QueueTests.swift",
    "content": "import Foundation\nimport XCTest\n\nclass QueueTest: XCTestCase {\n  func testEmpty() {\n    var queue = Queue<Int>()\n    XCTAssertTrue(queue.isEmpty)\n    XCTAssertEqual(queue.count, 0)\n    XCTAssertEqual(queue.front, nil)\n    XCTAssertNil(queue.dequeue())\n  }\n\n  func testOneElement() {\n    var queue = Queue<Int>()\n\n    queue.enqueue(123)\n    XCTAssertFalse(queue.isEmpty)\n    XCTAssertEqual(queue.count, 1)\n    XCTAssertEqual(queue.front, 123)\n\n    let result = queue.dequeue()\n    XCTAssertEqual(result, 123)\n    XCTAssertTrue(queue.isEmpty)\n    XCTAssertEqual(queue.count, 0)\n    XCTAssertEqual(queue.front, nil)\n  }\n\n  func testTwoElements() {\n    var queue = Queue<Int>()\n\n    queue.enqueue(123)\n    queue.enqueue(456)\n    XCTAssertFalse(queue.isEmpty)\n    XCTAssertEqual(queue.count, 2)\n    XCTAssertEqual(queue.front, 123)\n\n    let result1 = queue.dequeue()\n    XCTAssertEqual(result1, 123)\n    XCTAssertFalse(queue.isEmpty)\n    XCTAssertEqual(queue.count, 1)\n    XCTAssertEqual(queue.front, 456)\n\n    let result2 = queue.dequeue()\n    XCTAssertEqual(result2, 456)\n    XCTAssertTrue(queue.isEmpty)\n    XCTAssertEqual(queue.count, 0)\n    XCTAssertEqual(queue.front, nil)\n  }\n\n  func testMakeEmpty() {\n    var queue = Queue<Int>()\n\n    queue.enqueue(123)\n    queue.enqueue(456)\n    XCTAssertNotNil(queue.dequeue())\n    XCTAssertNotNil(queue.dequeue())\n    XCTAssertNil(queue.dequeue())\n\n    queue.enqueue(789)\n    XCTAssertEqual(queue.count, 1)\n    XCTAssertEqual(queue.front, 789)\n\n    let result = queue.dequeue()\n    XCTAssertEqual(result, 789)\n    XCTAssertTrue(queue.isEmpty)\n    XCTAssertEqual(queue.count, 0)\n    XCTAssertEqual(queue.front, nil)\n  }\n}\n"
  },
  {
    "path": "Queue/Tests/Tests.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t7B80C4021C77A6BF003CECC7 /* Queue-Optimized.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C4011C77A6BF003CECC7 /* Queue-Optimized.swift */; };\n\t\t7B80C4041C77A6C5003CECC7 /* QueueTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C4031C77A6C5003CECC7 /* QueueTests.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t7B2BBC801C779D720067B71D /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7B2BBC941C779E7B0067B71D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };\n\t\t7B80C4011C77A6BF003CECC7 /* Queue-Optimized.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = \"Queue-Optimized.swift\"; path = \"../Queue-Optimized.swift\"; sourceTree = SOURCE_ROOT; };\n\t\t7B80C4031C77A6C5003CECC7 /* QueueTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QueueTests.swift; sourceTree = SOURCE_ROOT; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t7B2BBC7D1C779D720067B71D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t7B2BBC681C779D710067B71D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC831C779D720067B71D /* Tests */,\n\t\t\t\t7B2BBC721C779D710067B71D /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC721C779D710067B71D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC801C779D720067B71D /* Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC831C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B80C4011C77A6BF003CECC7 /* Queue-Optimized.swift */,\n\t\t\t\t7B80C4031C77A6C5003CECC7 /* QueueTests.swift */,\n\t\t\t\t7B2BBC941C779E7B0067B71D /* Info.plist */,\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tpath = TestsTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t7B2BBC7F1C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t7B2BBC7C1C779D720067B71D /* Sources */,\n\t\t\t\t7B2BBC7D1C779D720067B71D /* Frameworks */,\n\t\t\t\t7B2BBC7E1C779D720067B71D /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tproductName = TestsTests;\n\t\t\tproductReference = 7B2BBC801C779D720067B71D /* Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t7B2BBC691C779D710067B71D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0720;\n\t\t\t\tLastUpgradeCheck = 1000;\n\t\t\t\tORGANIZATIONNAME = \"Swift Algorithm Club\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t7B2BBC7F1C779D720067B71D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2;\n\t\t\t\t\t\tLastSwiftMigration = 1000;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 7B2BBC681C779D710067B71D;\n\t\t\tproductRefGroup = 7B2BBC721C779D710067B71D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t7B2BBC7F1C779D720067B71D /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t7B2BBC7E1C779D720067B71D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t7B2BBC7C1C779D720067B71D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7B80C4021C77A6BF003CECC7 /* Queue-Optimized.swift in Sources */,\n\t\t\t\t7B80C4041C77A6C5003CECC7 /* QueueTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t7B2BBC871C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC881C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t7B2BBC8D1C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Default;\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC8E1C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Default;\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC871C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC881C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC8D1C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC8E1C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 7B2BBC691C779D710067B71D /* Project object */;\n}\n"
  },
  {
    "path": "Queue/Tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Tests.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Queue/Tests/Tests.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Queue/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1000\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Quicksort/Quicksort.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\nimport Foundation\n\n// *** Simple but inefficient version of quicksort ***\n\nfunc quicksort<T: Comparable>(_ a: [T]) -> [T] {\n  guard a.count > 1 else { return a }\n\n  let pivot = a[a.count/2]\n  let less = a.filter { $0 < pivot }\n  let equal = a.filter { $0 == pivot }\n  let greater = a.filter { $0 > pivot }\n\n  // Uncomment this following line to see in detail what the\n  // pivot is in each step and how the subarrays are partitioned.\n  //print(pivot, less, equal, greater)  return quicksort(less) + equal + quicksort(greater)\n\n  return quicksort(less) + equal + quicksort(greater)\n}\n\nlet list1 = [ 10, 0, 3, 9, 2, 14, 8, 27, 1, 5, 8, -1, 26 ]\nquicksort(list1)\n\n// *** Using Lomuto partitioning ***\n\n/*\n  Lomuto's partitioning algorithm.\n\n  The return value is the index of the pivot element in the new array. The left\n  partition is [low...p-1]; the right partition is [p+1...high], where p is the\n  return value.\n*/\nfunc partitionLomuto<T: Comparable>(_ a: inout [T], low: Int, high: Int) -> Int {\n  let pivot = a[high]\n\n  var i = low\n  for j in low..<high {\n    if a[j] <= pivot {\n      a.swapAt(i, j)\n      i += 1\n    }\n  }\n\n  a.swapAt(i, high)\n  return i\n}\n\nvar list2 = [ 10, 0, 3, 9, 2, 14, 26, 27, 1, 5, 8, -1, 8 ]\npartitionLomuto(&list2, low: 0, high: list2.count - 1)\nlist2\n\nfunc quicksortLomuto<T: Comparable>(_ a: inout [T], low: Int, high: Int) {\n  if low < high {\n    let p = partitionLomuto(&a, low: low, high: high)\n    quicksortLomuto(&a, low: low, high: p - 1)\n    quicksortLomuto(&a, low: p + 1, high: high)\n  }\n}\n\nquicksortLomuto(&list2, low: 0, high: list2.count - 1)\n\n// *** Hoare partitioning ***\n\n/*\n  Hoare's partitioning scheme.\n\n  The return value is NOT necessarily the index of the pivot element in the\n  new array. Instead, the array is partitioned into [low...p] and [p+1...high],\n  where p is the return value. The pivot value is placed somewhere inside one\n  of the two partitions, but the algorithm doesn't tell you which one or where.\n*/\nfunc partitionHoare<T: Comparable>(_ a: inout [T], low: Int, high: Int) -> Int {\n  let pivot = a[low]\n  var i = low - 1\n  var j = high + 1\n\n  while true {\n    repeat { j -= 1 } while a[j] > pivot\n    repeat { i += 1 } while a[i] < pivot\n\n    if i < j {\n        a.swapAt(i, j)\n    } else {\n      return j\n    }\n  }\n}\n\nvar list3 = [ 8, 0, 3, 9, 2, 14, 10, 27, 1, 5, 8, -1, 26 ]\npartitionHoare(&list3, low: 0, high: list3.count - 1)\nlist3\n\nfunc quicksortHoare<T: Comparable>(_ a: inout [T], low: Int, high: Int) {\n  if low < high {\n    let p = partitionHoare(&a, low: low, high: high)\n    quicksortHoare(&a, low: low, high: p)\n    quicksortHoare(&a, low: p + 1, high: high)\n  }\n}\n\nquicksortHoare(&list3, low: 0, high: list3.count - 1)\n\n// *** Randomized sorting ***\n\n/* Returns a random integer in the range min...max, inclusive. */\npublic func random(min: Int, max: Int) -> Int {\n  assert(min < max)\n  return min + Int(arc4random_uniform(UInt32(max - min + 1)))\n}\n\nfunc quicksortRandom<T: Comparable>(_ a: inout [T], low: Int, high: Int) {\n  if low < high {\n    let pivotIndex = random(min: low, max: high)\n    (a[pivotIndex], a[high]) = (a[high], a[pivotIndex])\n\n    let p = partitionLomuto(&a, low: low, high: high)\n    quicksortRandom(&a, low: low, high: p - 1)\n    quicksortRandom(&a, low: p + 1, high: high)\n  }\n}\n\nvar list4 = [ 10, 0, 3, 9, 2, 14, 8, 27, 1, 5, 8, -1, 26 ]\nquicksortRandom(&list4, low: 0, high: list4.count - 1)\nlist4\n\n// *** Dutch national flag partioning ***\n\n/*\n  Swift's swap() doesn't like it if the items you're trying to swap refer to\n  the same memory location. This little wrapper simply ignores such swaps.\n*/\npublic func swap<T>(_ a: inout [T], _ i: Int, _ j: Int) {\n  if i != j {\n    a.swapAt(i, j)\n  }\n}\n\n/*\n  Dutch national flag partitioning.\n  Returns a tuple with the start and end index of the middle area.\n*/\nfunc partitionDutchFlag<T: Comparable>(_ a: inout [T], low: Int, high: Int, pivotIndex: Int) -> (Int, Int) {\n  let pivot = a[pivotIndex]\n\n  var smaller = low\n  var equal = low\n  var larger = high\n\n  while equal <= larger {\n    if a[equal] < pivot {\n      swap(&a, smaller, equal)\n      smaller += 1\n      equal += 1\n    } else if a[equal] == pivot {\n      equal += 1\n    } else {\n      swap(&a, equal, larger)\n      larger -= 1\n    }\n  }\n  return (smaller, larger)\n}\n\nvar list5 = [ 10, 0, 3, 9, 2, 14, 8, 27, 1, 5, 8, -1, 26 ]\npartitionDutchFlag(&list5, low: 0, high: list5.count - 1, pivotIndex: 10)\nlist5\n\nfunc quicksortDutchFlag<T: Comparable>(_ a: inout [T], low: Int, high: Int) {\n  if low < high {\n    let pivotIndex = random(min: low, max: high)\n    let (p, q) = partitionDutchFlag(&a, low: low, high: high, pivotIndex: pivotIndex)\n    quicksortDutchFlag(&a, low: low, high: p - 1)\n    quicksortDutchFlag(&a, low: q + 1, high: high)\n  }\n}\n\nquicksortDutchFlag(&list5, low: 0, high: list5.count - 1)\n"
  },
  {
    "path": "Quicksort/Quicksort.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Quicksort/Quicksort.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Quicksort/Quicksort.swift",
    "content": "import Foundation\n\n/*\n  Easy to understand but not very efficient.\n*/\nfunc quicksort<T: Comparable>(_ a: [T]) -> [T] {\n  guard a.count > 1 else { return a }\n\n  let pivot = a[a.count/2]\n  let less = a.filter { $0 < pivot }\n  let equal = a.filter { $0 == pivot }\n  let greater = a.filter { $0 > pivot }\n\n  return quicksort(less) + equal + quicksort(greater)\n}\n\n// MARK: - Lomuto\n\n/*\n  Lomuto's partitioning algorithm.\n\n  This is conceptually simpler than Hoare's original scheme but less efficient.\n\n  The return value is the index of the pivot element in the new array. The left\n  partition is [low...p-1]; the right partition is [p+1...high], where p is the\n  return value.\n\n  The left partition includes all values smaller than or equal to the pivot, so\n  if the pivot value occurs more than once, its duplicates will be found in the\n  left partition.\n*/\nfunc partitionLomuto<T: Comparable>(_ a: inout [T], low: Int, high: Int) -> Int {\n  // We always use the highest item as the pivot.\n  let pivot = a[high]\n\n  // This loop partitions the array into four (possibly empty) regions:\n  //   [low  ...      i] contains all values <= pivot,\n  //   [i+1  ...    j-1] contains all values > pivot,\n  //   [j    ... high-1] are values we haven't looked at yet,\n  //   [high           ] is the pivot value.\n  var i = low\n  for j in low..<high {\n    if a[j] <= pivot {\n      (a[i], a[j]) = (a[j], a[i])\n      i += 1\n    }\n  }\n\n  // Swap the pivot element with the first element that is greater than\n  // the pivot. Now the pivot sits between the <= and > regions and the\n  // array is properly partitioned.\n  (a[i], a[high]) = (a[high], a[i])\n  return i\n}\n\n/*\n  Recursive, in-place version that uses Lomuto's partioning scheme.\n*/\nfunc quicksortLomuto<T: Comparable>(_ a: inout [T], low: Int, high: Int) {\n  if low < high {\n    let p = partitionLomuto(&a, low: low, high: high)\n    quicksortLomuto(&a, low: low, high: p - 1)\n    quicksortLomuto(&a, low: p + 1, high: high)\n  }\n}\n\n// MARK: - Hoare partitioning\n\n/*\n  Hoare's partitioning scheme.\n\n  The return value is NOT necessarily the index of the pivot element in the\n  new array. Instead, the array is partitioned into [low...p] and [p+1...high],\n  where p is the return value. The pivot value is placed somewhere inside one\n  of the two partitions, but the algorithm doesn't tell you which one or where.\n\n  If the pivot value occurs more than once, then some instances may appear in\n  the left partition and others may appear in the right partition.\n\n  Hoare scheme is more efficient than Lomuto's partition scheme; it performs\n  fewer swaps.\n*/\nfunc partitionHoare<T: Comparable>(_ a: inout [T], low: Int, high: Int) -> Int {\n  let pivot = a[low]\n  var i = low - 1\n  var j = high + 1\n\n  while true {\n    repeat { j -= 1 } while a[j] > pivot\n    repeat { i += 1 } while a[i] < pivot\n\n    if i < j {\n        a.swapAt(i, j)\n    } else {\n      return j\n    }\n  }\n}\n\n/*\n  Recursive, in-place version that uses Hoare's partioning scheme. Because of\n  the choice of pivot, this performs badly if the array is already sorted.\n*/\nfunc quicksortHoare<T: Comparable>(_ a: inout [T], low: Int, high: Int) {\n  if low < high {\n    let p = partitionHoare(&a, low: low, high: high)\n    quicksortHoare(&a, low: low, high: p)\n    quicksortHoare(&a, low: p + 1, high: high)\n  }\n}\n\n// MARK: - Randomized sort\n\n/* Returns a random integer in the range min...max, inclusive. */\npublic func random(min: Int, max: Int) -> Int {\n  assert(min < max)\n  return min + Int(arc4random_uniform(UInt32(max - min + 1)))\n}\n\n/*\n  Uses a random pivot index. On average, this results in a well-balanced split\n  of the input array.\n*/\nfunc quicksortRandom<T: Comparable>(_ a: inout [T], low: Int, high: Int) {\n  if low < high {\n    // Create a random pivot index in the range [low...high].\n    let pivotIndex = random(min: low, max: high)\n\n    // Because the Lomuto scheme expects a[high] to be the pivot entry, swap\n    // a[pivotIndex] with a[high] to put the pivot element at the end.\n    (a[pivotIndex], a[high]) = (a[high], a[pivotIndex])\n\n    let p = partitionLomuto(&a, low: low, high: high)\n    quicksortRandom(&a, low: low, high: p - 1)\n    quicksortRandom(&a, low: p + 1, high: high)\n  }\n}\n\n// MARK: - Dutch national flag partitioning\n\n/*\n  Swift's swap() doesn't like it if the items you're trying to swap refer to\n  the same memory location. This little wrapper simply ignores such swaps.\n*/\npublic func swap<T>(_ a: inout [T], _ i: Int, _ j: Int) {\n  if i != j {\n    a.swapAt(i, j)\n  }\n}\n\n/*\n  Dutch national flag partitioning\n\n  Partitions the array into three sections: all element smaller than the pivot,\n  all elements equal to the pivot, and all larger elements.\n\n  This makes for a more efficient Quicksort if the array contains many duplicate\n  elements.\n\n  Returns a tuple with the start and end index of the middle area. For example,\n  on [0,1,2,3,3,3,4,5] it returns (3, 5). Note: These indices are relative to 0,\n  not to \"low\"!\n\n  The number of occurrences of the pivot is: result.1 - result.0 + 1\n\n  Time complexity is O(n), space complexity is O(1).\n*/\nfunc partitionDutchFlag<T: Comparable>(_ a: inout [T], low: Int, high: Int, pivotIndex: Int) -> (Int, Int) {\n  let pivot = a[pivotIndex]\n\n  var smaller = low\n  var equal = low\n  var larger = high\n\n  // This loop partitions the array into four (possibly empty) regions:\n  //   [low    ...smaller-1] contains all values < pivot,\n  //   [smaller...  equal-1] contains all values == pivot,\n  //   [equal  ...   larger] contains all values > pivot,\n  //   [larger ...     high] are values we haven't looked at yet.\n  while equal <= larger {\n    if a[equal] < pivot {\n      swap(&a, smaller, equal)\n      smaller += 1\n      equal += 1\n    } else if a[equal] == pivot {\n      equal += 1\n    } else {\n      swap(&a, equal, larger)\n      larger -= 1\n    }\n  }\n  return (smaller, larger)\n}\n\n/*\n  Uses Dutch national flag partitioning and a random pivot index.\n*/\nfunc quicksortDutchFlag<T: Comparable>(_ a: inout [T], low: Int, high: Int) {\n  if low < high {\n    let pivotIndex = random(min: low, max: high)\n    let (p, q) = partitionDutchFlag(&a, low: low, high: high, pivotIndex: pivotIndex)\n    quicksortDutchFlag(&a, low: low, high: p - 1)\n    quicksortDutchFlag(&a, low: q + 1, high: high)\n  }\n}\n"
  },
  {
    "path": "Quicksort/README.markdown",
    "content": "# Quicksort\n\nGoal: Sort an array from low to high (or high to low).\n\nQuicksort is one of the most famous algorithms in history. It was invented way back in 1959 by Tony Hoare, at a time when recursion was still a fairly nebulous concept.\n\nHere's an implementation in Swift that should be easy to understand:\n\n```swift\nfunc quicksort<T: Comparable>(_ a: [T]) -> [T] {\n  guard a.count > 1 else { return a }\n\n  let pivot = a[a.count/2]\n  let less = a.filter { $0 < pivot }\n  let equal = a.filter { $0 == pivot }\n  let greater = a.filter { $0 > pivot }\n\n  return quicksort(less) + equal + quicksort(greater)\n}\n```\n\nPut this code in a playground and test it like so:\n\n```swift\nlet list = [ 10, 0, 3, 9, 2, 14, 8, 27, 1, 5, 8, -1, 26 ]\nquicksort(list)\n```\n\nHere's how it works. When given an array, `quicksort()` splits it up into three parts based on a \"pivot\" variable. Here, the pivot is taken to be the element in the middle of the array (later on you'll see other ways to choose the pivot).\n\nAll the elements less than the pivot go into a new array called `less`. All the elements equal to the pivot go into the `equal` array. And you guessed it, all elements greater than the pivot go into the third array, `greater`. This is why the generic type `T` must be `Comparable`, so we can compare the elements with `<`, `==`, and `>`.\n\nOnce we have these three arrays, `quicksort()` recursively sorts the `less` array and the `greater` array, then glues those sorted subarrays back together with the `equal` array to get the final result.\n\n## An example\n\nLet's walk through the example. The array is initially:\n\n\t[ 10, 0, 3, 9, 2, 14, 8, 27, 1, 5, 8, -1, 26 ]\n\nFirst, we pick the pivot element. That is `8` because it's in the middle of the array. Now we split the array into the less, equal, and greater parts:\n\n\tless:    [ 0, 3, 2, 1, 5, -1 ]\n\tequal:   [ 8, 8 ]\n\tgreater: [ 10, 9, 14, 27, 26 ]\n\nThis is a good split because `less` and `greater` roughly contain the same number of elements. So we've picked a good pivot that chopped the array right down the middle.\n\nNote that the `less` and `greater` arrays aren't sorted yet, so we call `quicksort()` again to sort those two subarrays. That does the exact same thing: pick a pivot and split the subarray into three even smaller parts.\n\nLet's just take a look at the `less` array:\n\n\t[ 0, 3, 2, 1, 5, -1 ]\n\nThe pivot element is the one in the middle, `1`. (You could also have picked `2`, it doesn't matter.) Again, we create three subarrays around the pivot:\n\n\tless:    [ 0, -1 ]\n\tequal:   [ 1 ]\n\tgreater: [ 3, 2, 5 ]\n\nWe're not done yet and `quicksort()` again is called recursively on the `less` and `greater` arrays. Let's look at `less` again:\n\n\t[ 0, -1 ]\n\nAs pivot we pick `-1`. Now the subarrays are:\n\n\tless:    [ ]\n\tequal:   [ -1 ]\n\tgreater: [ 0 ]\n\nThe `less` array is empty because there was no value smaller than `-1`; the other arrays contain a single element each. That means we're done at this level of the recursion, and we go back up to sort the previous `greater` array.\n\nThat `greater` array was:\n\n\t[ 3, 2, 5 ]\n\nThis works just the same way as before: we pick the middle element `2` as the pivot and fill up the subarrays:\n\n\tless:    [ ]\n\tequal:   [ 2 ]\n\tgreater: [ 3, 5 ]\n\nNote that here it would have been better to pick `3` as the pivot -- we would have been done sooner. But now we have to recurse into the `greater` array again to make sure it is sorted. This is why picking a good pivot is important. When you pick too many \"bad\" pivots, quicksort actually becomes really slow. More on that below.\n\nWhen we partition the `greater` subarray, we find:\n\n\tless:    [ 3 ]\n\tequal:   [ 5 ]\n\tgreater: [ ]\n\nAnd now we're done at this level of the recursion because we can't split up the arrays any further.\n\nThis process repeats until all the subarrays have been sorted. In a picture:\n\n![Example](Images/Example.png)\n\nNow if you read the colored boxes from left to right, you get the sorted array:\n\n\t[ -1, 0, 1, 2, 3, 5, 8, 8, 9, 10, 14, 26, 27 ]\n\nThis shows that `8` was a good initial pivot because it appears in the middle of the sorted array too.\n\nI hope this makes the basic principle clear of how quicksort works. Unfortunately, this version of quicksort isn't very quick, because we `filter()` the same array three times. There are more clever ways to split up the array.\n\n## Partitioning\n\nDividing the array around the pivot is called *partitioning* and there are a few different partitioning schemes.\n\nIf the array is,\n\n\t[ 10, 0, 3, 9, 2, 14, 8, 27, 1, 5, 8, -1, 26 ]\n\nand we choose the middle element `8` as a pivot then after partitioning the array will look like this:\n\n\t[ 0, 3, 2, 1, 5, -1, 8, 8, 10, 9, 14, 27, 26 ]\n\t  -----------------        -----------------\n\t  all elements < 8         all elements > 8\n\nThe key thing to realize is that after partitioning the pivot element is in its final sorted place already. The rest of the numbers are not sorted yet, they are simply partitioned around the pivot value. Quicksort partitions the array many times over, until all the values are in their final places.\n\nThere is no guarantee that partitioning keeps the elements in the same relative order, so after partitioning around pivot `8` you could also end up with something like this:\n\n\t[ 3, 0, 5, 2, -1, 1, 8, 8, 14, 26, 10, 27, 9 ]\n\nThe only guarantee is that to the left of the pivot are all the smaller elements and to the right are all the larger elements. Because partitioning can change the original order of equal elements, quicksort does not produce a \"stable\" sort (unlike [merge sort](../Merge%20Sort/), for example). Most of the time that's not a big deal.\n\n## Lomuto's partitioning scheme\n\nIn the first example of quicksort I showed you, partitioning was done by calling Swift's `filter()` function three times. That is not very efficient. So let's look at a smarter partitioning algorithm that works *in place*, i.e. by modifying the original array.\n\nHere's an implementation of Lomuto's partitioning scheme in Swift:\n\n```swift\nfunc partitionLomuto<T: Comparable>(_ a: inout [T], low: Int, high: Int) -> Int {\n  let pivot = a[high]\n\n  var i = low\n  for j in low..<high {\n    if a[j] <= pivot {\n\t  a.swapAt(i, j)\n      i += 1\n    }\n  }\n\n  a.swapAt(i, high)\n  return i\n}\n```\n\nTo test this in a playground, do:\n\n```swift\nvar list = [ 10, 0, 3, 9, 2, 14, 26, 27, 1, 5, 8, -1, 8 ]\nlet p = partitionLomuto(&list, low: 0, high: list.count - 1)\nlist  // show the results\n```\n\nNote that `list` needs to be a `var` because `partitionLomuto()` directly changes the contents of the array (it is passed as an `inout` parameter). That is much more efficient than allocating a new array object.\n\nThe `low` and `high` parameters are necessary because when this is used inside quicksort, you don't always want to (re)partition the entire array, only a limited range that becomes smaller and smaller.\n\nPreviously we used the middle array element as the pivot but it's important to realize that the Lomuto algorithm always uses the *last* element, `a[high]`, for the pivot. Because we've been pivoting around `8` all this time, I swapped the positions of `8` and `26` in the example so that `8` is at the end of the array and is used as the pivot value here too.\n\nAfter partitioning, the array looks like this:\n\n\t[ 0, 3, 2, 1, 5, 8, -1, 8, 9, 10, 14, 26, 27 ]\n\t                        *\n\nThe variable `p` contains the return value of the call to `partitionLomuto()` and is 7. This is the index of the pivot element in the new array (marked with a star).\n\nThe left partition goes from 0 to `p-1` and is `[ 0, 3, 2, 1, 5, 8, -1 ]`. The right partition goes from `p+1` to the end, and is `[ 9, 10, 14, 26, 27 ]` (the fact that the right partition is already sorted is a coincidence).\n\nYou may notice something interesting... The value `8` occurs more than once in the array. One of those `8`s did not end up neatly in the middle but somewhere in the left partition. That's a small downside of the Lomuto algorithm as it makes quicksort slower if there are a lot of duplicate elements.\n\nSo how does the Lomuto algorithm actually work? The magic happens in the `for` loop. This loop divides the array into four regions:\n\n1. `a[low...i]` contains all values <= pivot\n2. `a[i+1...j-1]` contains all values > pivot\n3. `a[j...high-1]` are values we haven't looked at yet\n4. `a[high]` is the pivot value\n\nIn ASCII art the array is divided up like this:\n\n\t[ values <= pivot | values > pivot | not looked at yet | pivot ]\n\t  low           i   i+1        j-1   j          high-1   high\n\nThe loop looks at each element from `low` to `high-1` in turn. If the value of the current element is less than or equal to the pivot, it is moved into the first region using a swap.\n\n> **Note:** In Swift, the notation `(x, y) = (y, x)` is a convenient way to perform a swap between the values of `x` and `y`. You can also write `swap(&x, &y)`.\n\nAfter the loop is over, the pivot is still the last element in the array. So we swap it with the first element that is greater than the pivot. Now the pivot sits between the <= and > regions and the array is properly partitioned.\n\nLet's step through the example. The array we're starting with is:\n\n\t[| 10, 0, 3, 9, 2, 14, 26, 27, 1, 5, 8, -1 | 8 ]\n\t   low                                       high\n\t   i\n\t   j\n\nInitially, the \"not looked at\" region stretches from index 0 to 11. The pivot is at index 12. The \"values <= pivot\" and \"values > pivot\" regions are empty, because we haven't looked at any values yet.\n\nLook at the first value, `10`. Is this smaller than the pivot? No, skip to the next element.\t  \n\n\t[| 10 | 0, 3, 9, 2, 14, 26, 27, 1, 5, 8, -1 | 8 ]\n\t   low                                        high\n\t   i\n\t       j\n\nNow the \"not looked at\" region goes from index 1 to 11, the \"values > pivot\" region contains the number `10`, and \"values <= pivot\" is still empty.\n\nLook at the second value, `0`. Is this smaller than the pivot? Yes, so swap `10` with `0` and move `i` ahead by one.\n\n\t[ 0 | 10 | 3, 9, 2, 14, 26, 27, 1, 5, 8, -1 | 8 ]\n\t  low                                         high\n\t      i\n\t           j\n\nNow \"not looked at\" goes from index 2 to 11, \"values > pivot\" still contains `10`, and \"values <= pivot\" contains the number `0`.\n\nLook at the third value, `3`. This is smaller than the pivot, so swap it with `10` to get:\n\n\t[ 0, 3 | 10 | 9, 2, 14, 26, 27, 1, 5, 8, -1 | 8 ]\n\t  low                                         high\n\t         i\n\t             j\n\nThe \"values <= pivot\" region is now `[ 0, 3 ]`. Let's do one more... `9` is greater than the pivot, so simply skip ahead:\n\n\t[ 0, 3 | 10, 9 | 2, 14, 26, 27, 1, 5, 8, -1 | 8 ]\n\t  low                                         high\n\t         i\n\t                 j\n\nNow the \"values > pivot\" region contains `[ 10, 9 ]`. If we keep going this way, then eventually we end up with:\n\n\t[ 0, 3, 2, 1, 5, 8, -1 | 27, 9, 10, 14, 26 | 8 ]\n\t  low                                        high\n\t                         i                   j\n\nThe final thing to do is to put the pivot into place by swapping `a[i]` with `a[high]`:\n\n\t[ 0, 3, 2, 1, 5, 8, -1 | 8 | 9, 10, 14, 26, 27 ]\n\t  low                                       high\n\t                         i                  j\n\nAnd we return `i`, the index of the pivot element.\n\n> **Note:** If you're still not entirely clear on how the algorithm works, I suggest you play with this in the playground to see exactly how the loop creates these four regions.\n\nLet's use this partitioning scheme to build quicksort. Here's the code:\n\n```swift\nfunc quicksortLomuto<T: Comparable>(_ a: inout [T], low: Int, high: Int) {\n  if low < high {\n    let p = partitionLomuto(&a, low: low, high: high)\n    quicksortLomuto(&a, low: low, high: p - 1)\n    quicksortLomuto(&a, low: p + 1, high: high)\n  }\n}\n```\n\nThis is now super simple. We first call `partitionLomuto()` to reorder the array around the pivot (which is always the last element from the array). And then we call `quicksortLomuto()` recursively to sort the left and right partitions.\n\nTry it out:\n\n```swift\nvar list = [ 10, 0, 3, 9, 2, 14, 26, 27, 1, 5, 8, -1, 8 ]\nquicksortLomuto(&list, low: 0, high: list.count - 1)\n```\n\nLomuto's isn't the only partitioning scheme but it's probably the easiest to understand. It's not as efficient as Hoare's scheme, which requires fewer swap operations.\n\n## Hoare's partitioning scheme\n\nThis partitioning scheme is by Hoare, the inventor of quicksort.\n\nHere is the code:\n\n```Swift\nfunc partitionHoare<T: Comparable>(_ a: inout [T], low: Int, high: Int) -> Int {\n  let pivot = a[low]\n  var i = low - 1\n  var j = high + 1\n\n  while true {\n    repeat { j -= 1 } while a[j] > pivot\n    repeat { i += 1 } while a[i] < pivot\n\n    if i < j {\n      a.swapAt(i, j)\n    } else {\n      return j\n    }\n  }\n}\n```\n\nTo test this in a playground, do:\n\n```swift\nvar list = [ 8, 0, 3, 9, 2, 14, 10, 27, 1, 5, 8, -1, 26 ]\nlet p = partitionHoare(&list, low: 0, high: list.count - 1)\nlist  // show the results\n```\n\nNote that with Hoare's scheme, the pivot is always expected to be the *first* element in the array, `a[low]`. Again, we're using `8` as the pivot element.\n\nThe result is:\n\n\t[ -1, 0, 3, 8, 2, 5, 1, 27, 10, 14, 9, 8, 26 ]\n\nNote that this time the pivot isn't in the middle at all. Unlike with Lomuto's scheme, the return value is not necessarily the index of the pivot element in the new array.\n\nInstead, the array is partitioned into the regions `[low...p]` and `[p+1...high]`. Here, the return value `p` is 6, so the two partitions are `[ -1, 0, 3, 8, 2, 5, 1 ]` and `[ 27, 10, 14, 9, 8, 26 ]`.\n\nThe pivot is placed somewhere inside one of the two partitions, but the algorithm doesn't tell you which one or where. If the pivot value occurs more than once, then some instances may appear in the left partition and others may appear in the right partition.\n\nBecause of these differences, the implementation of Hoare's quicksort is slightly different:\n\n```swift\nfunc quicksortHoare<T: Comparable>(_ a: inout [T], low: Int, high: Int) {\n  if low < high {\n    let p = partitionHoare(&a, low: low, high: high)\n    quicksortHoare(&a, low: low, high: p)\n    quicksortHoare(&a, low: p + 1, high: high)\n  }\n}\n```\n\nI'll leave it as an exercise for the reader to figure out exactly how Hoare's partitioning scheme works. :-)\n\n## Picking a good pivot\n\nLomuto's partitioning scheme always chooses the last array element for the pivot. Hoare's scheme uses the first element. But there is no guarantee that these pivots are any good.\n\nHere is what happens when you pick a bad value for the pivot. Let's say the array is,\n\n\t[ 7, 6, 5, 4, 3, 2, 1 ]\n\nand we're using Lomuto's scheme. The pivot is the last element, `1`. After pivoting, we have the following arrays:\n\n\t   less than pivot: [ ]\n\t    equal to pivot: [ 1 ]\n\tgreater than pivot: [ 7, 6, 5, 4, 3, 2 ]\n\nNow recursively partition the \"greater than\" subarray and get:\n\n\t   less than pivot: [ ]\n\t    equal to pivot: [ 2 ]\n\tgreater than pivot: [ 7, 6, 5, 4, 3 ]\n\nAnd again:\n\n\t   less than pivot: [ ]\n\t    equal to pivot: [ 3 ]\n\tgreater than pivot: [ 7, 6, 5, 4 ]\n\nAnd so on...\n\nThat's no good, because this pretty much reduces quicksort to the much slower insertion sort. For quicksort to be efficient, it needs to split the array into roughly two halves.\n\nThe optimal pivot for this example would have been `4`, so we'd get:\n\n\t   less than pivot: [ 3, 2, 1 ]\n\t    equal to pivot: [ 4 ]\n\tgreater than pivot: [ 7, 6, 5 ]\n\nYou might think this means we should always choose the middle element rather than the first or the last, but imagine what happens in the following situation:\n\n\t[ 7, 6, 5, 1, 4, 3, 2 ]\n\nNow the middle element is `1` and that gives the same lousy results as in the previous example.\n\nIdeally, the pivot is the *median* element of the array that you're partitioning, i.e. the element that sits in the middle of the sorted array. Of course, you won't know what the median is until after you've sorted the array, so this is a bit of a chicken-and-egg problem. However, there are some tricks to choose good, if not ideal, pivots.\n\nOne trick is \"median-of-three\", where you find the median of the first, middle, and last element in this subarray. In theory that often gives a good approximation of the true median.\n\nAnother common solution is to choose the pivot randomly. Sometimes this may result in choosing a suboptimal pivot but on average this gives very good results.\n\nHere is how you can do quicksort with a randomly chosen pivot:\n\n```swift\nfunc quicksortRandom<T: Comparable>(_ a: inout [T], low: Int, high: Int) {\n  if low < high {\n    let pivotIndex = random(min: low, max: high)         // 1\n\n    (a[pivotIndex], a[high]) = (a[high], a[pivotIndex])  // 2\n\n    let p = partitionLomuto(&a, low: low, high: high)\n    quicksortRandom(&a, low: low, high: p - 1)\n    quicksortRandom(&a, low: p + 1, high: high)\n  }\n}\n```\n\nThere are two important differences with before:\n\n1. The `random(min:max:)` function returns an integer in the range `min...max`, inclusive. This is our pivot index.\n\n2. Because the Lomuto scheme expects `a[high]` to be the pivot entry, we swap `a[pivotIndex]` with `a[high]` to put the pivot element at the end before calling `partitionLomuto()`.\n\nIt may seem strange to use random numbers in something like a sorting function, but it is necessary to make quicksort behave efficiently under all circumstances. With bad pivots, the performance of quicksort can be quite horrible, **O(n^2)**. But if you choose good pivots on average, for example by using a random number generator, the expected running time becomes **O(n log n)**, which is as good as sorting algorithms get.\n\n## Dutch national flag partitioning\n\nBut there are more improvements to make! In the first example of quicksort I showed you, we ended up with an array that was partitioned like this:\n\n\t[ values < pivot | values equal to pivot | values > pivot ]\n\nBut as you've seen with the Lomuto partitioning scheme, if the pivot occurs more than once the duplicates end up in the left half. And with Hoare's scheme the pivot can be all over the place. The solution to this is \"Dutch national flag\" partitioning, named after the fact that the [Dutch flag](https://en.wikipedia.org/wiki/Flag_of_the_Netherlands) has three bands just like we want to have three partitions.\n\nThe code for this scheme is:\n\n```swift\nfunc partitionDutchFlag<T: Comparable>(_ a: inout [T], low: Int, high: Int, pivotIndex: Int) -> (Int, Int) {\n  let pivot = a[pivotIndex]\n\n  var smaller = low\n  var equal = low\n  var larger = high\n\n  while equal <= larger {\n    if a[equal] < pivot {\n      swap(&a, smaller, equal)\n      smaller += 1\n      equal += 1\n    } else if a[equal] == pivot {\n      equal += 1\n    } else {\n      swap(&a, equal, larger)\n      larger -= 1\n    }\n  }\n  return (smaller, larger)\n}\n```\n\nThis works very similarly to the Lomuto scheme, except that the loop partitions the array into four (possibly empty) regions:\n\n- `[low ... smaller-1]` contains all values < pivot\n- `[smaller ... equal-1]` contains all values == pivot\n- `[equal ... larger]` contains all values > pivot\n- `[larger ... high]` are values we haven't looked at yet\n\nNote that this doesn't assume the pivot is in `a[high]`. Instead, you have to pass in the index of the element you wish to use as a pivot.\n\nAn example of how to use it:\n\n```swift\nvar list = [ 10, 0, 3, 9, 2, 14, 8, 27, 1, 5, 8, -1, 26 ]\npartitionDutchFlag(&list, low: 0, high: list.count - 1, pivotIndex: 10)\nlist  // show the results\n```\n\nJust for fun, we're giving it the index of the other `8` this time. The result is:\n\n\t[ -1, 0, 3, 2, 5, 1, 8, 8, 27, 14, 9, 26, 10 ]\n\nNotice how the two `8`s are in the middle now. The return value from `partitionDutchFlag()` is a tuple, `(6, 7)`. This is the range that contains the pivot value(s).\n\nHere is how you would use it in quicksort:\n\n```swift\nfunc quicksortDutchFlag<T: Comparable>(_ a: inout [T], low: Int, high: Int) {\n  if low < high {\n    let pivotIndex = random(min: low, max: high)\n    let (p, q) = partitionDutchFlag(&a, low: low, high: high, pivotIndex: pivotIndex)\n    quicksortDutchFlag(&a, low: low, high: p - 1)\n    quicksortDutchFlag(&a, low: q + 1, high: high)\n  }\n}\n```\n\nUsing Dutch flag partitioning makes for a more efficient quicksort if the array contains many duplicate elements. (And I'm not just saying that because I'm Dutch!)\n\n> **Note:** The above implementation of `partitionDutchFlag()` uses a custom `swap()` routine for swapping the contents of two array elements. Unlike Swift's own `swap()`, this doesn't give an error when the two indices refer to the same array element. See [Quicksort.swift](Quicksort.swift) for the code.\n\n## See also\n\n[Quicksort on Wikipedia](https://en.wikipedia.org/wiki/Quicksort)\n\n*Written for Swift Algorithm Club by Matthijs Hollemans*\n"
  },
  {
    "path": "Quicksort/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Quicksort/Tests/QuicksortTests.swift",
    "content": "import XCTest\n\nclass QuicksortTests: XCTestCase {\n  func testQuicksort() {\n    checkSortAlgorithm(quicksort)\n  }\n\n  fileprivate typealias QuicksortFunction = (inout [Int], _ low: Int, _ high: Int) -> Void\n\n  fileprivate func checkQuicksort(_ function: QuicksortFunction) {\n    checkSortAlgorithm { (a: [Int]) -> [Int] in\n      var b = a\n      function(&b, 0, b.count - 1)\n      return b\n    }\n  }\n\n  func testQuicksortLomuto() {\n    checkQuicksort(quicksortLomuto)\n  }\n\n  func testQuicksortHoare() {\n    checkQuicksort(quicksortHoare)\n  }\n\n  func testQuicksortRandom() {\n    checkQuicksort(quicksortRandom)\n  }\n\n  func testQuicksortDutchFlag() {\n    checkQuicksort(quicksortDutchFlag)\n  }\n}\n"
  },
  {
    "path": "Quicksort/Tests/SortingTestHelpers.swift",
    "content": "import XCTest\n\nfunc randomArray(_ size: Int) -> [Int] {\n  var a = [Int]()\n  for _ in 1...size {\n    a.append(Int(arc4random_uniform(1000)))\n  }\n  return a\n}\n\nfunc arrayIsSortedLowToHigh(_ a: [Int]) -> Bool {\n  for x in 1..<a.count {\n    if a[x - 1] > a[x] { return false }\n  }\n  return true\n}\n\ntypealias SortFunction = ([Int]) -> [Int]\n\nfunc checkSortingRandomArray(_ sortFunction: SortFunction) {\n  let numberOfIterations = 100\n  for _ in 1...numberOfIterations {\n    let a = randomArray(Int(arc4random_uniform(100)) + 1)\n    let s = sortFunction(a)\n    XCTAssertEqual(a.count, s.count)\n    XCTAssertTrue(arrayIsSortedLowToHigh(s))\n  }\n}\n\nfunc checkSortingEmptyArray(_ sortFunction: SortFunction) {\n  let a = [Int]()\n  let s = sortFunction(a)\n  XCTAssertEqual(s.count, 0)\n}\n\nfunc checkSortingArrayOneElement(_ sortFunction: SortFunction) {\n  let a = [123]\n  let s = sortFunction(a)\n  XCTAssertEqual(s, [123])\n}\n\nfunc checkSortingArrayTwoElementsInOrder(_ sortFunction: SortFunction) {\n  let a = [123, 456]\n  let s = sortFunction(a)\n  XCTAssertEqual(s, [123, 456])\n}\n\nfunc checkSortingArrayTwoElementsOutOfOrder(_ sortFunction: SortFunction) {\n  let a = [456, 123]\n  let s = sortFunction(a)\n  XCTAssertEqual(s, [123, 456])\n}\n\nfunc checkSortingArrayTwoEqualElements(_ sortFunction: SortFunction) {\n  let a = [123, 123]\n  let s = sortFunction(a)\n  XCTAssertEqual(s, [123, 123])\n}\n\nfunc checkSortingArrayThreeElementsABC(_ sortFunction: SortFunction) {\n  let a = [2, 4, 6]\n  let s = sortFunction(a)\n  XCTAssertEqual(s, [2, 4, 6])\n}\n\nfunc checkSortingArrayThreeElementsACB(_ sortFunction: SortFunction) {\n  let a = [2, 6, 4]\n  let s = sortFunction(a)\n  XCTAssertEqual(s, [2, 4, 6])\n}\n\nfunc checkSortingArrayThreeElementsBAC(_ sortFunction: SortFunction) {\n  let a = [4, 2, 6]\n  let s = sortFunction(a)\n  XCTAssertEqual(s, [2, 4, 6])\n}\n\nfunc checkSortingArrayThreeElementsBCA(_ sortFunction: SortFunction) {\n  let a = [4, 6, 2]\n  let s = sortFunction(a)\n  XCTAssertEqual(s, [2, 4, 6])\n}\n\nfunc checkSortingArrayThreeElementsCAB(_ sortFunction: SortFunction) {\n  let a = [6, 2, 4]\n  let s = sortFunction(a)\n  XCTAssertEqual(s, [2, 4, 6])\n}\n\nfunc checkSortingArrayThreeElementsCBA(_ sortFunction: SortFunction) {\n  let a = [6, 4, 2]\n  let s = sortFunction(a)\n  XCTAssertEqual(s, [2, 4, 6])\n}\n\nfunc checkSortAlgorithm(_ sortFunction: SortFunction) {\n  checkSortingEmptyArray(sortFunction)\n  checkSortingArrayOneElement(sortFunction)\n  checkSortingArrayTwoElementsInOrder(sortFunction)\n  checkSortingArrayTwoElementsOutOfOrder(sortFunction)\n  checkSortingArrayTwoEqualElements(sortFunction)\n  checkSortingArrayThreeElementsABC(sortFunction)\n  checkSortingArrayThreeElementsACB(sortFunction)\n  checkSortingArrayThreeElementsBAC(sortFunction)\n  checkSortingArrayThreeElementsBCA(sortFunction)\n  checkSortingArrayThreeElementsCAB(sortFunction)\n  checkSortingArrayThreeElementsCBA(sortFunction)\n  checkSortingRandomArray(sortFunction)\n}\n\nfunc checkSortAlgorithm(_ sortFunction: @escaping ([Int], (Int, Int) -> Bool) -> [Int]) {\n  checkSortAlgorithm { a in sortFunction(a, <) }\n}\n"
  },
  {
    "path": "Quicksort/Tests/Tests-Quicksort.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t7B80C3E61C77A4CA003CECC7 /* Quicksort.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C3E51C77A4CA003CECC7 /* Quicksort.swift */; };\n\t\t7B80C3E91C77A4D0003CECC7 /* QuicksortTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C3E71C77A4D0003CECC7 /* QuicksortTests.swift */; };\n\t\t7B80C3EA1C77A4D0003CECC7 /* SortingTestHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C3E81C77A4D0003CECC7 /* SortingTestHelpers.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t7B2BBC801C779D720067B71D /* Tests-Quicksort.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = \"Tests-Quicksort.xctest\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7B2BBC941C779E7B0067B71D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };\n\t\t7B80C3E51C77A4CA003CECC7 /* Quicksort.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Quicksort.swift; path = ../Quicksort.swift; sourceTree = SOURCE_ROOT; };\n\t\t7B80C3E71C77A4D0003CECC7 /* QuicksortTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QuicksortTests.swift; sourceTree = SOURCE_ROOT; };\n\t\t7B80C3E81C77A4D0003CECC7 /* SortingTestHelpers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SortingTestHelpers.swift; sourceTree = SOURCE_ROOT; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t7B2BBC7D1C779D720067B71D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t7B2BBC681C779D710067B71D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC831C779D720067B71D /* Tests */,\n\t\t\t\t7B2BBC721C779D710067B71D /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC721C779D710067B71D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC801C779D720067B71D /* Tests-Quicksort.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC831C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B80C3E51C77A4CA003CECC7 /* Quicksort.swift */,\n\t\t\t\t7B80C3E71C77A4D0003CECC7 /* QuicksortTests.swift */,\n\t\t\t\t7B80C3E81C77A4D0003CECC7 /* SortingTestHelpers.swift */,\n\t\t\t\t7B2BBC941C779E7B0067B71D /* Info.plist */,\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tpath = TestsTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t7B2BBC7F1C779D720067B71D /* Tests-Quicksort */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests-Quicksort\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t7B2BBC7C1C779D720067B71D /* Sources */,\n\t\t\t\t7B2BBC7D1C779D720067B71D /* Frameworks */,\n\t\t\t\t7B2BBC7E1C779D720067B71D /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"Tests-Quicksort\";\n\t\t\tproductName = TestsTests;\n\t\t\tproductReference = 7B2BBC801C779D720067B71D /* Tests-Quicksort.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t7B2BBC691C779D710067B71D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0720;\n\t\t\t\tLastUpgradeCheck = 1000;\n\t\t\t\tORGANIZATIONNAME = \"Swift Algorithm Club\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t7B2BBC7F1C779D720067B71D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2;\n\t\t\t\t\t\tLastSwiftMigration = 0900;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests-Quicksort\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 7B2BBC681C779D710067B71D;\n\t\t\tproductRefGroup = 7B2BBC721C779D710067B71D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t7B2BBC7F1C779D720067B71D /* Tests-Quicksort */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t7B2BBC7E1C779D720067B71D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t7B2BBC7C1C779D720067B71D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7B80C3EA1C77A4D0003CECC7 /* SortingTestHelpers.swift in Sources */,\n\t\t\t\t7B80C3E61C77A4CA003CECC7 /* Quicksort.swift in Sources */,\n\t\t\t\t7B80C3E91C77A4D0003CECC7 /* QuicksortTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t7B2BBC871C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Off;\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC881C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Off;\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t7B2BBC8D1C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Off;\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC8E1C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Off;\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests-Quicksort\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC871C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC881C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests-Quicksort\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC8D1C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC8E1C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 7B2BBC691C779D710067B71D /* Project object */;\n}\n"
  },
  {
    "path": "Quicksort/Tests/Tests-Quicksort.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:/Users/kaichen/src/swift-algorithm-club/Quicksort/Tests/Tests-Quicksort.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Quicksort/Tests/Tests-Quicksort.xcodeproj/xcshareddata/xcschemes/Tests-Quicksort.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1000\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests-Quicksort.xctest\"\n               BlueprintName = \"Tests-Quicksort\"\n               ReferencedContainer = \"container:Tests-Quicksort.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "README.markdown",
    "content": "![Swift Algorithm Club](Images/SwiftAlgorithm-410-transp.png)\n\n# Welcome to the Swift Algorithm Club!\n\nHere you'll find implementations of popular algorithms and data structures in everyone's favorite new language Swift, with detailed explanations of how they work.\n\nIf you're a computer science student who needs to learn this stuff for exams -- or if you're a self-taught programmer who wants to brush up on the theory behind your craft -- you've come to the right place!\n\nThe goal of this project is to **explain how algorithms work**. The focus is on clarity and readability of the code, not on making a reusable library that you can drop into your own projects. That said, most of the code should be ready for production use but you may need to tweak it to fit into your own codebase.\n\nCode is compatible with **Xcode 10** and **Swift 4.2**. We'll keep this updated with the latest version of Swift. If you're interested in a GitHub pages version of the repo, check out [this](https://aquarchitect.github.io/swift-algorithm-club/).\n\n:heart_eyes: **Suggestions and contributions are welcome!** :heart_eyes:\n\n## Important links\n\n[What are algorithms and data structures?](What%20are%20Algorithms.markdown) Pancakes!\n\n[Why learn algorithms?](Why%20Algorithms.markdown) Worried this isn't your cup of tea? Then read this.\n\n[Big-O notation](Big-O%20Notation.markdown). We often say things like, \"This algorithm is **O(n)**.\" If you don't know what that means, read this first.\n\n[Algorithm design techniques](Algorithm%20Design.markdown). How do you create your own algorithms?\n\n[How to contribute](https://github.com/raywenderlich/swift-algorithm-club/blob/master/.github/CONTRIBUTING.md). Report an issue to leave feedback, or submit a pull request.\n\n## Where to start?\n\nIf you're new to algorithms and data structures, here are a few good ones to start out with:\n\n- [Stack](Stack/)\n- [Queue](Queue/)\n- [Insertion Sort](Insertion%20Sort/)\n- [Binary Search](Binary%20Search/) and [Binary Search Tree](Binary%20Search%20Tree/)\n- [Merge Sort](Merge%20Sort/)\n- [Boyer-Moore string search](Boyer-Moore-Horspool/)\n\n## The algorithms\n\n### Searching\n\n- [Linear Search](Linear%20Search/). Find an element in an array.\n- [Binary Search](Binary%20Search/). Quickly find elements in a sorted array.\n- [Count Occurrences](Count%20Occurrences/). Count how often a value appears in an array.\n- [Select Minimum / Maximum](Select%20Minimum%20Maximum). Find the minimum/maximum value in an array.\n- [k-th Largest Element](Kth%20Largest%20Element/). Find the *k*-th largest element in an array, such as the median.\n- [Selection Sampling](Selection%20Sampling/). Randomly choose a bunch of items from a collection.\n- [Union-Find](Union-Find/). Keeps track of disjoint sets and lets you quickly merge them.\n\n\n### String Search\n\n- [Brute-Force String Search](Brute-Force%20String%20Search/). A naive method.\n- [Boyer-Moore](Boyer-Moore-Horspool/). A fast method to search for substrings. It skips ahead based on a look-up table, to avoid looking at every character in the text.\n- [Knuth-Morris-Pratt](Knuth-Morris-Pratt/). A linear-time string algorithm that returns indexes of all occurrencies of a given pattern.\n- [Rabin-Karp](Rabin-Karp/)  Faster search by using hashing.\n- [Longest Common Subsequence](Longest%20Common%20Subsequence/). Find the longest sequence of characters that appear in the same order in both strings.\n- [Z-Algorithm](Z-Algorithm/). Finds all instances of a pattern in a String, and returns the indexes of where the pattern starts within the String.\n\n### Sorting\n\nIt's fun to see how sorting algorithms work, but in practice you'll almost never have to provide your own sorting routines. Swift's own `sort()` is more than up to the job. But if you're curious, read on...\n\nBasic sorts:\n\n- [Insertion Sort](Insertion%20Sort/)\n- [Selection Sort](Selection%20Sort/)\n- [Shell Sort](Shell%20Sort/)\n\nFast sorts:\n\n- [Quicksort](Quicksort/)\n- [Merge Sort](Merge%20Sort/)\n- [Heap Sort](Heap%20Sort/)\n\nHybrid sorts:\n\n- [Introsort](Introsort/)\n\nSpecial-purpose sorts:\n\n- [Counting Sort](Counting%20Sort/)\n- [Radix Sort](Radix%20Sort/)\n- [Topological Sort](Topological%20Sort/)\n\nBad sorting algorithms (don't use these!):\n\n- [Bubble Sort](Bubble%20Sort/)\n- [Slow Sort](Slow%20Sort/)\n\n### Compression\n\n- [Run-Length Encoding (RLE)](Run-Length%20Encoding/). Store repeated values as a single byte and a count.\n- [Huffman Coding](Huffman%20Coding/). Store more common elements using a smaller number of bits.\n\n### Miscellaneous\n\n- [Shuffle](Shuffle/). Randomly rearranges the contents of an array.\n- [Comb Sort](Comb%20Sort/). An improve upon the Bubble Sort algorithm.\n- [Convex Hull](Convex%20Hull/).\n- [Miller-Rabin Primality Test](Miller-Rabin%20Primality%20Test/). Is the number a prime number?\n- [MinimumCoinChange](MinimumCoinChange/). A showcase for dynamic programming.\n- [Genetic](Genetic/). A simple example on how to slowly mutate a value to its ideal form, in the context of biological evolution.\n- [Myers Difference Algorithm](Myers%20Difference%20Algorithm/). Finding the longest common subsequence of two sequences.\n### Mathematics\n\n- [Greatest Common Divisor (GCD)](GCD/). Special bonus: the least common multiple.\n- [Permutations and Combinations](Combinatorics/). Get your combinatorics on!\n- [Shunting Yard Algorithm](Shunting%20Yard/). Convert infix expressions to postfix.\n- [Karatsuba Multiplication](Karatsuba%20Multiplication/). Another take on elementary multiplication.\n- [Haversine Distance](HaversineDistance/). Calculating the distance between 2 points from a sphere.\n- [Strassen's Multiplication Matrix](Strassen%20Matrix%20Multiplication/). Efficient way to handle matrix multiplication.\n- [CounterClockWise](/CounterClockWise/). Determining the area of a simple polygon.\n\n### Machine learning\n\n- [k-Means Clustering](K-Means/). Unsupervised classifier that partitions data into *k* clusters.\n- k-Nearest Neighbors\n- [Linear Regression](Linear%20Regression/). A technique for creating a model of the relationship between two (or more) variable quantities.\n- Logistic Regression\n- Neural Networks\n- PageRank\n- [Naive Bayes Classifier](Naive%20Bayes%20Classifier/)\n- [Simulated annealing](Simulated%20annealing/). Probabilistic technique for approximating the global maxima in a (often discrete) large search space.\n\n## Data structures\n\nThe choice of data structure for a particular task depends on a few things.\n\nFirst, there is the shape of your data and the kinds of operations that you'll need to perform on it. If you want to look up objects by a key you need some kind of dictionary; if your data is hierarchical in nature you want a tree structure of some sort; if your data is sequential you want a stack or queue.\n\nSecond, it matters what particular operations you'll be performing most, as certain data structures are optimized for certain actions. For example, if you often need to find the most important object in a collection, then a heap or priority queue is more optimal than a plain array.\n\nMost of the time using just the built-in `Array`, `Dictionary`, and `Set` types is sufficient, but sometimes you may want something more fancy...\n\n### Variations on arrays\n\n- [Array2D](Array2D/). A two-dimensional array with fixed dimensions. Useful for board games.\n- [Bit Set](Bit%20Set/). A fixed-size sequence of *n* bits.\n- [Fixed Size Array](Fixed%20Size%20Array/). When you know beforehand how large your data will be, it might be more efficient to use an old-fashioned array with a fixed size.\n- [Ordered Array](Ordered%20Array/). An array that is always sorted.\n- [Rootish Array Stack](Rootish%20Array%20Stack/). A space and time efficient variation on Swift arrays.\n\n### Queues\n\n- [Stack](Stack/). Last-in, first-out!\n- [Queue](Queue/). First-in, first-out!\n- [Deque](Deque/). A double-ended queue.\n- [Priority Queue](Priority%20Queue). A queue where the most important element is always at the front.\n- [Ring Buffer](Ring%20Buffer/). Also known as a circular buffer. An array of a certain size that conceptually wraps around back to the beginning.\n\n### Lists\n\n- [Linked List](Linked%20List/). A sequence of data items connected through links. Covers both singly and doubly linked lists.\n- [Skip-List](Skip-List/). Skip List is a probabilistic data-structure with same logarithmic time bound and efficiency as AVL/ or Red-Black tree and provides a clever compromise to efficiently support search and update operations.\n\n### Trees\n\n- [Tree](Tree/). A general-purpose tree structure.\n- [Binary Tree](Binary%20Tree/). A tree where each node has at most two children.\n- [Binary Search Tree (BST)](Binary%20Search%20Tree/). A binary tree that orders its nodes in a way that allows for fast queries.\n- [Red-Black Tree](Red-Black%20Tree/). A self balancing binary search tree.\n- [Splay Tree](Splay%20Tree/). A self balancing binary search tree that enables fast retrieval of recently updated elements.\n- [Threaded Binary Tree](Threaded%20Binary%20Tree/). A binary tree that maintains a few extra variables for cheap and fast in-order traversals.\n- [Segment Tree](Segment%20Tree/). Can quickly compute a function over a portion of an array.\n  - [Lazy Propagation](https://github.com/raywenderlich/swift-algorithm-club/tree/master/Segment%20Tree/LazyPropagation)\n- kd-Tree\n- [Sparse Table](Sparse%20Table/). Another take on quickly computing a function over a portion of an array, but this time we'll make it even quicker!.\n- [Heap](Heap/). A binary tree stored in an array, so it doesn't use pointers. Makes a great priority queue.\n- Fibonacci Heap\n- [Trie](Trie/). A special type of tree used to store associative data structures.\n- [B-Tree](B-Tree/). A self-balancing search tree, in which nodes can have more than two children.\n- [QuadTree](QuadTree/). A tree with 4 children.\n- [Octree](Octree/). A tree with 8 children.\n\n### Hashing\n\n- [Hash Table](Hash%20Table/). Allows you to store and retrieve objects by a key. This is how the dictionary type is usually implemented.\n- Hash Functions\n\n### Sets\n\n- [Bloom Filter](Bloom%20Filter/). A constant-memory data structure that probabilistically tests whether an element is in a set.\n- [Hash Set](Hash%20Set/). A set implemented using a hash table.\n- [Multiset](Multiset/). A set where the number of times an element is added matters. (Also known as a bag.)\n- [Ordered Set](Ordered%20Set/). A set where the order of items matters.\n\n### Graphs\n\n- [Graph](Graph/)\n- [Breadth-First Search (BFS)](Breadth-First%20Search/)\n- [Depth-First Search (DFS)](Depth-First%20Search/)\n- [Shortest Path](Shortest%20Path%20%28Unweighted%29/) on an unweighted tree\n- [Single-Source Shortest Paths](Single-Source%20Shortest%20Paths%20(Weighted)/)\n- [Minimum Spanning Tree](Minimum%20Spanning%20Tree%20%28Unweighted%29/) on an unweighted tree\n- [Minimum Spanning Tree](Minimum%20Spanning%20Tree/)\n- [All-Pairs Shortest Paths](All-Pairs%20Shortest%20Paths/)\n- [Dijkstra's shortest path algorithm](Dijkstra%20Algorithm/)\n- [A-Star](A-Star/)\n\n## Puzzles\n\nA lot of software developer interview questions consist of algorithmic puzzles. Here is a small selection of fun ones. For more puzzles (with answers), see [here](http://elementsofprogramminginterviews.com/) and [here](http://www.crackingthecodinginterview.com).\n\n- [Two-Sum Problem](Two-Sum%20Problem/)\n- [Three-Sum/Four-Sum Problem](3Sum%20and%204Sum/)\n- [Fizz Buzz](Fizz%20Buzz/)\n- [Monty Hall Problem](Monty%20Hall%20Problem/)\n- [Finding Palindromes](Palindromes/)\n- [Dining Philosophers](DiningPhilosophers/)\n- [Egg Drop Problem](Egg%20Drop%20Problem/)\n- [Encoding and Decoding Binary Tree](Encode%20and%20Decode%20Tree/)\n- [Closest Pair](Closest%20Pair/)\n\n## Learn more!\n\nLike what you see? Check out [Data Structures & Algorithms in Swift](https://store.raywenderlich.com/products/data-structures-and-algorithms-in-swift), the official book by the Swift Algorithm Club team!\n\n![Data Structures & Algorithms in Swift Book](Images/DataStructuresAndAlgorithmsInSwiftBook.png)\n\nYou’ll start with the fundamental structures of linked lists, queues and stacks, and see how to implement them in a highly Swift-like way. Move on to working with various types of trees, including general purpose trees, binary trees, AVL trees, binary search trees, and tries. \n\nGo beyond bubble and insertion sort with better-performing algorithms, including mergesort, radix sort, heap sort, and quicksort. Learn how to construct directed, non-directed and weighted graphs to represent many real-world models, and traverse graphs and trees efficiently with breadth-first, depth-first, Dijkstra’s and Prim’s algorithms to solve problems such as finding the shortest path or lowest cost in a network.\n\nBy the end of this book, you’ll have hands-on experience solving common issues with data structures and algorithms — and you’ll be well on your way to developing your own efficient and useful implementations!\n\nYou can find the book on the [raywenderlich.com store](https://store.raywenderlich.com/products/data-structures-and-algorithms-in-swift).\n\n## Credits\n\nThe Swift Algorithm Club was originally created by [Matthijs Hollemans](https://github.com/hollance).\n\nIt is now maintained by [Vincent Ngo](https://www.raywenderlich.com/u/jomoka), [Kelvin Lau](https://github.com/kelvinlauKL), and [Richard Ash](https://github.com/richard-ash).\n\nThe Swift Algorithm Club is a collaborative effort from the [most algorithmic members](https://github.com/raywenderlich/swift-algorithm-club/graphs/contributors) of the [raywenderlich.com](https://www.raywenderlich.com) community. We're always looking for help - why not [join the club](.github/CONTRIBUTING.md)? :]\n\n## License\n\nAll content is licensed under the terms of the MIT open source license.\n\nBy posting here, or by submitting any pull request through this forum, you agree that all content you submit or create, both code and text, is subject to this license.  Razeware, LLC, and others will have all the rights described in the license regarding this content.  The precise terms of this license may be found [here](https://github.com/raywenderlich/swift-algorithm-club/blob/master/LICENSE.txt).\n\n[![Build Status](https://travis-ci.org/raywenderlich/swift-algorithm-club.svg?branch=master)](https://travis-ci.org/raywenderlich/swift-algorithm-club)\n"
  },
  {
    "path": "Rabin-Karp/README.markdown",
    "content": "# Rabin-Karp string search algorithm\n\nThe Rabin-Karp string search algorithm is used to search text for a pattern.\n\nA practical application of the algorithm is detecting plagiarism. Given source material, the algorithm can rapidly search through a paper for instances of sentences from the source material, ignoring details such as case and punctuation. Because of the abundance of the sought strings, single-string searching algorithms are impractical.\n\n## Example\n\nGiven a text of \"The big dog jumped over the fox\" and a search pattern of \"ump\" this will return 13.\nIt starts by hashing \"ump\" then hashing \"The\".  If hashed don't match then it slides the window a character\nat a time (e.g. \"he \") and subtracts out the previous hash from the \"T\".\n\n## Algorithm\n\nThe Rabin-Karp algorithm uses a sliding window the size of the search pattern.  It starts by hashing the search pattern, then\nhashing the first x characters of the text string where x is the length of the search pattern.  It then slides the window one character over and uses\nthe previous hash value to calculate the new hash faster.  Only when it finds a hash that matches the hash of the search pattern will it compare\nthe two strings it see if they are the same (to prevent a hash collision from producing a false positive).\n\n## The code\n\nThe major search method is next.  More implementation details are in rabin-karp.swift\n\n```swift\npublic func search(text: String , pattern: String) -> Int {\n    // convert to array of ints\n    let patternArray = pattern.flatMap { $0.asInt }\n    let textArray = text.flatMap { $0.asInt }\n\n    if textArray.count < patternArray.count {\n        return -1\n    }\n\n    let patternHash = hash(array: patternArray)\n    var endIdx = patternArray.count - 1\n    let firstChars = Array(textArray[0...endIdx])\n    let firstHash = hash(array: firstChars)\n\n    if (patternHash == firstHash) {\n        // Verify this was not a hash collision\n        if firstChars == patternArray {\n            return 0\n        }\n    }\n\n    var prevHash = firstHash\n    // Now slide the window across the text to be searched\n    for idx in 1...(textArray.count - patternArray.count) {\n        endIdx = idx + (patternArray.count - 1)\n        let window = Array(textArray[idx...endIdx])\n        let windowHash = nextHash(prevHash: prevHash, dropped: textArray[idx - 1], added: textArray[endIdx], patternSize: patternArray.count - 1)\n\n        if windowHash == patternHash {\n            if patternArray == window {\n                return idx\n            }\n        }\n\n        prevHash = windowHash\n    }\n\n    return -1\n}\n```\n\nThis code can be tested in a playground using the following:\n\n```swift\n  search(text: \"The big dog jumped\"\", \"ump\")\n```\n\nThis will return 13 since ump is in the 13 position of the zero based string.\n\n## Additional Resources\n\n[Rabin-Karp Wikipedia](https://en.wikipedia.org/wiki/Rabin%E2%80%93Karp_algorithm)\n\n\n*Written by [Bill Barbour](https://github.com/brbatwork)*\n"
  },
  {
    "path": "Rabin-Karp/Rabin-Karp.playground/Contents.swift",
    "content": "//: Taking our rabin-karp algorithm for a walk\n\n// last checked with Xcode 9.4\n#if swift(>=4.0)\nprint(\"Hello, Swift 4!\")\n#endif\n\nimport UIKit\n\nstruct Constants {\n    static let hashMultiplier = 69061\n}\n\nprecedencegroup PowerPrecedence { higherThan: MultiplicationPrecedence }\ninfix operator ** : PowerPrecedence\nfunc ** (radix: Int, power: Int) -> Int {\n    return Int(pow(Double(radix), Double(power)))\n}\nfunc ** (radix: Double, power: Int) -> Double {\n    return pow(radix, Double(power))\n}\n\nextension Character {\n    var asInt: Int {\n        let s = String(self).unicodeScalars\n        return Int(s[s.startIndex].value)\n    }\n}\n\n// Find first position of pattern in the text using Rabin Karp algorithm\npublic func search(text: String, pattern: String) -> Int {\n    // convert to array of ints\n    let patternArray = pattern.compactMap { $0.asInt }\n    let textArray = text.compactMap { $0.asInt }\n\n    if textArray.count < patternArray.count {\n        return -1\n    }\n\n    let patternHash = hash(array: patternArray)\n    var endIdx = patternArray.count - 1\n    let firstChars = Array(textArray[0...endIdx])\n    let firstHash = hash(array: firstChars)\n\n    if patternHash == firstHash {\n        // Verify this was not a hash collison\n        if firstChars == patternArray {\n            return 0\n        }\n    }\n\n    var prevHash = firstHash\n    // Now slide the window across the text to be searched\n    for idx in 1...(textArray.count - patternArray.count) {\n        endIdx = idx + (patternArray.count - 1)\n        let window = Array(textArray[idx...endIdx])\n        let windowHash = nextHash(\n          prevHash: prevHash,\n          dropped: textArray[idx - 1],\n          added: textArray[endIdx],\n          patternSize: patternArray.count - 1\n        )\n\n        if windowHash == patternHash {\n            if patternArray == window {\n                return idx\n            }\n        }\n\n        prevHash = windowHash\n    }\n\n    return -1\n}\n\npublic func hash(array: Array<Int>) -> Double {\n    var total: Double = 0\n    var exponent = array.count - 1\n    for i in array {\n        total += Double(i) * (Double(Constants.hashMultiplier) ** exponent)\n        exponent -= 1\n    }\n\n    return Double(total)\n}\n\npublic func nextHash(prevHash: Double, dropped: Int, added: Int, patternSize: Int) -> Double {\n    let oldHash = prevHash - (Double(dropped) *\n      (Double(Constants.hashMultiplier) ** patternSize))\n    return Double(Constants.hashMultiplier) * oldHash + Double(added)\n}\n\n// TESTS\nassert(search(text:\"The big dog jumped over the fox\",\n  pattern:\"ump\") == 13, \"Invalid index returned\")\n\nassert(search(text:\"The big dog jumped over the fox\",\n  pattern:\"missed\") == -1, \"Invalid index returned\")\n\nassert(search(text:\"The big dog jumped over the fox\",\n  pattern:\"T\") == 0, \"Invalid index returned\")\n"
  },
  {
    "path": "Rabin-Karp/Rabin-Karp.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Rabin-Karp/Rabin-Karp.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Rabin-Karp/Rabin-Karp.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Rabin-Karp/rabin-karp.swift",
    "content": "// The MIT License (MIT)\n\n// Copyright (c) 2016 Bill Barbour (brbatwork[at]gmail.com)\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nstruct Constants {\n    static let hashMultiplier = 69069\n}\n\nprecedencegroup PowerPrecedence { higherThan: MultiplicationPrecedence }\ninfix operator ** : PowerPrecedence\nfunc ** (radix: Int, power: Int) -> Int {\n    return Int(pow(Double(radix), Double(power)))\n}\nfunc ** (radix: Double, power: Int) -> Double {\n    return pow(radix, Double(power))\n}\n\nextension Character {\n    var asInt: Int {\n        let s = String(self).unicodeScalars\n        return Int(s[s.startIndex].value)\n    }\n}\n\n// Find first position of pattern in the text using Rabin Karp algorithm\npublic func search(text: String, pattern: String) -> Int {\n    // convert to array of ints\n    let patternArray = pattern.characters.flatMap { $0.asInt }\n    let textArray = text.characters.flatMap { $0.asInt }\n\n    if textArray.count < patternArray.count {\n        return -1\n    }\n\n    let patternHash = hash(array: patternArray)\n    var endIdx = patternArray.count - 1\n    let firstChars = Array(textArray[0...endIdx])\n    let firstHash = hash(array: firstChars)\n\n    if patternHash == firstHash {\n        // Verify this was not a hash collison\n        if firstChars == patternArray {\n            return 0\n        }\n    }\n\n    var prevHash = firstHash\n    // Now slide the window across the text to be searched\n    for idx in 1...(textArray.count - patternArray.count) {\n        endIdx = idx + (patternArray.count - 1)\n        let window = Array(textArray[idx...endIdx])\n        let windowHash = nextHash(\n          prevHash: prevHash,\n          dropped: textArray[idx - 1],\n          added: textArray[endIdx],\n          patternSize: patternArray.count - 1\n        )\n\n        if windowHash == patternHash {\n            if patternArray == window {\n                return idx\n            }\n        }\n\n        prevHash = windowHash\n    }\n\n    return -1\n}\n\npublic func hash(array: Array<Int>) -> Double {\n    var total: Double = 0\n    var exponent = array.count - 1\n    for i in array {\n        total += Double(i) * (Double(Constants.hashMultiplier) ** exponent)\n        exponent -= 1\n    }\n\n    return Double(total)\n}\n\npublic func nextHash(prevHash: Double, dropped: Int, added: Int, patternSize: Int) -> Double {\n    let oldHash = prevHash - (Double(dropped) *\n      (Double(Constants.hashMultiplier) ** patternSize))\n    return Double(Constants.hashMultiplier) * oldHash + Double(added)\n}\n\n// TESTS\nassert(search(text:\"The big dog jumped over the fox\",\n  pattern:\"ump\") == 13, \"Invalid index returned\")\n\nassert(search(text:\"The big dog jumped over the fox\",\n  pattern:\"missed\") == -1, \"Invalid index returned\")\n\nassert(search(text:\"The big dog jumped over the fox\",\n  pattern:\"T\") == 0, \"Invalid index returned\")\n"
  },
  {
    "path": "Radix Sort/RadixSort.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\n// Test Radix Sort with small array of ten values\nvar array: [Int] = [19, 4242, 2, 9, 912, 101, 55, 67, 89, 32]\nradixSort(&array)\n\n// Test Radix Sort with large array of 1000 random values\nvar bigArray = (0..<1000).map { _ in Int.random(in: 1...1000) }\nbigArray\nradixSort(&bigArray)\n"
  },
  {
    "path": "Radix Sort/RadixSort.playground/Sources/radixSort.swift",
    "content": "/*\n \n Sorting Algorithm that sorts an input array of integers digit by digit.\n \n */\n\n// NOTE: This implementation does not handle negative numbers\npublic func radixSort(_ array: inout [Int] ) {\n  let radix = 10  //Here we define our radix to be 10\n  var done = false\n  var index: Int\n  var digit = 1  //Which digit are we on?\n\n  while !done {  //While our  sorting is not completed\n    done = true  //Assume it is done for now\n\n    var buckets: [[Int]] = []  //Our sorting subroutine is bucket sort, so let us predefine our buckets\n\n    for _ in 1...radix {\n      buckets.append([])\n    }\n\n    for number in array {\n      index = number / digit  //Which bucket will we access?\n      buckets[index % radix].append(number)\n      if done && index > 0 {  //If we arent done, continue to finish, otherwise we are done\n        done = false\n      }\n    }\n\n    var i = 0\n\n    for j in 0..<radix {\n      let bucket = buckets[j]\n      for number in bucket {\n        array[i] = number\n        i += 1\n      }\n    }\n\n    digit *= radix  //Move to the next digit\n  }\n}\n"
  },
  {
    "path": "Radix Sort/RadixSort.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='macos'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Radix Sort/RadixSort.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Radix Sort/RadixSortExample.swift",
    "content": "//\n//  RadixSortExample.swift\n//  \n//\n//  Created by Cheer on 2017/3/2.\n//\n//\n\nimport Foundation\n\nfunc radixSort1(_ arr: inout [Int]) {\n\n    var temp = [[Int]](repeating: [], count: 10)\n\n    for num in arr { temp[num % 10].append(num) }\n\n    for i in 1...Int(arr.max()!.description.characters.count) {\n\n        for index in 0..<temp.count {\n\n            for num in temp[index] {\n                temp[index].remove(at: temp[index].index(of: num)!)\n                temp[(num / Int(pow(10, Double(i)))) % 10].append(num)\n            }\n        }\n    }\n\n    arr = temp[0]\n}\n"
  },
  {
    "path": "Radix Sort/ReadMe.md",
    "content": "# Radix Sort\n\nRadix sort is a sorting algorithm that takes as input an array of integers and uses a sorting subroutine( that is often another efficient sorting algorith) to sort the integers by their radix, or rather their digit.  Counting Sort, and Bucket Sort are often times used as the subroutine for Radix Sort.\n\n## Example\n\n* Input Array: [170, 45, 75, 90, 802, 24, 2, 66]\n* Output Array (Sorted):  [2, 24, 45, 66, 75, 90, 170, 802]\n\n### Step 1:\nThe first step in this algorithm is to define the digit or rather the \"base\" or radix that we will use to sort.\nFor this example we will let radix = 10, since the integers we are working with in the example are of base 10.\n\n### Step 2:\nThe next step is to simply iterate n times (where n is the number of digits in the largest integer in the input array), and upon each iteration perform a sorting subroutine on the current digit in question.\n\n### Algorithm in Action\n\nLet's take a look at our example input array.\n\nThe largest integer in our array is 802, and it has three digits (ones, tens, hundreds).  So our algorithm will iterate three times whilst performing some sorting algorithm on the digits of each integer.\n\n* Iteration 1:  170, 90, 802, 2, 24, 45, 75, 66\n* Iteration 2:  802, 2, 24, 45, 66, 170, 75, 90\n* Iteration 3:  2, 24, 45, 66, 75, 90, 170, 802\n\n\n\nSee also [Wikipedia](https://en.wikipedia.org/wiki/Radix_Sort).\n\n*Written for the Swift Algorithm Club by Christian Encarnacion*\n"
  },
  {
    "path": "Radix Sort/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Radix Sort/Tests/RadixSortTests.swift",
    "content": "//\n//  RadixSortTests.swift\n//  Tests\n//\n//  Created by theng on 2017-01-10.\n//  Copyright © 2017 Swift Algorithm Club. All rights reserved.\n//\n\nimport XCTest\n\nclass RadixSortTests: XCTestCase {\n  func testCombSort() {\n    let expectedSequence: [Int] = [2, 9, 19, 32, 55, 67, 89, 101, 912, 4242]\n    var sequence = [19, 4242, 2, 9, 912, 101, 55, 67, 89, 32]\n    radixSort(&sequence)\n    XCTAssertEqual(sequence, expectedSequence)\n  }\n}\n"
  },
  {
    "path": "Radix Sort/Tests/Tests.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t056E92AB1E25D0C700B30F52 /* RadixSortTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 056E92AA1E25D0C700B30F52 /* RadixSortTests.swift */; };\n\t\t056E92AF1E25D3D700B30F52 /* radixSort.swift in Sources */ = {isa = PBXBuildFile; fileRef = 056E92AE1E25D3D700B30F52 /* radixSort.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t056E92A21E25D04D00B30F52 /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t056E92A61E25D04D00B30F52 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t056E92AA1E25D0C700B30F52 /* RadixSortTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RadixSortTests.swift; sourceTree = \"<group>\"; };\n\t\t056E92AE1E25D3D700B30F52 /* radixSort.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = radixSort.swift; path = ../radixSort.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t056E929F1E25D04D00B30F52 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t056E92851E25D03300B30F52 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t056E92A31E25D04D00B30F52 /* Tests */,\n\t\t\t\t056E928F1E25D03300B30F52 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t056E928F1E25D03300B30F52 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t056E92A21E25D04D00B30F52 /* Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t056E92A31E25D04D00B30F52 /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t056E92AE1E25D3D700B30F52 /* radixSort.swift */,\n\t\t\t\t056E92A61E25D04D00B30F52 /* Info.plist */,\n\t\t\t\t056E92AA1E25D0C700B30F52 /* RadixSortTests.swift */,\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tsourceTree = SOURCE_ROOT;\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t056E92A11E25D04D00B30F52 /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 056E92A71E25D04D00B30F52 /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t056E929E1E25D04D00B30F52 /* Sources */,\n\t\t\t\t056E929F1E25D04D00B30F52 /* Frameworks */,\n\t\t\t\t056E92A01E25D04D00B30F52 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tproductName = Tests;\n\t\t\tproductReference = 056E92A21E25D04D00B30F52 /* Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t056E92861E25D03300B30F52 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0820;\n\t\t\t\tLastUpgradeCheck = 0820;\n\t\t\t\tORGANIZATIONNAME = \"Swift Algorithm Club\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t056E92A11E25D04D00B30F52 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.2;\n\t\t\t\t\t\tLastSwiftMigration = 0820;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 056E92891E25D03300B30F52 /* Build configuration list for PBXProject \"Tests\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 056E92851E25D03300B30F52;\n\t\t\tproductRefGroup = 056E928F1E25D03300B30F52 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t056E92A11E25D04D00B30F52 /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t056E92A01E25D04D00B30F52 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t056E929E1E25D04D00B30F52 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t056E92AF1E25D3D700B30F52 /* radixSort.swift in Sources */,\n\t\t\t\t056E92AB1E25D0C700B30F52 /* RadixSortTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t056E92991E25D03300B30F52 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t056E929A1E25D03300B30F52 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t056E92A81E25D04D00B30F52 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = Swift.Algorithm.Club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t056E92A91E25D04D00B30F52 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = Swift.Algorithm.Club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t056E92891E25D03300B30F52 /* Build configuration list for PBXProject \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t056E92991E25D03300B30F52 /* Debug */,\n\t\t\t\t056E929A1E25D03300B30F52 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t056E92A71E25D04D00B30F52 /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t056E92A81E25D04D00B30F52 /* Debug */,\n\t\t\t\t056E92A91E25D04D00B30F52 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 056E92861E25D03300B30F52 /* Project object */;\n}\n"
  },
  {
    "path": "Radix Sort/Tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Tests.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Radix Sort/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0820\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"056E92A11E25D04D00B30F52\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"056E92A11E25D04D00B30F52\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"056E92A11E25D04D00B30F52\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"056E92A11E25D04D00B30F52\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"056E92A11E25D04D00B30F52\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Radix Sort/radixSort.swift",
    "content": "/*\n\n  Sorting Algorithm that sorts an input array of integers digit by digit.\n\n*/\n\n// NOTE: This implementation does not handle negative numbers\nfunc radixSort(_ array: inout [Int] ) {\n  let radix = 10  //Here we define our radix to be 10\n  var done = false\n  var index: Int\n  var digit = 1  //Which digit are we on?\n\n  while !done {  //While our  sorting is not completed\n    done = true  //Assume it is done for now\n\n    var buckets: [[Int]] = []  //Our sorting subroutine is bucket sort, so let us predefine our buckets\n\n    for _ in 1...radix {\n      buckets.append([])\n    }\n\n    for number in array {\n      index = number / digit  //Which bucket will we access?\n      buckets[index % radix].append(number)\n      if done && index > 0 {  //If we arent done, continue to finish, otherwise we are done\n        done = false\n      }\n    }\n\n    var i = 0\n\n    for j in 0..<radix {\n      let bucket = buckets[j]\n      for number in bucket {\n        array[i] = number\n        i += 1\n      }\n    }\n\n    digit *= radix  //Move to the next digit\n  }\n}\n"
  },
  {
    "path": "Radix Tree/README.markdown",
    "content": "# Radix Tree\n\nA radix tree is a [tree](../Tree/) where a node can have any number of children. Each edge leading from a node to a child has a label (usually a string). A radix tree is often used to store strings or IP addresses. By traversing from the root to any leaf in the tree, concatenating all the labels of edges along the way, you can find any string.\n\nThis is an example of a radix tree (image from wikipedia.org):\n\n![](Images/radixtree.png)\n\n## Implemenation\n\nThe radix tree is represented by a `RadixTree` object. This class has one member variable, `root`, of type `Root`. The `Root` is the object at the top of every `RadixTree`. \n\nEvery other node is of type `Edge` and is a child (or child of a child, etc.) of the root. \n\nThe difference between `Edge` and `Root` is that edges have a label (of type `String`) and a reference to a parent node. \n\nThis approach is a little different from the conventional way of creating tree data structures but is easier to wrap your head around (see the picture above).\n\n## Operations\n\nTypical operations on a radix tree are:\n\n- lookup\n- insertion\n- deletion\n- find predecessor\n- find successor\n- find all strings with common prefix\n\nThe running time of lookup, insertion, and deletion is **O(k)** where **k** is the length of the key. This is different from most trees because these operations usually run in **O(log n)** time where **n** is the number of nodes in the tree.\n\n### Lookup\n\nThe `find()` function returns true if the string you are searching for is in the tree and false if it is not. \n\nEvery `RadixTree` contains at the very least the empty string `\"\"` so `find(\"\")` will always return true. \n\nA string is considered \"in the tree\" if the text you are searching for is a concatenation of `Edge` labels while traversing downwards, or a prefix of that concatenation.\n\nFor example, if you look at the example tree above, `find(\"roma\")` will return true because it is a prefix of the traversal `\"r\" -> \"om\" -> \"an\"`. \n\nOn the other hand, `find(\"romans\")` will return false.\n\n### Insertion\n\nThe `insert()` function lets you add new strings to the radix tree.\n\nThis function returns true if the string you are trying to insert was successfully inserted into the `RadixTree` and false if the string is already in the tree.\n\n### Deletion\n\nThe `remove()` removes a string from the tree. When a string is removed, any other strings that have a prefix of the removed string are removed as well. \n\nFor example, `remove(\"rom\")` will also remove `\"roman\"`, `\"rome\"`, and `\"romulus\"` if those strings are in the tree as well. Calling `remove(\"\")` will remove all strings in the tree.\n\n### printTree()\n\nYou can use the `printTree()` function to visualize the tree. This function is a little buggy and not perfect yet but gets the job done thus far.\n\n### Helper functions\n\nThe `sharedPrefix()` function is a non-member function in the **RadixTree.swift** file. It takes in two `String` objects and returns the shared prefix between them. \n\nFor example, `sharedPrefix(\"apples\", \"oranges\")` will return `\"\"`, and `sharedPrefix(\"court\", \"coral\")` will return `\"co\"`. \n\nThis function is used in the implementation of the `find()`, `insert()`, and `remove()` functions.\n\n## See also\n\n[Radix Tree - Wikipedia](https://en.wikipedia.org/wiki/Radix_tree)\n\n*Written for Swift Algorithm Club by Steven Scally*\n"
  },
  {
    "path": "Radix Tree/RadixTree.playground/Contents.swift",
    "content": "// Radix Tree\n\n// last checked with Xcode 9.0b4\n#if swift(>=4.0)\nprint(\"Hello, Swift 4!\")\n#endif\n\nvar radix = RadixTree()\nvar radixWiki = RadixTree()\n\nradixWiki.insert(\"romanus\")\nradixWiki.insert(\"rubicundus\")\nradixWiki.insert(\"rubicon\")\nradixWiki.insert(\"romane\")\nradixWiki.insert(\"ruber\")\nradixWiki.insert(\"rubens\")\nradixWiki.insert(\"romulus\")\nradixWiki.insert(\"start\")\nradixWiki.insert(\"shoot\")\nradixWiki.insert(\"shit\")\nradixWiki.insert(\"starch\")\nradixWiki.insert(\"steven\")\nradixWiki.insert(\"shart\")\nradixWiki.insert(\"shard\")\n\nradixWiki.insert(\"compute\")\nradixWiki.insert(\"compatible\")\nradixWiki.insert(\"construction\")\nradixWiki.insert(\"coral\")\nradixWiki.insert(\"crude\")\nradixWiki.insert(\"chalk\")\nradixWiki.insert(\"chime\")\nradixWiki.insert(\"courting\")\nradixWiki.insert(\"courted\")\n\nradixWiki.insert(\"rubicunduses\")\n\nradixWiki.printTree()\n\nprint(\"\\n\\nFIND TESTS\")\nprint(radixWiki.find(\"courts\")) // false\nprint(radixWiki.find(\"r\")) // true\nprint(radixWiki.find(\"ro\")) // true\nprint(radixWiki.find(\"rom\")) // true\nprint(radixWiki.find(\"roma\")) // true\nprint(radixWiki.find(\"roman\")) // true\nprint(radixWiki.find(\"romane\")) // true\nprint(radixWiki.find(\"romans\")) // false\nprint(radixWiki.find(\"steve\")) // true\n\nprint(\"\\n\\nREMOVE TESTS\")\n\nprint(radixWiki.remove(\"c\"))\nradixWiki.printTree()\n\nprint(radixWiki.remove(\"rub\"))\nradixWiki.printTree()\n\nprint(radixWiki.remove(\"stevenson\"))\n\nprint(radixWiki.remove(\"\"))\nradixWiki.printTree()\n"
  },
  {
    "path": "Radix Tree/RadixTree.playground/Sources/RadixTree.swift",
    "content": "import Foundation\n\n// The root is the top of the Radix Tree\npublic class Root {\n\tvar children: [Edge]\n\n\tpublic init() {\n\t\tchildren = [Edge]()\n\t}\n\n\t// Returns the length (in number of edges) of the longest traversal down the tree.\n\tpublic func height() -> Int {\n\t\t// Base case: no children: the tree has a height of 1\n\t\tif children.count == 0 {\n\t\t\treturn 1\n\t\t}\n\t\t// Recursion: find the max height of a root's child and return 1 + that max\n\t\telse {\n\t\t\tvar max = 1\n\t\t\tfor c in children {\n\t\t\t\tif c.height() > max {\n\t\t\t\t\tmax = c.height()\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn 1 + max\n\t\t}\n\t}\n\n\t// Returns how far down in the tree a Root/Edge is.\n\t// A root's level is always 0.\n\tpublic func level() -> Int {\n\t\treturn 0\n\t}\n\n\t// Prints the tree for debugging/visualization purposes.\n\tpublic func printRoot() {\n\t\t// Print the first half of the children\n\t\tif children.count > 1 {\n\t\t\tfor c in 0...children.count/2-1 {\n\t\t\t\tchildren[c].printEdge()\n\t\t\t\tprint(\"|\")\n\t\t\t}\n\t\t} else if children.count > 0 {\n\t\t\tchildren[0].printEdge()\n\t\t}\n\t\t// Then print the root\n\t\tprint(\"ROOT\")\n\t\t// Print the second half of the children\n\t\tif children.count > 1 {\n\t\t\tfor c in children.count/2...children.count-1 {\n\t\t\t\tchildren[c].printEdge()\n\t\t\t\tprint(\"|\")\n\t\t\t}\n\t\t}\n\t\tprint()\n\t}\n}\n\n// Edges are what actually store the Strings in the tree\npublic class Edge: Root {\n\tvar parent: Root?\n\tvar label: String\n\n\tpublic init(_ label: String) {\n\t\tself.label = label\n\t\tsuper.init()\n\t}\n\n\tpublic override func level() -> Int {\n\t\t// Recurse up the tree incrementing level by one until the root is reached\n\t\tif parent != nil {\n\t\t\treturn 1 + parent!.level()\n\t\t}\n\t\t// If an edge has no parent, it's level is one\n\t\t// NOTE: THIS SHOULD NEVER HAPPEN AS THE ROOT IS ALWAYS THE TOP OF THE TREE\n\t\telse {\n\t\t\treturn 1\n\t\t}\n\t}\n\n\t// Erases a specific edge (and all edges below it in the tree).\n\tpublic func erase() {\n\t\tself.parent = nil\n\t\tif children.count > 0 {\n\t\t\t// For each child, erase it, then remove it from the children array.\n\t\t\tfor _ in 0...children.count-1 {\n\t\t\t\tchildren[0].erase()\n\t\t\t\tchildren.remove(at: 0)\n\t\t\t}\n\t\t}\n\t}\n\n\t// Prints the tree for debugging/visualization purposes.\n\tpublic func printEdge() {\n\t\t// Print the first half of the edge's children\n\t\tif children.count > 1 {\n\t\t\tfor c in 0...children.count/2-1 {\n\t\t\t\tchildren[c].printEdge()\n\t\t\t}\n\t\t} else if children.count > 0 {\n\t\t\tchildren[0].printEdge()\n\t\t}\n\t\t// Tab over once up to the edge's level\n\t\tfor x in 1...level() {\n\t\t\tif x == level() {\n\t\t\t\tprint(\"|------>\", terminator: \"\")\n\t\t\t} else {\n\t\t\t\tprint(\"|       \", terminator: \"\")\n\t\t\t}\n\t\t}\n\t\tprint(label)\n\t\t// Print the second half of the edge's children\n\t\tif children.count == 0 {\n\t\t\tfor _ in 1...level() {\n\t\t\t\tprint(\"|       \", terminator: \"\")\n\t\t\t}\n\t\t\tprint()\n\t\t}\n\t\tif children.count > 1 {\n\t\t\tfor c in children.count/2...children.count-1 {\n\t\t\t\tchildren[c].printEdge()\n\t\t\t}\n\t\t}\n\t}\n}\n\npublic class RadixTree {\n\tvar root: Root\n\n\tpublic init() {\n\t\troot = Root()\n\t}\n\n\t// Returns the height of the tree by calling the root's height function.\n\tpublic func height() -> Int {\n\t\treturn root.height() - 1\n\t}\n\n\t// Inserts a string into the tree.\n\tpublic func insert(_ str: String) -> Bool {\n\t\t//Account for a blank input. The empty string is already in the tree.\n\t\tif str == \"\" {\n\t\t\treturn false\n\t\t}\n\n\t\t// searchStr is the parameter of the function\n\t\t// it will be substringed as the function traverses down the tree\n\t\tvar searchStr = str\n\n\t\t// currEdge is the current Edge (or Root) in question\n\t\tvar currEdge = root\n\n\t\twhile true {\n\t\t\tvar found = false\n\n\t\t\t// If the current Edge has no children then the remaining searchStr is\n\t\t\t// created as a child\n\t\t\tif currEdge.children.count == 0 {\n\t\t\t\tlet newEdge = Edge(searchStr)\n\t\t\t\tcurrEdge.children.append(newEdge)\n\t\t\t\tnewEdge.parent = currEdge\n\t\t\t\treturn true\n\t\t\t}\n\n\t\t\t// Loop through all of the children\n\t\t\tfor e in currEdge.children {\n\t\t\t\t// Get the shared prefix between the child in question and the\n\t\t\t\t// search string\n\t\t\t\tlet shared = sharedPrefix(searchStr, e.label)\n\t\t\t\tvar index  = shared.startIndex\n\n\t\t\t\t// If the search string is equal to the shared string,\n\t\t\t\t// the string already exists in the tree\n\t\t\t\tif searchStr == shared {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\n\t\t\t\t// If the child's label is equal to the shared string, you have to\n\t\t\t\t// traverse another level down the tree, so substring the search\n\t\t\t\t// string, break the loop, and run it back\n\t\t\t\telse if shared == e.label {\n\t\t\t\t\tcurrEdge = e\n\t\t\t\t\tvar tempIndex = searchStr.startIndex\n\t\t\t\t\tfor _ in 1...shared.count {\n\t\t\t\t\t\ttempIndex = searchStr.index(after: tempIndex)\n\t\t\t\t\t}\n                    searchStr = String(searchStr[tempIndex...])\n\t\t\t\t\tfound = true\n\t\t\t\t\tbreak\n\t\t\t\t}\n\n\t\t\t\t// If the child's label and the search string share a partial prefix,\n\t\t\t\t// then both the label and the search string need to be substringed\n\t\t\t\t// and a new branch needs to be created\n\t\t\t\telse if shared.count > 0 {\n\t\t\t\t\tvar labelIndex = e.label.startIndex\n\n\t\t\t\t\t// Create index objects and move them to after the shared prefix\n\t\t\t\t\tfor _ in 1...shared.count {\n                        index = searchStr.index(after: index)\n\t\t\t\t\t\tlabelIndex = e.label.index(after: labelIndex)\n\t\t\t\t\t}\n\n\t\t\t\t\t// Substring both the search string and the label from the shared prefix\n                    searchStr = String(searchStr[index...])\n                    e.label = String(e.label[labelIndex...])\n\n\t\t\t\t\t// Create 2 new edges and update parent/children values\n\t\t\t\t\tlet newEdge = Edge(e.label)\n\t\t\t\t\te.label = shared\n\t\t\t\t\tfor ec in e.children {\n\t\t\t\t\t\tnewEdge.children.append(ec)\n\t\t\t\t\t}\n\t\t\t\t\tnewEdge.parent = e\n\t\t\t\t\te.children.removeAll()\n\t\t\t\t\tfor nec in newEdge.children {\n\t\t\t\t\t\tnec.parent = newEdge\n\t\t\t\t\t}\n\t\t\t\t\te.children.append(newEdge)\n\t\t\t\t\tlet newEdge2 = Edge(searchStr)\n\t\t\t\t\tnewEdge2.parent = e\n\t\t\t\t\te.children.append(newEdge2)\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t\t// If they don't share a prefix, go to next child\n\t\t\t}\n\n\t\t\t// If none of the children share a prefix, you have to create a new child\n\t\t\tif !found {\n\t\t\t\tlet newEdge = Edge(searchStr)\n\t\t\t\tcurrEdge.children.append(newEdge)\n\t\t\t\tnewEdge.parent = currEdge\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t}\n\n\t// Tells you if a string is in the tree\n\tpublic func find(_ str: String) -> Bool {\n\t\t// A radix tree always contains the empty string\n\t\tif str == \"\" {\n\t\t\treturn true\n\t\t}\n\t\t// If there are no children then the string cannot be in the tree\n\t\telse if root.children.count == 0 {\n\t\t\treturn false\n\t\t}\n\t\tvar searchStr = str\n\t\tvar currEdge = root\n\t\twhile true {\n\t\t\tvar found = false\n\t\t\t// Loop through currEdge's children\n\t\t\tfor c in currEdge.children {\n\t\t\t\t// First check if the search string and the child's label are equal\n\t\t\t\t// if so the string is in the tree, return true\n\t\t\t\tif searchStr == c.label {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\n\t\t\t\t// If that is not true, find the shared string b/t the search string\n\t\t\t\t// and the label\n\t\t\t\tlet shared = sharedPrefix(searchStr, c.label)\n\n\t\t\t\t// If the shared string is equal to the label, update the curent node,\n\t\t\t\t// break the loop, and run it back\n\t\t\t\tif shared == c.label {\n\t\t\t\t\tcurrEdge = c\n\t\t\t\t\tvar tempIndex = searchStr.startIndex\n\t\t\t\t\tfor _ in 1...shared.count {\n\t\t\t\t\t\ttempIndex = searchStr.index(after: tempIndex)\n\t\t\t\t\t}\n\t\t\t\t\tsearchStr = String(searchStr[tempIndex...])\n\t\t\t\t\tfound = true\n\t\t\t\t\tbreak\n\t\t\t\t}\n\n\t\t\t\t// If the shared string is empty, go to the next child\n\t\t\t\telse if shared.count == 0 {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\t// If the shared string matches the search string, return true\n\t\t\t\telse if shared == searchStr {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\n\t\t\t\t// If the search string and the child's label only share some characters,\n\t\t\t\t// the string is not in the tree, return false\n\t\t\t\telse if shared[shared.startIndex] == c.label[c.label.startIndex] &&\n\t\t\t\t  shared.count < c.label.count {\n\t\t\t\t  \treturn false\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If nothing was found, return false\n\t\t\tif !found {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t}\n\n\t// Removes a string from the tree\n\tpublic func remove(_ str: String) -> Bool {\n\t\t// Removing the empty string removes everything in the tree\n\t\tif str == \"\" {\n\t\t\tfor c in root.children {\n\t\t\t\tc.erase()\n\t\t\t\troot.children.remove(at: 0)\n\t\t\t}\n\t\t\treturn true\n\t\t}\n\t\t// If the tree is empty, you cannot remove anything\n\t\telse if root.children.count == 0 {\n\t\t\treturn false\n\t\t}\n\n\t\tvar searchStr = str\n\t\tvar currEdge = root\n\t\twhile true {\n\t\t\tvar found = false\n\t\t\t// If currEdge has no children, then the searchStr is not in the tree\n\t\t\tif currEdge.children.count == 0 {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\t// Loop through the children\n\t\t\tfor c in 0...currEdge.children.count-1 {\n\t\t\t\t// If the child's label matches the search string, remove that child\n\t\t\t\t// and everything below it in the tree\n\t\t\t\tif currEdge.children[c].label == searchStr {\n\t\t\t\t\tcurrEdge.children[c].erase()\n\t\t\t\t\tcurrEdge.children.remove(at: c)\n\t\t\t\t\treturn true\n\t\t\t\t}\n\n\t\t\t\t// Find the shared string\n\t\t\t\tlet shared = sharedPrefix(searchStr, currEdge.children[c].label)\n\n\t\t\t\t// If the shared string is equal to the child's string, go down a level\n\t\t\t\tif shared == currEdge.children[c].label {\n\t\t\t\t\tcurrEdge = currEdge.children[c]\n\t\t\t\t\tvar tempIndex = searchStr.startIndex\n\t\t\t\t\tfor _ in 1...shared.count {\n\t\t\t\t\t\ttempIndex = searchStr.index(after: tempIndex)\n\t\t\t\t\t}\n\t\t\t\t\tsearchStr = String(searchStr[tempIndex...])\n\t\t\t\t\tfound = true\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If there is no match, then the searchStr is not in the tree\n\t\t\tif !found {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t}\n\n\t// Prints the tree by calling the root's print function\n\tpublic func printTree() {\n\t\troot.printRoot()\n\t}\n}\n\n// Returns the prefix that is shared between the two input strings\n// i.e. sharedPrefix(\"court\", \"coral\") -> \"co\"\npublic func sharedPrefix(_ str1: String, _ str2: String) -> String {\n\tvar temp = \"\"\n\tvar c1 = str1.startIndex\n\tvar c2 = str2.startIndex\n\tfor _ in 0...min(str1.count-1, str2.count-1) {\n\t\tif str1[c1] == str2[c2] {\n\t\t\ttemp.append( str1[c1] )\n            c1 = str1.index(after:c1)\n            c2 = str2.index(after:c2)\n\t\t} else {\n\t\t\treturn temp\n\t\t}\n\t}\n\treturn temp\n}\n"
  },
  {
    "path": "Radix Tree/RadixTree.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Radix Tree/RadixTree.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Radix Tree/RadixTree.swift",
    "content": "import Foundation\n\n// The root is the top of the Radix Tree\npublic class Root {\n  var children: [Edge]\n\n  public init() {\n    children = [Edge]()\n  }\n\n  // Returns the length (in number of edges) of the longest traversal down the tree.\n  public func height() -> Int {\n    // Base case: no children: the tree has a height of 1\n    if children.count == 0 {\n      return 1\n    }\n      // Recursion: find the max height of a root's child and return 1 + that max\n    else {\n      var max = 1\n      for c in children {\n        if c.height() > max {\n          max = c.height()\n        }\n      }\n      return 1 + max\n    }\n  }\n\n  // Returns how far down in the tree a Root/Edge is.\n  // A root's level is always 0.\n  public func level() -> Int {\n    return 0\n  }\n\n  // Prints the tree for debugging/visualization purposes.\n  public func printRoot() {\n    // Print the first half of the children\n    if children.count > 1 {\n      for c in 0...children.count/2-1 {\n        children[c].printEdge()\n        print(\"|\")\n      }\n    } else if children.count > 0 {\n      children[0].printEdge()\n    }\n    // Then print the root\n    print(\"ROOT\")\n    // Print the second half of the children\n    if children.count > 1 {\n      for c in children.count/2...children.count-1 {\n        children[c].printEdge()\n        print(\"|\")\n      }\n    }\n    print()\n  }\n}\n\n// Edges are what actually store the Strings in the tree\npublic class Edge: Root {\n  var parent: Root?\n  var label: String\n\n  public init(_ label: String) {\n    self.label = label\n    super.init()\n  }\n\n  public override func level() -> Int {\n    // Recurse up the tree incrementing level by one until the root is reached\n    if parent != nil {\n      return 1 + parent!.level()\n    }\n      // If an edge has no parent, it's level is one\n      // NOTE: THIS SHOULD NEVER HAPPEN AS THE ROOT IS ALWAYS THE TOP OF THE TREE\n    else {\n      return 1\n    }\n  }\n\n  // Erases a specific edge (and all edges below it in the tree).\n  public func erase() {\n    self.parent = nil\n    if children.count > 0 {\n      // For each child, erase it, then remove it from the children array.\n      for _ in 0...children.count-1 {\n        children[0].erase()\n        children.remove(at: 0)\n      }\n    }\n  }\n\n  // Prints the tree for debugging/visualization purposes.\n  public func printEdge() {\n    // Print the first half of the edge's children\n    if children.count > 1 {\n      for c in 0...children.count/2-1 {\n        children[c].printEdge()\n      }\n    } else if children.count > 0 {\n      children[0].printEdge()\n    }\n    // Tab over once up to the edge's level\n    for x in 1...level() {\n      if x == level() {\n        print(\"|------>\", terminator: \"\")\n      } else {\n        print(\"|       \", terminator: \"\")\n      }\n    }\n    print(label)\n    // Print the second half of the edge's children\n    if children.count == 0 {\n      for _ in 1...level() {\n        print(\"|       \", terminator: \"\")\n      }\n      print()\n    }\n    if children.count > 1 {\n      for c in children.count/2...children.count-1 {\n        children[c].printEdge()\n      }\n    }\n  }\n}\n\npublic class RadixTree {\n  var root: Root\n\n  public init() {\n    root = Root()\n  }\n\n  // Returns the height of the tree by calling the root's height function.\n  public func height() -> Int {\n    return root.height() - 1\n  }\n\n  // Inserts a string into the tree.\n  public func insert(_ str: String) -> Bool {\n    //Account for a blank input. The empty string is already in the tree.\n    if str == \"\" {\n      return false\n    }\n\n    // searchStr is the parameter of the function\n    // it will be substringed as the function traverses down the tree\n    var searchStr = str\n\n    // currEdge is the current Edge (or Root) in question\n    var currEdge = root\n\n    while true {\n      var found = false\n\n      // If the current Edge has no children then the remaining searchStr is\n      // created as a child\n      if currEdge.children.count == 0 {\n        let newEdge = Edge(searchStr)\n        currEdge.children.append(newEdge)\n        newEdge.parent = currEdge\n        return true\n      }\n\n      // Loop through all of the children\n      for e in currEdge.children {\n        // Get the shared prefix between the child in question and the\n        // search string\n        let shared = sharedPrefix(searchStr, e.label)\n        var index  = shared.startIndex\n\n        // If the search string is equal to the shared string,\n        // the string already exists in the tree\n        if searchStr == shared {\n          return false\n        }\n\n          // If the child's label is equal to the shared string, you have to\n          // traverse another level down the tree, so substring the search\n          // string, break the loop, and run it back\n        else if shared == e.label {\n          currEdge = e\n          var tempIndex = searchStr.startIndex\n          for _ in 1...shared.count {\n            tempIndex = searchStr.index(after: tempIndex)\n          }\n          searchStr = String(searchStr[tempIndex...])\n          found = true\n          break\n        }\n\n          // If the child's label and the search string share a partial prefix,\n          // then both the label and the search string need to be substringed\n          // and a new branch needs to be created\n        else if shared.count > 0 {\n          var labelIndex = e.label.startIndex\n\n          // Create index objects and move them to after the shared prefix\n          for _ in 1...shared.count {\n            index = searchStr.index(after: index)\n            labelIndex = e.label.index(after: labelIndex)\n          }\n\n          // Substring both the search string and the label from the shared prefix\n          searchStr = String(searchStr[index...])\n          e.label = String(e.label[labelIndex...])\n\n          // Create 2 new edges and update parent/children values\n          let newEdge = Edge(e.label)\n          e.label = shared\n          for ec in e.children {\n            newEdge.children.append(ec)\n          }\n          newEdge.parent = e\n          e.children.removeAll()\n          for nec in newEdge.children {\n            nec.parent = newEdge\n          }\n          e.children.append(newEdge)\n          let newEdge2 = Edge(searchStr)\n          newEdge2.parent = e\n          e.children.append(newEdge2)\n          return true\n        }\n        // If they don't share a prefix, go to next child\n      }\n\n      // If none of the children share a prefix, you have to create a new child\n      if !found {\n        let newEdge = Edge(searchStr)\n        currEdge.children.append(newEdge)\n        newEdge.parent = currEdge\n        return true\n      }\n    }\n  }\n\n  // Tells you if a string is in the tree\n  public func find(_ str: String) -> Bool {\n    // A radix tree always contains the empty string\n    if str == \"\" {\n      return true\n    }\n      // If there are no children then the string cannot be in the tree\n    else if root.children.count == 0 {\n      return false\n    }\n    var searchStr = str\n    var currEdge = root\n    while true {\n      var found = false\n      // Loop through currEdge's children\n      for c in currEdge.children {\n        // First check if the search string and the child's label are equal\n        // if so the string is in the tree, return true\n        if searchStr == c.label {\n          return true\n        }\n\n        // If that is not true, find the shared string b/t the search string\n        // and the label\n        let shared = sharedPrefix(searchStr, c.label)\n\n        // If the shared string is equal to the label, update the curent node,\n        // break the loop, and run it back\n        if shared == c.label {\n          currEdge = c\n          var tempIndex = searchStr.startIndex\n          for _ in 1...shared.count {\n            tempIndex = searchStr.index(after: tempIndex)\n          }\n          searchStr = String(searchStr[tempIndex...])\n          found = true\n          break\n        }\n\n          // If the shared string is empty, go to the next child\n        else if shared.count == 0 {\n          continue\n        }\n\n          // If the shared string matches the search string, return true\n        else if shared == searchStr {\n          return true\n        }\n\n          // If the search string and the child's label only share some characters,\n          // the string is not in the tree, return false\n        else if shared[shared.startIndex] == c.label[c.label.startIndex] &&\n          shared.count < c.label.count {\n          return false\n        }\n      }\n\n      // If nothing was found, return false\n      if !found {\n        return false\n      }\n    }\n  }\n\n  // Removes a string from the tree\n  public func remove(_ str: String) -> Bool {\n    // Removing the empty string removes everything in the tree\n    if str == \"\" {\n      for c in root.children {\n        c.erase()\n        root.children.remove(at: 0)\n      }\n      return true\n    }\n      // If the tree is empty, you cannot remove anything\n    else if root.children.count == 0 {\n      return false\n    }\n\n    var searchStr = str\n    var currEdge = root\n    while true {\n      var found = false\n      // If currEdge has no children, then the searchStr is not in the tree\n      if currEdge.children.count == 0 {\n        return false\n      }\n\n      // Loop through the children\n      for c in 0...currEdge.children.count-1 {\n        // If the child's label matches the search string, remove that child\n        // and everything below it in the tree\n        if currEdge.children[c].label == searchStr {\n          currEdge.children[c].erase()\n          currEdge.children.remove(at: c)\n          return true\n        }\n\n        // Find the shared string\n        let shared = sharedPrefix(searchStr, currEdge.children[c].label)\n\n        // If the shared string is equal to the child's string, go down a level\n        if shared == currEdge.children[c].label {\n          currEdge = currEdge.children[c]\n          var tempIndex = searchStr.startIndex\n          for _ in 1...shared.count {\n            tempIndex = searchStr.index(after: tempIndex)\n          }\n          searchStr = String(searchStr[tempIndex...])\n          found = true\n          break\n        }\n      }\n\n      // If there is no match, then the searchStr is not in the tree\n      if !found {\n        return false\n      }\n    }\n  }\n\n  // Prints the tree by calling the root's print function\n  public func printTree() {\n    root.printRoot()\n  }\n}\n\n// Returns the prefix that is shared between the two input strings\n// i.e. sharedPrefix(\"court\", \"coral\") -> \"co\"\npublic func sharedPrefix(_ str1: String, _ str2: String) -> String {\n  var temp = \"\"\n  var c1 = str1.startIndex\n  var c2 = str2.startIndex\n  for _ in 0...min(str1.count-1, str2.count-1) {\n    if str1[c1] == str2[c2] {\n      temp.append( str1[c1] )\n      c1 = str1.index(after:c1)\n      c2 = str2.index(after:c2)\n    } else {\n      return temp\n    }\n  }\n  return temp\n}\n"
  },
  {
    "path": "Red-Black Tree/README.markdown",
    "content": "# Red-Black Tree\n\nA red-black tree (RBT) is a balanced version of a [Binary Search Tree](https://github.com/raywenderlich/swift-algorithm-club/tree/master/Binary%20Search%20Tree) guaranteeing that the basic operations (search, predecessor, successor, minimum, maximum, insert and delete) have a logarithmic worst case performance.\n\nBinary search trees (BSTs) have the disadvantage that they can become unbalanced after some insert or delete operations. In the worst case, this could lead to a tree where the nodes build a linked list as shown in the following example:\n\n```\na\n  \\\n   b\n    \\\n     c\n      \\\n       d\n```\nTo prevent this issue, RBTs perform rebalancing operations after an insert or delete and store an additional color property at each node which can either be red or black. After each operation a RBT satisfies the following properties:\n\n## Properties\n\n1. Every node is either red or black\n2. The root is black\n3. Every leaf (nullLeaf) is black\n4. If a node is red, then both its children are black\n5. For each node, all paths from the node to descendant leaves contain the same number of black nodes\n\nProperty 5 includes the definition of the black-height of a node x, bh(x), which is the number of black nodes on a path from this node down to a leaf not counting the node itself.\nFrom [CLRS]\n\n## Methods\n\nNodes:\n* `nodeX.getPredecessor()` Returns the inorder predecessor of nodeX\n* `nodeX.getSuccessor()` Returns the inorder successor of nodeX\n* `nodeX.minimum()` Returns the node with the minimum key of the subtree of nodeX\n* `nodeX.maximum()` Returns the node with the maximum key of the subtree of nodeX\nTree:\n* `search(input:)` Returns the node with the given key value\n* `minValue()` Returns the minimum key value of the whole tree\n* `maxValue()` Returns the maximum key value of the whole tree\n* `insert(key:)` Inserts the key value into the tree\n* `delete(key:)` Delete the node with the respective key value from the tree\n* `verify()` Verifies that the given tree fulfills the red-black tree properties\n* `count()` Returns how many nodes in the tree\n* `isEmpty()` Returns if the tree has no nodes\n* `allElements()` Returns an array containing all nodes (in-order traversal) in the tree.\n\nThe rotation, insertion and deletion algorithms are implemented based on the pseudo-code provided in [CLRS]\n\n## Implementation Details\n\nFor convenience, all nil-pointers to children or the parent (except the parent of the root) of a node are exchanged with a nullLeaf. This is an ordinary node object, like all other nodes in the tree, but with a black color, and in this case a nil value for its children, parent and key. Therefore, an empty tree consists of exactly one nullLeaf at the root.\n\n## Rotation\n\nLeft rotation (around x):\nAssumes that x.rightChild y is not a nullLeaf, rotates around the link from x to y, makes y the new root of the subtree with x as y's left child and y's left child as x's right child, where n = a node, [n] = a subtree\n```\n      |                |\n      x                y\n    /   \\     ~>     /   \\\n  [A]    y          x    [C]\n        / \\        / \\\n      [B] [C]    [A] [B]\n```\nRight rotation (around y):\nAssumes that y.leftChild x is not a nullLeaf, rotates around the link from y to x, makes x the new root of the subtree with y as x's right child and x's right child as y's left child, where n = a node, [n] = a subtree\n```\n      |                |\n      x                y\n    /   \\     <~     /   \\\n  [A]    y          x    [C]\n        / \\        / \\\n      [B] [C]    [A] [B]\n```\nAs rotation is a local operation only exchanging pointers it's runtime is O(1).\n\n## Insertion\n\nWe create a node with the given key and set its color to red. Then we insert it into the the tree by performing a standard insert into a BST. After this, the tree might not be a valid RBT anymore, so we fix the red-black properties by calling the insertFixup algorithm.\nThe only violation of the red-black properties occurs at the inserted node z and its parent. Either both are red, or the parent does not exist (so there is a violation since the root must be black).\nWe have three distinct cases:\n**Case 1:** The uncle of z is red. If z.parent is left child, z's uncle is z.grandparent's right child. If this is the case, we recolor and move z to z.grandparent, then we check again for this new z. In the following cases, we denote a red node with (x) and a black node with {x}, p = parent, gp = grandparent and u = uncle\n```\n         |                   |\n        {gp}               (newZ)\n       /    \\     ~>       /    \\\n    (p)     (u)         {p}     {u}\n    / \\     / \\         / \\     / \\\n  (z)  [C] [D] [E]    (z) [C] [D] [E]\n  / \\                 / \\\n[A] [B]             [A] [B]\n\n```\n**Case 2a:** The uncle of z is black and z is right child. Here, we move z upwards, so z's parent is the newZ and then we rotate around this newZ. After this, we have Case 2b.\n```\n         |                   |\n        {gp}                {gp}\n       /    \\     ~>       /    \\\n    (p)      {u}         (z)     {u}\n    / \\      / \\         / \\     / \\\n  [A]  (z)  [D] [E]  (newZ) [C] [D] [E]\n       / \\            / \\\n     [B] [C]        [A] [B]\n\n```\n**Case 2b:** The uncle of z is black and z is left child. In this case, we recolor z.parent to black and z.grandparent to red. Then we rotate around z's grandparent. Afterwards we have valid red-black tree.\n```\n         |                   |\n        {gp}                {p}\n       /    \\     ~>       /    \\\n    (p)      {u}         (z)    (gp)\n    / \\      / \\         / \\     / \\\n  (z)  [C] [D] [E]    [A] [B]  [C]  {u}\n  / \\                               / \\\n[A] [B]                           [D] [E]\n\n```\nRunning time of this algorithm: \n* Only case 1 may repeat, but this only h/2 steps, where h is the height of the tree\n* Case 2a -> Case 2b -> red-black tree\n* Case 2b -> red-black tree\nAs we perform case 1 at most O(log n) times and all other cases at most once, we have O(log n) recolorings and at most 2 rotations. \nThe overall runtime of insert is O(log n).\n\n## Deletion\n\nWe search for the node with the given key, and if it exists we delete it by performing a standard delete from a BST. If the deleted nodes' color was red everything is fine, otherwise red-black properties may be violated so we call the fixup procedure deleteFixup.\nViolations can be that the parent and child of the deleted node x where red, so we now have two adjacent red nodes, or if we deleted the root, the root could now be red, or the black height property is violated.\nWe have 4 cases: We call deleteFixup on node x\n**Case 1:** The sibling of x is red. The sibling is the other child of x's parent, which is not x itself. In this case, we recolor the parent of x and x.sibling then we left rotate around x's parent. In the following cases s = sibling of x, (x) = red, {x} = black, |x| = red/black.\n```\n        |                   |\n       {p}                 {s}\n      /    \\     ~>       /    \\\n    {x}    (s)         (p)     [D]\n    / \\    / \\         / \\     \n  [A] [B] [C] [D]    {x} [C]\n                     / \\  \n                   [A] [B]\n\n```\n**Case 2:** The sibling of x is black and has two black children. Here, we recolor x.sibling to red, move x upwards to x.parent and check again for this newX.\n```\n        |                    |\n       |p|                 |newX|\n      /    \\     ~>       /     \\\n    {x}     {s}          {x}     (s)\n    / \\    /   \\          / \\   /   \\\n  [A] [B] {l}  {r}     [A] [B] {l}  {r}\n          / \\  / \\             / \\  / \\\n        [C][D][E][F]         [C][D][E][F]\n\n```\n**Case 3:** The sibling of x is black with one black child to the right. In this case, we recolor the sibling to red and sibling.leftChild to black, then we right rotate around the sibling. After this we have case 4.\n```\n        |                    |\n       |p|                  |p|\n      /    \\     ~>       /     \\\n    {x}     {s}          {x}     {l}\n    / \\    /   \\         / \\    /   \\\n  [A] [B] (l)  {r}     [A] [B] [C]  (s)\n          / \\  / \\                  / \\\n        [C][D][E][F]               [D]{e}\n                                      / \\\n                                    [E] [F]\n\n```\n**Case 4:** The sibling of x is black with one red child to the right. Here, we recolor the sibling to the color of x.parent and x.parent and sibling.rightChild to black. Then we left rotate around x.parent. After this operation we have a valid red-black tree. Here, ||x|| denotes that x can have either color red or black, but that this can be different to |x| color. This is important, as s gets the same color as p.\n```\n        |                        |\n       ||p||                   ||s||\n      /    \\     ~>           /     \\\n    {x}     {s}              {p}     {r}\n    / \\    /   \\            /  \\     /  \\\n  [A] [B] |l|  (r)        {x}  |l|  [E] [F]\n          / \\  / \\        / \\  / \\\n        [C][D][E][F]    [A][B][C][D]\n\n```\nRunning time of this algorithm:\n* Only case 2 can repeat, but this only h many times, where h is the height of the tree\n* Case 1 -> case 2 -> red-black tree\n  Case 1 -> case 3 -> case 4 -> red-black tree\n  Case 1 -> case 4 -> red-black tree\n* Case 3 -> case 4 -> red-black tree\n* Case 4 -> red-black tree\nAs we perform case 2 at most O(log n) times and all other steps at most once, we have O(log n) recolorings and at most 3 rotations.\nThe overall runtime of delete is O(log n).\n\n## Resources:\n[CLRS]  T. Cormen, C. Leiserson, R. Rivest, and C. Stein. \"Introduction to Algorithms\", Third Edition. 2009\n\n*Written for Swift Algorithm Club by Ute Schiehlen. Updated from Jaap Wijnen and Ashwin Raghuraman's contributions. Swift 4.2 check by Bruno Scheele.*\n"
  },
  {
    "path": "Red-Black Tree/RedBlackTree.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n// Test for  the RedBlackTree implementation provided in the Source folder of this Playground\nimport Foundation\n\nlet redBlackTree = RedBlackTree<Double>()\n\nlet randomMax = Double(0x10000000)\nvar values = [Double]()\nfor i in 0..<1000 {\n  let value = Double(arc4random()) / randomMax\n  values.append(value)\n  redBlackTree.insert(key: value)\n  \n  if i % 100 == 0 {\n    redBlackTree.verify()\n  }\n}\nredBlackTree.verify()\n\nfor i in 0..<1000 {\n  let rand = arc4random_uniform(UInt32(values.count))\n  let index = Int(rand)\n  let value = values.remove(at: index)\n  redBlackTree.delete(key: value)\n  \n  if i % 100 == 0 {\n    redBlackTree.verify()\n  }\n}\nredBlackTree.verify()\n"
  },
  {
    "path": "Red-Black Tree/RedBlackTree.playground/Sources/RedBlackTree.swift",
    "content": "//Copyright (c) 2016 Matthijs Hollemans and contributors\n//\n//Permission is hereby granted, free of charge, to any person obtaining a copy\n//of this software and associated documentation files (the \"Software\"), to deal\n//in the Software without restriction, including without limitation the rights\n//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//copies of the Software, and to permit persons to whom the Software is\n//furnished to do so, subject to the following conditions:\n//\n//The above copyright notice and this permission notice shall be included in\n//all copies or substantial portions of the Software.\n//\n//THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//THE SOFTWARE.\n\nimport Foundation\n\nprivate enum RBTreeColor {\n    case red\n    case black\n}\n\nprivate enum RotationDirection {\n    case left\n    case right\n}\n\n// MARK: - RBNode\n\npublic class RBTreeNode<T: Comparable>: Equatable {\n    public typealias RBNode = RBTreeNode<T>\n    \n    fileprivate var color: RBTreeColor = .black\n    fileprivate var key: T?\n    var leftChild: RBNode?\n    var rightChild: RBNode?\n    fileprivate weak var parent: RBNode?\n    \n    public init(key: T?, leftChild: RBNode?, rightChild: RBNode?, parent: RBNode?) {\n        self.key = key\n        self.leftChild = leftChild\n        self.rightChild = rightChild\n        self.parent = parent\n        \n        self.leftChild?.parent = self\n        self.rightChild?.parent = self\n    }\n    \n    public convenience init(key: T?) {\n        self.init(key: key, leftChild: RBNode(), rightChild: RBNode(), parent: RBNode())\n    }\n    \n    // For initialising the nullLeaf\n    public convenience init() {\n        self.init(key: nil, leftChild: nil, rightChild: nil, parent: nil)\n        self.color = .black\n    }\n    \n    var isRoot: Bool {\n        return parent == nil\n    }\n    \n    var isLeaf: Bool {\n        return rightChild == nil && leftChild == nil\n    }\n    \n    var isNullLeaf: Bool {\n        return key == nil && isLeaf && color == .black\n    }\n    \n    var isLeftChild: Bool {\n        return parent?.leftChild === self\n    }\n    \n    var isRightChild: Bool {\n        return parent?.rightChild === self\n    }\n    \n    var grandparent: RBNode? {\n        return parent?.parent\n    }\n    \n    var sibling: RBNode? {\n        if isLeftChild {\n            return parent?.rightChild\n        } else {\n            return parent?.leftChild\n        }\n    }\n    \n    var uncle: RBNode? {\n        return parent?.sibling\n    }\n\n    public func getKey() -> T? {\n      return key\n    }\n}\n\n// MARK: - RedBlackTree\n\npublic class RedBlackTree<T: Comparable> {\n    public typealias RBNode = RBTreeNode<T>\n    \n    fileprivate(set) var root: RBNode\n    fileprivate(set) var size = 0\n    fileprivate let nullLeaf = RBNode()\n    fileprivate let allowDuplicateNode: Bool\n    \n    public init(_ allowDuplicateNode: Bool = false) {\n        root = nullLeaf\n        self.allowDuplicateNode = allowDuplicateNode\n    }\n}\n\n// MARK: - Size\n\nextension RedBlackTree {\n    public func count() -> Int {\n        return size\n    }\n    \n    public func isEmpty() -> Bool {\n        return size == 0\n    }\n    \n    public func allElements() -> [T] {\n        var nodes: [T] = []\n        \n        getAllElements(node: root, nodes: &nodes)\n        \n        return nodes\n    }\n    \n    private func getAllElements(node: RBTreeNode<T>, nodes: inout [T]) {\n        guard !node.isNullLeaf else {\n            return\n        }\n        \n        if let left = node.leftChild {\n            getAllElements(node: left, nodes: &nodes)\n        }\n        \n        if let key = node.key {\n            nodes.append(key)\n        }\n        \n        if let right = node.rightChild {\n            getAllElements(node: right, nodes: &nodes)\n        }\n    }\n}\n\n// MARK: - Equatable protocol\n\nextension RBTreeNode {\n    static public func == <T>(lhs: RBTreeNode<T>, rhs: RBTreeNode<T>) -> Bool {\n        return lhs.key == rhs.key\n    }\n}\n\n// MARK: - Finding a nodes successor and predecessor\n\nextension RBTreeNode {\n  /*\n   * Returns the inorder successor node of a node\n   * The successor is a node with the next larger key value of the current node\n   */\n  public func getSuccessor() -> RBNode? {\n    // If node has right child: successor min of this right tree\n    if let rightChild = self.rightChild {\n      if !rightChild.isNullLeaf {\n        return rightChild.minimum()\n      }\n    }\n    // Else go upward until node left child\n    var currentNode = self\n    var parent = currentNode.parent\n    while currentNode.isRightChild {\n      if let parent = parent {\n        currentNode = parent\n      }\n      parent = currentNode.parent\n    }\n    return parent\n  }\n  \n  /*\n  * Returns the inorder predecessor node of a node\n  * The predecessor is a node with the next smaller key value of the current node\n  */\n  public func getPredecessor() -> RBNode? {\n    // if node has left child: predecessor is min of this left tree\n    if let leftChild = leftChild, !leftChild.isNullLeaf {\n      return leftChild.maximum()\n    }\n    // else go upward while node is left child\n    var currentNode = self\n    var parent = currentNode.parent\n    while currentNode.isLeftChild {\n      if let parent = parent {\n        currentNode = parent\n      }\n      parent = currentNode.parent\n    }\n    return parent\n  }\n}\n\n// MARK: - Searching\n\nextension RBTreeNode {\n    /*\n     * Returns the node with the minimum key of the current subtree\n     */\n    public func minimum() -> RBNode? {\n        if let leftChild = leftChild {\n            if !leftChild.isNullLeaf {\n                return leftChild.minimum()\n            }\n            return self\n        }\n        return self\n    }\n    \n    /*\n     * Returns the node with the maximum key of the current subtree\n     */\n    public func maximum() -> RBNode? {\n        if let rightChild = rightChild {\n            if !rightChild.isNullLeaf {\n                return rightChild.maximum()\n            }\n            return self\n        }\n        return self\n    }\n}\n\nextension RedBlackTree {\n    /*\n     * Returns the node with the given key |input| if existing\n     */\n    public func search(input: T) -> RBNode? {\n        return search(key: input, node: root)\n    }\n    \n    /*\n     * Returns the node with given |key| in subtree of |node|\n     */\n    fileprivate func search(key: T, node: RBNode?) -> RBNode? {\n        // If node nil -> key not found\n        guard let node = node else {\n            return nil\n        }\n        // If node is nullLeaf == semantically same as if nil\n        if !node.isNullLeaf {\n            if let nodeKey = node.key {\n                // Node found\n                if key == nodeKey {\n                    return node\n                } else if key < nodeKey {\n                    return search(key: key, node: node.leftChild)\n                } else {\n                    return search(key: key, node: node.rightChild)\n                }\n            }\n        }\n        return nil\n    }\n}\n\n// MARK: - Finding maximum and minimum value\n\nextension RedBlackTree {\n    /*\n     * Returns the minimum key value of the whole tree\n     */\n    public func minValue() -> T? {\n        guard let minNode = root.minimum() else {\n            return nil\n        }\n        return minNode.key\n    }\n    \n    /*\n     * Returns the maximum key value of the whole tree\n     */\n    public func maxValue() -> T? {\n        guard let maxNode = root.maximum() else {\n            return nil\n        }\n        return maxNode.key\n    }\n}\n\n// MARK: - Inserting new nodes\n\nextension RedBlackTree {\n    /*\n     * Insert a node with key |key| into the tree\n     * 1. Perform normal insert operation as in a binary search tree\n     * 2. Fix red-black properties\n     * Runntime: O(log n)\n     */\n    public func insert(key: T) {\n        // If key must be unique and find the key already existed, quit\n        if search(input: key) != nil && !allowDuplicateNode {\n            return\n        }\n        \n        if root.isNullLeaf {\n            root = RBNode(key: key)\n        } else {\n            insert(input: RBNode(key: key), node: root)\n        }\n        \n        size += 1\n    }\n    \n    /*\n     * Nearly identical insert operation as in a binary search tree\n     * Differences: All nil pointers are replaced by the nullLeaf, we color the inserted node red,\n     * after inserting we call insertFixup to maintain the red-black properties\n     */\n    private func insert(input: RBNode, node: RBNode) {\n        guard let inputKey = input.key, let nodeKey = node.key else {\n            return\n        }\n        if inputKey < nodeKey {\n            guard let child = node.leftChild else {\n                addAsLeftChild(child: input, parent: node)\n                return\n            }\n            if child.isNullLeaf {\n                addAsLeftChild(child: input, parent: node)\n            } else {\n                insert(input: input, node: child)\n            }\n        } else {\n            guard let child = node.rightChild else {\n                addAsRightChild(child: input, parent: node)\n                return\n            }\n            if child.isNullLeaf {\n                addAsRightChild(child: input, parent: node)\n            } else {\n                insert(input: input, node: child)\n            }\n        }\n    }\n    \n    private func addAsLeftChild(child: RBNode, parent: RBNode) {\n        parent.leftChild = child\n        child.parent = parent\n        child.color = .red\n        insertFixup(node: child)\n    }\n    \n    private func addAsRightChild(child: RBNode, parent: RBNode) {\n        parent.rightChild = child\n        child.parent = parent\n        child.color = .red\n        insertFixup(node: child)\n    }\n    \n    /*\n     * Fixes possible violations of the red-black property after insertion\n     * Only violation of red-black properties occurs at inserted node |z| and z.parent\n     * We have 3 distinct cases: case 1, 2a and 2b\n     * - case 1: may repeat, but only h/2 steps, where h is the height of the tree\n     * - case 2a -> case 2b -> red-black tree\n     * - case 2b -> red-black tree\n     */\n    private func insertFixup(node z: RBNode) {\n        if !z.isNullLeaf {\n            guard let parentZ = z.parent else {\n                return\n            }\n            // If both |z| and his parent are red -> violation of red-black property -> need to fix it\n            if parentZ.color == .red {\n                guard let uncle = z.uncle else {\n                    return\n                }\n                // Case 1: Uncle red -> recolor + move z\n                if uncle.color == .red {\n                    parentZ.color = .black\n                    uncle.color = .black\n                    if let grandparentZ = parentZ.parent {\n                        grandparentZ.color = .red\n                        // Move z to grandparent and check again\n                        insertFixup(node: grandparentZ)\n                    }\n                }\n                    // Case 2: Uncle black\n                else {\n                    var zNew = z\n                    // Case 2.a: z right child -> rotate\n                    if parentZ.isLeftChild && z.isRightChild {\n                        zNew = parentZ\n                        leftRotate(node: zNew)\n                    } else if parentZ.isRightChild && z.isLeftChild {\n                        zNew = parentZ\n                        rightRotate(node: zNew)\n                    }\n                    // Case 2.b: z left child -> recolor + rotate\n                    zNew.parent?.color = .black\n                    if let grandparentZnew = zNew.grandparent {\n                        grandparentZnew.color = .red\n                        if z.isLeftChild {\n                            rightRotate(node: grandparentZnew)\n                        } else {\n                            leftRotate(node: grandparentZnew)\n                        }\n                        // We have a valid red-black-tree\n                    }\n                }\n            }\n        }\n        root.color = .black\n    }\n}\n\n// MARK: - Deleting a node\nextension RedBlackTree {\n    /*\n     * Delete a node with key |key| from the tree\n     * 1. Perform standard delete operation as in a binary search tree\n     * 2. Fix red-black properties\n     * Runntime: O(log n)\n     */\n    public func delete(key: T) {\n        if size == 1 {\n            root = nullLeaf\n            size -= 1\n        } else if let node = search(key: key, node: root) {\n            if !node.isNullLeaf {\n                delete(node: node)\n                size -= 1\n            }\n        }\n    }\n    \n    /*\n     * Nearly identical delete operation as in a binary search tree\n     * Differences: All nil pointers are replaced by the nullLeaf,\n     * after deleting we call insertFixup to maintain the red-black properties if the delted node was\n     * black (as if it was red -> no violation of red-black properties)\n     */\n    private func delete(node z: RBNode) {\n        var nodeY = RBNode()\n        var nodeX = RBNode()\n        if let leftChild = z.leftChild, let rightChild = z.rightChild {\n            if leftChild.isNullLeaf || rightChild.isNullLeaf {\n                nodeY = z\n            } else {\n                if let successor = z.getSuccessor() {\n                    nodeY = successor\n                }\n            }\n        }\n        if let leftChild = nodeY.leftChild {\n            if !leftChild.isNullLeaf {\n                nodeX = leftChild\n            } else if let rightChild = nodeY.rightChild {\n                nodeX = rightChild\n            }\n        }\n        nodeX.parent = nodeY.parent\n        if let parentY = nodeY.parent {\n            // Should never be the case, as parent of root = nil\n            if parentY.isNullLeaf {\n                root = nodeX\n            } else {\n                if nodeY.isLeftChild {\n                    parentY.leftChild = nodeX\n                } else {\n                    parentY.rightChild = nodeX\n                }\n            }\n        } else {\n            root = nodeX\n        }\n        if nodeY != z {\n            z.key = nodeY.key\n        }\n        // If sliced out node was red -> nothing to do as red-black-property holds\n        // If it was black -> fix red-black-property\n        if nodeY.color == .black {\n            deleteFixup(node: nodeX)\n        }\n    }\n    \n    /*\n     * Fixes possible violations of the red-black property after deletion\n     * We have w distinct cases: only case 2 may repeat, but only h many steps, where h is the height\n     * of the tree\n     * - case 1 -> case 2 -> red-black tree\n     *   case 1 -> case 3 -> case 4 -> red-black tree\n     *   case 1 -> case 4 -> red-black tree\n     * - case 3 -> case 4 -> red-black tree\n     * - case 4 -> red-black tree\n     */\n    private func deleteFixup(node x: RBNode) {\n        var xTmp = x\n        if !x.isRoot && x.color == .black {\n            guard var sibling = x.sibling else {\n                return\n            }\n            // Case 1: Sibling of x is red\n            if sibling.color == .red {\n                // Recolor\n                sibling.color = .black\n                if let parentX = x.parent {\n                    parentX.color = .red\n                    // Rotation\n                    if x.isLeftChild {\n                        leftRotate(node: parentX)\n                    } else {\n                        rightRotate(node: parentX)\n                    }\n                    // Update sibling\n                    if let sibl = x.sibling {\n                        sibling = sibl\n                    }\n                }\n            }\n            // Case 2: Sibling is black with two black children\n            if sibling.leftChild?.color == .black && sibling.rightChild?.color == .black {\n                // Recolor\n                sibling.color = .red\n                // Move fake black unit upwards\n                if let parentX = x.parent {\n                    deleteFixup(node: parentX)\n                }\n                // We have a valid red-black-tree\n            } else {\n                // Case 3: a. Sibling black with one black child to the right\n                if x.isLeftChild && sibling.rightChild?.color == .black {\n                    // Recolor\n                    sibling.leftChild?.color = .black\n                    sibling.color = .red\n                    // Rotate\n                    rightRotate(node: sibling)\n                    // Update sibling of x\n                    if let sibl = x.sibling {\n                        sibling = sibl\n                    }\n                }\n                    // Still case 3: b. One black child to the left\n                else if x.isRightChild && sibling.leftChild?.color == .black {\n                    // Recolor\n                    sibling.rightChild?.color = .black\n                    sibling.color = .red\n                    // Rotate\n                    leftRotate(node: sibling)\n                    // Update sibling of x\n                    if let sibl = x.sibling {\n                        sibling = sibl\n                    }\n                }\n                // Case 4: Sibling is black with red right child\n                // Recolor\n                if let parentX = x.parent {\n                    sibling.color = parentX.color\n                    parentX.color = .black\n                    // a. x left and sibling with red right child\n                    if x.isLeftChild {\n                        sibling.rightChild?.color = .black\n                        // Rotate\n                        leftRotate(node: parentX)\n                    }\n                        // b. x right and sibling with red left child\n                    else {\n                        sibling.leftChild?.color = .black\n                        //Rotate\n                        rightRotate(node: parentX)\n                    }\n                    // We have a valid red-black-tree\n                    xTmp = root\n                }\n            }\n        }\n        xTmp.color = .black\n    }\n}\n\n// MARK: - Rotation\nextension RedBlackTree {\n    /*\n     * Left rotation around node x\n     * Assumes that x.rightChild y is not a nullLeaf, rotates around the link from x to y,\n     * makes y the new root of the subtree with x as y's left child and y's left child as x's right\n     * child, where n = a node, [n] = a subtree\n     *     |                |\n     *     x                y\n     *   /   \\     ~>     /   \\\n     * [A]    y          x    [C]\n     *       / \\        / \\\n     *     [B] [C]    [A] [B]\n     */\n    fileprivate func leftRotate(node x: RBNode) {\n        rotate(node: x, direction: .left)\n    }\n    \n    /*\n     * Right rotation around node y\n     * Assumes that y.leftChild x is not a nullLeaf, rotates around the link from y to x,\n     * makes x the new root of the subtree with y as x's right child and x's right child as y's left\n     * child, where n = a node, [n] = a subtree\n     *     |                |\n     *     x                y\n     *   /   \\     <~     /   \\\n     * [A]    y          x    [C]\n     *       / \\        / \\\n     *     [B] [C]    [A] [B]\n     */\n    fileprivate func rightRotate(node x: RBNode) {\n        rotate(node: x, direction: .right)\n    }\n    \n    /*\n     * Rotation around a node x\n     * Is a local operation preserving the binary-search-tree property that only exchanges pointers.\n     * Runntime: O(1)\n     */\n    private func rotate(node x: RBNode, direction: RotationDirection) {\n        var nodeY: RBNode? = RBNode()\n        \n        // Set |nodeY| and turn |nodeY|'s left/right subtree into |x|'s right/left subtree\n        switch direction {\n        case .left:\n            nodeY = x.rightChild\n            x.rightChild = nodeY?.leftChild\n            x.rightChild?.parent = x\n        case .right:\n            nodeY = x.leftChild\n            x.leftChild = nodeY?.rightChild\n            x.leftChild?.parent = x\n        }\n        \n        // Link |x|'s parent to nodeY\n        nodeY?.parent = x.parent\n        if x.isRoot {\n            if let node = nodeY {\n                root = node\n            }\n        } else if x.isLeftChild {\n            x.parent?.leftChild = nodeY\n        } else if x.isRightChild {\n            x.parent?.rightChild = nodeY\n        }\n        \n        // Put |x| on |nodeY|'s left\n        switch direction {\n        case .left:\n            nodeY?.leftChild = x\n        case .right:\n            nodeY?.rightChild = x\n        }\n        x.parent = nodeY\n    }\n}\n\n// MARK: - Verify\nextension RedBlackTree {\n    /*\n     * Verifies that the existing tree fulfills all red-black properties\n     * Returns true if the tree is a valid red-black tree, false otherwise\n     */\n    public func verify() -> Bool {\n        if root.isNullLeaf {\n            print(\"The tree is empty\")\n            return true\n        }\n        return property2() && property4() && property5()\n    }\n    \n    // Property 1: Every node is either red or black -> fullfilled through setting node.color of type\n    // RBTreeColor\n    \n    // Property 2: The root is black\n    private func property2() -> Bool {\n        if root.color == .red {\n            print(\"Property-Error: Root is red\")\n            return false\n        }\n        return true\n    }\n    \n    // Property 3: Every nullLeaf is black -> fullfilled through initialising nullLeafs with color = black\n    \n    // Property 4: If a node is red, then both its children are black\n    private func property4() -> Bool {\n        return property4(node: root)\n    }\n    \n    private func property4(node: RBNode) -> Bool {\n        if node.isNullLeaf {\n            return true\n        }\n        if let leftChild = node.leftChild, let rightChild = node.rightChild {\n            if node.color == .red {\n                if !leftChild.isNullLeaf && leftChild.color == .red {\n                    print(\"Property-Error: Red node with key \\(String(describing: node.key)) has red left child\")\n                    return false\n                }\n                if !rightChild.isNullLeaf && rightChild.color == .red {\n                    print(\"Property-Error: Red node with key \\(String(describing: node.key)) has red right child\")\n                    return false\n                }\n            }\n            return property4(node: leftChild) && property4(node: rightChild)\n        }\n        return false\n    }\n    \n    // Property 5: For each node, all paths from the node to descendant leaves contain the same number\n    // of black nodes (same blackheight)\n    private func property5() -> Bool {\n        if property5(node: root) == -1 {\n            return false\n        } else {\n            return true\n        }\n    }\n    \n    private func property5(node: RBNode) -> Int {\n        if node.isNullLeaf {\n            return 0\n        }\n        guard let leftChild = node.leftChild, let rightChild = node.rightChild else {\n            return -1\n        }\n        let left = property5(node: leftChild)\n        let right = property5(node: rightChild)\n        \n        if left == -1 || right == -1 {\n            return -1\n        } else if left == right {\n            let addedHeight = node.color == .black ? 1 : 0\n            return left + addedHeight\n        } else {\n            print(\"Property-Error: Black height violated at node with key \\(String(describing: node.key))\")\n            return -1\n        }\n    }\n}\n\n// MARK: - Debugging\n\nextension RBTreeNode: CustomDebugStringConvertible {\n    public var debugDescription: String {\n        var s = \"\"\n        if isNullLeaf {\n            s = \"nullLeaf\"\n        } else {\n            if let key = key {\n                s = \"key: \\(key)\"\n            } else {\n                s = \"key: nil\"\n            }\n            if let parent = parent {\n                s += \", parent: \\(String(describing: parent.key))\"\n            }\n            if let left = leftChild {\n                s += \", left = [\" + left.debugDescription + \"]\"\n            }\n            if let right = rightChild {\n                s += \", right = [\" + right.debugDescription + \"]\"\n            }\n            s += \", color = \\(color)\"\n        }\n        return s\n    }\n}\n\nextension RedBlackTree: CustomDebugStringConvertible {\n    public var debugDescription: String {\n        return root.debugDescription\n    }\n}\n\nextension RBTreeNode: CustomStringConvertible {\n    public var description: String {\n        var s = \"\"\n        if isNullLeaf {\n            s += \"nullLeaf\"\n        } else {\n            if let left = leftChild {\n                s += \"(\\(left.description)) <- \"\n            }\n            if let key = key {\n                s += \"\\(key)\"\n            } else {\n                s += \"nil\"\n            }\n            s += \", \\(color)\"\n            if let right = rightChild {\n                s += \" -> (\\(right.description))\"\n            }\n        }\n        return s\n    }\n}\n\nextension RedBlackTree: CustomStringConvertible {\n    public var description: String {\n        if root.isNullLeaf {\n            return \"[]\"\n        } else {\n            return root.description\n        }\n    }\n}\n"
  },
  {
    "path": "Red-Black Tree/RedBlackTree.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Red-Black Tree/RedBlackTree.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Red-Black Tree/RedBlackTree.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Red-Black Tree/RedBlackTree.swift",
    "content": "//Copyright (c) 2016 Matthijs Hollemans and contributors\n//\n//Permission is hereby granted, free of charge, to any person obtaining a copy\n//of this software and associated documentation files (the \"Software\"), to deal\n//in the Software without restriction, including without limitation the rights\n//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//copies of the Software, and to permit persons to whom the Software is\n//furnished to do so, subject to the following conditions:\n//\n//The above copyright notice and this permission notice shall be included in\n//all copies or substantial portions of the Software.\n//\n//THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//THE SOFTWARE.\n\nimport Foundation\n\nprivate enum RBTreeColor {\n    case red\n    case black\n}\n\nprivate enum RotationDirection {\n    case left\n    case right\n}\n\n// MARK: - RBNode\n\npublic class RBTreeNode<T: Comparable>: Equatable {\n    public typealias RBNode = RBTreeNode<T>\n    \n    fileprivate var color: RBTreeColor = .black\n    fileprivate var key: T?\n    var leftChild: RBNode?\n    var rightChild: RBNode?\n    fileprivate weak var parent: RBNode?\n    \n    public init(key: T?, leftChild: RBNode?, rightChild: RBNode?, parent: RBNode?) {\n        self.key = key\n        self.leftChild = leftChild\n        self.rightChild = rightChild\n        self.parent = parent\n        \n        self.leftChild?.parent = self\n        self.rightChild?.parent = self\n    }\n    \n    public convenience init(key: T?) {\n        self.init(key: key, leftChild: RBNode(), rightChild: RBNode(), parent: RBNode())\n    }\n    \n    // For initialising the nullLeaf\n    public convenience init() {\n        self.init(key: nil, leftChild: nil, rightChild: nil, parent: nil)\n        self.color = .black\n    }\n    \n    var isRoot: Bool {\n        return parent == nil\n    }\n    \n    var isLeaf: Bool {\n        return rightChild == nil && leftChild == nil\n    }\n    \n    var isNullLeaf: Bool {\n        return key == nil && isLeaf && color == .black\n    }\n    \n    var isLeftChild: Bool {\n        return parent?.leftChild === self\n    }\n    \n    var isRightChild: Bool {\n        return parent?.rightChild === self\n    }\n    \n    var grandparent: RBNode? {\n        return parent?.parent\n    }\n    \n    var sibling: RBNode? {\n        if isLeftChild {\n            return parent?.rightChild\n        } else {\n            return parent?.leftChild\n        }\n    }\n    \n    var uncle: RBNode? {\n        return parent?.sibling\n    }\n}\n\n// MARK: - RedBlackTree\n\npublic class RedBlackTree<T: Comparable> {\n    public typealias RBNode = RBTreeNode<T>\n    \n    fileprivate(set) var root: RBNode\n    fileprivate(set) var size = 0\n    fileprivate let nullLeaf = RBNode()\n    fileprivate let allowDuplicateNode: Bool\n    \n    public init(_ allowDuplicateNode: Bool = false) {\n        root = nullLeaf\n        self.allowDuplicateNode = allowDuplicateNode\n    }\n}\n\n// MARK: - Size\n\nextension RedBlackTree {\n    public func count() -> Int {\n        return size\n    }\n    \n    public func isEmpty() -> Bool {\n        return size == 0\n    }\n    \n    public func allElements() -> [T] {\n        var nodes: [T] = []\n        \n        getAllElements(node: root, nodes: &nodes)\n        \n        return nodes\n    }\n    \n    private func getAllElements(node: RBTreeNode<T>, nodes: inout [T]) {\n        guard !node.isNullLeaf else {\n            return\n        }\n        \n        if let left = node.leftChild {\n            getAllElements(node: left, nodes: &nodes)\n        }\n        \n        if let key = node.key {\n            nodes.append(key)\n        }\n        \n        if let right = node.rightChild {\n            getAllElements(node: right, nodes: &nodes)\n        }\n    }\n}\n\n// MARK: - Equatable protocol\n\nextension RBTreeNode {\n    static public func == <T>(lhs: RBTreeNode<T>, rhs: RBTreeNode<T>) -> Bool {\n        return lhs.key == rhs.key\n    }\n}\n\n// MARK: - Finding a nodes successor\n\nextension RBTreeNode {\n    /*\n     * Returns the inorder successor node of a node\n     * The successor is a node with the next larger key value of the current node\n     */\n    public func getSuccessor() -> RBNode? {\n        // If node has right child: successor min of this right tree\n        if let rightChild = self.rightChild {\n            if !rightChild.isNullLeaf {\n                return rightChild.minimum()\n            }\n        }\n        // Else go upward until node left child\n        var currentNode = self\n        var parent = currentNode.parent\n        while currentNode.isRightChild {\n            if let parent = parent {\n                currentNode = parent\n            }\n            parent = currentNode.parent\n        }\n        return parent\n    }\n}\n\n// MARK: - Searching\n\nextension RBTreeNode {\n    /*\n     * Returns the node with the minimum key of the current subtree\n     */\n    public func minimum() -> RBNode? {\n        if let leftChild = leftChild {\n            if !leftChild.isNullLeaf {\n                return leftChild.minimum()\n            }\n            return self\n        }\n        return self\n    }\n    \n    /*\n     * Returns the node with the maximum key of the current subtree\n     */\n    public func maximum() -> RBNode? {\n        if let rightChild = rightChild {\n            if !rightChild.isNullLeaf {\n                return rightChild.maximum()\n            }\n            return self\n        }\n        return self\n    }\n}\n\nextension RedBlackTree {\n    /*\n     * Returns the node with the given key |input| if existing\n     */\n    public func search(input: T) -> RBNode? {\n        return search(key: input, node: root)\n    }\n    \n    /*\n     * Returns the node with given |key| in subtree of |node|\n     */\n    fileprivate func search(key: T, node: RBNode?) -> RBNode? {\n        // If node nil -> key not found\n        guard let node = node else {\n            return nil\n        }\n        // If node is nullLeaf == semantically same as if nil\n        if !node.isNullLeaf {\n            if let nodeKey = node.key {\n                // Node found\n                if key == nodeKey {\n                    return node\n                } else if key < nodeKey {\n                    return search(key: key, node: node.leftChild)\n                } else {\n                    return search(key: key, node: node.rightChild)\n                }\n            }\n        }\n        return nil\n    }\n}\n\n// MARK: - Finding maximum and minimum value\n\nextension RedBlackTree {\n    /*\n     * Returns the minimum key value of the whole tree\n     */\n    public func minValue() -> T? {\n        guard let minNode = root.minimum() else {\n            return nil\n        }\n        return minNode.key\n    }\n    \n    /*\n     * Returns the maximum key value of the whole tree\n     */\n    public func maxValue() -> T? {\n        guard let maxNode = root.maximum() else {\n            return nil\n        }\n        return maxNode.key\n    }\n}\n\n// MARK: - Inserting new nodes\n\nextension RedBlackTree {\n    /*\n     * Insert a node with key |key| into the tree\n     * 1. Perform normal insert operation as in a binary search tree\n     * 2. Fix red-black properties\n     * Runntime: O(log n)\n     */\n    public func insert(key: T) {\n        // If key must be unique and find the key already existed, quit\n        if search(input: key) != nil && !allowDuplicateNode {\n            return\n        }\n        \n        if root.isNullLeaf {\n            root = RBNode(key: key)\n        } else {\n            insert(input: RBNode(key: key), node: root)\n        }\n        \n        size += 1\n    }\n    \n    /*\n     * Nearly identical insert operation as in a binary search tree\n     * Differences: All nil pointers are replaced by the nullLeaf, we color the inserted node red,\n     * after inserting we call insertFixup to maintain the red-black properties\n     */\n    private func insert(input: RBNode, node: RBNode) {\n        guard let inputKey = input.key, let nodeKey = node.key else {\n            return\n        }\n        if inputKey < nodeKey {\n            guard let child = node.leftChild else {\n                addAsLeftChild(child: input, parent: node)\n                return\n            }\n            if child.isNullLeaf {\n                addAsLeftChild(child: input, parent: node)\n            } else {\n                insert(input: input, node: child)\n            }\n        } else {\n            guard let child = node.rightChild else {\n                addAsRightChild(child: input, parent: node)\n                return\n            }\n            if child.isNullLeaf {\n                addAsRightChild(child: input, parent: node)\n            } else {\n                insert(input: input, node: child)\n            }\n        }\n    }\n    \n    private func addAsLeftChild(child: RBNode, parent: RBNode) {\n        parent.leftChild = child\n        child.parent = parent\n        child.color = .red\n        insertFixup(node: child)\n    }\n    \n    private func addAsRightChild(child: RBNode, parent: RBNode) {\n        parent.rightChild = child\n        child.parent = parent\n        child.color = .red\n        insertFixup(node: child)\n    }\n    \n    /*\n     * Fixes possible violations of the red-black property after insertion\n     * Only violation of red-black properties occurs at inserted node |z| and z.parent\n     * We have 3 distinct cases: case 1, 2a and 2b\n     * - case 1: may repeat, but only h/2 steps, where h is the height of the tree\n     * - case 2a -> case 2b -> red-black tree\n     * - case 2b -> red-black tree\n     */\n    private func insertFixup(node z: RBNode) {\n        if !z.isNullLeaf {\n            guard let parentZ = z.parent else {\n                return\n            }\n            // If both |z| and his parent are red -> violation of red-black property -> need to fix it\n            if parentZ.color == .red {\n                guard let uncle = z.uncle else {\n                    return\n                }\n                // Case 1: Uncle red -> recolor + move z\n                if uncle.color == .red {\n                    parentZ.color = .black\n                    uncle.color = .black\n                    if let grandparentZ = parentZ.parent {\n                        grandparentZ.color = .red\n                        // Move z to grandparent and check again\n                        insertFixup(node: grandparentZ)\n                    }\n                }\n                    // Case 2: Uncle black\n                else {\n                    var zNew = z\n                    // Case 2.a: z right child -> rotate\n                    if parentZ.isLeftChild && z.isRightChild {\n                        zNew = parentZ\n                        leftRotate(node: zNew)\n                    } else if parentZ.isRightChild && z.isLeftChild {\n                        zNew = parentZ\n                        rightRotate(node: zNew)\n                    }\n                    // Case 2.b: z left child -> recolor + rotate\n                    zNew.parent?.color = .black\n                    if let grandparentZnew = zNew.grandparent {\n                        grandparentZnew.color = .red\n                        if z.isLeftChild {\n                            rightRotate(node: grandparentZnew)\n                        } else {\n                            leftRotate(node: grandparentZnew)\n                        }\n                        // We have a valid red-black-tree\n                    }\n                }\n            }\n        }\n        root.color = .black\n    }\n}\n\n// MARK: - Deleting a node\nextension RedBlackTree {\n    /*\n     * Delete a node with key |key| from the tree\n     * 1. Perform standard delete operation as in a binary search tree\n     * 2. Fix red-black properties\n     * Runntime: O(log n)\n     */\n    public func delete(key: T) {\n        if size == 1 {\n            root = nullLeaf\n            size -= 1\n        } else if let node = search(key: key, node: root) {\n            if !node.isNullLeaf {\n                delete(node: node)\n                size -= 1\n            }\n        }\n    }\n    \n    /*\n     * Nearly identical delete operation as in a binary search tree\n     * Differences: All nil pointers are replaced by the nullLeaf,\n     * after deleting we call insertFixup to maintain the red-black properties if the delted node was\n     * black (as if it was red -> no violation of red-black properties)\n     */\n    private func delete(node z: RBNode) {\n        var nodeY = RBNode()\n        var nodeX = RBNode()\n        if let leftChild = z.leftChild, let rightChild = z.rightChild {\n            if leftChild.isNullLeaf || rightChild.isNullLeaf {\n                nodeY = z\n            } else {\n                if let successor = z.getSuccessor() {\n                    nodeY = successor\n                }\n            }\n        }\n        if let leftChild = nodeY.leftChild {\n            if !leftChild.isNullLeaf {\n                nodeX = leftChild\n            } else if let rightChild = nodeY.rightChild {\n                nodeX = rightChild\n            }\n        }\n        nodeX.parent = nodeY.parent\n        if let parentY = nodeY.parent {\n            // Should never be the case, as parent of root = nil\n            if parentY.isNullLeaf {\n                root = nodeX\n            } else {\n                if nodeY.isLeftChild {\n                    parentY.leftChild = nodeX\n                } else {\n                    parentY.rightChild = nodeX\n                }\n            }\n        } else {\n            root = nodeX\n        }\n        if nodeY != z {\n            z.key = nodeY.key\n        }\n        // If sliced out node was red -> nothing to do as red-black-property holds\n        // If it was black -> fix red-black-property\n        if nodeY.color == .black {\n            deleteFixup(node: nodeX)\n        }\n    }\n    \n    /*\n     * Fixes possible violations of the red-black property after deletion\n     * We have w distinct cases: only case 2 may repeat, but only h many steps, where h is the height\n     * of the tree\n     * - case 1 -> case 2 -> red-black tree\n     *   case 1 -> case 3 -> case 4 -> red-black tree\n     *   case 1 -> case 4 -> red-black tree\n     * - case 3 -> case 4 -> red-black tree\n     * - case 4 -> red-black tree\n     */\n    private func deleteFixup(node x: RBNode) {\n        var xTmp = x\n        if !x.isRoot && x.color == .black {\n            guard var sibling = x.sibling else {\n                return\n            }\n            // Case 1: Sibling of x is red\n            if sibling.color == .red {\n                // Recolor\n                sibling.color = .black\n                if let parentX = x.parent {\n                    parentX.color = .red\n                    // Rotation\n                    if x.isLeftChild {\n                        leftRotate(node: parentX)\n                    } else {\n                        rightRotate(node: parentX)\n                    }\n                    // Update sibling\n                    if let sibl = x.sibling {\n                        sibling = sibl\n                    }\n                }\n            }\n            // Case 2: Sibling is black with two black children\n            if sibling.leftChild?.color == .black && sibling.rightChild?.color == .black {\n                // Recolor\n                sibling.color = .red\n                // Move fake black unit upwards\n                if let parentX = x.parent {\n                    deleteFixup(node: parentX)\n                }\n                // We have a valid red-black-tree\n            } else {\n                // Case 3: a. Sibling black with one black child to the right\n                if x.isLeftChild && sibling.rightChild?.color == .black {\n                    // Recolor\n                    sibling.leftChild?.color = .black\n                    sibling.color = .red\n                    // Rotate\n                    rightRotate(node: sibling)\n                    // Update sibling of x\n                    if let sibl = x.sibling {\n                        sibling = sibl\n                    }\n                }\n                    // Still case 3: b. One black child to the left\n                else if x.isRightChild && sibling.leftChild?.color == .black {\n                    // Recolor\n                    sibling.rightChild?.color = .black\n                    sibling.color = .red\n                    // Rotate\n                    leftRotate(node: sibling)\n                    // Update sibling of x\n                    if let sibl = x.sibling {\n                        sibling = sibl\n                    }\n                }\n                // Case 4: Sibling is black with red right child\n                // Recolor\n                if let parentX = x.parent {\n                    sibling.color = parentX.color\n                    parentX.color = .black\n                    // a. x left and sibling with red right child\n                    if x.isLeftChild {\n                        sibling.rightChild?.color = .black\n                        // Rotate\n                        leftRotate(node: parentX)\n                    }\n                        // b. x right and sibling with red left child\n                    else {\n                        sibling.leftChild?.color = .black\n                        //Rotate\n                        rightRotate(node: parentX)\n                    }\n                    // We have a valid red-black-tree\n                    xTmp = root\n                }\n            }\n        }\n        xTmp.color = .black\n    }\n}\n\n// MARK: - Rotation\nextension RedBlackTree {\n    /*\n     * Left rotation around node x\n     * Assumes that x.rightChild y is not a nullLeaf, rotates around the link from x to y,\n     * makes y the new root of the subtree with x as y's left child and y's left child as x's right\n     * child, where n = a node, [n] = a subtree\n     *     |                |\n     *     x                y\n     *   /   \\     ~>     /   \\\n     * [A]    y          x    [C]\n     *       / \\        / \\\n     *     [B] [C]    [A] [B]\n     */\n    fileprivate func leftRotate(node x: RBNode) {\n        rotate(node: x, direction: .left)\n    }\n    \n    /*\n     * Right rotation around node y\n     * Assumes that y.leftChild x is not a nullLeaf, rotates around the link from y to x,\n     * makes x the new root of the subtree with y as x's right child and x's right child as y's left\n     * child, where n = a node, [n] = a subtree\n     *     |                |\n     *     x                y\n     *   /   \\     <~     /   \\\n     * [A]    y          x    [C]\n     *       / \\        / \\\n     *     [B] [C]    [A] [B]\n     */\n    fileprivate func rightRotate(node x: RBNode) {\n        rotate(node: x, direction: .right)\n    }\n    \n    /*\n     * Rotation around a node x\n     * Is a local operation preserving the binary-search-tree property that only exchanges pointers.\n     * Runntime: O(1)\n     */\n    private func rotate(node x: RBNode, direction: RotationDirection) {\n        var nodeY: RBNode? = RBNode()\n        \n        // Set |nodeY| and turn |nodeY|'s left/right subtree into |x|'s right/left subtree\n        switch direction {\n        case .left:\n            nodeY = x.rightChild\n            x.rightChild = nodeY?.leftChild\n            x.rightChild?.parent = x\n        case .right:\n            nodeY = x.leftChild\n            x.leftChild = nodeY?.rightChild\n            x.leftChild?.parent = x\n        }\n        \n        // Link |x|'s parent to nodeY\n        nodeY?.parent = x.parent\n        if x.isRoot {\n            if let node = nodeY {\n                root = node\n            }\n        } else if x.isLeftChild {\n            x.parent?.leftChild = nodeY\n        } else if x.isRightChild {\n            x.parent?.rightChild = nodeY\n        }\n        \n        // Put |x| on |nodeY|'s left\n        switch direction {\n        case .left:\n            nodeY?.leftChild = x\n        case .right:\n            nodeY?.rightChild = x\n        }\n        x.parent = nodeY\n    }\n}\n\n// MARK: - Verify\nextension RedBlackTree {\n    /*\n     * Verifies that the existing tree fulfills all red-black properties\n     * Returns true if the tree is a valid red-black tree, false otherwise\n     */\n    public func verify() -> Bool {\n        if root.isNullLeaf {\n            print(\"The tree is empty\")\n            return true\n        }\n        return property2() && property4() && property5()\n    }\n    \n    // Property 1: Every node is either red or black -> fullfilled through setting node.color of type\n    // RBTreeColor\n    \n    // Property 2: The root is black\n    private func property2() -> Bool {\n        if root.color == .red {\n            print(\"Property-Error: Root is red\")\n            return false\n        }\n        return true\n    }\n    \n    // Property 3: Every nullLeaf is black -> fullfilled through initialising nullLeafs with color = black\n    \n    // Property 4: If a node is red, then both its children are black\n    private func property4() -> Bool {\n        return property4(node: root)\n    }\n    \n    private func property4(node: RBNode) -> Bool {\n        if node.isNullLeaf {\n            return true\n        }\n        if let leftChild = node.leftChild, let rightChild = node.rightChild {\n            if node.color == .red {\n                if !leftChild.isNullLeaf && leftChild.color == .red {\n                    print(\"Property-Error: Red node with key \\(String(describing: node.key)) has red left child\")\n                    return false\n                }\n                if !rightChild.isNullLeaf && rightChild.color == .red {\n                    print(\"Property-Error: Red node with key \\(String(describing: node.key)) has red right child\")\n                    return false\n                }\n            }\n            return property4(node: leftChild) && property4(node: rightChild)\n        }\n        return false\n    }\n    \n    // Property 5: For each node, all paths from the node to descendant leaves contain the same number\n    // of black nodes (same blackheight)\n    private func property5() -> Bool {\n        if property5(node: root) == -1 {\n            return false\n        } else {\n            return true\n        }\n    }\n    \n    private func property5(node: RBNode) -> Int {\n        if node.isNullLeaf {\n            return 0\n        }\n        guard let leftChild = node.leftChild, let rightChild = node.rightChild else {\n            return -1\n        }\n        let left = property5(node: leftChild)\n        let right = property5(node: rightChild)\n        \n        if left == -1 || right == -1 {\n            return -1\n        } else if left == right {\n            let addedHeight = node.color == .black ? 1 : 0\n            return left + addedHeight\n        } else {\n            print(\"Property-Error: Black height violated at node with key \\(String(describing: node.key))\")\n            return -1\n        }\n    }\n}\n\n// MARK: - Debugging\n\nextension RBTreeNode: CustomDebugStringConvertible {\n    public var debugDescription: String {\n        var s = \"\"\n        if isNullLeaf {\n            s = \"nullLeaf\"\n        } else {\n            if let key = key {\n                s = \"key: \\(key)\"\n            } else {\n                s = \"key: nil\"\n            }\n            if let parent = parent {\n                s += \", parent: \\(String(describing: parent.key))\"\n            }\n            if let left = leftChild {\n                s += \", left = [\" + left.debugDescription + \"]\"\n            }\n            if let right = rightChild {\n                s += \", right = [\" + right.debugDescription + \"]\"\n            }\n            s += \", color = \\(color)\"\n        }\n        return s\n    }\n}\n\nextension RedBlackTree: CustomDebugStringConvertible {\n    public var debugDescription: String {\n        return root.debugDescription\n    }\n}\n\nextension RBTreeNode: CustomStringConvertible {\n    public var description: String {\n        var s = \"\"\n        if isNullLeaf {\n            s += \"nullLeaf\"\n        } else {\n            if let left = leftChild {\n                s += \"(\\(left.description)) <- \"\n            }\n            if let key = key {\n                s += \"\\(key)\"\n            } else {\n                s += \"nil\"\n            }\n            s += \", \\(color)\"\n            if let right = rightChild {\n                s += \" -> (\\(right.description))\"\n            }\n        }\n        return s\n    }\n}\n\nextension RedBlackTree: CustomStringConvertible {\n    public var description: String {\n        if root.isNullLeaf {\n            return \"[]\"\n        } else {\n            return root.description\n        }\n    }\n}\n"
  },
  {
    "path": "Ring Buffer/README.markdown",
    "content": "# Ring Buffer\n\nAlso known as a circular buffer.\n\nThe problem with a [queue based on an array](../Queue/) is that adding new items to the back of the queue is fast, **O(1)**, but removing items from the front of the queue is slow, **O(n)**. Removing is slow because it requires the remaining array elements to be shifted in memory.\n\nA more efficient way to implement a queue is to use a ring buffer or circular buffer. This is an array that conceptually wraps around back to the beginning, so you never have to remove any items. All operations are **O(1)**.\n\nHere is how it works in principle. We have an array of a fixed size, say 5 items:\n\n\t[    ,    ,    ,    ,     ]\n\t r\n\t w\n\nInitially, the array is empty and the read (`r`) and write (`w`) pointers are at the beginning.\n\nLet's add some data to this array. We'll write, or \"enqueue\", the number `123`:\n\n\t[ 123,    ,    ,    ,     ]\n\t  r\n\t  ---> w\n\nEach time we add data, the write pointer moves one step forward. Let's add a few more elements:\n\n\t[ 123, 456, 789, 666,     ]\n\t  r    \n\t       -------------> w\n\nThere is now one open spot left in the array, but rather than enqueuing another item the app decides to read some data. That's possible because the write pointer is ahead of the read pointer, meaning data is available for reading. The read pointer advances as we read the available data:\n\n\t[ 123, 456, 789, 666,     ]\n\t  ---> r              w\n\nLet's read two more items:\n\n\t[ 123, 456, 789, 666,     ]\n\t       --------> r    w\n\nNow the app decides it's time to write again and enqueues two more data items, `333` and `555`:\n\n\t[ 123, 456, 789, 666, 333 ]\n\t                 r    ---> w\n\nWhoops, the write pointer has reached the end of the array, so there is no more room for object `555`. What now? Well, this is why it's a circular buffer: we wrap the write pointer back to the beginning and write the remaining data:\n\n\t[ 555, 456, 789, 666, 333 ]\n\t  ---> w         r        \n\nWe can now read the remaining three items, `666`, `333`, and `555`.\n\n\t[ 555, 456, 789, 666, 333 ]\n\t       w         --------> r        \n\nOf course, as the read pointer reaches the end of the buffer it also wraps around:\n\n\t[ 555, 456, 789, 666, 333 ]\n\t       w            \n\t  ---> r\n\nAnd now the buffer is empty again because the read pointer has caught up with the write pointer.\n\nHere is a very basic implementation in Swift:\n\n```swift\npublic struct RingBuffer<T> {\n  fileprivate var array: [T?]\n  fileprivate var readIndex = 0\n  fileprivate var writeIndex = 0\n\n  public init(count: Int) {\n    array = [T?](repeating: nil, count: count)\n  }\n\n  public mutating func write(_ element: T) -> Bool {\n    if !isFull {\n      array[writeIndex % array.count] = element\n      writeIndex += 1\n      return true\n    } else {\n      return false\n    }\n  }\n\n  public mutating func read() -> T? {\n    if !isEmpty {\n      let element = array[readIndex % array.count]\n      readIndex += 1\n      return element\n    } else {\n      return nil\n    }\n  }\n\n  fileprivate var availableSpaceForReading: Int {\n    return writeIndex - readIndex\n  }\n\n  public var isEmpty: Bool {\n    return availableSpaceForReading == 0\n  }\n\n  fileprivate var availableSpaceForWriting: Int {\n    return array.count - availableSpaceForReading\n  }\n\n  public var isFull: Bool {\n    return availableSpaceForWriting == 0\n  }\n}\n```\n\nThe `RingBuffer` object has an array for the actual storage of the data, and `readIndex` and `writeIndex` variables for the \"pointers\" into the array. The `write()` function puts the new element into the array at the `writeIndex`, and the `read()` function returns the element at the `readIndex`.\n\nBut hold up, you say, how does this wrapping around work? There are several ways to accomplish this and I chose a slightly controversial one. In this implementation, the `writeIndex` and `readIndex` always increment and never actually wrap around. Instead, we do the following to find the actual index into the array:\n\n```swift\narray[writeIndex % array.count]\n```\n\nand:\n\n```swift\narray[readIndex % array.count]\n```\n\nIn other words, we take the modulo (or the remainder) of the read index and write index divided by the size of the underlying array.\n\nThe reason this is a bit controversial is that `writeIndex` and `readIndex` always increment, so in theory these values could become too large to fit into an integer and the app will crash. However, a quick back-of-the-napkin calculation should take away those fears.\n\nBoth `writeIndex` and `readIndex` are 64-bit integers. If we assume that they are incremented 1000 times per second, which is a lot, then doing this continuously for one year requires `ceil(log_2(365 * 24 * 60 * 60 * 1000)) = 35` bits. That leaves 28 bits to spare, so that should give you about 2^28 years before running into problems. That's a long time. :-)\n\nTo play with this ring buffer, copy the code to a playground and do the following to mimic the example above:\n\n```swift\nvar buffer = RingBuffer<Int>(count: 5)\n\nbuffer.write(123)\nbuffer.write(456)\nbuffer.write(789)\nbuffer.write(666)\n\nbuffer.read()   // 123\nbuffer.read()   // 456\nbuffer.read()   // 789\n\nbuffer.write(333)\nbuffer.write(555)\n\nbuffer.read()   // 666\nbuffer.read()   // 333\nbuffer.read()   // 555\nbuffer.read()   // nil\n```\n\nYou've seen that a ring buffer can make a more optimal queue but it also has a disadvantage: the wrapping makes it tricky to resize the queue. But if a fixed-size queue is suitable for your purposes, then you're golden.\n\nA ring buffer is also very useful for when a producer of data writes into the array at a different rate than the consumer of the data reads it. This happens often with file or network I/O. Ring buffers are also the preferred way of communicating between high priority threads (such as an audio rendering callback) and other, slower, parts of the system.\n\nThe implementation given here is not thread-safe. It only serves as an example of how a ring buffer works. That said, it should be fairly straightforward to make it thread-safe for a single reader and single writer by using `OSAtomicIncrement64()` to change the read and write pointers.\n\nA cool trick to make a really fast ring buffer is to use the operating system's virtual memory system to map the same buffer onto different memory pages. Crazy stuff but worth looking into if you need to use a ring buffer in a high performance environment.\n\n*Written for Swift Algorithm Club by Matthijs Hollemans*\n"
  },
  {
    "path": "Ring Buffer/RingBuffer.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\npublic struct RingBuffer<T> {\n  fileprivate var array: [T?]\n  fileprivate var readIndex = 0\n  fileprivate var writeIndex = 0\n\n  public init(count: Int) {\n    array = [T?](repeating: nil, count: count)\n  }\n\n  /* Returns false if out of space. */\n  @discardableResult\n  public mutating func write(_ element: T) -> Bool {\n    guard !isFull else { return false }\n    defer {\n        writeIndex += 1\n    }\n    array[wrapped: writeIndex] = element\n    return true\n  }\n    \n  /* Returns nil if the buffer is empty. */\n  public mutating func read() -> T? {\n    guard !isEmpty else { return nil }\n    defer {\n        array[wrapped: readIndex] = nil\n        readIndex += 1\n    }\n    return array[wrapped: readIndex]\n  }\n\n  fileprivate var availableSpaceForReading: Int {\n    return writeIndex - readIndex\n  }\n\n  public var isEmpty: Bool {\n    return availableSpaceForReading == 0\n  }\n\n  fileprivate var availableSpaceForWriting: Int {\n    return array.count - availableSpaceForReading\n  }\n\n  public var isFull: Bool {\n    return availableSpaceForWriting == 0\n  }\n}\n\nextension RingBuffer: Sequence {\n  public func makeIterator() -> AnyIterator<T> {\n    var index = readIndex\n    return AnyIterator {\n      guard index < self.writeIndex else { return nil }\n      defer {\n        index += 1\n        }\n      return self.array[wrapped: index]\n    }\n  }\n}\n\nprivate extension Array {\n  subscript (wrapped index: Int) -> Element {\n    get {\n      return self[index % count]\n    }\n    set {\n      self[index % count] = newValue\n    }\n  }\n}\n\nvar buffer = RingBuffer<Int>(count: 5)\nbuffer.array          // [nil, nil, nil, nil, nil]\nbuffer.readIndex      // 0\nbuffer.writeIndex     // 0\nbuffer.availableSpaceForReading // 0\nbuffer.availableSpaceForWriting // 5\n\nbuffer.write(123)\nbuffer.write(456)\nbuffer.write(789)\nbuffer.write(666)\n\nbuffer.array          // [{Some 123}, {Some 456}, {Some 789}, {Some 666}, nil]\nbuffer.readIndex      // 0\nbuffer.writeIndex     // 4\nbuffer.availableSpaceForReading // 4\nbuffer.availableSpaceForWriting // 1\n\nbuffer.read()         // 123\nbuffer.readIndex      // 1\nbuffer.availableSpaceForReading // 3\nbuffer.availableSpaceForWriting // 2\n\nbuffer.read()         // 456\nbuffer.read()         // 789\nbuffer.readIndex      // 3\nbuffer.availableSpaceForReading // 1\nbuffer.availableSpaceForWriting // 4\n\nbuffer.write(333)\nbuffer.write(555)\nbuffer.array          // [{Some 555}, {Some 456}, {Some 789}, {Some 666}, {Some 333}]\nbuffer.availableSpaceForReading // 3\nbuffer.availableSpaceForWriting // 2\nbuffer.writeIndex     // 6\n\nbuffer.read()         // 666\nbuffer.read()         // 333\nbuffer.read()         // 555\nbuffer.read()         // nil\nbuffer.availableSpaceForReading // 0\nbuffer.availableSpaceForWriting // 5\nbuffer.readIndex      // 6\n"
  },
  {
    "path": "Ring Buffer/RingBuffer.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Ring Buffer/RingBuffer.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Ring Buffer/RingBuffer.swift",
    "content": "/*\n  Fixed-length ring buffer\n\n  In this implementation, the read and write pointers always increment and\n  never wrap around. On a 64-bit platform that should not get you into trouble\n  any time soon.\n\n  Not thread-safe, so don't read and write from different threads at the same\n  time! To make this thread-safe for one reader and one writer, it should be\n  enough to change read/writeIndex += 1 to OSAtomicIncrement64(), but I haven't\n  tested this...\n*/\npublic struct RingBuffer<T> {\n  private var array: [T?]\n  private var readIndex = 0\n  private var writeIndex = 0\n\n  public init(count: Int) {\n    array = [T?](repeating: nil, count: count)\n  }\n\n  /* Returns false if out of space. */\n  @discardableResult\n  public mutating func write(_ element: T) -> Bool {\n    guard !isFull else { return false }\n    defer {\n        writeIndex += 1\n    }\n    array[wrapped: writeIndex] = element\n    return true\n  }\n\n  /* Returns nil if the buffer is empty. */\n  public mutating func read() -> T? {\n    guard !isEmpty else { return nil }\n    defer {\n        array[wrapped: readIndex] = nil\n        readIndex += 1\n    }\n    return array[wrapped: readIndex]\n  }\n\n  private var availableSpaceForReading: Int {\n    return writeIndex - readIndex\n  }\n\n  public var isEmpty: Bool {\n    return availableSpaceForReading == 0\n  }\n\n  private var availableSpaceForWriting: Int {\n    return array.count - availableSpaceForReading\n  }\n\n  public var isFull: Bool {\n    return availableSpaceForWriting == 0\n  }\n}\n\npublic extension RingBuffer: Sequence {\n  public func makeIterator() -> AnyIterator<T> {\n    var index = readIndex\n    return AnyIterator {\n        guard index < self.writeIndex else { return nil }\n        defer {\n            index += 1\n        }\n        return self.array[wrapped: index]\n    }\n  }\n}\n\nprivate extension Array {\n  subscript (wrapped index: Int) -> Element {\n    get {\n      return self[index % count]\n    }\n    set {\n      self[index % count] = newValue\n    }\n  }\n}\n"
  },
  {
    "path": "Rootish Array Stack/README.md",
    "content": "# Rootish Array Stack\n\nA *Rootish Array Stack* is an ordered array based structure that minimizes wasted space (based on [Gauss's summation technique](https://betterexplained.com/articles/techniques-for-adding-the-numbers-1-to-100/)). A *Rootish Array Stack* consists of an array holding many fixed size arrays in ascending size.  \n\n![Rootish Array Stack Intro](images/RootishArrayStackIntro.png)\n\nA resizable array holds references to blocks (arrays of fixed size). A block's capacity is the same as it's index in the resizable array. Blocks don't grow/shrink like regular Swift arrays. Instead, when their capacity is reached, a new slightly larger block is created. When a block is emptied the last block is freed. This is a great improvement on what Swift arrays do in terms of wasted space.\n\n![Rootish Array Stack Intro](images/RootishArrayStackExample.png)\n\nHere you can see how insert/remove operations would behave (very similar to how a Swift array handles such operations).\n\n## Gauss' Summation Trick\nOne of the most well known legends about famous mathematician [Carl Friedrich Gauss](https://en.wikipedia.org/wiki/Carl_Friedrich_Gauss) goes back to when he was in primary school. One day, Gauss' teacher asked his class to add up all the numbers from 1 to 100, hoping that the task would take long enough for him to step out for a smoke break. The teacher was shocked when young Gauss had his hand up with the answer `5050`. So soon? The teacher suspected a cheat, but no. Gauss had found a formula to sidestep the problem of manually adding up all the numbers 1 by 1. His formula:\n```\nsum from 1...n = n * (n + 1) / 2\n```\nTo understand this imagine `n` blocks where `x` represents `1` unit. In this example let `n` be `5`:\n```\nblocks:     [x] [x x] [x x x] [x x x x] [x x x x x]\n# of x's:    1    2      3        4          5\n```\n_Block `1` has 1 `x`, block `2` as 2 `x`s, block `3` has 3 `x`s, etc..._\n\nIf you wanted to take the sum of all the blocks from `1` to `n`, you could go through and count them _one by one_. This is okay, but for a large sequence of blocks that could take a long time! Instead, you could arrange the blocks to look like a _half pyramid_:\n```\n# |  blocks\n--|-------------\n1 |  x\n2 |  x x\n3 |  x x x\n4 |  x x x x\n5 |  x x x x x\n\n```\nThen we mirror the _half pyramid_ and rearrange the image so that it fits with the original _half pyramid_ in a rectangular shape:\n```\nx                  o      x o o o o o\nx x              o o      x x o o o o\nx x x          o o o  =>  x x x o o o\nx x x x      o o o o      x x x x o o\nx x x x x  o o o o o      x x x x x o\n```\nHere we have `n` rows and `n + 1` columns. _5 rows and 6 columns_.\n\nWe can calculate the sum just as we would an area! Let's also express the width and height in terms of `n`:\n```\narea of a rectangle = height * width = n * (n + 1)\n```\nWe only want to calculate the amount of `x`s, not the amount of `o`s. Since there's a 1:1 ratio between `x`s and `o`s we can just divide our area by 2!\n```\narea of only x = n * (n + 1) / 2\n```\nVoila! A super fast way to take a sum of all the blocks! This equation is useful for deriving fast `block` and `inner block index` equations.\n<!-- TODO: Define block and innerBlockIndex -->\n\n## Get/Set with Speed\nNext, we want to find an efficient and accurate way to access an element at a random index. For example, which block does `rootishArrayStack[12]` point to? To answer this we will need more math!\nDetermining the inner block `index` turns out to be easy. If `index` is in some `block` then:\n```\ninner block index = index - block * (block + 1) / 2\n```\nDetermining which `block` an index points to is more difficult. The number of elements up to and including the element requested is: `index + 1` elements. The number of elements in blocks `0...block` is `(block + 1) * (block + 2) / 2` (equation derived above). The relationship between the `block` and the `index` is as follows:\n```\n(block + 1) * (block + 2) / 2 >= index + 1\n```\nThis can be rewritten as:\n```\n(block)^2 + (3 * block) - (2 * index) >= 0\n```\nUsing the quadratic formula we get:\n```\nblock = (-3 ± √(9 + 8 * index)) / 2\n```\nA negative block doesn't make sense, so we take the positive root instead. In general, this solution is not an integer. However, going back to our inequality, we want the smallest block such that `block => (-3 + √(9 + 8 * index)) / 2`. Next, we take the ceiling of the result:\n```\nblock = ⌈(-3 + √(9 + 8 * index)) / 2⌉\n```\n\nNow we can figure out what `rootishArrayStack[12]` points to! First, let's see which block the `12` points to:\n```\nblock = ⌈(-3 + √(9 + 8 * (12))) / 2⌉\nblock = ⌈(-3 + √105) / 2⌉\nblock = ⌈(-3 + (10.246950766)) / 2⌉\nblock = ⌈(7.246950766) / 2⌉\nblock = ⌈3.623475383⌉\nblock = 4\n```\nNext lets see which `innerBlockIndex` `12` points to:\n```\ninner block index = (12) - (4) * ((4) + 1) / 2\ninner block index = (12) - (4) * (5) / 2\ninner block index = (12) - 10\ninner block index = 2\n```\nTherefore, `rootishArrayStack[12]` points to the block at index `4` and at inner block index `2`.\n![Rootish Array Stack Intro](images/RootishArrayStackExample2.png)\n\n### Interesting Discovery\nUsing the `block` equation, we can see that the number of `blocks` is proportional to the square root of the number of elements: **O(blocks) = O(√n)**.\n\n# Implementation Details\nLet's start with instance variables and struct declaration:\n```swift\nimport Darwin\n\npublic struct RootishArrayStack<T> {\n\n  fileprivate var blocks = [Array<T?>]()\n  fileprivate var internalCount = 0\n\n  public init() { }\n\n  var count: Int {\n    return internalCount\n  }\n\n  ...\n\n}\n\n```\nThe elements are of generic type `T`, so data of any kind can be stored in the list. `blocks` will be a resizable array to hold fixed sized arrays that take type `T?`.\n> The reason for the fixed size arrays taking type `T?` is so that references to elements aren't retained after they've been removed. Eg: if you remove the last element, the last index must be set to `nil` to prevent the last element being held in memory at an inaccessible index.\n\n`internalCount` is an internal mutable counter that keeps track of the number of elements. `count` is a read only variable that returns the `internalCount` value. `Darwin` is imported here to provide simple math functions such as `ceil()` and `sqrt()`.\n\nThe `capacity` of the structure is simply the Gaussian summation trick:\n```swift\nvar capacity: Int {\n  return blocks.count * (blocks.count + 1) / 2\n}\n```\n\nNext, let's look at how we would `get` and `set` elements:\n```swift\nfileprivate func block(fromIndex: Int) -> Int {\n  let block = Int(ceil((-3.0 + sqrt(9.0 + 8.0 * Double(index))) / 2))\n  return block\n}\n\nfileprivate func innerBlockIndex(fromIndex index: Int, fromBlock block: Int) -> Int {\n  return index - block * (block + 1) / 2\n}\n\npublic subscript(index: Int) -> T {\n  get {\n    let block = self.block(fromIndex: index)\n    let innerBlockIndex = self.innerBlockIndex(fromIndex: index, fromBlock: block)\n    return blocks[block][innerBlockIndex]!\n  }\n  set(newValue) {\n    let block = self.block(fromIndex: index)\n    let innerBlockIndex = self.innerBlockIndex(fromIndex: index, fromBlock: block)\n    blocks[block][innerBlockIndex] = newValue\n  }\n}\n```\n`block(fromIndex:)` and `innerBlockIndex(fromIndex:, fromBlock:)` are wrapping the `block` and `inner block index` equations we derived earlier. `superscript` lets us have `get` and `set` access to the structure with the familiar `[index:]` syntax. For both `get` and `set` in `superscript` we use the same logic:\n\n1. determine the block that the index points to\n2. determine the inner block index\n3. `get`/`set` the value\n\nNext, let's look at how we would `growIfNeeded()` and `shrinkIfNeeded()`.\n```swift\nfileprivate mutating func growIfNeeded() {\n  if capacity - blocks.count < count + 1 {\n    let newArray = [T?](repeating: nil, count: blocks.count + 1)\n    blocks.append(newArray)\n  }\n}\n\nfileprivate mutating func shrinkIfNeeded() {\n  if capacity + blocks.count >= count {\n    while blocks.count > 0 && (blocks.count - 2) * (blocks.count - 1) / 2 >    count {\n      blocks.remove(at: blocks.count - 1)\n    }\n  }\n}\n```\nIf our data set grows or shrinks in size, we want our data structure to accommodate the change.\nJust like a Swift array, when a capacity threshold is met we will `grow` or `shrink` the size of our structure. For the Rootish Array Stack we want to `grow` if the second last block is full on an `insert` operation, and `shrink` if the two last blocks are empty.\n\nNow to the more familiar Swift array behaviour.  \n```swift\npublic mutating func insert(element: T, atIndex index: Int) {\n\tgrowIfNeeded()\n\tinternalCount += 1\n\tvar i = count - 1\n\twhile i > index {\n\t\tself[i] = self[i - 1]\n\t\ti -= 1\n\t}\n\tself[index] = element\n}\n\npublic mutating func append(element: T) {\n\tinsert(element: element, atIndex: count)\n}\n\npublic mutating func remove(atIndex index: Int) -> T {\n\tlet element = self[index]\n\tfor i in index..<count - 1 {\n\t\tself[i] = self[i + 1]\n\t}\n\tinternalCount -= 1\n\tmakeNil(atIndex: count)\n\tshrinkIfNeeded()\n\treturn element\n}\n\nfileprivate mutating func makeNil(atIndex index: Int) {\n  let block = self.block(fromIndex: index)\n  let innerBlockIndex = self.innerBlockIndex(fromIndex: index, fromBlock: block)\n  blocks[block][innerBlockIndex] = nil\n}\n```\nTo `insert(element:, atIndex:)` we move all elements after the `index` to the right by 1. After space has been made for the element, we set the value using the `subscript` convenience method.\n`append(element:)` is just a convenience method to `insert` to the end.\nTo `remove(atIndex:)` we move all the elements after the `index` to the left by 1. After the removed value is covered by it's proceeding value, we set the last value in the structure to `nil`.\n`makeNil(atIndex:)` uses the same logic as our `subscript` method but is used to set the root optional at a particular index to `nil` (because setting it's wrapped value to `nil` is something only the user of the data structure should do).\n> Setting a optionals value to `nil` is different than setting it's wrapped value to `nil`. An optionals wrapped value is an embedded type within the optional reference. This means that a `nil` wrapped value is actually `.some(.none)` whereas setting the root reference to `nil` is `.none`. To better understand Swift optionals I recommend checking out @SebastianBoldt's article [Swift! Optionals?](https://medium.com/ios-os-x-development/swift-optionals-78dafaa53f3#.rvjobhuzs).\n\n# Performance\n* An internal counter keeps track of the number of elements in the structure. `count` is executed in **O(1)** time.\n\n* `capacity` can be calculated using Gauss' summation trick in an equation which takes **O(1)** time to execute.\n\n* Since `subcript[index:]` uses the `block` and `inner block index` equations, which can be executed in **O(1)** time, all get and set operations take **O(1)**.\n\n* Ignoring the time cost to `grow` and `shrink`, `insert(atIndex:)` and `remove(atIndex:)` operations shift all elements right of the specified index resulting in **O(n)** time.\n\n# Analysis of Growing and Shrinking\nThe performance analysis doesn't account for the cost to `grow` and `shrink`. Unlike a regular Swift array, `grow` and `shrink` operations don't copy all the elements into a backing array. They only allocate or free an array proportional to the number of `blocks`. The number of `blocks` is proportional to the  square root of the number of elements. Growing and shrinking only costs **O(√n)**.\n\n# Wasted Space\nWasted space is how much memory with respect to the number of elements `n` is unused. The Rootish Array Stack never has more than 2 empty blocks and it never has less than 1 empty block. The last two blocks are proportional to the number of blocks, which is proportional to the square root of the number of elements. The number of references needed to point to each block is the same as the number of blocks. Therefore, the amount of wasted space with respect to the number of elements is **O(√n)**.\n\n\n_Written for Swift Algorithm Club by @BenEmdon_\n\n_With help from [OpenDataStructures.org](http://opendatastructures.org)_\n"
  },
  {
    "path": "Rootish Array Stack/RootishArrayStack.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\n// last checked with Xcode 9.0b4\n#if swift(>=4.0)\nprint(\"Hello, Swift 4!\")\n#endif\n\nimport Darwin\n\npublic struct RootishArrayStack<T> {\n\n\t// MARK: - Instance variables\n\n\tfileprivate var blocks = [Array<T?>]()\n\tfileprivate var internalCount = 0\n\n\t// MARK: - Init\n\n\tpublic init() { }\n\n\t// MARK: - Calculated variables\n\n\tvar count: Int {\n\t\treturn internalCount\n\t}\n\n\tvar capacity: Int {\n\t\treturn blocks.count * (blocks.count + 1) / 2\n\t}\n\n\tvar isEmpty: Bool {\n\t\treturn blocks.count == 0\n\t}\n\n\tvar first: T? {\n\t\tguard capacity > 0 else { return nil }\n\t\treturn blocks[0][0]\n\t}\n\n\tvar last: T? {\n\t\tguard capacity > 0 else { return nil }\n\t\tlet block = self.block(fromIndex: count - 1)\n\t\tlet innerBlockIndex = self.innerBlockIndex(fromIndex: count - 1, fromBlock: block)\n\t\treturn blocks[block][innerBlockIndex]\n\t}\n\n\t// MARK: - Equations\n\n\tfileprivate func block(fromIndex index: Int) -> Int {\n\t\tlet block = Int(ceil((-3.0 + sqrt(9.0 + 8.0 * Double(index))) / 2))\n\t\treturn block\n\t}\n\n\tfileprivate func innerBlockIndex(fromIndex index: Int, fromBlock block: Int) -> Int {\n\t\treturn index - block * (block + 1) / 2\n\t}\n\n\t// MARK: - Behavior\n\n\tfileprivate mutating func growIfNeeded() {\n\t\tif capacity - blocks.count < count + 1 {\n\t\t\tlet newArray = [T?](repeating: nil, count: blocks.count + 1)\n\t\t\tblocks.append(newArray)\n\t\t}\n\t}\n\n\tfileprivate mutating func shrinkIfNeeded() {\n\t\tif capacity + blocks.count >= count {\n\t\t\twhile blocks.count > 0 && (blocks.count - 2) * (blocks.count - 1) / 2 >= count {\n\t\t\t\tblocks.remove(at: blocks.count - 1)\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic subscript(index: Int) -> T {\n\t\tget {\n\t\t\tlet block = self.block(fromIndex: index)\n\t\t\tlet innerBlockIndex = self.innerBlockIndex(fromIndex: index, fromBlock: block)\n\t\t\treturn blocks[block][innerBlockIndex]!\n\t\t}\n\t\tset(newValue) {\n\t\t\tlet block = self.block(fromIndex: index)\n\t\t\tlet innerBlockIndex = self.innerBlockIndex(fromIndex: index, fromBlock: block)\n\t\t\tblocks[block][innerBlockIndex] = newValue\n\t\t}\n\t}\n\n\tpublic mutating func insert(element: T, atIndex index: Int) {\n\t\tgrowIfNeeded()\n\t\tinternalCount += 1\n\t\tvar i = count - 1\n\t\twhile i > index {\n\t\t\tself[i] = self[i - 1]\n\t\t\ti -= 1\n\t\t}\n\t\tself[index] = element\n\t}\n\n\tpublic mutating func append(element: T) {\n\t\tinsert(element: element, atIndex: count)\n\t}\n\n\tfileprivate mutating func makeNil(atIndex index: Int) {\n\t\tlet block = self.block(fromIndex: index)\n\t\tlet innerBlockIndex = self.innerBlockIndex(fromIndex: index, fromBlock: block)\n\t\tblocks[block][innerBlockIndex] = nil\n\t}\n\n\tpublic mutating func remove(atIndex index: Int) -> T {\n\t\tlet element = self[index]\n\t\tfor i in index..<count - 1 {\n\t\t\tself[i] = self[i + 1]\n\t\t}\n\t\tinternalCount -= 1\n\t\tmakeNil(atIndex: count)\n\t\tshrinkIfNeeded()\n\t\treturn element\n\t}\n\n\t// MARK: - Struct to string\n\n\tpublic var memoryDescription: String {\n\t\tvar description = \"{\\n\"\n\t\tfor block in blocks {\n\t\t\tdescription += \"\\t[\"\n\t\t\tfor index in 0..<block.count {\n\t\t\t\tdescription += \"\\(block[index])\"\n\t\t\t\tif index + 1 != block.count {\n\t\t\t\t\tdescription += \", \"\n\t\t\t\t}\n\t\t\t}\n\t\t\tdescription += \"]\\n\"\n\t\t}\n\t\treturn description + \"}\"\n\t}\n}\n\nextension RootishArrayStack: CustomStringConvertible {\n\tpublic var description: String {\n\t\tvar description = \"[\"\n\t\tfor index in 0..<count {\n\t\t\tdescription += \"\\(self[index])\"\n\t\t\tif index + 1 != count {\n\t\t\t\tdescription += \", \"\n\t\t\t}\n\t\t}\n\t\treturn description + \"]\"\n\t}\n}\n\nvar list = RootishArrayStack<String>()\nlist.isEmpty   // true\nlist.first     // nil\nlist.last      // nil\nlist.count     // 0\nlist.capacity  // 0\n\nlist.memoryDescription\n//\t{\n//\t}\n\nlist.append(element: \"Hello\")\nlist.isEmpty  // false\nlist.first    // \"Hello\"\nlist.last     // \"hello\"\nlist.count    // 1\nlist.capacity // 1\n\nlist.memoryDescription\n//\t{\n//\t\t[Optional(\"Hello\")]\n//\t}\n\nlist.append(element: \"World\")\nlist.isEmpty  // false\nlist.first    // \"Hello\"\nlist.last     // \"World\"\nlist.count    // 2\nlist.capacity // 3\n\nlist[0]       // \"Hello\"\nlist[1]       // \"World\"\n//list[2]     // crash!\n\nlist.memoryDescription\n//\t{\n//\t\t[Optional(\"Hello\")]\n//\t\t[Optional(\"World\"), nil]\n//\t}\n\nlist.insert(element: \"Swift\", atIndex: 1)\nlist.isEmpty  // false\nlist.first    // \"Hello\"\nlist.last     // \"World\"\nlist.count    // 3\nlist.capacity // 6\n\nlist[0]  // \"Hello\"\nlist[1]  // \"Swift\"\nlist[2]  // \"World\"\n\nlist.memoryDescription\n//\t{\n//\t\t[Optional(\"Hello\")]\n//\t\t[Optional(\"Swift\"), Optional(\"World\")]\n//\t\t[nil, nil, nil]\n//\t}\n\nlist.remove(atIndex: 2)  // \"World\"\nlist.isEmpty  // false\nlist.first    // \"Hello\"\nlist.last     // \"Swift\"\nlist.count    // 2\nlist.capacity // 3\n\nlist[0]    // \"Hello\"\nlist[1]    // \"Swift\"\n//list[2]  // crash!\n\nlist[0] = list[1]\nlist[1] = \"is awesome\"\nlist       // [\"Swift\", \"is awesome\"]\n"
  },
  {
    "path": "Rootish Array Stack/RootishArrayStack.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='macos'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Rootish Array Stack/RootishArrayStack.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Rootish Array Stack/RootishArrayStack.swift",
    "content": "//\n//  RootishArrayStack\n//\n//  Created by @BenEmdon on 2016-11-07.\n//\n\nimport Darwin\n\npublic struct RootishArrayStack<T> {\n\n\t// MARK: - Instance variables\n\n\tfileprivate var blocks = [Array<T?>]()\n\tfileprivate var internalCount = 0\n\n\t// MARK: - Init\n\n\tpublic init() { }\n\n\t// MARK: - Calculated variables\n\n\tvar count: Int {\n\t\treturn internalCount\n\t}\n\n\tvar capacity: Int {\n\t\treturn blocks.count * (blocks.count + 1) / 2\n\t}\n\n\tvar isEmpty: Bool {\n\t\treturn blocks.count == 0\n\t}\n\n\tvar first: T? {\n\t\tguard capacity > 0 else { return nil }\n\t\treturn blocks[0][0]\n\t}\n\n\tvar last: T? {\n\t\tguard capacity > 0 else { return nil }\n\t\tlet block = self.block(fromIndex: count - 1)\n\t\tlet innerBlockIndex = self.innerBlockIndex(fromIndex: count - 1, fromBlock: block)\n\t\treturn blocks[block][innerBlockIndex]\n\t}\n\n\t// MARK: - Equations\n\n\tfileprivate func block(fromIndex index: Int) -> Int {\n\t\tlet block = Int(ceil((-3.0 + sqrt(9.0 + 8.0 * Double(index))) / 2))\n\t\treturn block\n\t}\n\n\tfileprivate func innerBlockIndex(fromIndex index: Int, fromBlock block: Int) -> Int {\n\t\treturn index - block * (block + 1) / 2\n\t}\n\n\t// MARK: - Behavior\n\n\tfileprivate mutating func growIfNeeded() {\n\t\tif capacity - blocks.count < count + 1 {\n\t\t\tlet newArray = [T?](repeating: nil, count: blocks.count + 1)\n\t\t\tblocks.append(newArray)\n\t\t}\n\t}\n\n\tfileprivate mutating func shrinkIfNeeded() {\n\t\tif capacity + blocks.count >= count {\n\t\t\twhile blocks.count > 0 && (blocks.count - 2) * (blocks.count - 1) / 2 >= count {\n\t\t\t\tblocks.remove(at: blocks.count - 1)\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic subscript(index: Int) -> T {\n\t\tget {\n\t\t\tlet block = self.block(fromIndex: index)\n\t\t\tlet innerBlockIndex = self.innerBlockIndex(fromIndex: index, fromBlock: block)\n\t\t\treturn blocks[block][innerBlockIndex]!\n\t\t}\n\t\tset(newValue) {\n\t\t\tlet block = self.block(fromIndex: index)\n\t\t\tlet innerBlockIndex = self.innerBlockIndex(fromIndex: index, fromBlock: block)\n\t\t\tblocks[block][innerBlockIndex] = newValue\n\t\t}\n\t}\n\n\tpublic mutating func insert(element: T, atIndex index: Int) {\n\t\tgrowIfNeeded()\n\t\tinternalCount += 1\n\t\tvar i = count - 1\n\t\twhile i > index {\n\t\t\tself[i] = self[i - 1]\n\t\t\ti -= 1\n\t\t}\n\t\tself[index] = element\n\t}\n\n\tpublic mutating func append(element: T) {\n\t\tinsert(element: element, atIndex: count)\n\t}\n\n\tfileprivate mutating func makeNil(atIndex index: Int) {\n\t\tlet block = self.block(fromIndex: index)\n\t\tlet innerBlockIndex = self.innerBlockIndex(fromIndex: index, fromBlock: block)\n\t\tblocks[block][innerBlockIndex] = nil\n\t}\n\n\tpublic mutating func remove(atIndex index: Int) -> T {\n\t\tlet element = self[index]\n\t\tfor i in index..<count - 1 {\n\t\t\tself[i] = self[i + 1]\n\t\t}\n\t\tinternalCount -= 1\n\t\tmakeNil(atIndex: count)\n\t\tshrinkIfNeeded()\n\t\treturn element\n\t}\n\n\t// MARK: - Struct to string\n\n\tpublic var memoryDescription: String {\n\t\tvar description = \"{\\n\"\n\t\tfor block in blocks {\n\t\t\tdescription += \"\\t[\"\n\t\t\tfor index in 0..<block.count {\n\t\t\t\tdescription += \"\\(block[index])\"\n\t\t\t\tif index + 1 != block.count {\n\t\t\t\t\tdescription += \", \"\n\t\t\t\t}\n\t\t\t}\n\t\t\tdescription += \"]\\n\"\n\t\t}\n\t\treturn description + \"}\"\n\t}\n}\n\nextension RootishArrayStack: CustomStringConvertible {\n\tpublic var description: String {\n\t\tvar description = \"[\"\n\t\tfor index in 0..<count {\n\t\t\tdescription += \"\\(self[index])\"\n\t\t\tif index + 1 != count {\n\t\t\t\tdescription += \", \"\n\t\t\t}\n\t\t}\n\t\treturn description + \"]\"\n\t}\n}\n"
  },
  {
    "path": "Rootish Array Stack/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Rootish Array Stack/Tests/RootishArrayStack.swift",
    "content": "//\n//  RootishArrayStack\n//\n//  Created by @BenEmdon on 2016-11-07.\n//\n\nimport Darwin\n\npublic struct RootishArrayStack<T> {\n\n\t// MARK: - Instance variables\n\n\tfileprivate var blocks = [Array<T?>]()\n\tfileprivate var internalCount = 0\n\n\t// MARK: - Init\n\n\tpublic init() { }\n\n\t// MARK: - Calculated variables\n\n\tvar count: Int {\n\t\treturn internalCount\n\t}\n\n\tvar capacity: Int {\n\t\treturn blocks.count * (blocks.count + 1) / 2\n\t}\n\n\tvar isEmpty: Bool {\n\t\treturn blocks.count == 0\n\t}\n\n\tvar first: T? {\n\t\tguard capacity > 0 else { return nil }\n\t\treturn blocks[0][0]\n\t}\n\n\tvar last: T? {\n\t\tguard capacity > 0 else { return nil }\n\t\tlet block = self.block(fromIndex: count - 1)\n\t\tlet innerBlockIndex = self.innerBlockIndex(fromIndex: count - 1, fromBlock: block)\n\t\treturn blocks[block][innerBlockIndex]\n\t}\n\n\t// MARK: - Equations\n\n\tfileprivate func block(fromIndex index: Int) -> Int {\n\t\tlet block = Int(ceil((-3.0 + sqrt(9.0 + 8.0 * Double(index))) / 2))\n\t\treturn block\n\t}\n\n\tfileprivate func innerBlockIndex(fromIndex index: Int, fromBlock block: Int) -> Int {\n\t\treturn index - block * (block + 1) / 2\n\t}\n\n\t// MARK: - Behavior\n\n\tfileprivate mutating func growIfNeeded() {\n\t\tif capacity - blocks.count < count + 1 {\n\t\t\tlet newArray = [T?](repeating: nil, count: blocks.count + 1)\n\t\t\tblocks.append(newArray)\n\t\t}\n\t}\n\n\tfileprivate mutating func shrinkIfNeeded() {\n\t\tif capacity + blocks.count >= count {\n\t\t\twhile blocks.count > 0 && (blocks.count - 2) * (blocks.count - 1) / 2 >= count {\n\t\t\t\tblocks.remove(at: blocks.count - 1)\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic subscript(index: Int) -> T {\n\t\tget {\n\t\t\tlet block = self.block(fromIndex: index)\n\t\t\tlet innerBlockIndex = self.innerBlockIndex(fromIndex: index, fromBlock: block)\n\t\t\treturn blocks[block][innerBlockIndex]!\n\t\t}\n\t\tset(newValue) {\n\t\t\tlet block = self.block(fromIndex: index)\n\t\t\tlet innerBlockIndex = self.innerBlockIndex(fromIndex: index, fromBlock: block)\n\t\t\tblocks[block][innerBlockIndex] = newValue\n\t\t}\n\t}\n\n\tpublic mutating func insert(element: T, atIndex index: Int) {\n\t\tgrowIfNeeded()\n\t\tinternalCount += 1\n\t\tvar i = count - 1\n\t\twhile i > index {\n\t\t\tself[i] = self[i - 1]\n\t\t\ti -= 1\n\t\t}\n\t\tself[index] = element\n\t}\n\n\tpublic mutating func append(element: T) {\n\t\tinsert(element: element, atIndex: count)\n\t}\n\n\tfileprivate mutating func makeNil(atIndex index: Int) {\n\t\tlet block = self.block(fromIndex: index)\n\t\tlet innerBlockIndex = self.innerBlockIndex(fromIndex: index, fromBlock: block)\n\t\tblocks[block][innerBlockIndex] = nil\n\t}\n\n\tpublic mutating func remove(atIndex index: Int) -> T {\n\t\tlet element = self[index]\n\t\tfor i in index..<count - 1 {\n\t\t\tself[i] = self[i + 1]\n\t\t}\n\t\tinternalCount -= 1\n\t\tmakeNil(atIndex: count)\n\t\tshrinkIfNeeded()\n\t\treturn element\n\t}\n\n\t// MARK: - Struct to string\n\n\tpublic var memoryDescription: String {\n\t\tvar description = \"{\\n\"\n\t\tfor block in blocks {\n\t\t\tdescription += \"\\t[\"\n\t\t\tfor index in 0..<block.count {\n\t\t\t\tdescription += \"\\(block[index])\"\n\t\t\t\tif index + 1 != block.count {\n\t\t\t\t\tdescription += \", \"\n\t\t\t\t}\n\t\t\t}\n\t\t\tdescription += \"]\\n\"\n\t\t}\n\t\treturn description + \"}\"\n\t}\n}\n\nextension RootishArrayStack: CustomStringConvertible {\n\tpublic var description: String {\n\t\tvar description = \"[\"\n\t\tfor index in 0..<count {\n\t\t\tdescription += \"\\(self[index])\"\n\t\t\tif index + 1 != count {\n\t\t\t\tdescription += \", \"\n\t\t\t}\n\t\t}\n\t\treturn description + \"]\"\n\t}\n}\n"
  },
  {
    "path": "Rootish Array Stack/Tests/RootishArrayStackTests.swift",
    "content": "import XCTest\n\nfileprivate extension RootishArrayStack {\n\tfunc equal(toArray array: Array<Int>) -> Bool {\n\t\tfor index in 0..<count {\n\t\t\tguard let integerElement = self[index] as? Int else { return false }\n\t\t\tif array[index] != integerElement {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t\treturn true\n\t}\n}\n\nclass RootishArrayStackTests: XCTestCase {\n\n\tprivate func buildList(withNumbers numbers: [Int]? = nil) -> RootishArrayStack<Int> {\n    var list = RootishArrayStack<Int>()\n\n\t\tif let numbers = numbers {\n\t\t\tfor number in numbers {\n\t\t\t\tlist.append(element: number)\n\t\t\t}\n\t\t}\n    return list\n  }\n\n\tfunc testEmptyList() {\n\t\tlet emptyArray = [Int]()\n\t\tlet list = buildList()\n\n\t\tXCTAssertTrue(list.isEmpty)\n\t\tXCTAssertEqual(list.count, 0)\n\t\tXCTAssertEqual(list.capacity, 0)\n\t\tXCTAssertNil(list.first)\n\t\tXCTAssertNil(list.last)\n\t\tXCTAssertTrue(list.equal(toArray: emptyArray))\n\t}\n\n\tfunc testListWithOneElement() {\n\t\tlet array = [1]\n\t\tlet list = buildList(withNumbers: array)\n\n\t\tXCTAssertFalse(list.isEmpty)\n\t\tXCTAssertEqual(list.count, 1)\n\t\tXCTAssertEqual(list.capacity, 1)\n\t\tXCTAssertEqual(list.first, 1)\n\t\tXCTAssertEqual(list.last, 1)\n\t\tXCTAssertEqual(list.first, list.last)\n\t\tXCTAssertTrue(list.equal(toArray: array))\n\t}\n\n\tfunc testListWithTwoElements() {\n\t\tlet array = [1, 2]\n\t\tlet list = buildList(withNumbers: array)\n\n\t\tXCTAssertFalse(list.isEmpty)\n\t\tXCTAssertEqual(list.count, 2)\n\t\tXCTAssertEqual(list.capacity, 3)\n\t\tXCTAssertEqual(list.first, 1)\n\t\tXCTAssertEqual(list.last, 2)\n\t\tXCTAssertNotEqual(list.first, list.last)\n\t\tXCTAssertTrue(list.equal(toArray: array))\n\t}\n\n\tfunc testListWithThreeElements() {\n\t\tlet array = [1, 2, 3]\n\t\tlet list = buildList(withNumbers: array)\n\n\t\tXCTAssertFalse(list.isEmpty)\n\t\tXCTAssertEqual(list.count, 3)\n\t\tXCTAssertEqual(list.capacity, 6)\n\t\tXCTAssertEqual(list.first, 1)\n\t\tXCTAssertEqual(list.last, 3)\n\t\tXCTAssertNotEqual(list.first, list.last)\n\t\tXCTAssertTrue(list.equal(toArray: array))\n\t}\n\n\tfunc testFillThenEmpty() {\n\t\tlet array = [Int](0..<100)\n\t\tlet emptyArray = [Int]()\n\t\tvar list = buildList(withNumbers: array)\n\n\t\tXCTAssertTrue(list.equal(toArray: array))\n\n\t\tfor _ in 0..<100 {\n\t\t\tlist.remove(atIndex: list.count - 1)\n\t\t}\n\n\t\tXCTAssertEqual(list.count, 0)\n\t\tXCTAssertEqual(list.capacity, 0)\n\t\tXCTAssertTrue(list.equal(toArray: emptyArray))\n\t}\n\n\tfunc testInsertFront() {\n\t\tvar array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n\t\tvar list = buildList(withNumbers: array)\n\n\t\tXCTAssertEqual(list.count, 10)\n\t\tXCTAssertEqual(list.capacity, 15)\n\t\tXCTAssertEqual(list.first, 1)\n\t\tXCTAssertTrue(list.equal(toArray: array))\n\n\t\tlet newElement = 0\n\t\tlist.insert(element: newElement, atIndex: 0)\n\t\tarray.insert(newElement, at: 0)\n\n\t\tXCTAssertEqual(list.count, 11)\n\t\tXCTAssertEqual(list.capacity, 21)\n\t\tXCTAssertEqual(list.first, newElement)\n\t\tXCTAssertTrue(list.equal(toArray: array))\n\t}\n\n\tfunc testInsertMiddle() {\n\t\tvar array = [0, 2, 3]\n\t\tvar list = buildList(withNumbers: array)\n\n\t\tXCTAssertEqual(list.count, 3)\n\t\tXCTAssertEqual(list.capacity, 6)\n\t\tXCTAssertTrue(list.equal(toArray: array))\n\n\t\tlet newElement = 1\n\t\tlist.insert(element: newElement, atIndex: 1)\n\t\tarray.insert(newElement, at: 1)\n\n\t\tXCTAssertEqual(list.count, 4)\n\t\tXCTAssertEqual(list.capacity, 10)\n\t\tXCTAssertEqual(list[1], newElement)\n\t\tXCTAssertTrue(list.equal(toArray: array))\n\t}\n\n\tfunc testSubscriptGet() {\n\t\tlet array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n\t\tlet list = buildList(withNumbers: array)\n\t\tfor index in 0...9 {\n\t\t\tXCTAssertEqual(list[index], index)\n\t\t}\n\t\tXCTAssertTrue(list.equal(toArray: array))\n\t}\n\n\tfunc testSubscriptSet() {\n\t\tvar array = [Int](0..<10)\n\t\tvar list = buildList(withNumbers: array)\n\n\t\tlist[1] = 100\n\t\tlist[5] = 500\n\t\tlist[8] = 800\n\t\tarray[1] = 100\n\t\tarray[5] = 500\n\t\tarray[8] = 800\n\n\t\tXCTAssertTrue(list.equal(toArray: array))\n\t}\n\n\tfunc testRemoveFirst() {\n\t\tvar array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n\t\tvar list = buildList(withNumbers: array)\n\n\t\tXCTAssertEqual(list.count, 10)\n\t\tXCTAssertEqual(list.capacity, 15)\n\t\tXCTAssertEqual(list.first, 1)\n\t\tXCTAssertTrue(list.equal(toArray: array))\n\n\t\tlist.remove(atIndex: 0)\n\t\tarray.remove(at: 0)\n\n\t\tXCTAssertEqual(list.count, 9)\n\t\tXCTAssertEqual(list.capacity, 15)\n\t\tXCTAssertEqual(list.first, 2)\n\t\tXCTAssertTrue(list.equal(toArray: array))\n\t}\n\n\tfunc testRemoveMiddle() {\n\t\tvar array = [0, 1, 2, 3]\n\t\tvar list = buildList(withNumbers: array)\n\n\t\tXCTAssertEqual(list.count, 4)\n\t\tXCTAssertEqual(list.capacity, 10)\n\t\tXCTAssertEqual(list.first, 0)\n\t\tXCTAssertTrue(list.equal(toArray: array))\n\n\t\tlist.remove(atIndex: 2)\n\t\tarray.remove(at: 2)\n\n\t\tXCTAssertEqual(list.count, 3)\n\t\tXCTAssertEqual(list.capacity, 6)\n\t\tXCTAssertEqual(list.first, 0)\n\t\tXCTAssertTrue(list.equal(toArray: array))\n\t}\n\n\tfunc testRemoveLast() {\n\t\tvar array = [0, 1, 2, 3]\n\t\tvar list = buildList(withNumbers: array)\n\n\t\tXCTAssertEqual(list.count, 4)\n\t\tXCTAssertEqual(list.capacity, 10)\n\t\tXCTAssertEqual(list.first, 0)\n\t\tXCTAssertTrue(list.equal(toArray: array))\n\n\t\tlist.remove(atIndex: 3)\n\t\tarray.remove(at: 3)\n\n\t\tXCTAssertEqual(list.count, 3)\n\t\tXCTAssertEqual(list.capacity, 6)\n\t\tXCTAssertEqual(list.first, 0)\n\t\tXCTAssertTrue(list.equal(toArray: array))\n\t}\n\n  func testSwift4() {\n    // last checked with Xcode 9.0b4\n    #if swift(>=4.0)\n      print(\"Hello, Swift 4!\")\n    #endif\n  }\n}\n"
  },
  {
    "path": "Rootish Array Stack/Tests/Tests.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t1D059BB21E073CED00391DD1 /* RootishArrayStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D059BB11E073CED00391DD1 /* RootishArrayStack.swift */; };\n\t\t7B80C3FA1C77A61E003CECC7 /* RootishArrayStackTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C3F91C77A61E003CECC7 /* RootishArrayStackTests.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t1D059BB11E073CED00391DD1 /* RootishArrayStack.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RootishArrayStack.swift; path = ../RootishArrayStack.swift; sourceTree = \"<group>\"; };\n\t\t7B2BBC801C779D720067B71D /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7B2BBC941C779E7B0067B71D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };\n\t\t7B80C3F91C77A61E003CECC7 /* RootishArrayStackTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RootishArrayStackTests.swift; sourceTree = SOURCE_ROOT; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t7B2BBC7D1C779D720067B71D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t7B2BBC681C779D710067B71D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC831C779D720067B71D /* Tests */,\n\t\t\t\t7B2BBC721C779D710067B71D /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC721C779D710067B71D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC801C779D720067B71D /* Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC831C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t1D059BB11E073CED00391DD1 /* RootishArrayStack.swift */,\n\t\t\t\t7B80C3F91C77A61E003CECC7 /* RootishArrayStackTests.swift */,\n\t\t\t\t7B2BBC941C779E7B0067B71D /* Info.plist */,\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tpath = TestsTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t7B2BBC7F1C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t7B2BBC7C1C779D720067B71D /* Sources */,\n\t\t\t\t7B2BBC7D1C779D720067B71D /* Frameworks */,\n\t\t\t\t7B2BBC7E1C779D720067B71D /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tproductName = TestsTests;\n\t\t\tproductReference = 7B2BBC801C779D720067B71D /* Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t7B2BBC691C779D710067B71D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0720;\n\t\t\t\tLastUpgradeCheck = 0820;\n\t\t\t\tORGANIZATIONNAME = \"Swift Algorithm Club\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t7B2BBC7F1C779D720067B71D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2;\n\t\t\t\t\t\tLastSwiftMigration = 0820;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 7B2BBC681C779D710067B71D;\n\t\t\tproductRefGroup = 7B2BBC721C779D710067B71D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t7B2BBC7F1C779D720067B71D /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t7B2BBC7E1C779D720067B71D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t7B2BBC7C1C779D720067B71D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7B80C3FA1C77A61E003CECC7 /* RootishArrayStackTests.swift in Sources */,\n\t\t\t\t1D059BB21E073CED00391DD1 /* RootishArrayStack.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t7B2BBC871C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC881C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t7B2BBC8D1C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC8E1C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC871C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC881C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC8D1C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC8E1C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 7B2BBC691C779D710067B71D /* Project object */;\n}\n"
  },
  {
    "path": "Rootish Array Stack/Tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Tests.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Rootish Array Stack/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0820\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Run-Length Encoding/README.markdown",
    "content": "# Run-Length Encoding (RLE)\n\nRLE is probably the simplest way to do compression. Let's say you have data that looks like this:\n\n\taaaaabbbcdeeeeeeef...\n\nthen RLE encodes it as follows:\n\n\t5a3b1c1d7e1f...\n\nInstead of repeating bytes, you first write how often that byte occurs and then the byte's actual value. So `5a` means `aaaaa`. If the data has a lot of \"byte runs\", that is lots of repeating bytes, then RLE can save quite a bit of space. It works quite well on images.\n\nThere are many different ways you can implement RLE. Here's an extension of `Data` that does a version of RLE inspired by the old [PCX image file format](https://en.wikipedia.org/wiki/PCX).\n\nThe rules are these:\n\n- Each byte run, i.e. when a certain byte value occurs more than once in a row, is compressed using two bytes: the first byte records the number of repetitions, the second records the actual value. The first byte is stored as: `191 + count`. This means encoded byte runs can never be more than 64 bytes long.\n\n- A single byte in the range 0 - 191 is not compressed and is copied without change.\n\n- A single byte in the range 192 - 255 is represented by two bytes: first the byte 192 (meaning a run of 1 byte), followed by the actual value.\n\nHere is the compression code. It returns a new `Data` object containing the run-length encoded bytes:\n\n```swift\nextension Data {\n    public func compressRLE() -> Data {\n        var data = Data()\n        self.withUnsafeBytes { (uPtr: UnsafePointer<UInt8>) in\n            var ptr = uPtr\n            let end = ptr + count\n            while ptr < end { \t\t\t\t\t\t//1\n                var count = 0\n                var byte = ptr.pointee\n                var next = byte\n\n                while next == byte && ptr < end && count < 64 { //2\n                    ptr = ptr.advanced(by: 1)\n                    next = ptr.pointee\n                    count += 1\n                }\n\n                if count > 1 || byte >= 192 {       // 3\n                    var size = 191 + UInt8(count)\n                    data.append(&size, count: 1)\n                    data.append(&byte, count: 1)\n                } else {                            // 4\n                    data.append(&byte, count: 1)\n                }\n            }\n        }\n        return data\n    }\n }\n```\n\nHow it works:\n\n1. We use an `UnsafePointer` to step through the bytes of the original `Data` object.\n\n2. At this point we've read the current byte value into the `byte` variable. If the next byte is the same, then we keep reading until we find a byte value that is different, or we reach the end of the data. We also stop if the run is 64 bytes because that's the maximum we can encode.\n\n3. Here, we have to decide how to encode the bytes we just read. The first possibility is that we've read a run of 2 or more bytes (up to 64). In that case we write out two bytes: the length of the run followed by the byte value. But it's also possible we've read a single byte with a value >= 192. That will also be encoded with two bytes.\n\n4. The third possibility is that we've read a single byte < 192. That simply gets copied to the output verbatim.\n\nYou can test it like this in a playground:\n\n```swift\nlet originalString = \"aaaaabbbcdeeeeeeef\"\nlet utf8 = originalString.data(using: String.Encoding.utf8)!\nlet compressed = utf8.compressRLE()\n```\n\nThe compressed `Data` object should be `<c461c262 6364c665 66>`. Let's decode that by hand to see what has happened:\n\n\tc4    This is 196 in decimal. It means the next byte appears 5 times.\n\t61    The data byte \"a\".\n\tc2    The next byte appears 3 times.\n\t62    The data byte \"b\".\n\t63    The data byte \"c\". Because this is < 192, it's a single data byte.\n\t64    The data byte \"d\". Also appears just once.\n\tc6    The next byte will appear 7 times.\n\t65    The data byte \"e\".\n\t66    The data byte \"f\". Appears just once.\n\nSo that's 9 bytes encoded versus 18 original. That's a savings of 50%. Of course, this was only a simple test case... If you get unlucky and there are no byte runs at all in your original data, then this method will actually make the encoded data twice as large! So it really depends on the input data.\n\nHere is the decompression code:\n\n```swift\npublic func decompressRLE() -> Data {\n        var data = Data()\n        self.withUnsafeBytes { (uPtr: UnsafePointer<UInt8>) in\n            var ptr = uPtr\n            let end = ptr + count\n\n            while ptr < end {\n                // Read the next byte. This is either a single value less than 192,\n                // or the start of a byte run.\n                var byte = ptr.pointee\t\t\t\t\t\t\t// 1\n                ptr = ptr.advanced(by: 1)\n\n                if byte < 192 {                     // 2\n                    data.append(&byte, count: 1)\n                } else if ptr < end {               // 3\n                    // Read the actual data value.\n                    var value = ptr.pointee\n                    ptr = ptr.advanced(by: 1)\n\n                    // And write it out repeatedly.\n                    for _ in 0 ..< byte - 191 {\n                        data.append(&value, count: 1)\n                    }\n                }\n            }\n        }\n        return data\n    }\n\n```\n\n1. Again this uses an `UnsafePointer` to read the `Data`. Here we read the next byte; this is either a single value less than 192, or the start of a byte run.\n\n2. If it's a single value, then it's just a matter of copying it to the output.\n\n3. But if the byte is the start of a run, we have to first read the actual data value and then write it out repeatedly.\n\nTo turn the compressed data back into the original, you'd do:\n\n```swift\nlet decompressed = compressed.decompressRLE()\nlet restoredString = String(data: decompressed, encoding: NSUTF8StringEncoding)\n```\n\nAnd now `originalString == restoredString` must be true!\n\nFootnote: The original PCX implementation is slightly different. There, a byte value of 192 (0xC0) means that the following byte will be repeated 0 times. This also limits the maximum run size to 63 bytes. Because it makes no sense to store bytes that don't occur, in my implementation 192 means the next byte appears once, and the maximum run length is 64 bytes.\n\nThis was probably a trade-off when they designed the PCX format way back when. If you look at it in binary, the upper two bits indicate whether a byte is compressed. (If both bits are set then the byte value is 192 or more.) To get the run length you can simply do `byte & 0x3F`, giving you a value in the range 0 to 63.\n\n*Written for Swift Algorithm Club by Matthijs Hollemans*\n*Migrated to Swift3 by Jaap Wijnen*\n"
  },
  {
    "path": "Run-Length Encoding/RLE.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\nimport Foundation\n\nlet originalString = \"aaaaabbbcdeeeeeeef\"\nlet utf8 = originalString.data(using: String.Encoding.utf8)!\nlet compressed = utf8.compressRLE()\n\nlet decompressed = compressed.decompressRLE()\nlet restoredString = String(data: decompressed, encoding: String.Encoding.utf8)\noriginalString == restoredString\n\nfunc encodeAndDecode(_ bytes: [UInt8]) -> Bool {\n    var bytes = bytes\n\n    var data1 = Data(bytes: &bytes, count: bytes.count)\n    print(\"data1 is \\(data1.count) bytes\")\n\n    var rleData = data1.compressRLE()\n    print(\"encoded data is \\(rleData.count) bytes\")\n\n    var data2 = rleData.decompressRLE()\n    print(\"data2 is \\(data2.count) bytes\")\n\n    return data1 == data2\n}\n\nfunc testEmpty() -> Bool {\n    let bytes: [UInt8] = []\n    return encodeAndDecode(bytes)\n}\n\nfunc testOneByteWithLowValue() -> Bool {\n    let bytes: [UInt8] = [0x80]\n    return encodeAndDecode(bytes)\n}\n\nfunc testOneByteWithHighValue() -> Bool {\n    let bytes: [UInt8] = [0xD0]\n    return encodeAndDecode(bytes)\n}\n\nfunc testSimpleCases() -> Bool {\n    let bytes: [UInt8] = [\n        0x00,\n        0x20, 0x20, 0x20, 0x20, 0x20,\n        0x30,\n        0x00, 0x00,\n        0xC0,\n        0xC1,\n        0xC0, 0xC0, 0xC0,\n        0xFF, 0xFF, 0xFF, 0xFF\n    ]\n    return encodeAndDecode(bytes)\n}\n\nfunc testBufferWithoutSpans() -> Bool {\n    // There is nothing that can be encoded in this buffer, so the encoded\n    // data ends up being longer.\n    var bytes: [UInt8] = []\n    for i in 0..<1024 {\n        bytes.append(UInt8(i % 256))\n    }\n    return encodeAndDecode(bytes)\n}\n\nfunc testBufferWithSpans(_ spanSize: Int) -> Bool {\n    print(\"span size \\(spanSize)\")\n\n    let length = spanSize * 32\n    var bytes: [UInt8] = Array<UInt8>(repeating: 0, count: length)\n\n    for t in stride(from: 0, to: length, by: spanSize) {\n        for i in 0..<spanSize {\n            bytes[t + i] = UInt8(t % 256)\n        }\n    }\n    return encodeAndDecode(bytes)\n}\n\nfunc testRandomByte() -> Bool {\n    let length = 1 + Int(arc4random_uniform(2048))\n    var bytes: [UInt8] = []\n    for _ in 0..<length {\n        bytes.append(UInt8(arc4random() % 256))\n    }\n    return encodeAndDecode(bytes)\n}\n\nfunc runTests() -> Bool {\n    var tests: [Bool] = [\n        testEmpty(),\n        testOneByteWithLowValue(),\n        testOneByteWithHighValue(),\n        testSimpleCases(),\n        testBufferWithoutSpans(),\n        testBufferWithSpans(4),\n        testBufferWithSpans(63),\n        testBufferWithSpans(64),\n        testBufferWithSpans(65),\n        testBufferWithSpans(66),\n        testBufferWithSpans(80)\n    ]\n    for _ in 0..<10 {\n        let result = testRandomByte()\n        tests.append(result)\n    }\n    var result = true\n    for bool in tests {\n        result = result && bool\n    }\n\n    return result\n}\n\nrunTests()\n"
  },
  {
    "path": "Run-Length Encoding/RLE.playground/Sources/RLE.swift",
    "content": "import Foundation\n\nextension Data {\n    /*\n     Compresses the NSData using run-length encoding.\n     */\n    public func compressRLE() -> Data {\n        var data = Data()\n        self.withUnsafeBytes { (uPtr: UnsafePointer<UInt8>) in\n            var ptr = uPtr\n            let end = ptr + count\n            while ptr < end {\n                var count = 0\n                var byte = ptr.pointee\n                var next = byte\n\n                // Is the next byte the same? Keep reading until we find a different\n                // value, or we reach the end of the data, or the run is 64 bytes.\n                while next == byte && ptr < end && count < 64 {\n                    ptr = ptr.advanced(by: 1)\n                    next = ptr.pointee\n                    count += 1\n                }\n\n                if count > 1 || byte >= 192 {       // byte run of up to 64 repeats\n                    var size = 191 + UInt8(count)\n                    data.append(&size, count: 1)\n                    data.append(&byte, count: 1)\n                } else {                            // single byte between 0 and 192\n                    data.append(&byte, count: 1)\n                }\n            }\n        }\n        return data\n    }\n\n    /*\n     Converts a run-length encoded NSData back to the original.\n     */\n    public func decompressRLE() -> Data {\n        var data = Data()\n        self.withUnsafeBytes { (uPtr: UnsafePointer<UInt8>) in\n            var ptr = uPtr\n            let end = ptr + count\n\n            while ptr < end {\n                // Read the next byte. This is either a single value less than 192,\n                // or the start of a byte run.\n                var byte = ptr.pointee\n                ptr = ptr.advanced(by: 1)\n\n                if byte < 192 {                     // single value\n                    data.append(&byte, count: 1)\n                } else if ptr < end {               // byte run\n                    // Read the actual data value.\n                    var value = ptr.pointee\n                    ptr = ptr.advanced(by: 1)\n\n                    // And write it out repeatedly.\n                    for _ in 0 ..< byte - 191 {\n                        data.append(&value, count: 1)\n                    }\n                }\n            }\n        }\n        return data\n    }\n}\n"
  },
  {
    "path": "Run-Length Encoding/RLE.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Run-Length Encoding/RLE.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Segment Tree/LazyPropagation/LazyPropagation.playground/Contents.swift",
    "content": "public class LazySegmentTree {\n    \n    private var value: Int\n    \n    private var leftBound: Int\n    \n    private var rightBound: Int\n    \n    private var leftChild: LazySegmentTree?\n    \n    private var rightChild: LazySegmentTree?\n    \n    // Interval Update Lazy Element\n    private var lazyValue: Int\n    \n    // MARK: - Push Up Operation\n    // Description: pushUp() - update items to the top\n    private func pushUp(lson: LazySegmentTree, rson: LazySegmentTree) {\n        self.value = lson.value + rson.value\n    }\n    \n    // MARK: - Push Down Operation\n    // Description: pushDown() - update items to the bottom\n    private func pushDown(round: Int, lson: LazySegmentTree, rson: LazySegmentTree) {\n        guard lazyValue != 0 else { return }\n        lson.lazyValue += lazyValue\n        rson.lazyValue += lazyValue\n        lson.value += lazyValue * (round - (round >> 1))\n        rson.value += lazyValue * (round >> 1)\n        lazyValue = 0\n    }\n    \n    public init(array: [Int], leftBound: Int, rightBound: Int) {\n        self.leftBound = leftBound\n        self.rightBound = rightBound\n        self.value = 0\n        self.lazyValue = 0\n        \n        guard leftBound != rightBound else {\n            value = array[leftBound]\n            return\n        }\n        \n        let middle = leftBound + (rightBound - leftBound) / 2\n        leftChild = LazySegmentTree(array: array, leftBound: leftBound, rightBound: middle)\n        rightChild = LazySegmentTree(array: array, leftBound: middle + 1, rightBound: rightBound)\n        if let leftChild = leftChild, let rightChild = rightChild {\n            pushUp(lson: leftChild, rson: rightChild)\n        }\n    }\n    \n    public convenience init(array: [Int]) {\n        self.init(array: array, leftBound: 0, rightBound: array.count - 1)\n    }\n    \n    public func query(leftBound: Int, rightBound: Int) -> Int {\n        if leftBound <= self.leftBound && self.rightBound <= rightBound {\n            return value\n        }\n        guard let leftChild  = leftChild  else { fatalError(\"leftChild should not be nil\") }\n        guard let rightChild = rightChild else { fatalError(\"rightChild should not be nil\") }\n        \n        pushDown(round: self.rightBound - self.leftBound + 1, lson: leftChild, rson: rightChild)\n        \n        let middle = self.leftBound + (self.rightBound - self.leftBound) / 2\n        var result = 0\n        \n        if leftBound <= middle { result +=  leftChild.query(leftBound: leftBound, rightBound: rightBound) }\n        if rightBound > middle { result += rightChild.query(leftBound: leftBound, rightBound: rightBound) }\n        \n        return result\n    }\n    \n    // MARK: - One Item Update\n    public func update(index: Int, incremental: Int) {\n        guard self.leftBound != self.rightBound else {\n            self.value += incremental\n            return\n        }\n        guard let leftChild  = leftChild  else { fatalError(\"leftChild should not be nil\") }\n        guard let rightChild = rightChild else { fatalError(\"rightChild should not be nil\") }\n        \n        let middle = self.leftBound + (self.rightBound - self.leftBound) / 2\n        \n        if index <= middle { leftChild.update(index: index, incremental: incremental) }\n        else { rightChild.update(index: index, incremental: incremental) }\n        pushUp(lson: leftChild, rson: rightChild)\n    }\n    \n    // MARK: - Interval Item Update\n    public func update(leftBound: Int, rightBound: Int, incremental: Int) {\n        if leftBound <= self.leftBound && self.rightBound <= rightBound {\n            self.lazyValue += incremental\n            self.value += incremental * (self.rightBound - self.leftBound + 1)\n            return \n        }\n        \n        guard let leftChild  = leftChild  else { fatalError(\"leftChild should not be nil\") }\n        guard let rightChild = rightChild else { fatalError(\"rightChild should not be nil\") }\n        \n        pushDown(round: self.rightBound - self.leftBound + 1, lson: leftChild, rson: rightChild)\n        \n        let middle = self.leftBound + (self.rightBound - self.leftBound) / 2\n        \n        if leftBound <= middle { leftChild.update(leftBound: leftBound, rightBound: rightBound, incremental: incremental) }\n        if middle < rightBound { rightChild.update(leftBound: leftBound, rightBound: rightBound, incremental: incremental) }\n        \n        pushUp(lson: leftChild, rson: rightChild)\n    }\n    \n}\n\nlet array = [1, 2, 3, 4, 1, 3, 2]\n\nlet sumSegmentTree = LazySegmentTree(array: array)\n\nprint(sumSegmentTree.query(leftBound: 0, rightBound: 3)) // 10 = 1 + 2 + 3 + 4\nsumSegmentTree.update(index: 1, incremental: 2)\nprint(sumSegmentTree.query(leftBound: 0, rightBound: 3)) // 12 = 1 + 4 + 3 + 4\nsumSegmentTree.update(leftBound: 0, rightBound: 2, incremental: 2)\nprint(sumSegmentTree.query(leftBound: 0, rightBound: 3)) // 18 = 3 + 6 + 5 + 4\n\nfor index in 2 ... 5 {\n    sumSegmentTree.update(index: index, incremental: 3)\n}\n\n\nsumSegmentTree.update(leftBound: 0, rightBound: 5, incremental: 2)\nprint(sumSegmentTree.query(leftBound: 0, rightBound: 2))"
  },
  {
    "path": "Segment Tree/LazyPropagation/LazyPropagation.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx' last-migration='0800'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Segment Tree/LazyPropagation/LazyPropagation.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Segment Tree/LazyPropagation/README.markdown",
    "content": "# Lazy Propagation in Segment Tree\n\nIn previous implement about the Segment Tree by **Artur Antonov**, it's a strong data structure with *Generic* `<T>`. And we can pass a closure parameter `function: (T, T) -> T` to reflect the relationship between parent and child node. And in particular, Generic can solve multiple strings stitching problem. It's just like the sample in Playground:\n\n```swift\nstringSegmentTree.replaceItem(at: 0, withItem: \"I\")\nstringSegmentTree.replaceItem(at: 1, withItem: \" like\")\nstringSegmentTree.replaceItem(at: 2, withItem: \" algorithms\")\nstringSegmentTree.replaceItem(at: 3, withItem: \" and\")\nstringSegmentTree.replaceItem(at: 4, withItem: \" swift\")\nstringSegmentTree.replaceItem(at: 5, withItem: \"!\")\nprint(stringSegmentTree.query(leftBound: 0, rightBound: 5))\n// \"I like algorithms and swift!\"\n```\n\nThe use of `<T>` is so exciting. But we seldom use the Segment Tree to solve string problem instead of *Suffix Array*. And the Segment Tree is a kind of *Interval Tree* to solve the Interval Problem in mathemtics and statistics, which is a structure for storing intervals, or segments, and allows querying which of the stored segments contain a given point. A segment tree for a set *I* of n intervals uses `O(nlogn)` storage and can be built in `O(nlogn)` time. Segment trees support searching for all the intervals that contain a query point in O(log n+k), k being the number of retrieved intervals or segments.\n\nBut that is common Segment Tree. By **Lazy Propagation**, we can implement to modify an interval in `O(logn)` time. Let's explore together in following:\n\n## `PushUp` - update to the top\n\nAt first, we reference the implement of **Artur Antonov** about Segment Tree. This code contained *build*, *single update* and *interval query* three operation. The implement of *build* and *single update* operation is following:\n\n```swift\n// Author: Artur Antonov\npublic init(array: [T], leftBound: Int, rightBound: Int, function: @escaping (T, T) -> T) {\n\tself.leftBound = leftBound\n\tself.rightBound = rightBound\n\tself.function = function\n\t// ①\n\tif leftBound == rightBound {\n\t\tvalue = array[leftBound]\n\t} \n\t// ②\n\telse {\n\t\tlet middle = (leftBound + rightBound) / 2\n\t\tleftChild = SegmentTree<T>(array: array, leftBound: leftBound, rightBound: middle, function: function)\n\t\trightChild = SegmentTree<T>(array: array, leftBound: middle+1, rightBound: rightBound, function: function)\n\t\tvalue = function(leftChild!.value, rightChild!.value)\n\t}\n}\n```\n\nIn position ①, it means the current node is *leaf* because its left bound data is equal to the right. So we assign a value to it directly. In position ②, it means the current node is *parent* (which has one or more children), and we need to recursion down and update current node's data in the follow-up process.\n\nAnd then, we have a look for *interval query* operation:\n\n```swift\n// Author: Artur Antonov\npublic func query(leftBound: Int, rightBound: Int) -> T {\n\tif self.leftBound == leftBound && self.rightBound == rightBound {\n\t\treturn self.value\n\t}\n\tguard let leftChild = leftChild else { fatalError(\"leftChild should not be nil\") }\n\tguard let rightChild = rightChild else { fatalError(\"rightChild should not be nil\") }\n\t// ①\n\tif leftChild.rightBound < leftBound {\n\t\treturn rightChild.query(leftBound: leftBound, rightBound: rightBound)\n\t} \n\t// ②\n\telse if rightChild.leftBound > rightBound {\n\t\treturn leftChild.query(leftBound: leftBound, rightBound: rightBound)\n\t}\n\t// ③ \n\telse {\n\t\tlet leftResult = leftChild.query(leftBound: leftBound, rightBound: leftChild.rightBound)\n\t\tlet rightResult = rightChild.query(leftBound:rightChild.leftBound, rightBound: rightBound)\n\t\treturn function(leftResult, rightResult)\n\t}\n}\n```\n\nPosition ① means that the left bound of current query interval is on the  right of this right bound, so recurs to right direction. Position ② is opposite of position ①, recurs to left direction. Position ③ means our check interval is included the interval we need, so recurs deeply.\n\n![pushUp](Images/pushUp.png)\n\nThere are common part from the two parts of code above - **recurs deeply below, and update data up**. So we can decouple this operation named `func pushUp(lson: LazySegmentTree, rson: LazySegmentTree)`:\n\n```swift\n// MARK: - Push Up Operation\nprivate func pushUp(lson: LazySegmentTree, rson: LazySegmentTree) {\n    self.value = lson.value + rson.value\n}\n```\n\n(This code only describe the *Sum Segment Tree*)\n\nAnd then, we can update the implement before:\n\n```swift\npublic init(array: [Int], leftBound: Int, rightBound: Int) {\n    self.leftBound = leftBound\n    self.rightBound = rightBound\n    self.value = 0\n    self.lazyValue = 0\n    \n    guard leftBound != rightBound else {\n        value = array[leftBound]\n        return\n    }\n    \n    let middle = leftBound + (rightBound - leftBound) / 2\n    leftChild = LazySegmentTree(array: array, leftBound: leftBound, rightBound: middle)\n    rightChild = LazySegmentTree(array: array, leftBound: middle + 1, rightBound: rightBound)\n    if let leftChild = leftChild, let rightChild = rightChild {\n        pushUp(lson: leftChild, rson: rightChild)\n    }\n}\n// MARK: - One Item Update\npublic func update(index: Int, incremental: Int) {\n    guard self.leftBound != self.rightBound else {\n        self.value += incremental\n        return\n    }\n    guard let leftChild  = leftChild  else { fatalError(\"leftChild should not be nil\") }\n    guard let rightChild = rightChild else { fatalError(\"rightChild should not be nil\") }\n    \n    let middle = self.leftBound + (self.rightBound - self.leftBound) / 2\n    \n    if index <= middle { leftChild.update(index: index, incremental: incremental) }\n    else { rightChild.update(index: index, incremental: incremental) }\n    pushUp(lson: leftChild, rson: rightChild)\n}\n```\n\n## `PushDown` - Lazy Propagation \n\nYou may feel that the `pushUp` is so simple. In fact, this's just to lead `pushDown` this function.\n\nBefore this, I want to talk about the topic about **interval operation**. The interval operation is a way to update all elements of a continuous subset. But these isn't in the version of **Artur Antonov**. You might disdain with this, because it's solved with a `for` loop:\n\n```swift\n// Sample: update the elements with subscript [2, 5] \nfor index in 2 ... 5 {\n    sumSegmentTree.update(index: index, incremental: 3)\n}\n```\n\nIt is a `O(n)` time operation, which make the interval operation uses `O(nlogn)` time to update these elements. We need a `O(logn)` way to maintain the elegance of Segment Tree. \n\n Check the data structure of Segment Tree again:\n \n ![Segment-tree](Images/Segment-tree.png)\n \nWe only catch the root node in programming. If we want to explore the bottom of the tree, and use `pushUp` to update every node, the task will be reached. So it asked us to traverse the tree, that spent `O(n)` time to do this with any way. This can't conform our expectations.  \n\nThen we started to think about `pushDown` to update down from the root. **After we update the parent, the data continued to distributed to its children according to law.** But it still need `O(n)` time to do this. Keep thinking, we **only update the parent, and to update the children when `query` time**. Yeah, that's the key of **lazy propagation**. Because the recursing direct of the `query` and `update interval` is same. So we got it! 😁 Let's check this sample:\n\n![lazy-sample-2](Images/lazy-sample-2.png)\n\n`update` make the subscript 1...3 elements plus 2, so we make the 1st node in 2 depth and 3rd in 3 depth get a *lazy mark*, which means these node need to be updated. And we shouldn't add a *lazy mark* for root node, because it was updated before the `pushDown` in the first recursing. \n\nIn `query` operation, we accord to the original method to recurs the tree, and find the 1st node held *lazy mark* in 2 depth, so to update it. It's the same situation about the 1st node in 3 depth.\n\nDo you understand the **lazy propagation**? **In short, we only update the wide range node data and add it a lazy mark. Then they will be update when we need to query them.** And the *Update Down* operation is the function of `pushDown`.\n\nThis is the complete implementation about the Sum Segment Tree with interval update operation:\n\n```swift\npublic class LazySegmentTree {\n    \n    private var value: Int\n    \n    private var leftBound: Int\n    \n    private var rightBound: Int\n    \n    private var leftChild: LazySegmentTree?\n    \n    private var rightChild: LazySegmentTree?\n    \n    // Interval Update Lazy Element\n    private var lazyValue: Int\n    \n    // MARK: - Push Up Operation\n    // Description: pushUp() - update items to the top\n    private func pushUp(lson: LazySegmentTree, rson: LazySegmentTree) {\n        self.value = lson.value + rson.value\n    }\n    \n    // MARK: - Push Down Operation\n    // Description: pushDown() - update items to the bottom\n    private func pushDown(round: Int, lson: LazySegmentTree, rson: LazySegmentTree) {\n        guard lazyValue != 0 else { return }\n        lson.lazyValue += lazyValue\n        rson.lazyValue += lazyValue\n        lson.value += lazyValue * (round - (round >> 1))\n        rson.value += lazyValue * (round >> 1)\n        lazyValue = 0\n    }\n    \n    public init(array: [Int], leftBound: Int, rightBound: Int) {\n        self.leftBound = leftBound\n        self.rightBound = rightBound\n        self.value = 0\n        self.lazyValue = 0\n        \n        guard leftBound != rightBound else {\n            value = array[leftBound]\n            return\n        }\n        \n        let middle = leftBound + (rightBound - leftBound) / 2\n        leftChild = LazySegmentTree(array: array, leftBound: leftBound, rightBound: middle)\n        rightChild = LazySegmentTree(array: array, leftBound: middle + 1, rightBound: rightBound)\n        if let leftChild = leftChild, let rightChild = rightChild {\n            pushUp(lson: leftChild, rson: rightChild)\n        }\n    }\n    \n    public convenience init(array: [Int]) {\n        self.init(array: array, leftBound: 0, rightBound: array.count - 1)\n    }\n    \n    public func query(leftBound: Int, rightBound: Int) -> Int {\n        if leftBound <= self.leftBound && self.rightBound <= rightBound {\n            return value\n        }\n        guard let leftChild  = leftChild  else { fatalError(\"leftChild should not be nil\") }\n        guard let rightChild = rightChild else { fatalError(\"rightChild should not be nil\") }\n        \n        pushDown(round: self.rightBound - self.leftBound + 1, lson: leftChild, rson: rightChild)\n        \n        let middle = self.leftBound + (self.rightBound - self.leftBound) / 2\n        var result = 0\n        \n        if leftBound <= middle { result +=  leftChild.query(leftBound: leftBound, rightBound: rightBound) }\n        if rightBound > middle { result += rightChild.query(leftBound: leftBound, rightBound: rightBound) }\n        \n        return result\n    }\n    \n    // MARK: - One Item Update\n    public func update(index: Int, incremental: Int) {\n        guard self.leftBound != self.rightBound else {\n            self.value += incremental\n            return\n        }\n        guard let leftChild  = leftChild  else { fatalError(\"leftChild should not be nil\") }\n        guard let rightChild = rightChild else { fatalError(\"rightChild should not be nil\") }\n        \n        let middle = self.leftBound + (self.rightBound - self.leftBound) / 2\n        \n        if index <= middle { leftChild.update(index: index, incremental: incremental) }\n        else { rightChild.update(index: index, incremental: incremental) }\n        pushUp(lson: leftChild, rson: rightChild)\n    }\n    \n    // MARK: - Interval Item Update\n    public func update(leftBound: Int, rightBound: Int, incremental: Int) {\n        if leftBound <= self.leftBound && self.rightBound <= rightBound {\n            self.lazyValue += incremental\n            self.value += incremental * (self.rightBound - self.leftBound + 1)\n            return \n        }\n        \n        guard let leftChild  = leftChild  else { fatalError(\"leftChild should not be nil\") }\n        guard let rightChild = rightChild else { fatalError(\"rightChild should not be nil\") }\n        \n        pushDown(round: self.rightBound - self.leftBound + 1, lson: leftChild, rson: rightChild)\n        \n        let middle = self.leftBound + (self.rightBound - self.leftBound) / 2\n        \n        if leftBound <= middle { leftChild.update(leftBound: leftBound, rightBound: rightBound, incremental: incremental) }\n        if middle < rightBound { rightChild.update(leftBound: leftBound, rightBound: rightBound, incremental: incremental) }\n        \n        pushUp(lson: leftChild, rson: rightChild)\n    }\n    \n}\n```\n\nExplain some sample snippets:\n\n```swift\nprivate var lazyValue: Int\n```\n\nHere we add a new property for Segment Tree to represent *lazy mark*. And it is a incremental value for Sum Segment Tree. If the `lazyValue` isn't equal to zero, the current node need to be updated. And its real value is equal to `value + lazyValue * (rightBound - leftBound + 1)`.\n\n```swift\n    // MARK: - Push Down Operation\n    // Description: pushDown() - update items to the bottom\nprivate func pushDown(round: Int, lson: LazySegmentTree, rson: LazySegmentTree) {\n    guard lazyValue != 0 else { return }\n    lson.lazyValue += lazyValue\n    rson.lazyValue += lazyValue\n    lson.value += lazyValue * (round - (round >> 1))\n    rson.value += lazyValue * (round >> 1)\n    lazyValue = 0\n}\n```\n\n![pushdown](Images/pushdown.png)\n\nAt first we check whether the node needs to be updated. If the `lazyValue` isn't equal to zero, we need to `pushDown`. And the update rules are the `lazyValue * (rightBound - leftBound + 1)`. At last, reset the `lazyValue` to zero.\n\n## Conclusion\n\nThis is the introduce of the Lazy Propagation in Segment Tree. You can also learn **Functional Segment Tree** to understand the Lazy Propagation deeply. In addition, I learn from the *notonlysuccess*'s code about Segment Tree described by C, this is the [link](http://www.cnblogs.com/Destiny-Gem/articles/3875243.html).\n\nIn fact, the operation of Segment Tree is far more than that. It can also be used to handle problems between collections. I want to implement it with Swift in the future and make the Swift Segment Tree stronger and stronger. 😁\n\n---\n\n*Written for Swift Algorithm Club by [Desgard_Duan](https://github.com/desgard)*\n"
  },
  {
    "path": "Segment Tree/README.markdown",
    "content": "# Segment Tree\n\n> For an example on lazy propagation, see this [article](https://github.com/raywenderlich/swift-algorithm-club/tree/master/Segment%20Tree/LazyPropagation).\n\nI'm pleased to present to you Segment Tree. It's actually one of my favorite data structures because it's very flexible and simple in realization.\n\nLet's suppose that you have an array **a** of some type and some associative function **f**. For example, the function can be sum, multiplication, min, max, [gcd](../GCD/), and so on.\n\nYour task is to:\n\n- answer a query for an interval given by **l** and **r**, i.e. perform `f(a[l], a[l+1], ..., a[r-1], a[r])`\n- support replacing an item at some index `a[index] = newItem`\n\nFor example, if we have an array of numbers:\n\n```swift\nvar a = [ 20, 3, -1, 101, 14, 29, 5, 61, 99 ]\n```\n\nWe want to query this array on the interval from 3 to 7 for the function \"sum\". That means we do the following:\n\n\t101 + 14 + 29 + 5 + 61 = 210\n\nbecause `101` is at index 3 in the array and `61` is at index 7. So we pass all the numbers between `101` and `61` to the sum function, which adds them all up. If we had used the \"min\" function, the result would have been `5` because that's the smallest number in the interval from 3 to 7.\n\nHere's naive approach if our array's type is `Int` and **f** is just the sum of two integers:\n\n```swift\nfunc query(array: [Int], l: Int, r: Int) -> Int {\n  var sum = 0\n  for i in l...r {\n    sum += array[i]\n  }\n  return sum\n}\n```\n\nThe running time of this algorithm is **O(n)** in the worst case, that is when **l = 0, r = n-1** (where **n** is the number of elements in the array). And if we have **m** queries to answer we get **O(m*n)** complexity.\n\nIf we have an array with 100,000 items (**n = 10^5**) and we have to do 100 queries (**m = 100**), then our algorithm will do **10^7** units of work. Ouch, that doesn't sound very good. Let's look at how we can improve it.\n\nSegment trees allow us to answer queries and replace items with **O(log n)** time. Isn't it magic? :sparkles:\n\nThe main idea of segment trees is simple: we precalculate some segments in our array and then we can use those without repeating calculations.\n\n## Structure of segment tree\n\nA segment tree is just a [binary tree](../Binary%20Tree/) where each node is an instance of the `SegmentTree` class:\n\n```swift\npublic class SegmentTree<T> {\n  private var value: T\n  private var function: (T, T) -> T\n  private var leftBound: Int\n  private var rightBound: Int\n  private var leftChild: SegmentTree<T>?\n  private var rightChild: SegmentTree<T>?\n}\n```\n\nEach node has the following data:\n\n- `leftBound` and `rightBound` describe an interval\n- `leftChild` and `rightChild` are pointers to child nodes\n- `value` is the result of applying the function `f(a[leftBound], a[leftBound+1], ..., a[rightBound-1], a[rightBound])`\n\nIf our array is `[1, 2, 3, 4]` and the function `f = a + b`, the segment tree looks like this:\n\n![structure](Images/Structure.png)\n\nThe `leftBound` and `rightBound` of each node are marked in red.\n\n## Building a segment tree\n\nHere's how we create a node of the segment tree:\n\n```swift\npublic init(array: [T], leftBound: Int, rightBound: Int, function: @escaping (T, T) -> T) {\n    self.leftBound = leftBound\n    self.rightBound = rightBound\n    self.function = function\n\n    if leftBound == rightBound {                    // 1\n      value = array[leftBound]\n    } else {\n      let middle = (leftBound + rightBound) / 2     // 2\n\n      // 3\n      leftChild = SegmentTree<T>(array: array, leftBound: leftBound, rightBound: middle, function: function)\n      rightChild = SegmentTree<T>(array: array, leftBound: middle+1, rightBound: rightBound, function: function)\n\n      value = function(leftChild!.value, rightChild!.value)  // 4\n    }\n  }\n```\n\nNotice that this is a recursive method. You give it an array such as `[1, 2, 3, 4]` and it builds up the entire tree, from the root node to all the child nodes.\n\n1. The recursion terminates if `leftBound` and `rightBound` are equal. Such a `SegmentTree` instance represents a leaf node. For the input array `[1, 2, 3, 4]`, this process will create four such leaf nodes: `1`, `2`, `3`, and `4`. We just fill in the `value` property with the number from the array.\n\n2. However, if `rightBound` is still greater than `leftBound`, we create two child nodes. We divide the current segment into two equal segments (at least, if the length is even; if it's odd, one segment will be slightly larger).\n\n3. Recursively build child nodes for those two segments. The left child node covers the interval **[leftBound, middle]** and the right child node covers **[middle+1, rightBound]**.\n\n4. After having constructed our child nodes, we can calculate our own value because **f(leftBound, rightBound) = f(f(leftBound, middle), f(middle+1, rightBound))**. It's math!\n\nBuilding the tree is an **O(n)** operation.\n\n## Getting answer to query\n\nWe go through all this trouble so we can efficiently query the tree.\n\nHere's the code:\n\n```swift\n  public func query(withLeftBound: leftBound: Int, rightBound: Int) -> T {\n    // 1\n    if self.leftBound == leftBound && self.rightBound == rightBound {\n      return self.value\n    }\n\n    guard let leftChild = leftChild else { fatalError(\"leftChild should not be nil\") }\n    guard let rightChild = rightChild else { fatalError(\"rightChild should not be nil\") }\n\n    // 2\n    if leftChild.rightBound < leftBound {\n      return rightChild.query(withLeftBound: leftBound, rightBound: rightBound)\n\n    // 3\n    } else if rightChild.leftBound > rightBound {\n      return leftChild.query(withLeftBound: leftBound, rightBound: rightBound)\n\n    // 4\n    } else {\n      let leftResult = leftChild.query(withLeftBound: leftBound, rightBound: leftChild.rightBound)\n      let rightResult = rightChild.query(withLeftBound: rightChild.leftBound, rightBound: rightBound)\n      return function(leftResult, rightResult)\n    }\n  }\n```\n\nAgain, this is a recursive method. It checks four different possibilities.\n\n1) First, we check if the query segment is equal to the segment for which our current node is responsible. If it is we just return this node's value.\n\n![equalSegments](Images/EqualSegments.png)\n\n2) Does the query segment fully lie within the right child? If so, recursively perform the query on the right child.\n\n![rightSegment](Images/RightSegment.png)\n\n3) Does the query segment fully lie within the left child? If so, recursively perform the query on the left child.\n\n![leftSegment](Images/LeftSegment.png)\n\n4) If none of the above, it means our query partially lies in both children so we combine the results of queries on both children.\n\n![mixedSegment](Images/MixedSegment.png)\n\nThis is how you can test it out in a playground:\n\n```swift\nlet array = [1, 2, 3, 4]\n\nlet sumSegmentTree = SegmentTree(array: array, function: +)\n\nsumSegmentTree.query(withLeftBound: 0, rightBound: 3)  // 1 + 2 + 3 + 4 = 10\nsumSegmentTree.query(withLeftBound: 1, rightBound: 2)  // 2 + 3 = 5\nsumSegmentTree.query(withLeftBound: 0, rightBound: 0)  // just 1\nsumSegmentTree.query(withLeftBound: 3, rightBound: 3)  // just 4\n```\n\nQuerying the tree takes **O(log n)** time.\n\n## Replacing items\n\nThe value of a node in the segment tree depends on the nodes below it. So if we want to change a value of a leaf node, we need to update all its parent nodes too.\n\nHere is the code:\n\n```swift\n  public func replaceItem(at index: Int, withItem item: T) {\n    if leftBound == rightBound {\n      value = item\n    } else if let leftChild = leftChild, rightChild = rightChild {\n      if leftChild.rightBound >= index {\n        leftChild.replaceItem(at: index, withItem: item)\n      } else {\n        rightChild.replaceItem(at: index, withItem: item)\n      }\n      value = function(leftChild.value, rightChild.value)\n    }\n  }\n```\n\nAs usual, this works with recursion. If the node is a leaf, we just change its value. If the node is not a leaf, then we recursively call `replaceItem(at: )` to update its children. After that, we recalculate the node's own value so that it is up-to-date again.\n\nReplacing an item takes **O(log n)** time.\n\nSee the playground for more examples of how to use the segment tree.\n\n## See also\n\n[Lazy Propagation](https://github.com/raywenderlich/swift-algorithm-club/tree/master/Segment%20Tree/LazyPropagation) implementation and explanation.\n\n[Segment tree at PEGWiki](http://wcipeg.com/wiki/Segment_tree)\n\n*Written for Swift Algorithm Club by [Artur Antonov](https://github.com/goingreen)*\n"
  },
  {
    "path": "Segment Tree/SegmentTree.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\n// last checked with Xcode 9.0b4\n#if swift(>=4.0)\nprint(\"Hello, Swift 4!\")\n#endif\n\npublic class SegmentTree<T> {\n\n\tprivate var value: T\n\tprivate var function: (T, T) -> T\n\tprivate var leftBound: Int\n\tprivate var rightBound: Int\n\tprivate var leftChild: SegmentTree<T>?\n\tprivate var rightChild: SegmentTree<T>?\n\n\tpublic init(array: [T], leftBound: Int, rightBound: Int, function: @escaping (T, T) -> T) {\n\t\tself.leftBound = leftBound\n\t\tself.rightBound = rightBound\n\t\tself.function = function\n\n\t\tif leftBound == rightBound {\n\t\t\tvalue = array[leftBound]\n\t\t} else {\n\t\t\tlet middle = (leftBound + rightBound) / 2\n\t\t\tleftChild = SegmentTree<T>(array: array, leftBound: leftBound, rightBound: middle, function: function)\n\t\t\trightChild = SegmentTree<T>(array: array, leftBound: middle+1, rightBound: rightBound, function: function)\n\t\t\tvalue = function(leftChild!.value, rightChild!.value)\n\t\t}\n\t}\n\n\tpublic convenience init(array: [T], function: @escaping (T, T) -> T) {\n\t\tself.init(array: array, leftBound: 0, rightBound: array.count-1, function: function)\n\t}\n\n\tpublic func query(leftBound: Int, rightBound: Int) -> T {\n\t\tif self.leftBound == leftBound && self.rightBound == rightBound {\n\t\t\treturn self.value\n\t\t}\n\n\t\tguard let leftChild = leftChild else { fatalError(\"leftChild should not be nil\") }\n\t\tguard let rightChild = rightChild else { fatalError(\"rightChild should not be nil\") }\n\n\t\tif leftChild.rightBound < leftBound {\n\t\t\treturn rightChild.query(leftBound: leftBound, rightBound: rightBound)\n\t\t} else if rightChild.leftBound > rightBound {\n\t\t\treturn leftChild.query(leftBound: leftBound, rightBound: rightBound)\n\t\t} else {\n\t\t\tlet leftResult = leftChild.query(leftBound: leftBound, rightBound: leftChild.rightBound)\n\t\t\tlet rightResult = rightChild.query(leftBound:rightChild.leftBound, rightBound: rightBound)\n\t\t\treturn function(leftResult, rightResult)\n\t\t}\n\t}\n\n\tpublic func replaceItem(at index: Int, withItem item: T) {\n\t\tif leftBound == rightBound {\n\t\t\tvalue = item\n\t\t} else if let leftChild = leftChild, let rightChild = rightChild {\n\t\t\tif leftChild.rightBound >= index {\n\t\t\t\tleftChild.replaceItem(at: index, withItem: item)\n\t\t\t} else {\n\t\t\t\trightChild.replaceItem(at: index, withItem: item)\n\t\t\t}\n\t\t\tvalue = function(leftChild.value, rightChild.value)\n\t\t}\n\t}\n}\n\nlet array = [1, 2, 3, 4]\n\nlet sumSegmentTree = SegmentTree(array: array, function: +)\n\nprint(sumSegmentTree.query(leftBound: 0, rightBound: 3)) // 1 + 2 + 3 + 4 = 10\nprint(sumSegmentTree.query(leftBound: 1, rightBound: 2)) // 2 + 3 = 5\nprint(sumSegmentTree.query(leftBound: 0, rightBound: 0)) // 1 = 1\n\nsumSegmentTree.replaceItem(at: 0, withItem: 2) //our array now is [2, 2, 3, 4]\n\nprint(sumSegmentTree.query(leftBound: 0, rightBound: 0)) // 2 = 2\nprint(sumSegmentTree.query(leftBound: 0, rightBound: 1)) // 2 + 2 = 4\n\n//you can use any associative function (i.e (a+b)+c == a+(b+c)) as function for segment tree\nfunc gcd(_ m: Int, _ n: Int) -> Int {\n\tvar a = 0\n\tvar b = max(m, n)\n\tvar r = min(m, n)\n\n\twhile r != 0 {\n\t\ta = b\n\t\tb = r\n\t\tr = a % b\n\t}\n\treturn b\n}\n\nlet gcdArray = [2, 4, 6, 3, 5]\n\nlet gcdSegmentTree = SegmentTree(array: gcdArray, function: gcd)\n\nprint(gcdSegmentTree.query(leftBound: 0, rightBound: 1)) // gcd(2, 4) = 2\nprint(gcdSegmentTree.query(leftBound: 2, rightBound: 3)) // gcd(6, 3) = 3\nprint(gcdSegmentTree.query(leftBound: 1, rightBound: 3)) // gcd(4, 6, 3) = 1\nprint(gcdSegmentTree.query(leftBound: 0, rightBound: 4)) // gcd(2, 4, 6, 3, 5) = 1\n\ngcdSegmentTree.replaceItem(at: 3, withItem: 10) //gcdArray now is [2, 4, 6, 10, 5]\n\nprint(gcdSegmentTree.query(leftBound: 3, rightBound: 4)) // gcd(10, 5) = 5\n\n//example of segment tree which finds minimum on given range\nlet minArray = [2, 4, 1, 5, 3]\n\nlet minSegmentTree = SegmentTree(array: minArray, function: min)\n\nprint(minSegmentTree.query(leftBound: 0, rightBound: 4)) // min(2, 4, 1, 5, 3) = 1\nprint(minSegmentTree.query(leftBound: 0, rightBound: 1)) // min(2, 4) = 2\n\nminSegmentTree.replaceItem(at: 2, withItem: 10) // minArray now is [2, 4, 10, 5, 3]\n\nprint(minSegmentTree.query(leftBound: 0, rightBound: 4)) // min(2, 4, 10, 5, 3) = 2\n\n//type of elements in array can be any type which has some associative function\nlet stringArray = [\"a\", \"b\", \"c\", \"A\", \"B\", \"C\"]\n\nlet stringSegmentTree = SegmentTree(array: stringArray, function: +)\n\nprint(stringSegmentTree.query(leftBound: 0, rightBound: 1)) // \"a\"+\"b\" = \"ab\"\nprint(stringSegmentTree.query(leftBound: 2, rightBound: 3)) // \"c\"+\"A\" = \"cA\"\nprint(stringSegmentTree.query(leftBound: 1, rightBound: 3)) // \"b\"+\"c\"+\"A\" = \"bcA\"\nprint(stringSegmentTree.query(leftBound: 0, rightBound: 5)) // \"a\"+\"b\"+\"c\"+\"A\"+\"B\"+\"C\" = \"abcABC\"\n\nstringSegmentTree.replaceItem(at: 0, withItem: \"I\")\nstringSegmentTree.replaceItem(at: 1, withItem: \" like\")\nstringSegmentTree.replaceItem(at: 2, withItem: \" algorithms\")\nstringSegmentTree.replaceItem(at: 3, withItem: \" and\")\nstringSegmentTree.replaceItem(at: 4, withItem: \" swift\")\nstringSegmentTree.replaceItem(at: 5, withItem: \"!\")\n\nprint(stringSegmentTree.query(leftBound: 0, rightBound: 5))\n"
  },
  {
    "path": "Segment Tree/SegmentTree.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx' last-migration='0800'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Segment Tree/SegmentTree.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Segment Tree/SegmentTree.swift",
    "content": "/*\n  Segment tree\n\n  Performance:\n    building the tree is O(n)\n    query is O(log n)\n    replace item is O(log n)\n*/\n\npublic class SegmentTree<T> {\n\n\tprivate var value: T\n\tprivate var function: (T, T) -> T\n\tprivate var leftBound: Int\n\tprivate var rightBound: Int\n\tprivate var leftChild: SegmentTree<T>?\n\tprivate var rightChild: SegmentTree<T>?\n\n\tpublic init(array: [T], leftBound: Int, rightBound: Int, function: @escaping (T, T) -> T) {\n\t\tself.leftBound = leftBound\n\t\tself.rightBound = rightBound\n\t\tself.function = function\n\n\t\tif leftBound == rightBound {\n\t\t\tvalue = array[leftBound]\n\t\t} else {\n\t\t\tlet middle = (leftBound + rightBound) / 2\n\t\t\tleftChild = SegmentTree<T>(array: array, leftBound: leftBound, rightBound: middle, function: function)\n\t\t\trightChild = SegmentTree<T>(array: array, leftBound: middle+1, rightBound: rightBound, function: function)\n\t\t\tvalue = function(leftChild!.value, rightChild!.value)\n\t\t}\n\t}\n\n\tpublic convenience init(array: [T], function: @escaping (T, T) -> T) {\n\t\tself.init(array: array, leftBound: 0, rightBound: array.count-1, function: function)\n\t}\n\n\tpublic func query(leftBound: Int, rightBound: Int) -> T {\n\t\tif self.leftBound == leftBound && self.rightBound == rightBound {\n\t\t\treturn self.value\n\t\t}\n\n\t\tguard let leftChild = leftChild else { fatalError(\"leftChild should not be nil\") }\n\t\tguard let rightChild = rightChild else { fatalError(\"rightChild should not be nil\") }\n\n\t\tif leftChild.rightBound < leftBound {\n\t\t\treturn rightChild.query(leftBound: leftBound, rightBound: rightBound)\n\t\t} else if rightChild.leftBound > rightBound {\n\t\t\treturn leftChild.query(leftBound: leftBound, rightBound: rightBound)\n\t\t} else {\n\t\t\tlet leftResult = leftChild.query(leftBound: leftBound, rightBound: leftChild.rightBound)\n\t\t\tlet rightResult = rightChild.query(leftBound:rightChild.leftBound, rightBound: rightBound)\n\t\t\treturn function(leftResult, rightResult)\n\t\t}\n\t}\n\n\tpublic func replaceItem(at index: Int, withItem item: T) {\n\t\tif leftBound == rightBound {\n\t\t\tvalue = item\n\t\t} else if let leftChild = leftChild, let rightChild = rightChild {\n\t\t\tif leftChild.rightBound >= index {\n\t\t\t\tleftChild.replaceItem(at: index, withItem: item)\n\t\t\t} else {\n\t\t\t\trightChild.replaceItem(at: index, withItem: item)\n\t\t\t}\n\t\t\tvalue = function(leftChild.value, rightChild.value)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Select Minimum Maximum/Maximum.swift",
    "content": "/*\n Finds the maximum value in an array in O(n) time.\n */\n\nfunc maximum<T: Comparable>(_ array: [T]) -> T? {\n    guard var maximum = array.first else { return nil }\n    \n    for element in array.dropFirst() {\n        maximum = element > maximum ? element : maximum\n    }\n    return maximum\n}\n"
  },
  {
    "path": "Select Minimum Maximum/Minimum.swift",
    "content": "/*\n Finds the minimum value in an array in O(n) time.\n */\n\nfunc minimum<T: Comparable>(_ array: [T]) -> T? {\n    guard var minimum = array.first else { return nil }\n \n    for element in array.dropFirst() {\n        minimum = element < minimum ? element : minimum\n    }\n    return minimum\n}\n"
  },
  {
    "path": "Select Minimum Maximum/MinimumMaximumPairs.swift",
    "content": "/*\n Finds the maximum and minimum value in an array in O(n) time.\n */\n\nfunc minimumMaximum<T: Comparable>(_ array: [T]) -> (minimum: T, maximum: T)? {\n    guard var minimum = array.first else { return nil }\n    var maximum = minimum\n\n    // if 'array' has an odd number of items, let 'minimum' or 'maximum' deal with the leftover\n    let start = array.count % 2 // 1 if odd, skipping the first element\n    for i in stride(from: start, to: array.count, by: 2) {\n        let pair = (array[i], array[i+1])\n\n        if pair.0 > pair.1 {\n            if pair.0 > maximum {\n                maximum = pair.0\n            }\n            if pair.1 < minimum {\n                minimum = pair.1\n            }\n        } else {\n            if pair.1 > maximum {\n                maximum = pair.1\n            }\n            if pair.0 < minimum {\n                minimum = pair.0\n            }\n        }\n    }\n\n    return (minimum, maximum)\n}\n"
  },
  {
    "path": "Select Minimum Maximum/README.markdown",
    "content": "# Select Minimum / Maximum\n\nGoal: Find the minimum/maximum object in an unsorted array.\n\n## Maximum or minimum\n\nWe have an array of generic objects and we iterate over all the objects keeping track of the minimum/maximum element so far.\n\n### An example\n\nLet's say the we want to find the maximum value in the unsorted list `[ 8, 3, 9, 4, 6 ]`.\n\nPick the first number, `8`, and store it as the maximum element so far. \n\nPick the next number from the list, `3`, and compare it to the current maximum. `3` is less than `8` so the maximum `8` does not change.\n\nPick the next number from the list, `9`, and compare it to the current maximum. `9` is greater than `8` so we store `9` as the maximum.\n\nRepeat this process until the all elements in the list have been processed.\n\n### The code\n\nHere is a simple implementation in Swift:\n\n```swift\nfunc minimum<T: Comparable>(_ array: [T]) -> T? {\n  guard var minimum = array.first else {\n    return nil\n  }\n\n  for element in array.dropFirst() {\n    minimum = element < minimum ? element : minimum\n  }\n  return minimum\n}\n\nfunc maximum<T: Comparable>(_ array: [T]) -> T? {\n  guard var maximum = array.first else {\n    return nil\n  }\n\n  for element in array.dropFirst() {\n    maximum = element > maximum ? element : maximum\n  }\n  return maximum\n}\n```\n\nPut this code in a playground and test it like so:\n\n```swift\nlet array = [ 8, 3, 9, 4, 6 ]\nminimum(array)   // This will return 3\nmaximum(array)   // This will return 9\n```\n\n### In the Swift standard library\n\nThe Swift library already contains an extension to `SequenceType` that returns the minimum/maximum element in a sequence.\n\n```swift\nlet array = [ 8, 3, 9, 4, 6 ]\narray.minElement()   // This will return 3\narray.maxElement()   // This will return 9\n```\n\n```swift\nlet array = [ 8, 3, 9, 4, 6 ]\n//swift3\narray.min()   // This will return 3\narray.max()   // This will return 9\n```\n\n## Maximum and minimum\n\nTo find both the maximum and minimum values contained in array while minimizing the number of comparisons we can compare the items in pairs. \n\n### An example\n\nLet's say the we want to find the minimum and maximum value in the unsorted list `[ 8, 3, 9, 6, 4 ]`.\n\nPick the first number, `8`, and store it as the minimum and maximum element so far. \n\nBecause we have an odd number of items we remove `8` from the list which leaves the pairs `[ 3, 9 ]` and `[ 6, 4 ]`.\n\nPick the next pair of numbers from the list, `[ 3, 9 ]`. Of these two numbers, `3` is the smaller one, so we compare `3` to the current minimum `8`, and we compare `9` to the current maximum `8`. `3` is less than `8` so the new minimum is `3`. `9` is greater than `8` so the new maximum is `9`.\n\nPick the next pair of numbers from the list, `[ 6, 4 ]`. Here, `4` is the smaller one, so we compare `4` to the current minimum `3`, and we compare `6` to the current maximum `9`. `4` is greater than `3` so the minimum does not change. `6` is less than `9` so the maximum does not change.\n\nThe result is a minimum of `3` and a maximum of `9`.\n\n### The code\n\nHere is a simple implementation in Swift:\n\n```swift\nfunc minimumMaximum<T: Comparable>(_ array: [T]) -> (minimum: T, maximum: T)? {\n  guard var minimum = array.first else {\n    return nil\n  }\n  var maximum = minimum\n\n  // if 'array' has an odd number of items, let 'minimum' or 'maximum' deal with the leftover\n  let start = array.count % 2 // 1 if odd, skipping the first element\n  for i in stride(from: start, to: array.count, by: 2) {\n    let pair = (array[i], array[i+1])\n\n    if pair.0 > pair.1 {\n      if pair.0 > maximum {\n        maximum = pair.0\n      }\n      if pair.1 < minimum {\n        minimum = pair.1\n      }\n    } else {\n      if pair.1 > maximum {\n        maximum = pair.1\n      }\n      if pair.0 < minimum {\n        minimum = pair.0\n      }\n    }\n  }\n\n  return (minimum, maximum)\n}\n```\n\nPut this code in a playground and test it like so:\n\n```swift\nlet result = minimumMaximum(array)!\nresult.minimum   // This will return 3\nresult.maximum   // This will return 9\n```\n\nBy picking elements in pairs and comparing their maximum and minimum with the running minimum and maximum we reduce the number of comparisons to 3 for every 2 elements.\n\n## Performance\n\nThese algorithms run at **O(n)**. Each object in the array is compared with the running minimum/maximum so the time it takes is proportional to the array length.\n\n*Written by [Chris Pilcher](https://github.com/chris-pilcher)*\n"
  },
  {
    "path": "Select Minimum Maximum/SelectMinimumMaximum.playground/Contents.swift",
    "content": "// last checked with Xcode 9.0b4\n#if swift(>=4.0)\nprint(\"Hello, Swift 4!\")\n#endif\n\n// Compare each item to find minimum\nfunc minimum<T: Comparable>(_ array: [T]) -> T? {\n  guard var minimum = array.first else {\n    return nil\n  }\n  \n  for element in array.dropFirst() {\n    minimum = element < minimum ? element : minimum\n  }\n  return minimum\n}\n\n// Compare each item to find maximum\nfunc maximum<T: Comparable>(_ array: [T]) -> T? {\n  guard var maximum = array.first else {\n    return nil\n  }\n  \n  for element in array.dropFirst() {\n    maximum = element > maximum ? element : maximum\n  }\n  return maximum\n}\n\n// Compare in pairs to find minimum and maximum\nfunc minimumMaximum<T: Comparable>(_ array: [T]) -> (minimum: T, maximum: T)? {\n  guard !array.isEmpty else {\n    return nil\n  }\n\n  var minimum = array.first!\n  var maximum = array.first!\n\n  // if 'array' has an odd number of items, let 'minimum' or 'maximum' deal with the leftover\n  let start = array.count % 2 // 1 if odd, skipping the first element\n  for i in stride(from: start, to: array.count, by: 2) {\n    let pair = (array[i], array[i+1])\n\n    if pair.0 > pair.1 {\n      if pair.0 > maximum {\n        maximum = pair.0\n      }\n      if pair.1 < minimum {\n        minimum = pair.1\n      }\n    } else {\n      if pair.1 > maximum {\n        maximum = pair.1\n      }\n      if pair.0 < minimum {\n        minimum = pair.0\n      }\n    }\n  }\n\n  return (minimum, maximum)\n}\n\n// Test of minimum and maximum functions\nlet array = [ 8, 3, 9, 4, 6 ]\nminimum(array)\nmaximum(array)\n\n// Test of minimumMaximum function\nlet result = minimumMaximum(array)!\nresult.minimum\nresult.maximum\n\n// Built-in Swift functions\narray.min()\narray.max()\n"
  },
  {
    "path": "Select Minimum Maximum/SelectMinimumMaximum.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Select Minimum Maximum/SelectMinimumMaximum.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Select Minimum Maximum/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Select Minimum Maximum/Tests/MaximumTests.swift",
    "content": "import XCTest\n\nclass MaximumTests: XCTestCase {\n\n  func testMaximumGivenAListContainingOneElement() {\n    let array = [ 99 ]\n\n    let result = maximum(array)\n\n    XCTAssertEqual(result, 99)\n  }\n\n  func testMaximumGivenAListContainingMultipleElementsWithTheSameValue() {\n    let array = [ 3, 16, 3, 16 ]\n\n    let result = maximum(array)\n\n    XCTAssertEqual(result, 16)\n  }\n\n  func testMaximumGivenAListOfOrderedElements() {\n    let array = [ 3, 4, 6, 8, 9 ]\n\n    let result = maximum(array)\n\n    XCTAssertEqual(result, 9)\n  }\n\n  func testMaximumGivenAListOfReverseOrderedElements() {\n    let array = [ 9, 8, 6, 4, 3 ]\n\n    let result = maximum(array)\n\n    XCTAssertEqual(result, 9)\n  }\n\n  func testMaximumGivenAnEmptyList() {\n    let array = [Int]()\n\n    let result = maximum(array)\n\n    XCTAssertNil(result)\n  }\n\n  func testMaximumMatchesSwiftLibraryGivenARandomList() {\n    for _ in 0...10 {\n      for n in 1...100 {\n        let array = createRandomList(n)\n\n        let result = maximum(array)\n\n        XCTAssertEqual(result, array.max())\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Select Minimum Maximum/Tests/MinimumMaximumPairsTests.swift",
    "content": "import XCTest\n\nclass MinimumMaximumPairsTests: XCTestCase {\n\n  func testMinimumAndMaximumGivenAListContainingOneElement() {\n    let array = [ 8 ]\n\n    let result = minimumMaximum(array)!\n\n    XCTAssertEqual(result.minimum, 8)\n    XCTAssertEqual(result.maximum, 8)\n  }\n\n  func testMinimumAndMaximumGivenAListContainingMultipleElementsWithTheSameValue() {\n    let array = [ 8, 16, 8, 8 ]\n\n    let result = minimumMaximum(array)!\n\n    XCTAssertEqual(result.minimum, 8)\n    XCTAssertEqual(result.maximum, 16)\n  }\n\n  func testMimimumAndMaximumGivenAListContainingAnEvenNumberOfElements() {\n    let array = [ 3, 4, 6, 8 ]\n\n    let result = minimumMaximum(array)!\n\n    XCTAssertEqual(result.minimum, 3)\n    XCTAssertEqual(result.maximum, 8)\n  }\n\n  func testMimimumAndMaximumGivenAListContainingAnOddNumberOfElements() {\n    let array = [ 8, 3, 9, 4, 6 ]\n\n    let result = minimumMaximum(array)!\n\n    XCTAssertEqual(result.minimum, 3)\n    XCTAssertEqual(result.maximum, 9)\n  }\n\n  func testMimimumAndMaximumGivenAListOfOrderedElements() {\n    let array = [ 3, 4, 6, 8, 9 ]\n\n    let result = minimumMaximum(array)!\n\n    XCTAssertEqual(result.minimum, 3)\n    XCTAssertEqual(result.maximum, 9)\n  }\n\n  func testMimimumAndMaximumGivenAListOfReverseOrderedElements() {\n    let array = [ 9, 8, 6, 4, 3 ]\n\n    let result = minimumMaximum(array)!\n\n    XCTAssertEqual(result.minimum, 3)\n    XCTAssertEqual(result.maximum, 9)\n  }\n\n  func testMinimumAndMaximumGivenAnEmptyList() {\n    let array = [Int]()\n\n    let result = minimumMaximum(array)\n\n    XCTAssertNil(result)\n  }\n\n  func testMinimumAndMaximumMatchSwiftLibraryGivenARandomList() {\n    for _ in 0...10 {\n      for n in 1...100 {\n        let array = createRandomList(n)\n\n        let result = minimumMaximum(array)!\n\n        XCTAssertEqual(result.minimum, array.min())\n        XCTAssertEqual(result.maximum, array.max())\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Select Minimum Maximum/Tests/MinimumTests.swift",
    "content": "import XCTest\n\nclass MinimumTests: XCTestCase {\n\n  func testMinimumGivenAListContainingOneElement() {\n    let array = [ 54 ]\n\n    let result = minimum(array)\n\n    XCTAssertEqual(result, 54)\n  }\n\n  func testMinimumGivenAListContainingMultipleElementsWithTheSameValue() {\n    let array = [ 2, 16, 2, 16 ]\n\n    let result = minimum(array)\n\n    XCTAssertEqual(result, 2)\n  }\n\n  func testMinimumGivenAListOfOrderedElements() {\n    let array = [ 3, 4, 6, 8, 9 ]\n\n    let result = minimum(array)\n\n    XCTAssertEqual(result, 3)\n  }\n\n  func testMinimumGivenAListOfReverseOrderedElements() {\n    let array = [ 9, 8, 6, 4, 3 ]\n\n    let result = minimum(array)\n\n    XCTAssertEqual(result, 3)\n  }\n\n  func testMinimumGivenAnEmptyList() {\n    let array = [Int]()\n\n    let result = minimum(array)\n\n    XCTAssertNil(result)\n  }\n\n  func testMinimumMatchesSwiftLibraryGivenARandomList() {\n    for _ in 0...10 {\n      for n in 1...100 {\n        let array = createRandomList(n)\n\n        let result = minimum(array)\n\n        XCTAssertEqual(result, array.min())\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Select Minimum Maximum/Tests/TestHelper.swift",
    "content": "import Foundation\n\nfunc createRandomList(_ numberOfElements: Int) -> [UInt32] {\n  return (1...numberOfElements).map {_ in arc4random()}\n}\n"
  },
  {
    "path": "Select Minimum Maximum/Tests/Tests.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t7B80C40C1C77A768003CECC7 /* Maximum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C4091C77A768003CECC7 /* Maximum.swift */; };\n\t\t7B80C40D1C77A768003CECC7 /* Minimum.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C40A1C77A768003CECC7 /* Minimum.swift */; };\n\t\t7B80C40E1C77A768003CECC7 /* MinimumMaximumPairs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C40B1C77A768003CECC7 /* MinimumMaximumPairs.swift */; };\n\t\t7B80C4131C77A770003CECC7 /* MaximumTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C40F1C77A770003CECC7 /* MaximumTests.swift */; };\n\t\t7B80C4141C77A770003CECC7 /* MinimumTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C4101C77A770003CECC7 /* MinimumTests.swift */; };\n\t\t7B80C4151C77A770003CECC7 /* MinimumMaximumPairsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C4111C77A770003CECC7 /* MinimumMaximumPairsTests.swift */; };\n\t\t7B80C4161C77A770003CECC7 /* TestHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C4121C77A770003CECC7 /* TestHelper.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t7B2BBC801C779D720067B71D /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7B2BBC941C779E7B0067B71D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };\n\t\t7B80C4091C77A768003CECC7 /* Maximum.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Maximum.swift; path = ../Maximum.swift; sourceTree = SOURCE_ROOT; };\n\t\t7B80C40A1C77A768003CECC7 /* Minimum.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Minimum.swift; path = ../Minimum.swift; sourceTree = SOURCE_ROOT; };\n\t\t7B80C40B1C77A768003CECC7 /* MinimumMaximumPairs.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MinimumMaximumPairs.swift; path = ../MinimumMaximumPairs.swift; sourceTree = SOURCE_ROOT; };\n\t\t7B80C40F1C77A770003CECC7 /* MaximumTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MaximumTests.swift; sourceTree = SOURCE_ROOT; };\n\t\t7B80C4101C77A770003CECC7 /* MinimumTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MinimumTests.swift; sourceTree = SOURCE_ROOT; };\n\t\t7B80C4111C77A770003CECC7 /* MinimumMaximumPairsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MinimumMaximumPairsTests.swift; sourceTree = SOURCE_ROOT; };\n\t\t7B80C4121C77A770003CECC7 /* TestHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestHelper.swift; sourceTree = SOURCE_ROOT; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t7B2BBC7D1C779D720067B71D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t7B2BBC681C779D710067B71D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC831C779D720067B71D /* Tests */,\n\t\t\t\t7B2BBC721C779D710067B71D /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC721C779D710067B71D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC801C779D720067B71D /* Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC831C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC941C779E7B0067B71D /* Info.plist */,\n\t\t\t\t7B80C4091C77A768003CECC7 /* Maximum.swift */,\n\t\t\t\t7B80C40F1C77A770003CECC7 /* MaximumTests.swift */,\n\t\t\t\t7B80C40A1C77A768003CECC7 /* Minimum.swift */,\n\t\t\t\t7B80C4101C77A770003CECC7 /* MinimumTests.swift */,\n\t\t\t\t7B80C40B1C77A768003CECC7 /* MinimumMaximumPairs.swift */,\n\t\t\t\t7B80C4111C77A770003CECC7 /* MinimumMaximumPairsTests.swift */,\n\t\t\t\t7B80C4121C77A770003CECC7 /* TestHelper.swift */,\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tpath = TestsTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t7B2BBC7F1C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t7B2BBC7C1C779D720067B71D /* Sources */,\n\t\t\t\t7B2BBC7D1C779D720067B71D /* Frameworks */,\n\t\t\t\t7B2BBC7E1C779D720067B71D /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tproductName = TestsTests;\n\t\t\tproductReference = 7B2BBC801C779D720067B71D /* Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t7B2BBC691C779D710067B71D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0720;\n\t\t\t\tLastUpgradeCheck = 0820;\n\t\t\t\tORGANIZATIONNAME = \"Swift Algorithm Club\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t7B2BBC7F1C779D720067B71D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2;\n\t\t\t\t\t\tLastSwiftMigration = 0820;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 7B2BBC681C779D710067B71D;\n\t\t\tproductRefGroup = 7B2BBC721C779D710067B71D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t7B2BBC7F1C779D720067B71D /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t7B2BBC7E1C779D720067B71D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t7B2BBC7C1C779D720067B71D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7B80C40D1C77A768003CECC7 /* Minimum.swift in Sources */,\n\t\t\t\t7B80C40E1C77A768003CECC7 /* MinimumMaximumPairs.swift in Sources */,\n\t\t\t\t7B80C4141C77A770003CECC7 /* MinimumTests.swift in Sources */,\n\t\t\t\t7B80C40C1C77A768003CECC7 /* Maximum.swift in Sources */,\n\t\t\t\t7B80C4131C77A770003CECC7 /* MaximumTests.swift in Sources */,\n\t\t\t\t7B80C4161C77A770003CECC7 /* TestHelper.swift in Sources */,\n\t\t\t\t7B80C4151C77A770003CECC7 /* MinimumMaximumPairsTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t7B2BBC871C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC881C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t7B2BBC8D1C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 3.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC8E1C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 3.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC871C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC881C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC8D1C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC8E1C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 7B2BBC691C779D710067B71D /* Project object */;\n}\n"
  },
  {
    "path": "Select Minimum Maximum/Tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Tests.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Select Minimum Maximum/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0820\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Selection Sampling/README.markdown",
    "content": "# Selection Sampling\n\nGoal: Select *k* items at random from a collection of *n* items.\n\nLet's say you have a deck of 52 playing cards and you need to draw 10 cards at random. This algorithm lets you do that.\n\nHere's a very fast version:\n\n```swift\nfunc select<T>(from a: [T], count k: Int) -> [T] {\n  var a = a\n  for i in 0..<k {\n    let r = random(min: i, max: a.count - 1)\n    if i != r {\n      a.swapAt(i, r) // Corrected line in README\n    }\n  }\n  return Array(a[0..<k])\n}\n```\n\nAs often happens with these [kinds of algorithms](../Shuffle/), it divides the array into two regions. The first region contains the selected items; the second region is all the remaining items.\n\nHere's an example. Let's say the array is:\n\n\t[ \"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\" ]\n\t\nWe want to select 3 items, so `k = 3`. In the loop, `i` is initially 0, so it points at `\"a\"`.\n\n\t[ \"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\" ]\n\t   i\n\nWe calculate a random number between `i` and `a.count`, the size of the array. Let's say this is 4. Now we swap `\"a\"` with `\"e\"`, the element at index 4, and move `i` forward:\n\n\t[ \"e\" | \"b\", \"c\", \"d\", \"a\", \"f\", \"g\" ]\n\t         i\n\nThe `|` bar shows the split between the two regions. `\"e\"` is the first element we've selected. Everything to the right of the bar we still need to look at.\n\nAgain, we ask for a random number between `i` and `a.count`, but because `i` has shifted, the random number can never be less than 1. So we'll never again swap `\"e\"` with anything.\n\nLet's say the random number is 6 and we swap `\"b\"` with `\"g\"`:\n\n\t[ \"e\" , \"g\" | \"c\", \"d\", \"a\", \"f\", \"b\" ]\n\t               i\n\nOne more random number to pick, let's say it is 4 again. We swap `\"c\"` with `\"a\"` to get the final selection on the left:\n\n\t[ \"e\", \"g\", \"a\" | \"d\", \"c\", \"f\", \"b\" ]\n\nAnd that's it. Easy peasy. The performance of this function is **O(k)** because as soon as we've selected *k* elements, we're done.\n\nHere is an alternative algorithm, called \"reservoir sampling\":\n\n```swift\nfunc reservoirSample<T>(from a: [T], count k: Int) -> [T] {\n  precondition(a.count >= k)\n\n  var result = [T]()      // 1\n  for i in 0..<k {\n    result.append(a[i])\n  }\n\n  for i in k..<a.count {  // 2\n    let j = random(min: 0, max: i)\n    if j < k {\n      result[j] = a[i]\n    }\n  }\n  return result\n}\n```\n\nThis works in two steps:\n\n1. Fill the `result` array with the first `k` elements from the original array. This is called the \"reservoir\".\n2. Randomly replace elements in the reservoir with elements from the remaining pool.\n\nThe performance of this algorithm is **O(n)**, so it's a little bit slower than the first algorithm. However, its big advantage is that it can be used for arrays that are too large to fit in memory, even if you don't know what the size of the array is (in Swift this might be something like a lazy generator that reads the elements from a file).\n\nThere is one downside to the previous two algorithms: they do not keep the elements in the original order. In the input array `\"a\"` came before `\"e\"` but now it's the other way around. If that is an issue for your app, you can't use this particular method.\n\nHere is an alternative approach that does keep the original order intact, but is a little more involved:\n\n```swift\nfunc select<T>(from a: [T], count requested: Int) -> [T] {\n  var examined = 0\n  var selected = 0\n  var b = [T]()\n  \n  while selected < requested {                          // 1\n    let r = Double(arc4random()) / 0x100000000          // 2\n    \n    let leftToExamine = a.count - examined              // 3\n    let leftToAdd = requested - selected\n\n    if Double(leftToExamine) * r < Double(leftToAdd) {  // 4\n      selected += 1\n      b.append(a[examined])\n    }\n\n    examined += 1\n  }\n  return b\n}\n```\n\nThis algorithm uses probability to decide whether to include a number in the selection or not. \n\n1. The loop steps through the array from beginning to end. It keeps going until we've selected *k* items from our set of *n*. Here, *k* is called `requested` and *n* is `a.count`.\n\n2. Calculate a random number between 0 and 1. We want `0.0 <= r < 1.0`. The higher bound is exclusive; we never want it to be exactly 1. That's why we divide the result from `arc4random()` by `0x100000000` instead of the more usual `0xffffffff`.\n\n3. `leftToExamine` is how many items we still haven't looked at. `leftToAdd` is how many items we still need to select before we're done.\n\n4. This is where the magic happens. Basically, we're flipping a coin. If it was heads, we add the current array element to the selection; if it was tails, we skip it.\n\nInterestingly enough, even though we use probability, this approach always guarantees that we end up with exactly *k* items in the output array.\n\nLet's walk through the same example again. The input array is:\n\n\t[ \"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\" ]\n\nThe loop looks at each element in turn, so we start at `\"a\"`. We get a random number between 0 and 1, let's say it is 0.841. The formula at `// 4` multiplies the number of items left to examine with this random number. There are still 7 elements left to examine, so the result is: \n\n\t7 * 0.841 = 5.887\n\nWe compare this to 3 because we wanted to select 3 items. Since 5.887 is greater than 3, we skip `\"a\"` and move on to `\"b\"`.\n\nAgain, we get a random number, let's say 0.212. Now there are only 6 elements left to examine, so the formula gives:\n\n\t6 * 0.212 = 1.272\n\nThis *is* less than 3 and we add `\"b\"` to the selection. This is the first item we've selected, so two left to go.\n\nOn to the next element, `\"c\"`. The random number is 0.264, giving the result:\n\n\t5 * 0.264 = 1.32\n\nThere are only 2 elements left to select, so this number must be less than 2. It is, and we also add `\"c\"` to the selection. The total selection is `[ \"b\", \"c\" ]`.\n\nOnly one item left to select but there are still 4 candidates to look at. Suppose the next random number is 0.718. The formula now gives:\n\n\t4 * 0.718 = 2.872\n\nFor this element to be selected the number has to be less than 1, as there is only 1 element left to be picked. It isn't, so we skip `\"d\"`. Only three possibilities left -- will we make it before we run out of elements?\n\nThe random number is 0.346. The formula gives:\n\n\t3 * 0.346 = 1.038\n\t\nJust a tiny bit too high. We skip `\"e\"`. Only two candidates left...\n\nNote that now literally we're dealing with a coin toss: if the random number is less than 0.5 we select `\"f\"` and we're done. If it's greater than 0.5, we go on to the final element. Let's say we get 0.583:\n\n\t2 * 0.583 = 1.166\n\nWe skip `\"f\"` and look at the very last element. Whatever random number we get here, it should always select `\"g\"` or we won't have selected enough elements and the algorithm doesn't work!\n\nLet's say our final random number is 0.999 (remember, it can never be 1.0 or higher). Actually, no matter what we choose here, the formula will always give a value less than 1:\n\n\t1 * 0.999 = 0.999\n\nAnd so the last element will always be chosen if we didn't have a big enough selection yet. The final selection is `[ \"b\", \"c\", \"g\" ]`. Notice that the elements are still in their original order, because we examined the array from left to right.\n\nMaybe you're not convinced yet... What if we always got 0.999 as the random value (the maximum possible), would that still select 3 items? Well, let's do the math:\n\n\t7 * 0.999 = 6.993     is this less than 3? no\n\t6 * 0.999 = 5.994     is this less than 3? no\n\t5 * 0.999 = 4.995     is this less than 3? no\n\t4 * 0.999 = 3.996     is this less than 3? no\n\t3 * 0.999 = 2.997     is this less than 3? YES\n\t2 * 0.999 = 1.998     is this less than 2? YES\n\t1 * 0.999 = 0.999     is this less than 1? YES\n\nIt always works! But does this mean that elements closer to the end of the array have a higher probability of being chosen than those in the beginning? Nope, all elements are equally likely to be selected. (Don't take my word for it: see the playground for a quick test that shows this in practice.)\n\nHere's an example of how to test this algorithm:\n\n```swift\nlet input = [\n  \"there\", \"once\", \"was\", \"a\", \"man\", \"from\", \"nantucket\",\n  \"who\", \"kept\", \"all\", \"of\", \"his\", \"cash\", \"in\", \"a\", \"bucket\",\n  \"his\", \"daughter\", \"named\", \"nan\",\n  \"ran\", \"off\", \"with\", \"a\", \"man\",\n  \"and\", \"as\", \"for\", \"the\", \"bucket\", \"nan\", \"took\", \"it\",\n]\n\nlet output = select(from: input, count: 10)\nprint(output)\nprint(output.count)\n```\n\nThe performance of this second algorithm is **O(n)** as it may require a pass through the entire input array.\n\n> **Note:** If `k > n/2`, then it's more efficient to do it the other way around and choose `a.count - k` items to remove.\n\nBased on code from Algorithm Alley, Dr. Dobb's Magazine, October 1993.\n\n*Written for Swift Algorithm Club by Matthijs Hollemans*\n"
  },
  {
    "path": "Selection Sampling/SelectionSampling.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\n// last checked with Xcode 9.0b4\n#if swift(>=4.0)\nprint(\"Hello, Swift 4!\")\n#endif\n\nimport Foundation\n\n/* Returns a random integer in the range min...max, inclusive. */\npublic func random(min: Int, max: Int) -> Int {\n  assert(min < max)\n  return min + Int(arc4random_uniform(UInt32(max - min + 1)))\n}\n\n/*\nfunc select<T>(from a: [T], count k: Int) -> [T] {\n  var a = a\n  for i in 0..<k {\n    let r = random(min: i, max: a.count - 1)\n    if i != r {\n      swap(&a[i], &a[r])\n    }\n  }\n  return Array(a[0..<k])\n}\n*/\n\nfunc select<T>(from a: [T], count requested: Int) -> [T] {\n  var examined = 0\n  var selected = 0\n  var b = [T]()\n\n  while selected < requested {\n    // Calculate random variable 0.0 <= r < 1.0 (exclusive!).\n    let r = Double(arc4random()) / 0x100000000\n\n    let leftToExamine = a.count - examined\n    let leftToAdd = requested - selected\n\n    // Decide whether to use the next record from the input.\n    if Double(leftToExamine) * r < Double(leftToAdd) {\n      selected += 1\n      b.append(a[examined])\n    }\n\n    examined += 1\n  }\n  return b\n}\n\nlet poem = [\n  \"there\", \"once\", \"was\", \"a\", \"man\", \"from\", \"nantucket\",\n  \"who\", \"kept\", \"all\", \"of\", \"his\", \"cash\", \"in\", \"a\", \"bucket\",\n  \"his\", \"daughter\", \"named\", \"nan\",\n  \"ran\", \"off\", \"with\", \"a\", \"man\",\n  \"and\", \"as\", \"for\", \"the\", \"bucket\", \"nan\", \"took\", \"it\",\n]\n\nlet output = select(from: poem, count: 10)\nprint(output)\noutput.count\n\n// Use this to verify that all input elements have the same probability\n// of being chosen. The \"counts\" dictionary should have a roughly equal\n// count for each input element.\n\n/*\nlet input = [ \"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\" ]\nvar counts = [String: Int]()\nfor x in input {\n  counts[x] = 0\n}\n\nfor _ in 0...1000 {\n  let output = select(from: input, count: 3)\n  for x in output {\n    counts[x] = counts[x]! + 1\n  }\n}\n\nprint(counts)\n*/\n"
  },
  {
    "path": "Selection Sampling/SelectionSampling.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Selection Sampling/SelectionSampling.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Selection Sampling/SelectionSampling.swift",
    "content": "//: Playground - noun: a place where people can play\n\nimport Foundation\n\n/* Returns a random integer in the range min...max, inclusive. */\npublic func random(min min: Int, max: Int) -> Int {\n  assert(min < max)\n  return min + Int(arc4random_uniform(UInt32(max - min + 1)))\n}\n\n/*\n  Selects k items at random from an array of size n. Does not keep the elements\n  in the original order. Performance: O(k).\n*/\nfunc select<T>(from a: [T], count k: Int) -> [T] {\n  var a = a\n  for i in 0..<k {\n    let r = random(min: i, max: a.count - 1)\n    if i != r {\n      a.swapAt(i, r) // Corrected line\n    }\n  }\n  return Array(a[0..<k])\n}\n\n/*\n  Pick k random elements from an array. Performance: O(n).\n*/\nfunc reservoirSample<T>(from a: [T], count k: Int) -> [T] {\n  precondition(a.count >= k)\n\n  var result = [T]()\n\n  // Fill the result array with first k elements.\n  for i in 0..<k {\n    result.append(a[i])\n  }\n\n  // Randomly replace elements from remaining pool.\n  for i in k..<a.count {\n    let j = random(min: 0, max: i)\n    if j < k {\n      result[j] = a[i]\n    }\n  }\n  return result\n}\n\n/*\n  Selects `count` items at random from an array. Respects the original order of\n  the elements. Performance: O(n).\n\n  Note: if `count > size/2`, then it's more efficient to do it the other way\n  around and choose `count` items to remove.\n\n  Based on code from Algorithm Alley, Dr. Dobb's Magazine, October 1993.\n*/\nfunc select<T>(from a: [T], count requested: Int) -> [T] {\n  var examined = 0\n  var selected = 0\n  var b = [T]()\n\n  while selected < requested {\n    // Calculate random variable 0.0 <= r < 1.0 (exclusive!).\n    let r = Double(arc4random()) / 0x100000000\n\n    let leftToExamine = a.count - examined\n    let leftToAdd = requested - selected\n\n    // Decide whether to use the next record from the input.\n    if Double(leftToExamine) * r < Double(leftToAdd) {\n      selected += 1\n      b.append(a[examined])\n    }\n\n    examined += 1\n  }\n  return b\n}\n"
  },
  {
    "path": "Selection Sort/README.markdown",
    "content": "# Selection Sort\n\nGoal: To sort an array from low to high (or high to low).\n\nYou are given an array of numbers and need to put them in the right order. The selection sort algorithm divides the array into two parts: the beginning of the array is sorted, while the rest of the array consists of the numbers that still remain to be sorted.\n\n\t[ ...sorted numbers... | ...unsorted numbers... ]\n\nThis is similar to [insertion sort](../Insertion%20Sort/), but the difference is in how new numbers are added to the sorted portion.\n\nIt works as follows:\n\n- Find the lowest number in the array. You must start at index 0, loop through all the numbers in the array, and keep track of what the lowest number is.\n- Swap the lowest number with the number at index 0. Now, the sorted portion consists of just the number at index 0.\n- Go to index 1.\n- Find the lowest number in the rest of the array. This time you start looking from index 1. Again you loop until the end of the array and keep track of the lowest number you come across.\n- Swap  the lowest number with the number at index 1. Now, the sorted portion contains two numbers and extends from index 0 to index 1.\n- Go to index 2.\n- Find the lowest number in the rest of the array, starting from index 2, and swap it with the one at index 2. Now, the array is sorted from index 0 to 2; this range contains the three lowest numbers in the array.\n- And continue until no numbers remain to be sorted.\n\nIt is called a \"selection\" sort because at every step you search through the rest of the array to select the next lowest number.\n\n## An example\n\nSuppose the numbers to sort are `[ 5, 8, 3, 4, 6 ]`. We also keep track of where the sorted portion of the array ends, denoted by the `|` symbol.\n\nInitially, the sorted portion is empty:\n\n\t[| 5, 8, 3, 4, 6 ]\n\nNow we find the lowest number in the array. We do that by scanning through the array from left to right, starting at the `|` bar. We find the number `3`.\n\nTo put this number into the sorted position, we swap it with the number next to the `|`, which is `5`:\n\n\t[ 3 | 8, 5, 4, 6 ]\n\t  *      *\n\nThe sorted portion is now `[ 3 ]` and the rest is `[ 8, 5, 4, 6 ]`.\n\nAgain, we look for the lowest number, starting from the `|` bar. We find `4` and swap it with `8` to get:\n\n\t[ 3, 4 | 5, 8, 6 ]\n\t     *      *\n\nWith every step, the `|` bar moves one position to the right. We again look through the rest of the array and find `5` as the lowest number. There is no need to swap `5` with itself, and we simply move forward:\n\n\t[ 3, 4, 5 | 8, 6 ]\n\t        *\n\nThis process repeats until the array is sorted. Note that everything to the left of the `|` bar is always in sorted order and always contains the lowest numbers in the array. Finally, we end up with:\n\n\t[ 3, 4, 5, 6, 8 |]\n\nThe selection sort is an *in-place* sort because everything happens in the same array without using additional memory. You can also implement this as a *stable* sort so that identical elements do not get swapped around relative to each other (note that the version given below is not stable).\n\n## The code\n\nHere is an implementation of selection sort in Swift:\n\n```swift\nfunc selectionSort(_ array: [Int]) -> [Int] {\n  guard array.count > 1 else { return array }  // 1\n\n  var a = array                    // 2\n\n  for x in 0 ..< a.count - 1 {     // 3\n\n    var lowest = x\n    for y in x + 1 ..< a.count {   // 4\n      if a[y] < a[lowest] {\n        lowest = y\n      }\n    }\n\n    if x != lowest {               // 5\n      a.swapAt(x, lowest)\n    }\n  }\n  return a\n}\n```\n\nPut this code in a playground and test it like so:\n\n```swift\nlet list = [ 10, -1, 3, 9, 2, 27, 8, 5, 1, 3, 0, 26 ]\nselectionSort(list)\n```\n\nA step-by-step explanation of how the code works:\n\n1. If the array is empty or only contains a single element, then there is no need to sort.\n\n2. Make a copy of the array. This is necessary because we cannot modify the contents of the `array` parameter directly in Swift. Like the Swift's `sort()` function, the `selectionSort()` function will return a sorted *copy* of the original array.\n\n3. There are two loops inside this function. The outer loop looks at each of the elements in the array in turn; this is what moves the `|` bar forward.\n\n4. This is the inner loop. It finds the lowest number in the rest of the array.\n\n5. Swap the lowest number with the current array index. The `if` check is necessary because you can't `swap()` an element with itself in Swift.\n\nIn summary: For each element of the array, the selection sort swaps positions with the lowest value from the rest of the array. As a result, the array gets sorted from the left to the right. (You can also do it right-to-left, in which case you always look for the largest number in the array. Give that a try!)\n\n> **Note:** The outer loop ends at index `a.count - 2`. The very last element will automatically be in the correct position because at that point there are no other smaller elements left.\n\nThe source file [SelectionSort.swift](SelectionSort.swift) has a version of this function that uses generics, so you can also use it to sort strings and other data types.\n\n## Performance\n\nThe selection sort is easy to understand but it performs slow as **O(n^2)**. It is worse than [insertion sort](../Insertion%20Sort/) but better than [bubble sort](../Bubble%20Sort/). Finding the lowest element in the rest of the array is slow, especially since the inner loop will be performed repeatedly.\n\nThe [Heap sort](../Heap%20Sort/) uses the same principle as selection sort but has a fast method for finding the minimum value in the rest of the array. The heap sort' performance is **O(n log n)**.\n\n## See also\n\n[Selection sort on Wikipedia](https://en.wikipedia.org/wiki/Selection_sort)\n\n*Written for Swift Algorithm Club by Matthijs Hollemans*\n"
  },
  {
    "path": "Selection Sort/SelectionSort.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\nlet list = [ 10, -1, 3, 9, 2, 27, 8, 5, 1, 3, 0, 26 ]\nselectionSort(list)\nselectionSort(list, <)\nselectionSort(list, >)\n"
  },
  {
    "path": "Selection Sort/SelectionSort.playground/Sources/SelectionSort.swift",
    "content": "/// Performs the Selection sort algorithm on a array\n///\n/// - Parameter array: array of elements that conform to the Comparable protocol\n/// - Returns: an array in ascending order\npublic func selectionSort<T: Comparable>(_ array: [T]) -> [T] {\n  return selectionSort(array, <)\n}\n\n/// Performs the Selection sort algorithm on a array using the provided comparisson method\n///\n/// - Parameters:\n///   - array: array of elements that conform to the Comparable protocol\n///   - isLowerThan: returns true if the two provided elements are in the correct order\n/// - Returns: a sorted array\npublic func selectionSort<T>(_ array: [T], _ isLowerThan: (T, T) -> Bool) -> [T] {\n    guard array.count > 1 else { return array }\n    \n    var a = array\n    for x in 0 ..< a.count - 1 {\n        \n        // Find the lowest value in the rest of the array.\n        var lowest = x\n        for y in x + 1 ..< a.count {\n            if isLowerThan(a[y], a[lowest]) {\n                lowest = y\n            }\n        }\n        \n        // Swap the lowest value with the current array index.\n        if x != lowest {\n            a.swapAt(x, lowest)\n        }\n    }\n    return a\n}\n"
  },
  {
    "path": "Selection Sort/SelectionSort.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Selection Sort/SelectionSort.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Selection Sort/SelectionSort.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Selection Sort/SelectionSort.swift",
    "content": "public func selectionSort<T: Comparable>(_ array: [T], _ isOrderedBefore: (T, T) -> Bool) -> [T] {\n    guard array.count > 1 else { return array }\n\n    var a = array\n    for x in 0 ..< a.count - 1 {\n\n        // Find the lowest value in the rest of the array.\n        var lowest = x\n        for y in x + 1 ..< a.count {\n            if isOrderedBefore(a[y], a[lowest]) {\n                lowest = y\n            }\n        }\n\n        // Swap the lowest value with the current array index.\n        if x != lowest {\n            a.swapAt(x, lowest)\n        }\n    }\n    return a\n}\n"
  },
  {
    "path": "Selection Sort/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Selection Sort/Tests/SelectionSortTests.swift",
    "content": "import XCTest\n\nclass SelectionSortTests: XCTestCase {\n  func testSelectionSort() {\n    checkSortAlgorithm(selectionSort)\n  }\n}\n"
  },
  {
    "path": "Selection Sort/Tests/Tests.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t7B80C3EA1C77A4D0003CECC7 /* SortingTestHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C3E81C77A4D0003CECC7 /* SortingTestHelpers.swift */; };\n\t\t7B80C3F01C77A590003CECC7 /* SelectionSortTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C3EF1C77A590003CECC7 /* SelectionSortTests.swift */; };\n\t\t7B80C3F21C77A598003CECC7 /* SelectionSort.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C3F11C77A598003CECC7 /* SelectionSort.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t7B2BBC801C779D720067B71D /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7B2BBC941C779E7B0067B71D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };\n\t\t7B80C3E81C77A4D0003CECC7 /* SortingTestHelpers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SortingTestHelpers.swift; path = ../../Quicksort/Tests/SortingTestHelpers.swift; sourceTree = SOURCE_ROOT; };\n\t\t7B80C3EF1C77A590003CECC7 /* SelectionSortTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SelectionSortTests.swift; sourceTree = SOURCE_ROOT; };\n\t\t7B80C3F11C77A598003CECC7 /* SelectionSort.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SelectionSort.swift; path = ../SelectionSort.swift; sourceTree = SOURCE_ROOT; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t7B2BBC7D1C779D720067B71D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t7B2BBC681C779D710067B71D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC831C779D720067B71D /* Tests */,\n\t\t\t\t7B2BBC721C779D710067B71D /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC721C779D710067B71D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC801C779D720067B71D /* Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC831C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B80C3F11C77A598003CECC7 /* SelectionSort.swift */,\n\t\t\t\t7B80C3EF1C77A590003CECC7 /* SelectionSortTests.swift */,\n\t\t\t\t7B80C3E81C77A4D0003CECC7 /* SortingTestHelpers.swift */,\n\t\t\t\t7B2BBC941C779E7B0067B71D /* Info.plist */,\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tpath = TestsTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t7B2BBC7F1C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t7B2BBC7C1C779D720067B71D /* Sources */,\n\t\t\t\t7B2BBC7D1C779D720067B71D /* Frameworks */,\n\t\t\t\t7B2BBC7E1C779D720067B71D /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tproductName = TestsTests;\n\t\t\tproductReference = 7B2BBC801C779D720067B71D /* Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t7B2BBC691C779D710067B71D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0720;\n\t\t\t\tLastUpgradeCheck = 0800;\n\t\t\t\tORGANIZATIONNAME = \"Swift Algorithm Club\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t7B2BBC7F1C779D720067B71D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2;\n\t\t\t\t\t\tLastSwiftMigration = 0800;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 7B2BBC681C779D710067B71D;\n\t\t\tproductRefGroup = 7B2BBC721C779D710067B71D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t7B2BBC7F1C779D720067B71D /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t7B2BBC7E1C779D720067B71D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t7B2BBC7C1C779D720067B71D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7B80C3F01C77A590003CECC7 /* SelectionSortTests.swift in Sources */,\n\t\t\t\t7B80C3EA1C77A4D0003CECC7 /* SortingTestHelpers.swift in Sources */,\n\t\t\t\t7B80C3F21C77A598003CECC7 /* SelectionSort.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t7B2BBC871C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC881C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t7B2BBC8D1C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 3.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC8E1C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 3.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC871C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC881C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC8D1C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC8E1C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 7B2BBC691C779D710067B71D /* Project object */;\n}\n"
  },
  {
    "path": "Selection Sort/Tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Tests.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Selection Sort/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0800\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Set Cover (Unweighted)/README.markdown",
    "content": "# Set Cover (Unweighted)\n\nIf you have a group of sets, this algorithm finds a subset of those sets within that group whose union will cover an initial set that you're trying to match. The initial set is also known as the universe.\n\nFor example, suppose you have a universe of `{1, 5, 7}` and you want to find the sets which cover the universe within the following group of sets:\n\n> {8, 4, 2}\n> {3, 1}\n> {7, 6, 5, 4}\n> {2}\n> {1, 2, 3}\n\nYou can see that the sets `{3, 1} {7, 6, 5, 4}` when unioned together will cover the universe of `{1, 5, 7}`. Yes, there may be additional elements in the sets returned by the algorithm, but every element in the universe is represented in the cover itself.\n\nThere may be cases where no cover exists. For example, if your universe is `{7, 9}`, there is no combination of sets within the group above that will yield a cover.\n\n## The algorithm\n\nThe Greedy Set Cover algorithm (unweighted) is provided here. It's known as greedy because it uses the largest intersecting set from the group of sets first before examining other sets in the group. This is part of the reason why the cover may have additional elements which are not part of the universe.\n\nThe function (named `cover`) is provided as an extension of the Swift type `Set`. The function takes a single parameter, which is an array of sets. This array represents the group, and the set itself represents the universe.\n\nOne of the first things done in `cover` is to make a copy of the universe in `remainingSet`. Then, the algorithm enters a `while` loop in which a call to `largestIntersectingSet` is made. The value returned from `largestIntersectingSet` is the set which has the most elements in common with the remaining universe identified by `remainingSet`. If all sets have nothing in common, `largestIntersectingSet` returns `nil`.\n\nIf the result from `largestIntersectingSet` is not nil, that result is subtracted from `remainingSet` (reducing its size), and the loop continues until `remainingSet` has zero length (meaning a cover has been found) or until `largestIntersectingSet` returns `nil`.\n\nIf there is no cover within the group of sets, `cover` returns `nil`.\n\n## See also\n\n[Set cover problem on Wikipedia](https://en.wikipedia.org/wiki/Set_cover_problem)\n\n*Written for Swift Algorithm Club by [Michael C. Rael](https://github.com/mrael2)*\n*Migrated to Swift 3 by Jaap Wijnen*\n"
  },
  {
    "path": "Set Cover (Unweighted)/SetCover.playground/Contents.swift",
    "content": "// SetCover\n\nlet universe1 = Set(1...7)\nlet array1 = randomArrayOfSets(covering: universe1)\nlet cover1 = universe1.cover(within: array1)\n\nlet universe2 = Set(1...10)\nlet array2: Array<Set<Int>> = [[1, 2, 3, 4, 5, 6, 7], [8, 9]]\nlet cover2 = universe2.cover(within: array2)\n\nlet universe3 = Set([\"tall\", \"heavy\"])\nlet array3: Array<Set<String>> = [[\"tall\", \"light\"], [\"short\", \"heavy\"], [\"tall\", \"heavy\", \"young\"]]\nlet cover3 = universe3.cover(within: array3)\n\nlet universe4 = Set([\"tall\", \"heavy\", \"green\"])\nlet cover4 = universe4.cover(within: array3)\n\nlet universe5: Set<Int> = [16, 32, 64]\nlet array5: Array<Set<Int>> = [[16, 17, 18], [16, 32, 128], [1, 2, 3], [32, 64, 128]]\nlet cover5 = universe5.cover(within: array5)\n\nlet universe6: Set<Int> = [24, 89, 132, 90, 22]\nlet array6 = randomArrayOfSets(covering: universe6)\nlet cover6 = universe6.cover(within: array6)\n\nlet universe7: Set<String> = [\"fast\", \"cheap\", \"good\"]\nlet array7 = randomArrayOfSets(covering: universe7, minArraySizeFactor: 20.0, maxSetSizeFactor: 0.7)\nlet cover7 = universe7.cover(within: array7)\n\nlet emptySet = Set<Int>()\nlet coverTest1 = emptySet.cover(within: array1)\nlet coverTest2 = universe1.cover(within: Array<Set<Int>>())\nlet coverTest3 = emptySet.cover(within: Array<Set<Int>>())\n\n\n"
  },
  {
    "path": "Set Cover (Unweighted)/SetCover.playground/Sources/RandomArrayOfSets.swift",
    "content": "import Foundation\n\npublic func randomArrayOfSets<T>(covering universe: Set<T>,\n                              minArraySizeFactor: Double = 0.8,\n                              maxSetSizeFactor: Double = 0.6) -> Array<Set<T>> {\n  var result = [Set<T>]()\n  var ongoingUnion = Set<T>()\n\n  let minArraySize = Int(Double(universe.count) * minArraySizeFactor)\n  var maxSetSize = Int(Double(universe.count) * maxSetSizeFactor)\n  if maxSetSize > universe.count {\n    maxSetSize = universe.count\n  }\n\n  while true {\n    var generatedSet = Set<T>()\n    let targetSetSize = Int.random(in: 0...maxSetSize) + 1\n\n    while true {\n      let randomUniverseIndex = Int.random(in: 0...universe.count)\n      for (setIndex, value) in universe.enumerated() {\n        if setIndex == randomUniverseIndex {\n          generatedSet.insert(value)\n          break\n        }\n      }\n\n      if generatedSet.count == targetSetSize {\n        result.append(generatedSet)\n        ongoingUnion = ongoingUnion.union(generatedSet)\n        break\n      }\n    }\n\n    if result.count >= minArraySize {\n      if ongoingUnion == universe {\n        break\n      }\n    }\n  }\n\n  return result\n}\n"
  },
  {
    "path": "Set Cover (Unweighted)/SetCover.playground/Sources/SetCover.swift",
    "content": "public extension Set {\n  func cover(within array: Array<Set<Element>>) -> Array<Set<Element>>? {\n    var result: [Set<Element>]? = [Set<Element>]()\n    var remainingSet = self\n\n    func largestIntersectingSet() -> Set<Element>? {\n      var largestIntersectionLength = 0\n      var largestSet: Set<Element>?\n\n      for set in array {\n        let intersectionLength = remainingSet.intersection(set).count\n        if intersectionLength > largestIntersectionLength {\n          largestIntersectionLength = intersectionLength\n          largestSet = set\n        }\n      }\n\n      return largestSet\n    }\n\n    while !remainingSet.isEmpty {\n      guard let largestSet = largestIntersectingSet() else { break }\n      result!.append(largestSet)\n      remainingSet = remainingSet.subtracting(largestSet)\n    }\n\n    if !remainingSet.isEmpty || isEmpty {\n      result = nil\n    }\n\n    return result\n  }\n}\n"
  },
  {
    "path": "Set Cover (Unweighted)/SetCover.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Set Cover (Unweighted)/SetCover.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Set Cover (Unweighted)/SetCover.swift",
    "content": "extension Set {\n  func cover(within array: Array<Set<Element>>) -> Array<Set<Element>>? {\n    var result: [Set<Element>]? = [Set<Element>]()\n    var remainingSet = self\n\n    func largestIntersectingSet() -> Set<Element>? {\n      var largestIntersectionLength = 0\n      var largestSet: Set<Element>?\n\n      for set in array {\n        let intersectionLength = remainingSet.intersect(set).count\n        if intersectionLength > largestIntersectionLength {\n          largestIntersectionLength = intersectionLength\n          largestSet = set\n        }\n      }\n\n      return largestSet\n    }\n\n    while !remainingSet.isEmpty {\n      guard let largestSet = largestIntersectingSet() else { break }\n      result!.append(largestSet)\n      remainingSet = remainingSet.subtract(largestSet)\n    }\n\n    if !remainingSet.isEmpty || isEmpty {\n      result = nil\n    }\n\n    return result\n  }\n}\n"
  },
  {
    "path": "Shell Sort/README.markdown",
    "content": "# Shell Sort\n\nShell sort is based on [insertion sort](../Insertion%20Sort/) as a general way to improve its performance, by breaking the original list into smaller sublists which are then individually sorted using insertion sort.\n\n[There is a nice video created at Sapientia University](https://www.youtube.com/watch?v=CmPA7zE8mx0) which shows the process as a Hungarian folk dance.\n\n## How it works\n\nInstead of comparing elements that are side-by-side and swapping them if they are out of order, the way insertion sort does it, the shell sort algorithm compares elements that are far apart.\n\nThe distance between elements is known as the *gap*. If the elements being compared are in the wrong order, they are swapped across the gap. This eliminates many in-between copies that are common with insertion sort.\n\nThe idea is that by moving the elements over large gaps, the array becomes partially sorted quite quickly. This makes later passes faster because they don't have to swap so many items anymore.\n\nOnce a pass has been completed, the gap is made smaller and a new pass starts.  This repeats until the gap has size 1, at which point the algorithm functions just like  insertion sort. But since the data is already fairly well sorted by then, the final pass can be very quick.\n\n## An example\n\nSuppose we want to sort the array `[64, 20, 50, 33, 72, 10, 23, -1, 4]` using shell sort.\n\nWe start by dividing the length of the array by 2:\n\n    n = floor(9/2) = 4\n\nThis is the gap size.\n\nWe create `n` sublists. In each sublist, the items are spaced apart by a gap of size `n`. In our example, we need to make four of these sublists. The sublists are sorted by the `insertionSort()` function.\n\nThat may not have made a whole lot of sense, so let's take a closer look at what happens.\n\nThe first pass is as follows. We have `n = 4`, so we make four sublists:\n\n\tsublist 0:  [ 64, xx, xx, xx, 72, xx, xx, xx, 4  ]\n\tsublist 1:  [ xx, 20, xx, xx, xx, 10, xx, xx, xx ]\n\tsublist 2:  [ xx, xx, 50, xx, xx, xx, 23, xx, xx ]\n\tsublist 3:  [ xx, xx, xx, 33, xx, xx, xx, -1, xx ]\n\nAs you can see, each sublist contains only every 4th item from the original array. The items that are not in a sublist are marked with `xx`. So the first sublist is `[ 64, 72, 4 ]` and the second is `[ 20, 10 ]`, and so on. The reason we use this \"gap\" is so that we don't have to actually make new arrays. Instead, we interleave them in the original array.\n\nWe now call `insertionSort()` once on each sublist.\n\nThis particular version of [insertion sort](../Insertion%20Sort/) sorts from the back to the front. Each item in the sublist is compared against the others. If they're in the wrong order, the value is swapped and travels all the way down until we reach the start of the sublist.\n\nSo for sublist 0, we swap `4` with `72`, then swap `4` with `64`. After sorting, this sublist looks like:\n\n    sublist 0:  [ 4, xx, xx, xx, 64, xx, xx, xx, 72 ]\n\nThe other three sublists after sorting:\n\n\tsublist 1:  [ xx, 10, xx, xx, xx, 20, xx, xx, xx ]\n\tsublist 2:  [ xx, xx, 23, xx, xx, xx, 50, xx, xx ]\n\tsublist 3:  [ xx, xx, xx, -1, xx, xx, xx, 33, xx ]\n    \nThe total array looks like this now:\n\n\t[ 4, 10, 23, -1, 64, 20, 50, 33, 72 ]\n\nIt's not entirely sorted yet but it's more sorted than before. This completes the first pass.\n\nIn the second pass, we divide the gap size by two:\n\n\tn = floor(4/2) = 2\n\nThat means we now create only two sublists:\n\n\tsublist 0:  [  4, xx, 23, xx, 64, xx, 50, xx, 72 ]\n\tsublist 1:  [ xx, 10, xx, -1, xx, 20, xx, 33, xx ]\n\nEach sublist contains every 2nd item. Again, we call `insertionSort()` to sort these sublists. The result is:\n\n\tsublist 0:  [  4, xx, 23, xx, 50, xx, 64, xx, 72 ]\n\tsublist 1:  [ xx, -1, xx, 10, xx, 20, xx, 33, xx ]\n\nNote that in each list only two elements were out of place. So the insertion sort is really fast. That's because we already sorted the array a little in the first pass.\n\nThe total array looks like this now:\n\n\t[ 4, -1, 23, 10, 50, 20, 64, 33, 72 ]\n\nThis completes the second pass. The gap size of the final pass is:\n\n\tn = floor(2/2) = 1\n\nA gap size of 1 means we only have a single sublist, the array itself, and once again we call `insertionSort()` to sort it. The final sorted array is:\n\n\t[ -1, 4, 10, 20, 23, 33, 50, 64, 72 ]\n\nThe performance of shell sort is **O(n^2)** in most cases or **O(n log n)** if you get lucky. This algorithm produces an unstable sort; it may change the relative order of elements with equal values.\n  \n## The gap sequence\n\nThe \"gap sequence\" determines the initial size of the gap and how it is made smaller with each iteration. A good gap sequence is important for shell sort to perform well.\n\nThe gap sequence in this implementation is the one from Shell's original version: the initial value is half the array size and then it is divided by 2 each time. There are other ways to calculate the gap sequence.\n\n## Just for fun...\n\nThis is an old Commodore 64 BASIC version of shell sort that Matthijs used a long time ago and ported to pretty much every programming language he ever used:\n\n\t61200 REM S is the array to be sorted\n\t61205 REM AS is the number of elements in S\n\t61210 W1=AS\n\t61220 IF W1<=0 THEN 61310\n\t61230 W1=INT(W1/2): W2=AS-W1\n\t61240 V=0\n\t61250 FOR N1=0 TO W2-1\n\t61260 W3=N1+W1\n\t61270 IF S(N1)>S(W3) THEN SH=S(N1): S(N1)=S(W3): S(W3)=SH: V=1\n\t61280 NEXT N1\n\t61290 IF V>0 THEN 61240\n\t61300 GOTO 61220\n\t61310 RETURN\n\n## The Code:\nHere is an implementation of Shell Sort in Swift:\n```\nvar arr = [64, 20, 50, 33, 72, 10, 23, -1, 4, 5]\n\npublic func shellSort(_ list: inout [Int]) {\n    var sublistCount = list.count / 2\n    while sublistCount > 0 {\n        for pos in 0..<sublistCount {\n            insertionSort(&list, start: pos, gap: sublistCount)\n        }\n        sublistCount = sublistCount / 2\n    }\n}\n\nshellSort(&arr)\n```\n\n## See also\n\n[Shellsort on Wikipedia](https://en.wikipedia.org/wiki/Shellsort)\n\n[Shell sort at Rosetta code](http://rosettacode.org/wiki/Sorting_algorithms/Shell_sort)\n\n*Written for Swift Algorithm Club by [Mike Taghavi](https://github.com/mitghi) and Matthijs Hollemans*\n"
  },
  {
    "path": "Shell Sort/Shell Sort.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\nimport UIKit\n\n// last checked with Xcode 9.0b4\n#if swift(>=4.0)\n    print(\"Hello, Swift 4!\")\n#endif\n\npublic func insertionSort(_ list: inout [Int], start: Int, gap: Int) {\n    for i in stride(from: (start + gap), to: list.count, by: gap) {\n        let currentValue = list[i]\n        var pos = i\n        while pos >= gap && list[pos - gap] > currentValue {\n            list[pos] = list[pos - gap]\n            pos -= gap\n        }\n        list[pos] = currentValue\n    }\n}\n\npublic func shellSort(_ list: inout [Int]) {\n    var sublistCount = list.count / 2\n    while sublistCount > 0 {\n        for pos in 0..<sublistCount {\n            insertionSort(&list, start: pos, gap: sublistCount)\n        }\n        sublistCount = sublistCount / 2\n    }\n}\n\nvar arr = [64, 20, 50, 33, 72, 10, 23, -1, 4, 5]\n\nshellSort(&arr)\n"
  },
  {
    "path": "Shell Sort/Shell Sort.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Shell Sort/ShellSortExample.swift",
    "content": "//\n//  ShellSortExample.swift\n//  \n//\n//  Created by Cheer on 2017/2/26.\n//\n//\n\nimport Foundation\n\npublic func shellSort(_ list : inout [Int]) {\n    var sublistCount = list.count / 2\n\n    while sublistCount > 0 {\n        for var index in 0..<list.count {\n\n            guard index + sublistCount < list.count else { break }\n\n            if list[index] > list[index + sublistCount] {\n                swap(&list[index], &list[index + sublistCount])\n            }\n\n            guard sublistCount == 1 && index > 0 else { continue }\n\n            while index > 0 && list[index - 1] > list[index] {\n                swap(&list[index - 1], &list[index])\n                index -= 1\n            }\n        }\n        sublistCount = sublistCount / 2\n    }\n}\n"
  },
  {
    "path": "Shell Sort/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Shell Sort/Tests/ShellSortTests.swift",
    "content": "import XCTest\n\nclass ShellSortTests: XCTestCase {\n  func testSwift4() {\n    // last checked with Xcode 9.0b4\n    #if swift(>=4.0)\n      print(\"Hello, Swift 4!\")\n    #endif\n  }\n  \n  func testShellSort() {\n    checkSortAlgorithm { (a: [Int]) -> [Int] in\n      var b = a\n      shellSort(&b)\n      return b\n    }\n  }\n}\n"
  },
  {
    "path": "Shell Sort/Tests/Tests.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t7B80C3EA1C77A4D0003CECC7 /* SortingTestHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C3E81C77A4D0003CECC7 /* SortingTestHelpers.swift */; };\n\t\t7B80C3F41C77A5D3003CECC7 /* ShellSort.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C3F31C77A5D3003CECC7 /* ShellSort.swift */; };\n\t\t7B80C3F61C77A5D9003CECC7 /* ShellSortTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C3F51C77A5D9003CECC7 /* ShellSortTests.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t7B2BBC801C779D720067B71D /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7B2BBC941C779E7B0067B71D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };\n\t\t7B80C3E81C77A4D0003CECC7 /* SortingTestHelpers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SortingTestHelpers.swift; path = ../../Quicksort/Tests/SortingTestHelpers.swift; sourceTree = SOURCE_ROOT; };\n\t\t7B80C3F31C77A5D3003CECC7 /* ShellSort.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ShellSort.swift; path = ../ShellSort.swift; sourceTree = SOURCE_ROOT; };\n\t\t7B80C3F51C77A5D9003CECC7 /* ShellSortTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShellSortTests.swift; sourceTree = SOURCE_ROOT; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t7B2BBC7D1C779D720067B71D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t7B2BBC681C779D710067B71D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC831C779D720067B71D /* Tests */,\n\t\t\t\t7B2BBC721C779D710067B71D /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC721C779D710067B71D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC801C779D720067B71D /* Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC831C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B80C3F31C77A5D3003CECC7 /* ShellSort.swift */,\n\t\t\t\t7B80C3F51C77A5D9003CECC7 /* ShellSortTests.swift */,\n\t\t\t\t7B80C3E81C77A4D0003CECC7 /* SortingTestHelpers.swift */,\n\t\t\t\t7B2BBC941C779E7B0067B71D /* Info.plist */,\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tpath = TestsTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t7B2BBC7F1C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t7B2BBC7C1C779D720067B71D /* Sources */,\n\t\t\t\t7B2BBC7D1C779D720067B71D /* Frameworks */,\n\t\t\t\t7B2BBC7E1C779D720067B71D /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tproductName = TestsTests;\n\t\t\tproductReference = 7B2BBC801C779D720067B71D /* Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t7B2BBC691C779D710067B71D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0720;\n\t\t\t\tLastUpgradeCheck = 0720;\n\t\t\t\tORGANIZATIONNAME = \"Swift Algorithm Club\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t7B2BBC7F1C779D720067B71D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2;\n\t\t\t\t\t\tLastSwiftMigration = 0800;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 7B2BBC681C779D710067B71D;\n\t\t\tproductRefGroup = 7B2BBC721C779D710067B71D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t7B2BBC7F1C779D720067B71D /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t7B2BBC7E1C779D720067B71D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t7B2BBC7C1C779D720067B71D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7B80C3F61C77A5D9003CECC7 /* ShellSortTests.swift in Sources */,\n\t\t\t\t7B80C3EA1C77A4D0003CECC7 /* SortingTestHelpers.swift in Sources */,\n\t\t\t\t7B80C3F41C77A5D3003CECC7 /* ShellSort.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t7B2BBC871C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC881C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t7B2BBC8D1C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC8E1C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC871C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC881C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC8D1C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC8E1C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 7B2BBC691C779D710067B71D /* Project object */;\n}\n"
  },
  {
    "path": "Shell Sort/Tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Tests.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Shell Sort/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0720\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Shell Sort/shellsort.swift",
    "content": "// The MIT License (MIT)\n\n// Copyright (c) 2016 Mike Taghavi (mitghi[at]me.com)\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\npublic func insertionSort(_ list: inout [Int], start: Int, gap: Int) {\n  for i in stride(from: (start + gap), to: list.count, by: gap) {\n    let currentValue = list[i]\n    var pos = i\n    while pos >= gap && list[pos - gap] > currentValue {\n      list[pos] = list[pos - gap]\n      pos -= gap\n    }\n    list[pos] = currentValue\n  }\n}\n\npublic func shellSort(_ list: inout [Int]) {\n  var sublistCount = list.count / 2\n  while sublistCount > 0 {\n    for pos in 0..<sublistCount {\n      insertionSort(&list, start: pos, gap: sublistCount)\n    }\n    sublistCount = sublistCount / 2\n  }\n}\n"
  },
  {
    "path": "Shortest Path (Unweighted)/README.markdown",
    "content": "# Shortest Path (Unweighted Graph)\n\nGoal: find the shortest route to go from one node to another in a graph.\n\nSuppose we have to following graph:\n\n![Example graph](Images/Graph.png)\n\nWe may want to find out what the shortest way is to get from node `A` to node `F`.\n\nIf the [graph is unweighed](../Graph/), then finding the shortest path is easy: we can use the breadth-first search algorithm. For a weighted graph, we can use Dijkstra's algorithm.\n\n## Unweighted graph: breadth-first search\n\n[Breadth-first search](../Breadth-First%20Search/) is a method for traversing a tree or graph data structure. It starts at a source node and explores the immediate neighbor nodes first, before moving to the next level neighbors. As a convenient side effect, it automatically computes the shortest path between a source node and each of the other nodes in the tree or graph.\n\nThe result of the breadth-first search can be represented with a tree:\n\n![The BFS tree](../Breadth-First%20Search/Images/TraversalTree.png)\n\nThe root of the tree is the node you started the breadth-first search from. To find the distance from node `A` to any other node, we simply count the number of edges in the tree. And so we find that the shortest path between `A` and `F` is 2. The tree not only tells you how long that path is, but also how to actually get from `A` to `F` (or any of the other nodes).\n\nLet's put breadth-first search into practice and calculate the shortest path from `A` to all the other nodes. We start with the source node `A` and add it to a queue with a distance of `0`.\n\n```swift\nqueue.enqueue(element: A)\nA.distance = 0\n```\n\nThe queue is now `[ A ]`. We dequeue `A` and enqueue its two immediate neighbor nodes `B` and `C` with a distance of `1`.\n\n```swift\nqueue.dequeue()   // A\nqueue.enqueue(element: B)\nB.distance = A.distance + 1   // result: 1\nqueue.enqueue(element: C)\nC.distance = A.distance + 1   // result: 1\n```\n\nThe queue is now `[ B, C ]`. Dequeue `B` and enqueue `B`'s neighbor nodes `D` and `E` with a distance of `2`.\n\n```swift\nqueue.dequeue()   // B\nqueue.enqueue(element: D)\nD.distance = B.distance + 1   // result: 2\nqueue.enqueue(element: E)\nE.distance = B.distance + 1   // result: 2\n```\n\nThe queue is now `[ C, D, E ]`. Dequeue `C` and enqueue `C`'s neighbor nodes `F` and `G`, also with a distance of `2`.\n\n```swift\nqueue.dequeue()   // C\nqueue.enqueue(element: F)\nF.distance = C.distance + 1   // result: 2\nqueue.enqueue(element: G)\nG.distance = C.distance + 1   // result: 2\n```\n\nThis continues until the queue is empty and we've visited all the nodes. Each time we discover a new node, it gets the `distance` of its parent plus 1. As you can see, this is exactly what the [breadth-first search](../Breadth-First%20Search/) algorithm does, except that we now also keep track of the distance travelled.\n\nHere's the code:\n\n```swift\nfunc breadthFirstSearchShortestPath(graph: Graph, source: Node) -> Graph {\n  let shortestPathGraph = graph.duplicate()\n\n  var queue = Queue<Node>()\n  let sourceInShortestPathsGraph = shortestPathGraph.findNodeWithLabel(label: source.label)\n  queue.enqueue(element: sourceInShortestPathsGraph)\n  sourceInShortestPathsGraph.distance = 0\n\n  while let current = queue.dequeue() {\n    for edge in current.neighbors {\n      let neighborNode = edge.neighbor\n      if !neighborNode.hasDistance {\n        queue.enqueue(element: neighborNode)\n        neighborNode.distance = current.distance! + 1\n      }\n    }\n  }\n\n  return shortestPathGraph\n}\n```\n\nPut this code in a playground and test it like so:\n\n```swift\nlet shortestPathGraph = breadthFirstSearchShortestPath(graph: graph, source: nodeA)\nprint(shortestPathGraph.nodes)\n```\n\nThis will output:\n\n\tNode(label: a, distance: 0), Node(label: b, distance: 1), Node(label: c, distance: 1),\n\tNode(label: d, distance: 2), Node(label: e, distance: 2), Node(label: f, distance: 2),\n\tNode(label: g, distance: 2), Node(label: h, distance: 3)\n\n> **Note:** This version of `breadthFirstSearchShortestPath()` does not actually produce the tree, it only computes the distances. See [minimum spanning tree](../Minimum%20Spanning%20Tree%20(Unweighted)/) on how you can convert the graph into a tree by removing edges.\n\n*Written by [Chris Pilcher](https://github.com/chris-pilcher) and Matthijs Hollemans*\n"
  },
  {
    "path": "Shortest Path (Unweighted)/ShortestPath.playground/Pages/Shortest path example.xcplaygroundpage/Contents.swift",
    "content": "// last checked with Xcode 9.0b4\n#if swift(>=4.0)\nprint(\"Hello, Swift 4!\")\n#endif\n\nfunc breadthFirstSearchShortestPath(graph: Graph, source: Node) -> Graph {\n  let shortestPathGraph = graph.duplicate()\n\n  var queue = Queue<Node>()\n  let sourceInShortestPathsGraph = shortestPathGraph.findNodeWithLabel(label: source.label)\n  queue.enqueue(element: sourceInShortestPathsGraph)\n  sourceInShortestPathsGraph.distance = 0\n\n  while let current = queue.dequeue() {\n    for edge in current.neighbors {\n      let neighborNode = edge.neighbor\n      if !neighborNode.hasDistance {\n        queue.enqueue(element: neighborNode)\n        neighborNode.distance = current.distance! + 1\n      }\n    }\n  }\n\n  return shortestPathGraph\n}\n\nlet graph = Graph()\n\nlet nodeA = graph.addNode(label: \"a\")\nlet nodeB = graph.addNode(label: \"b\")\nlet nodeC = graph.addNode(label: \"c\")\nlet nodeD = graph.addNode(label: \"d\")\nlet nodeE = graph.addNode(label: \"e\")\nlet nodeF = graph.addNode(label: \"f\")\nlet nodeG = graph.addNode(label: \"g\")\nlet nodeH = graph.addNode(label: \"h\")\n\ngraph.addEdge(nodeA, neighbor: nodeB)\ngraph.addEdge(nodeA, neighbor: nodeC)\ngraph.addEdge(nodeB, neighbor: nodeD)\ngraph.addEdge(nodeB, neighbor: nodeE)\ngraph.addEdge(nodeC, neighbor: nodeF)\ngraph.addEdge(nodeC, neighbor: nodeG)\ngraph.addEdge(nodeE, neighbor: nodeH)\n\nlet shortestPathGraph = breadthFirstSearchShortestPath(graph: graph, source: nodeA)\nprint(shortestPathGraph.nodes)\n"
  },
  {
    "path": "Shortest Path (Unweighted)/ShortestPath.playground/Sources/Edge.swift",
    "content": "public class Edge: Equatable {\n  public var neighbor: Node\n\n  public init(neighbor: Node) {\n    self.neighbor = neighbor\n  }\n}\n\npublic func == (lhs: Edge, rhs: Edge) -> Bool {\n  return lhs.neighbor == rhs.neighbor\n}\n"
  },
  {
    "path": "Shortest Path (Unweighted)/ShortestPath.playground/Sources/Graph.swift",
    "content": "public class Graph: CustomStringConvertible, Equatable {\n  public private(set) var nodes: [Node]\n\n  public init() {\n    self.nodes = []\n  }\n\n  public func addNode(label: String) -> Node {\n    let node = Node(label: label)\n    nodes.append(node)\n    return node\n  }\n\n  public func addEdge(_ source: Node, neighbor: Node) {\n    let edge = Edge(neighbor: neighbor)\n    source.neighbors.append(edge)\n  }\n\n  public var description: String {\n    var description = \"\"\n\n    for node in nodes {\n      if !node.neighbors.isEmpty {\n        description += \"[node: \\(node.label) edges: \\(node.neighbors.map { $0.neighbor.label})]\"\n      }\n    }\n    return description\n  }\n\n  public func findNodeWithLabel(label: String) -> Node {\n    return nodes.filter { $0.label == label }.first!\n  }\n\n  public func duplicate() -> Graph {\n    let duplicated = Graph()\n\n    for node in nodes {\n      duplicated.addNode(label: node.label)\n    }\n\n    for node in nodes {\n      for edge in node.neighbors {\n        let source = duplicated.findNodeWithLabel(label: node.label)\n        let neighbour = duplicated.findNodeWithLabel(label: edge.neighbor.label)\n        duplicated.addEdge(source, neighbor: neighbour)\n      }\n    }\n\n    return duplicated\n  }\n}\n\npublic func == (lhs: Graph, rhs: Graph) -> Bool {\n  return lhs.nodes == rhs.nodes\n}\n"
  },
  {
    "path": "Shortest Path (Unweighted)/ShortestPath.playground/Sources/Node.swift",
    "content": "public class Node: CustomStringConvertible, Equatable {\n  public var neighbors: [Edge]\n\n  public private(set) var label: String\n  public var distance: Int?\n  public var visited: Bool\n\n  public init(label: String) {\n    self.label = label\n    neighbors = []\n    visited = false\n  }\n\n  public var description: String {\n    if let distance = distance {\n      return \"Node(label: \\(label), distance: \\(distance))\"\n    }\n    return \"Node(label: \\(label), distance: infinity)\"\n  }\n\n  public var hasDistance: Bool {\n    return distance != nil\n  }\n\n  public func remove(edge: Edge) {\n    neighbors.remove(at: neighbors.index { $0 === edge }!)\n  }\n}\n\npublic func == (lhs: Node, rhs: Node) -> Bool {\n  return lhs.label == rhs.label && lhs.neighbors == rhs.neighbors\n}\n"
  },
  {
    "path": "Shortest Path (Unweighted)/ShortestPath.playground/Sources/Queue.swift",
    "content": "public struct Queue<T> {\n  private var array: [T]\n\n  public init() {\n    array = []\n  }\n\n  public var isEmpty: Bool {\n    return array.isEmpty\n  }\n\n  public var count: Int {\n    return array.count\n  }\n\n  public mutating func enqueue(element: T) {\n    array.append(element)\n  }\n\n  public mutating func dequeue() -> T? {\n    if isEmpty {\n      return nil\n    } else {\n      return array.removeFirst()\n    }\n  }\n\n  public func peek() -> T? {\n    return array.first\n  }\n}\n"
  },
  {
    "path": "Shortest Path (Unweighted)/ShortestPath.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='6.0' target-platform='ios' display-mode='raw'/>"
  },
  {
    "path": "Shortest Path (Unweighted)/ShortestPath.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Shortest Path (Unweighted)/ShortestPath.swift",
    "content": "func breadthFirstSearchShortestPath(graph: Graph, source: Node) -> Graph {\n  let shortestPathGraph = graph.duplicate()\n\n  var queue = Queue<Node>()\n  let sourceInShortestPathsGraph = shortestPathGraph.findNodeWithLabel(label: source.label)\n  queue.enqueue(element: sourceInShortestPathsGraph)\n  sourceInShortestPathsGraph.distance = 0\n\n  while let current = queue.dequeue() {\n    for edge in current.neighbors {\n      let neighborNode = edge.neighbor\n      if !neighborNode.hasDistance {\n        queue.enqueue(element: neighborNode)\n        neighborNode.distance = current.distance! + 1\n      }\n    }\n  }\n\n  return shortestPathGraph\n}\n"
  },
  {
    "path": "Shortest Path (Unweighted)/Tests/Graph.swift",
    "content": "// MARK: - Edge\n\nopen class Edge: Equatable {\n    open var neighbor: Node\n\n    public init(neighbor: Node) {\n        self.neighbor = neighbor\n    }\n}\n\npublic func == (lhs: Edge, rhs: Edge) -> Bool {\n    return lhs.neighbor == rhs.neighbor\n}\n\n// MARK: - Node\n\nopen class Node: CustomStringConvertible, Equatable {\n    open var neighbors: [Edge]\n\n    open fileprivate(set) var label: String\n    open var distance: Int?\n    open var visited: Bool\n\n    public init(label: String) {\n        self.label = label\n        neighbors = []\n        visited = false\n    }\n\n    open var description: String {\n        if let distance = distance {\n            return \"Node(label: \\(label), distance: \\(distance))\"\n        }\n        return \"Node(label: \\(label), distance: infinity)\"\n    }\n\n    open var hasDistance: Bool {\n        return distance != nil\n    }\n\n    open func remove(_ edge: Edge) {\n        neighbors.remove(at: neighbors.index { $0 === edge }!)\n    }\n}\n\npublic func == (lhs: Node, rhs: Node) -> Bool {\n    return lhs.label == rhs.label && lhs.neighbors == rhs.neighbors\n}\n\n// MARK: - Graph\n\nopen class Graph: CustomStringConvertible, Equatable {\n    open fileprivate(set) var nodes: [Node]\n\n    public init() {\n        self.nodes = []\n    }\n\n    open func addNode(label: String) -> Node {\n        let node = Node(label: label)\n        nodes.append(node)\n        return node\n    }\n\n    open func addEdge(_ source: Node, neighbor: Node) {\n        let edge = Edge(neighbor: neighbor)\n        source.neighbors.append(edge)\n    }\n\n    open var description: String {\n        var description = \"\"\n\n        for node in nodes {\n            if !node.neighbors.isEmpty {\n                description += \"[node: \\(node.label) edges: \\(node.neighbors.map { $0.neighbor.label})]\"\n            }\n        }\n        return description\n    }\n\n    open func findNodeWithLabel(label: String) -> Node {\n        return nodes.filter { $0.label == label }.first!\n    }\n\n    open func duplicate() -> Graph {\n        let duplicated = Graph()\n\n        for node in nodes {\n            duplicated.addNode(label: node.label)\n        }\n\n        for node in nodes {\n            for edge in node.neighbors {\n                let source = duplicated.findNodeWithLabel(label: node.label)\n                let neighbour = duplicated.findNodeWithLabel(label: edge.neighbor.label)\n                duplicated.addEdge(source, neighbor: neighbour)\n            }\n        }\n\n        return duplicated\n    }\n}\n\npublic func == (lhs: Graph, rhs: Graph) -> Bool {\n    return lhs.nodes == rhs.nodes\n}\n"
  },
  {
    "path": "Shortest Path (Unweighted)/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Shortest Path (Unweighted)/Tests/Queue.swift",
    "content": "public struct Queue<T> {\n  fileprivate var array: [T]\n\n  public init() {\n    array = []\n  }\n\n  public var isEmpty: Bool {\n    return array.isEmpty\n  }\n\n  public var count: Int {\n    return array.count\n  }\n\n  public mutating func enqueue(element: T) {\n    array.append(element)\n  }\n\n  public mutating func dequeue() -> T? {\n    if isEmpty {\n      return nil\n    } else {\n      return array.removeFirst()\n    }\n  }\n\n  public func peek() -> T? {\n    return array.first\n  }\n}\n"
  },
  {
    "path": "Shortest Path (Unweighted)/Tests/ShortestPathTests.swift",
    "content": "import XCTest\n\nclass ShortestPathTests: XCTestCase {\n  \n  func testSwift4() {\n    // last checked with Xcode 9.0b4\n    #if swift(>=4.0)\n      print(\"Hello, Swift 4!\")\n    #endif\n  }\n\n  func testShortestPathWhenGivenTree() {\n    let tree = Graph()\n    let nodeA = tree.addNode(label: \"a\")\n    let nodeB = tree.addNode(label: \"b\")\n    let nodeC = tree.addNode(label: \"c\")\n    let nodeD = tree.addNode(label: \"d\")\n    let nodeE = tree.addNode(label: \"e\")\n    let nodeF = tree.addNode(label: \"f\")\n    let nodeG = tree.addNode(label: \"g\")\n    let nodeH = tree.addNode(label: \"h\")\n    tree.addEdge(nodeA, neighbor: nodeB)\n    tree.addEdge(nodeA, neighbor: nodeC)\n    tree.addEdge(nodeB, neighbor: nodeD)\n    tree.addEdge(nodeB, neighbor: nodeE)\n    tree.addEdge(nodeC, neighbor: nodeF)\n    tree.addEdge(nodeC, neighbor: nodeG)\n    tree.addEdge(nodeE, neighbor: nodeH)\n\n    let shortestPaths = breadthFirstSearchShortestPath(graph: tree, source: nodeA)\n\n    XCTAssertEqual(shortestPaths.findNodeWithLabel(label: nodeA.label).distance, 0)\n    XCTAssertEqual(shortestPaths.findNodeWithLabel(label: nodeB.label).distance, 1)\n    XCTAssertEqual(shortestPaths.findNodeWithLabel(label: nodeC.label).distance, 1)\n    XCTAssertEqual(shortestPaths.findNodeWithLabel(label: nodeD.label).distance, 2)\n    XCTAssertEqual(shortestPaths.findNodeWithLabel(label: nodeE.label).distance, 2)\n    XCTAssertEqual(shortestPaths.findNodeWithLabel(label: nodeF.label).distance, 2)\n    XCTAssertEqual(shortestPaths.findNodeWithLabel(label: nodeG.label).distance, 2)\n    XCTAssertEqual(shortestPaths.findNodeWithLabel(label: nodeH.label).distance, 3)\n  }\n\n  func testShortestPathWhenGivenGraph() {\n    let graph = Graph()\n\n    let nodeA = graph.addNode(label:\"a\")\n    let nodeB = graph.addNode(label:\"b\")\n    let nodeC = graph.addNode(label:\"c\")\n    let nodeD = graph.addNode(label:\"d\")\n    let nodeE = graph.addNode(label:\"e\")\n    let nodeF = graph.addNode(label:\"f\")\n    let nodeG = graph.addNode(label:\"g\")\n    let nodeH = graph.addNode(label:\"h\")\n    let nodeI = graph.addNode(label:\"i\")\n\n    graph.addEdge(nodeA, neighbor: nodeB)\n    graph.addEdge(nodeA, neighbor: nodeH)\n    graph.addEdge(nodeB, neighbor: nodeA)\n    graph.addEdge(nodeB, neighbor: nodeC)\n    graph.addEdge(nodeB, neighbor: nodeH)\n    graph.addEdge(nodeC, neighbor: nodeB)\n    graph.addEdge(nodeC, neighbor: nodeD)\n    graph.addEdge(nodeC, neighbor: nodeF)\n    graph.addEdge(nodeC, neighbor: nodeI)\n    graph.addEdge(nodeD, neighbor: nodeC)\n    graph.addEdge(nodeD, neighbor: nodeE)\n    graph.addEdge(nodeD, neighbor: nodeF)\n    graph.addEdge(nodeE, neighbor: nodeD)\n    graph.addEdge(nodeE, neighbor: nodeF)\n    graph.addEdge(nodeF, neighbor: nodeC)\n    graph.addEdge(nodeF, neighbor: nodeD)\n    graph.addEdge(nodeF, neighbor: nodeE)\n    graph.addEdge(nodeF, neighbor: nodeG)\n    graph.addEdge(nodeG, neighbor: nodeF)\n    graph.addEdge(nodeG, neighbor: nodeH)\n    graph.addEdge(nodeG, neighbor: nodeI)\n    graph.addEdge(nodeH, neighbor: nodeA)\n    graph.addEdge(nodeH, neighbor: nodeB)\n    graph.addEdge(nodeH, neighbor: nodeG)\n    graph.addEdge(nodeH, neighbor: nodeI)\n    graph.addEdge(nodeI, neighbor: nodeC)\n    graph.addEdge(nodeI, neighbor: nodeG)\n    graph.addEdge(nodeI, neighbor: nodeH)\n\n    let shortestPaths = breadthFirstSearchShortestPath(graph: graph, source: nodeA)\n\n    XCTAssertEqual(shortestPaths.findNodeWithLabel(label: nodeA.label).distance, 0)\n    XCTAssertEqual(shortestPaths.findNodeWithLabel(label: nodeB.label).distance, 1)\n    XCTAssertEqual(shortestPaths.findNodeWithLabel(label: nodeC.label).distance, 2)\n    XCTAssertEqual(shortestPaths.findNodeWithLabel(label: nodeD.label).distance, 3)\n    XCTAssertEqual(shortestPaths.findNodeWithLabel(label: nodeE.label).distance, 4)\n    XCTAssertEqual(shortestPaths.findNodeWithLabel(label: nodeF.label).distance, 3)\n    XCTAssertEqual(shortestPaths.findNodeWithLabel(label: nodeG.label).distance, 2)\n    XCTAssertEqual(shortestPaths.findNodeWithLabel(label: nodeH.label).distance, 1)\n    XCTAssertEqual(shortestPaths.findNodeWithLabel(label: nodeI.label).distance, 2)\n  }\n}\n"
  },
  {
    "path": "Shortest Path (Unweighted)/Tests/Tests.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t83AACB441C8456D200DDAFC7 /* ShortestPathTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83AACB431C8456D200DDAFC7 /* ShortestPathTests.swift */; };\n\t\t83F9C96A1C84437C00B3A87F /* ShortestPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83F9C9671C84437C00B3A87F /* ShortestPath.swift */; };\n\t\t83F9C9721C84449D00B3A87F /* Graph.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83F9C96E1C84449D00B3A87F /* Graph.swift */; };\n\t\t83F9C9741C84449D00B3A87F /* Queue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83F9C9701C84449D00B3A87F /* Queue.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t7B2BBC801C779D720067B71D /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7B2BBC941C779E7B0067B71D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };\n\t\t83AACB431C8456D200DDAFC7 /* ShortestPathTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShortestPathTests.swift; sourceTree = SOURCE_ROOT; };\n\t\t83F9C9671C84437C00B3A87F /* ShortestPath.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ShortestPath.swift; path = ../ShortestPath.swift; sourceTree = SOURCE_ROOT; };\n\t\t83F9C96E1C84449D00B3A87F /* Graph.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Graph.swift; sourceTree = SOURCE_ROOT; };\n\t\t83F9C9701C84449D00B3A87F /* Queue.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Queue.swift; sourceTree = SOURCE_ROOT; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t7B2BBC7D1C779D720067B71D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t7B2BBC681C779D710067B71D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC831C779D720067B71D /* Tests */,\n\t\t\t\t7B2BBC721C779D710067B71D /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC721C779D710067B71D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC801C779D720067B71D /* Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC831C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t83F9C9671C84437C00B3A87F /* ShortestPath.swift */,\n\t\t\t\t83AACB431C8456D200DDAFC7 /* ShortestPathTests.swift */,\n\t\t\t\t83F9C96E1C84449D00B3A87F /* Graph.swift */,\n\t\t\t\t83F9C9701C84449D00B3A87F /* Queue.swift */,\n\t\t\t\t7B2BBC941C779E7B0067B71D /* Info.plist */,\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tpath = TestsTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t7B2BBC7F1C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t7B2BBC7C1C779D720067B71D /* Sources */,\n\t\t\t\t7B2BBC7D1C779D720067B71D /* Frameworks */,\n\t\t\t\t7B2BBC7E1C779D720067B71D /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tproductName = TestsTests;\n\t\t\tproductReference = 7B2BBC801C779D720067B71D /* Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t7B2BBC691C779D710067B71D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0720;\n\t\t\t\tLastUpgradeCheck = 0720;\n\t\t\t\tORGANIZATIONNAME = \"Swift Algorithm Club\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t7B2BBC7F1C779D720067B71D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2;\n\t\t\t\t\t\tLastSwiftMigration = 0820;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 7B2BBC681C779D710067B71D;\n\t\t\tproductRefGroup = 7B2BBC721C779D710067B71D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t7B2BBC7F1C779D720067B71D /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t7B2BBC7E1C779D720067B71D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t7B2BBC7C1C779D720067B71D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t83AACB441C8456D200DDAFC7 /* ShortestPathTests.swift in Sources */,\n\t\t\t\t83F9C9721C84449D00B3A87F /* Graph.swift in Sources */,\n\t\t\t\t83F9C9741C84449D00B3A87F /* Queue.swift in Sources */,\n\t\t\t\t83F9C96A1C84437C00B3A87F /* ShortestPath.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t7B2BBC871C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC881C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t7B2BBC8D1C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC8E1C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC871C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC881C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC8D1C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC8E1C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 7B2BBC691C779D710067B71D /* Project object */;\n}\n"
  },
  {
    "path": "Shortest Path (Unweighted)/Tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Shortest Path (Unweighted)/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0720\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Shuffle/README.markdown",
    "content": "# Shuffle\n\nGoal: Rearrange the contents of an array.\n\nImagine you're making a card game and you need to shuffle a deck of cards. You can represent the deck by an array of `Card` objects and shuffling the deck means to change the order of those objects in the array. (It's like the opposite of sorting.)\n\nHere is a naive way to approach this in Swift:\n\n```swift\nextension Array {\n  public mutating func shuffle() {\n    var temp = [Element]()\n    while !isEmpty {\n      let i = random(count)\n      let obj = remove(at: i)\n      temp.append(obj)\n    }\n    self = temp\n  }\n}\n```\n\nTo try it out, copy the code into a playground and then do:\n\n```swift\nvar list = [ \"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\" ]\nlist.shuffle()\nlist.shuffle()\nlist.shuffle()\n```\n\nYou should see three different arrangements -- or [permutations](../Combinatorics/) to use math-speak -- of the objects in the array.\n\nThis shuffle works *in place*, it modifies the contents of the original array. The algorithm works by creating a new array, `temp`, that is initially empty. Then we randomly choose an element from the original array and append it to `temp`, until the original array is empty. Finally, the temporary array is copied back into the original one.\n\nThis code works just fine but it's not very efficient. Removing an element from an array is an **O(n)** operation and we perform this **n** times, making the total algorithm **O(n^2)**. We can do better!\n\n## The Fisher-Yates / Knuth shuffle\n\nHere is a much-improved version of the shuffle algorithm:\n\n```swift\nextension Array {\n  public mutating func shuffle() {\n    for i in stride(from: count - 1, through: 1, by: -1) {\n      let j = Int.random(in: 0...i)\n      if i != j {\n        swap(&self[i], &self[j])\n      }\n    }\n  }\n}\n```\n\nAgain, this picks objects at random. In the naive version, we placed those objects into a new temporary array so we could keep track of which objects were already shuffled and which still remained to be done. In this improved algorithm, however, we'll move the shuffled objects to the end of the original array. \n\nLet's walk through the example. We have the array:\n\n\t[ \"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\" ]\n\nThe loop starts at the end of the array and works its way back to the beginning. The very first random number can be any element from the entire array. Let's say it returns 2, the index of `\"c\"`. We swap `\"c\"` with `\"g\"` to move it to the end:\n\n\t[ \"a\", \"b\", \"g\", \"d\", \"e\", \"f\" | \"c\" ]\n\t             *                    *\n\nThe array now consists of two regions, indicated by the `|` bar. Everything to the right of the bar is shuffled already. \n\nThe next random number is chosen from the range 0...6, so only from the region `[ \"a\", \"b\", \"g\", \"d\", \"e\", \"f\" ]`. It will never choose `\"c\"` since that object is done and we'll no longer touch it.\n\nLet's say the random number generator picks 0, the index of `\"a\"`. Then we swap `\"a\"` with `\"f\"`, which is the last element in the unshuffled portion, and the array looks like this:\n\n\t[ \"f\", \"b\", \"g\", \"d\", \"e\" | \"a\", \"c\" ]\n\t   *                         *\n\nThe next random number is somewhere in `[ \"f\", \"b\", \"g\", \"d\", \"e\" ]`, so let's say it is 3. We swap `\"d\"` with `\"e\"`:\n\n\t[ \"f\", \"b\", \"g\", \"e\" | \"d\", \"a\", \"c\" ]\n\t                  *     *\n\nAnd so on... This continues until there is only one element remaining in the left portion. For example:\n\n\t[ \"b\" | \"e\", \"f\", \"g\", \"d\", \"a\", \"c\" ]\n\nThere's nothing left to swap that `\"b\"` with, so we're done.\n\nBecause we only look at each array element once, this algorithm has a guaranteed running time of **O(n)**. It's as fast as you could hope to get!\n\n## Creating a new array that is shuffled\n\nThere is a slight variation on this algorithm that is useful for when you want to create a new array instance that contains the values `0` to `n-1` in random order.\n\nHere is the code:\n\n```swift\npublic func shuffledArray(_ n: Int) -> [Int] {\n  var a = [Int](repeating: 0, count: n)\n  for i in 0..<n {\n    let j = Int.random(in: 0...i)\n    // for the Fisher–Yates_shuffle's pseudo code implement in wiki, it will check if i != j\n    a[i] = a[j]\n    a[j] = i\n  }\n  return a\n}\n```\n\nTo use it:\n\n```swift\nlet numbers = shuffledArray(10)\n```\n\nThis returns something like `[3, 0, 9, 1, 8, 5, 2, 6, 7, 4]`. As you can see, every number between 0 and 10 is in that list, but shuffled around. Of course, when you try it for yourself the order of the numbers will be different. \n\nThe `shuffledArray()` function first creates a new array with `n` zeros. Then it loops `n` times and in each step adds the next number from the sequence to a random position in the array. The trick is to make sure that none of these numbers gets overwritten with the next one, so it moves the previous number out of the way first!\n\nFor this function, `The condition that checks if j ≠ i may be omitted in languages that have no problems accessing uninitialized array values, and for which assigning is cheaper than comparing.`, you can check it in wiki. And also remove checking logic will optimise performance.\n\nThe algorithm is quite clever and I suggest you walk through an example yourself, either on paper or in the playground. (Hint: Again it splits the array into two regions.)\n\n## See also\n\nThese Swift implementations are based on pseudocode from the [Wikipedia article](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle).\n\nMike Bostock has a [great visualization](http://bost.ocks.org/mike/shuffle/) of the shuffle algorithm.\n\n*Written for Swift Algorithm Club by Matthijs Hollemans*\n"
  },
  {
    "path": "Shuffle/Shuffle.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\nimport Foundation\n\nvar list = [ \"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\" ]\nlist.shuffle()\nlist.shuffle()\nlist.shuffle()\n\nlet numbers = shuffledArray(10)\n"
  },
  {
    "path": "Shuffle/Shuffle.playground/Sources/Shuffle.swift",
    "content": "import Foundation\n\nextension Array {\n  /*\n   Randomly shuffles the array in-place\n   This is the Fisher-Yates algorithm, also known as the Knuth shuffle.\n   Time complexity: O(n)\n   */\n  public mutating func shuffle() {\n    for i in (1...count-1).reversed() {\n      let j = Int.random(in: 0...i)\n      if i != j {\n        let t = self[i]\n        self[i] = self[j]\n        self[j] = t\n      }\n    }\n  }\n}\n\n/*\n Simultaneously initializes an array with the values 0...n-1 and shuffles it.\n */\npublic func shuffledArray(_ n: Int) -> [Int] {\n  var a = Array(repeating: 0, count: n)\n  for i in 0..<n {\n    let j = Int.random(in: 0...i)\n    if i != j {\n      a[i] = a[j]\n    }\n    a[j] = i  // insert next number from the sequence\n  }\n  return a\n}\n"
  },
  {
    "path": "Shuffle/Shuffle.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Shuffle/Shuffle.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Shuffle/Shuffle.swift",
    "content": "import Foundation\n\n/* Returns a random integer between 0 and n-1. */\npublic func random(_ n: Int) -> Int {\n  return Int(arc4random_uniform(UInt32(n)))\n}\n\nextension Array {\n  /*\n   Randomly shuffles the array in-place\n   This is the Fisher-Yates algorithm, also known as the Knuth shuffle.\n   Time complexity: O(n)\n   */\n  public mutating func shuffle() {\n    for i in (1...count-1).reversed() {\n      let j = random(i + 1)\n      if i != j {\n        let t = self[i]\n        self[i] = self[j]\n        self[j] = t\n      }\n    }\n  }\n}\n\n/*\n Simultaneously initializes an array with the values 0...n-1 and shuffles it.\n */\npublic func shuffledArray(_ n: Int) -> [Int] {\n  var a = Array(repeating: 0, count: n)\n  for i in 0..<n {\n    let j = random(i + 1)\n    a[i] = a[j]\n    a[j] = i  // insert next number from the sequence\n  }\n  return a\n}\n\n"
  },
  {
    "path": "Shunting Yard/README.markdown",
    "content": "# Shunting Yard Algorithm\n\nAny mathematics we write is expressed in a notation known as *infix notation*. For example:\n\n**A + B * C**\n\nThe operator is placed in between the operands, hence the expression is said to be in *infix* form. If you think about it, any expression that you write on a piece of paper will always be in infix form. This is what we humans understand.\n\nMultiplication has higher precedence than addition, so when the above expression is evaluated you would first multiply **B** and **C**, and then add the result to **A**. We humans can easily understand the precedence of operators, but a machine needs to be given instructions about each operator.\n\nTo change the order of evaluation, we can use parentheses:\n\n**(A + B) * C**\n\nNow **A** is first added to **B** and then the sum is multiplied by **C**.\n\nIf you were to write an algorithm that parsed and evaluated expressions in infix notation you will realize that it's a tedious process. You'd have to parse the expression multiple times to know what operation to perform first. As the number of operators increase so does the complexity.\n\n## Postfix notation\n\nIn postfix notation, also known as Reverse Polish Notation or RPN, the operators come after the corresponding operands. Here is the postfix representation of the example from the previous section:\n\n**A B C * +**\n\nAn expression in postfix form will not have any parentheses and neither will you have to worry about scanning for operator precedence. This makes it easy for the computer to evaluate expressions, since the order in which the operators need to be applied is fixed.\n\nEvaluating a postfix expression is easily done using a stack. Here is the pseudocode:\n\n1. Read the postfix expression token by token\n2. If the token is an operand, push it onto the stack\n3. If the token is a binary operator,\n    1. Pop the two topmost operands from the stack\n    2. Apply the binary operator to the two operands\n    3. Push the result back onto the stack\n4. Finally, the value of the whole postfix expression remains in the stack\n\nUsing the above pseudocode, the evaluation of **A B C * +** would be as follows:\n\n| Expression    | Stack   |\n| ------------- | --------|\n| A B C * +     |         |\n| B C * +       | A       |\n| C * +         | A, B    |\n| * +           | A, B, C |\n| +             | A, D    |\n|               | E       |\n\nWhere **D = B * C** and **E = A + D.**\n\nAs seen above, a postfix operation is relatively easy to evaluate as the order in which the operators need to be applied is pre-decided.\n\n## Converting infix to postfix\n\nThe shunting yard algorithm was invented by Edsger Dijkstra to convert an infix expression to postfix. Many calculators use this algorithm to convert the expression being entered to postfix form.\n\nHere is the psedocode of the algorithm:\n\n1. For all the input tokens:\n    1. Read the next token\n    2. If token is an operator (x)\n        1. While there is an operator (y) at the top of the operators stack and either (x) is left-associative and its precedence is less or equal to that of (y), or (x) is right-associative and its precedence is less than (y)\n            1. Pop (y) from the stack\n            2. Add (y) output buffer\n        2. Push (x) on the stack\n    3. Else if token is left parenthesis, then push it on the stack\n    4. Else if token is a right parenthesis\n        1. Until the top token (from the stack) is left parenthesis, pop from the stack to the output buffer\n        2. Also pop the left parenthesis but don’t include it in the output buffer\n    7. Else add token to output buffer\n2. Pop any remaining operator tokens from the stack to the output\n\nLet's take a small example and see how the pseudocode works. Here is the infix expression to convert:\n\n**4 + 4 * 2 / ( 1 - 5 )**\n\nThe following table describes the precedence and the associativity for each operator. The same values are used in the algorithm.\n\n| Operator | Precedence   | Associativity   |\n| ---------| -------------| ----------------|\n| ^        | 10           | Right           |\n| *        | 5            | Left            |\n| /        | 5            | Left            |\n| +        | 0            | Left            |\n| -        | 0            | Left            |\n\nHere we go:\n\n| Token | Action                                      | Output            | Operator stack |\n|-------|---------------------------------------------|-------------------|----------------|\n| 4     | Add token to output                         | 4                 |                |\n| +     | Push token to stack                         | 4                 | +              |\n| 4     | Add token to output                         | 4 4               | +              |\n| *     | Push token to stack                         | 4 4               | * +            |\n| 2     | Add token to output                         | 4 4 2             | * +            |\n| /     | Pop stack to output, Push token to stack | 4 4 2 *           | / +            |\n| (     | Push token to stack                         | 4 4 2 *           | ( / +          |\n| 1     | Add token to output                         | 4 4 2 * 1         | ( / +          |\n| -     | Push token to stack                         | 4 4 2 * 1         | - ( / +        |\n| 5     | Add token to output                         | 4 4 2 * 1 5       | - ( / +        |\n| )     | Pop stack to output, Pop stack           | 4 4 2 * 1 5 -     | /  +           |\n| end   | Pop entire stack to output                  | 4 4 2 * 1 5 - / + |                |\n\nWe end up with the postfix expression:\n\n**4 4 2 * 1 5 - / +**\n\n# See also\n\n[Shunting yard algorithm on Wikipedia](https://en.wikipedia.org/wiki/Shunting-yard_algorithm)\n\n*Written for the Swift Algorithm Club by [Ali Hafizji](http://www.github.com/aliHafizji)*\n*Migrated to Swift 3 by Jaap Wijnen*\n"
  },
  {
    "path": "Shunting Yard/ShuntingYard.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\ninternal enum OperatorAssociativity {\n  case leftAssociative\n  case rightAssociative\n}\n\npublic enum OperatorType: CustomStringConvertible {\n  case add\n  case subtract\n  case divide\n  case multiply\n  case percent\n  case exponent\n\n  public var description: String {\n    switch self {\n    case .add:\n      return \"+\"\n    case .subtract:\n      return \"-\"\n    case .divide:\n      return \"/\"\n    case .multiply:\n      return \"*\"\n    case .percent:\n      return \"%\"\n    case .exponent:\n      return \"^\"\n    }\n  }\n}\n\npublic enum TokenType: CustomStringConvertible {\n  case openBracket\n  case closeBracket\n  case Operator(OperatorToken)\n  case operand(Double)\n\n  public var description: String {\n    switch self {\n    case .openBracket:\n      return \"(\"\n    case .closeBracket:\n      return \")\"\n    case .Operator(let operatorToken):\n      return operatorToken.description\n    case .operand(let value):\n      return \"\\(value)\"\n    }\n  }\n}\n\npublic struct OperatorToken: CustomStringConvertible {\n  let operatorType: OperatorType\n\n  init(operatorType: OperatorType) {\n    self.operatorType = operatorType\n  }\n\n  var precedence: Int {\n    switch operatorType {\n    case .add, .subtract:\n      return 0\n    case .divide, .multiply, .percent:\n      return 5\n    case .exponent:\n      return 10\n    }\n  }\n\n  var associativity: OperatorAssociativity {\n    switch operatorType {\n    case .add, .subtract, .divide, .multiply, .percent:\n      return .leftAssociative\n    case .exponent:\n      return .rightAssociative\n    }\n  }\n\n  public var description: String {\n    return operatorType.description\n  }\n}\n\nfunc <= (left: OperatorToken, right: OperatorToken) -> Bool {\n  return left.precedence <= right.precedence\n}\n\nfunc < (left: OperatorToken, right: OperatorToken) -> Bool {\n  return left.precedence < right.precedence\n}\n\npublic struct Token: CustomStringConvertible {\n  let tokenType: TokenType\n\n  init(tokenType: TokenType) {\n    self.tokenType = tokenType\n  }\n\n  init(operand: Double) {\n    tokenType = .operand(operand)\n  }\n\n  init(operatorType: OperatorType) {\n    tokenType = .Operator(OperatorToken(operatorType: operatorType))\n  }\n\n  var isOpenBracket: Bool {\n    switch tokenType {\n    case .openBracket:\n      return true\n    default:\n      return false\n    }\n  }\n\n  var isOperator: Bool {\n    switch tokenType {\n    case .Operator(_):\n      return true\n    default:\n      return false\n    }\n  }\n\n  var operatorToken: OperatorToken? {\n    switch tokenType {\n    case .Operator(let operatorToken):\n      return operatorToken\n    default:\n      return nil\n    }\n  }\n\n  public var description: String {\n    return tokenType.description\n  }\n}\n\npublic class InfixExpressionBuilder {\n  private var expression = [Token]()\n\n  public func addOperator(_ operatorType: OperatorType) -> InfixExpressionBuilder {\n    expression.append(Token(operatorType: operatorType))\n    return self\n  }\n\n  public func addOperand(_ operand: Double) -> InfixExpressionBuilder {\n    expression.append(Token(operand: operand))\n    return self\n  }\n\n  public func addOpenBracket() -> InfixExpressionBuilder {\n    expression.append(Token(tokenType: .openBracket))\n    return self\n  }\n\n  public func addCloseBracket() -> InfixExpressionBuilder {\n    expression.append(Token(tokenType: .closeBracket))\n    return self\n  }\n\n  public func build() -> [Token] {\n    // Maybe do some validation here\n    return expression\n  }\n}\n\n// This returns the result of the shunting yard algorithm\npublic func reversePolishNotation(_ expression: [Token]) -> String {\n\n  var tokenStack = Stack<Token>()\n  var reversePolishNotation = [Token]()\n\n  for token in expression {\n    switch token.tokenType {\n    case .operand(_):\n      reversePolishNotation.append(token)\n\n    case .openBracket:\n      tokenStack.push(token)\n\n    case .closeBracket:\n      while tokenStack.count > 0, let tempToken = tokenStack.pop(), !tempToken.isOpenBracket {\n        reversePolishNotation.append(tempToken)\n      }\n\n    case .Operator(let operatorToken):\n      for tempToken in tokenStack.makeIterator() {\n        if !tempToken.isOperator {\n          break\n        }\n\n        if let tempOperatorToken = tempToken.operatorToken {\n          if operatorToken.associativity == .leftAssociative && operatorToken <= tempOperatorToken\n            || operatorToken.associativity == .rightAssociative && operatorToken < tempOperatorToken {\n            reversePolishNotation.append(tokenStack.pop()!)\n          } else {\n            break\n          }\n        }\n      }\n      tokenStack.push(token)\n    }\n  }\n\n  while tokenStack.count > 0 {\n    reversePolishNotation.append(tokenStack.pop()!)\n  }\n\n  return reversePolishNotation.map({token in token.description}).joined(separator: \" \")\n}\n\n// Simple demo\n\nlet expr = InfixExpressionBuilder()\n  .addOperand(3)\n  .addOperator(.add)\n  .addOperand(4)\n  .addOperator(.multiply)\n  .addOperand(2)\n  .addOperator(.divide)\n  .addOpenBracket()\n  .addOperand(1)\n  .addOperator(.subtract)\n  .addOperand(5)\n  .addCloseBracket()\n  .addOperator(.exponent)\n  .addOperand(2)\n  .addOperator(.exponent)\n  .addOperand(3)\n  .build()\n\nprint(expr.description)\nprint(reversePolishNotation(expr))\n"
  },
  {
    "path": "Shunting Yard/ShuntingYard.playground/Sources/Stack.swift",
    "content": "import Foundation\n\npublic struct Stack<T> {\n  fileprivate var array = [T]()\n  \n  public init() {\n    \n  }\n  \n  public var isEmpty: Bool {\n    return array.isEmpty\n  }\n  \n  public var count: Int {\n    return array.count\n  }\n  \n  public mutating func push(_ element: T) {\n    array.append(element)\n  }\n  \n  public mutating func pop() -> T? {\n    return array.popLast()\n  }\n  \n  public var top: T? {\n    return array.last\n  }\n}\n\nextension Stack: Sequence {\n  public func makeIterator() -> AnyIterator<T> {\n    var curr = self\n    return AnyIterator { curr.pop() }\n  }\n}\n"
  },
  {
    "path": "Shunting Yard/ShuntingYard.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Shunting Yard/ShuntingYard.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Shunting Yard/ShuntingYard.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Shunting Yard/ShuntingYard.swift",
    "content": "//\n//  ShuntingYardAlgorithm.swift\n//\n//\n//  Created by Ali Hafizji on 2016-02-25.\n//\n//\n\ninternal enum OperatorAssociativity {\n  case leftAssociative\n  case rightAssociative\n}\n\npublic enum OperatorType: CustomStringConvertible {\n  case add\n  case subtract\n  case divide\n  case multiply\n  case percent\n  case exponent\n\n  public var description: String {\n    switch self {\n    case .add:\n      return \"+\"\n    case .subtract:\n      return \"-\"\n    case .divide:\n      return \"/\"\n    case .multiply:\n      return \"*\"\n    case .percent:\n      return \"%\"\n    case .exponent:\n      return \"^\"\n    }\n  }\n}\n\npublic enum TokenType: CustomStringConvertible {\n  case openBracket\n  case closeBracket\n  case Operator(OperatorToken)\n  case operand(Double)\n\n  public var description: String {\n    switch self {\n    case .openBracket:\n      return \"(\"\n    case .closeBracket:\n      return \")\"\n    case .Operator(let operatorToken):\n      return operatorToken.description\n    case .operand(let value):\n      return \"\\(value)\"\n    }\n  }\n}\n\npublic struct OperatorToken: CustomStringConvertible {\n  let operatorType: OperatorType\n\n  init(operatorType: OperatorType) {\n    self.operatorType = operatorType\n  }\n\n  var precedence: Int {\n    switch operatorType {\n    case .add, .subtract:\n      return 0\n    case .divide, .multiply, .percent:\n      return 5\n    case .exponent:\n      return 10\n    }\n  }\n\n  var associativity: OperatorAssociativity {\n    switch operatorType {\n    case .add, .subtract, .divide, .multiply, .percent:\n      return .leftAssociative\n    case .exponent:\n      return .rightAssociative\n    }\n  }\n\n  public var description: String {\n    return operatorType.description\n  }\n}\n\nfunc <= (left: OperatorToken, right: OperatorToken) -> Bool {\n  return left.precedence <= right.precedence\n}\n\nfunc < (left: OperatorToken, right: OperatorToken) -> Bool {\n  return left.precedence < right.precedence\n}\n\npublic struct Token: CustomStringConvertible {\n  let tokenType: TokenType\n\n  init(tokenType: TokenType) {\n    self.tokenType = tokenType\n  }\n\n  init(operand: Double) {\n    tokenType = .operand(operand)\n  }\n\n  init(operatorType: OperatorType) {\n    tokenType = .Operator(OperatorToken(operatorType: operatorType))\n  }\n\n  var isOpenBracket: Bool {\n    switch tokenType {\n    case .openBracket:\n      return true\n    default:\n      return false\n    }\n  }\n\n  var isOperator: Bool {\n    switch tokenType {\n    case .Operator(_):\n      return true\n    default:\n      return false\n    }\n  }\n\n  var operatorToken: OperatorToken? {\n    switch tokenType {\n    case .Operator(let operatorToken):\n      return operatorToken\n    default:\n      return nil\n    }\n  }\n\n  public var description: String {\n    return tokenType.description\n  }\n}\n\npublic class InfixExpressionBuilder {\n  private var expression = [Token]()\n\n  public func addOperator(_ operatorType: OperatorType) -> InfixExpressionBuilder {\n    expression.append(Token(operatorType: operatorType))\n    return self\n  }\n\n  public func addOperand(_ operand: Double) -> InfixExpressionBuilder {\n    expression.append(Token(operand: operand))\n    return self\n  }\n\n  public func addOpenBracket() -> InfixExpressionBuilder {\n    expression.append(Token(tokenType: .openBracket))\n    return self\n  }\n\n  public func addCloseBracket() -> InfixExpressionBuilder {\n    expression.append(Token(tokenType: .closeBracket))\n    return self\n  }\n\n  public func build() -> [Token] {\n    // Maybe do some validation here\n    return expression\n  }\n}\n\n// This returns the result of the shunting yard algorithm\npublic func reversePolishNotation(_ expression: [Token]) -> String {\n\n  var tokenStack = Stack<Token>()\n  var reversePolishNotation = [Token]()\n\n  for token in expression {\n    switch token.tokenType {\n    case .operand(_):\n      reversePolishNotation.append(token)\n\n    case .openBracket:\n      tokenStack.push(token)\n\n    case .closeBracket:\n      while tokenStack.count > 0, let tempToken = tokenStack.pop(), !tempToken.isOpenBracket {\n        reversePolishNotation.append(tempToken)\n      }\n\n    case .Operator(let operatorToken):\n      for tempToken in tokenStack.makeIterator() {\n        if !tempToken.isOperator {\n          break\n        }\n\n        if let tempOperatorToken = tempToken.operatorToken {\n          if operatorToken.associativity == .leftAssociative && operatorToken <= tempOperatorToken\n            || operatorToken.associativity == .rightAssociative && operatorToken < tempOperatorToken {\n            reversePolishNotation.append(tokenStack.pop()!)\n          } else {\n            break\n          }\n        }\n      }\n      tokenStack.push(token)\n    }\n  }\n\n  while tokenStack.count > 0 {\n    reversePolishNotation.append(tokenStack.pop()!)\n  }\n\n  return reversePolishNotation.map({token in token.description}).joined(separator: \" \")\n}\n"
  },
  {
    "path": "Simulated annealing/README.md",
    "content": "# Simulated annealing\n\nSimulated Annealing is a nature inspired global optimization technique and a metaheuristic to approximate global maxima in a (often discrete)large search space. The name comes from the process of annealing in metallurgy where a material is heated and cooled down under controlled conditions in order to improve its strength and durabilility. The objective is to find a minimum cost solution in the search space by exploiting properties of a thermodynamic system. \nUnlike hill climbing techniques which usually gets stuck in a local maxima ( downward moves are not allowed ), simulated annealing can escape local maxima. The interesting property of simulated annealing is that probability of allowing downward moves is high at the high temperatures and gradually reduced as it cools down. In other words, high temperature relaxes the acceptance criteria for the search space and triggers chaotic behavior of acceptance function in the algorithm (e.x initial/high temperature stages) which should make it possible to escape from local maxima and cooler temperatures narrows it and focuses on improvements.\n\nPseucocode\n\n\tInput: initial, temperature, coolingRate, acceptance\n\tOutput: Sbest\n\tScurrent <- CreateInitialSolution(initial)\n\tSbest <- Scurrent\n\twhile temperature is not minimum:\n\t\tSnew <- FindNewSolution(Scurrent)\n\t\tif acceptance(Energy(Scurrent), Energy(Snew), temperature) > Rand():\n\t\t\tScurrent = Snew\n\t\tif Energy(Scurrent) < Energy(Sbest):\n\t\t\tSbest = Scurrent\n\t\ttemperature = temperature * (1-coolingRate)\n\t\nCommon acceptance criteria : \n\n\tP(accept) <- exp((e-ne)/T) where \n\t\te is the current energy ( current solution ), \n\t\tne is new energy ( new solution ),\n\t\tT is current temperature.\n\n\nWe use this algorithm to solve a Travelling salesman problem instance with 20 cities. The code is in `simann_example.swift`\n\n#See also\n\n[Simulated annealing on Wikipedia](https://en.wikipedia.org/wiki/Simulated_annealing) \n\n[Travelling salesman problem](https://en.wikipedia.org/wiki/Travelling_salesman_problem)\n\nWritten for Swift Algorithm Club by [Mike Taghavi](https://github.com/mitghi)\n"
  },
  {
    "path": "Simulated annealing/simann.swift",
    "content": "// The MIT License (MIT)\n// Copyright (c) 2017 Mike Taghavi (mitghi[at]me.com)\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#if os(OSX)\n  import Foundation\n#elseif os(Linux)\n  import Glibc\n#endif\n\nprotocol Clonable {\n  init(current: Self)\n}\n\n// MARK: - create a clone from instance\n\nextension Clonable {\n  func clone() -> Self {\n    return Self.init(current: self)\n  }\n}\n\nprotocol SAObject: Clonable {\n  var count: Int { get }\n  func randSwap(a: Int, b: Int)\n  func currentEnergy() -> Double\n  func shuffle()\n}\n\n// MARK: - create a new copy of elements\n\nextension Array where Element: Clonable {\n  func clone() -> Array {\n    var newArray = Array<Element>()\n    for elem in self {\n      newArray.append(elem.clone())\n    }\n    \n    return newArray\n  }\n}\n\ntypealias AcceptanceFunc = (Double, Double, Double) -> Double\n\nfunc SimulatedAnnealing<T: SAObject>(initial: T, temperature: Double, coolingRate: Double, acceptance: AcceptanceFunc) -> T {\n  // Step 1:\n  //  Calculate the initial feasible solution based on a random permutation.\n  //  Set best and current solutions to initial solution\n  \n  var temp: Double = temperature\n  var currentSolution = initial.clone()\n  currentSolution.shuffle()\n  var bestSolution = currentSolution.clone()\n\n  // Step 2:\n  //  Repeat while the system is still hot\n  //   Randomly modify the current solution by swapping its elements\n  //   Randomly decide if the new solution ( neighbor ) is acceptable and set current solution accordingly\n  //   Update the best solution *iff* it had improved ( lower energy = improvement )\n  //   Reduce temperature\n  \n  while temp > 1 {    \n    let newSolution: T = currentSolution.clone()\n    let pos1: Int = Int.random(in: 0 ..< newSolution.count)\n    let pos2: Int = Int.random(in: 0 ..< newSolution.count)\n    newSolution.randSwap(a: pos1, b: pos2)\n    let currentEnergy: Double  = currentSolution.currentEnergy()\n    let newEnergy: Double = newSolution.currentEnergy()\n    \n    if acceptance(currentEnergy, newEnergy, temp) > Double.random(in: 0 ..< 1) {\n      currentSolution = newSolution.clone()\n    }\n    if currentSolution.currentEnergy() < bestSolution.currentEnergy() {\n      bestSolution = currentSolution.clone()\n    }\n    \n    temp *= 1-coolingRate\n  }\n  \n  return bestSolution\n}\n"
  },
  {
    "path": "Simulated annealing/simann_example.swift",
    "content": "// The MIT License (MIT)\n// Copyright (c) 2017 Mike Taghavi (mitghi[at]me.com)\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n#if os(OSX)\n  import Foundation\n  import Cocoa\n#elseif os(Linux)\n  import Glibc\n#endif\n\nprotocol Clonable {\n  init(current: Self)\n}\n\nextension Clonable {\n  func clone() -> Self {\n    return Self.init(current: self)\n  }\n}\n\nprotocol SAObject: Clonable {\n  var count: Int { get }\n  func randSwap(a: Int, b: Int)\n  func currentEnergy() -> Double\n  func shuffle()\n}\n\n// MARK: - create a new copy of elements\n\nextension Array where Element: Clonable {\n  func clone() -> Array {\n    var newArray = Array<Element>()\n    for elem in self {\n      newArray.append(elem.clone())\n    }\n    \n    return newArray\n  }\n}\n\ntypealias Points = [Point]\ntypealias AcceptanceFunc = (Double, Double, Double) -> Double\n\nclass Point: Clonable {\n  var x: Int\n  var y: Int\n  \n  init(x: Int, y: Int) {\n    self.x = x\n    self.y = y\n  }\n  \n  required init(current: Point){\n    self.x = current.x\n    self.y = current.y\n  }\n}\n\n// MARK: - string representation\n\nextension Point: CustomStringConvertible {\n  public var description: String {\n    return \"Point(\\(x), \\(y))\"\n  }\n}\n\n// MARK: - return distance between two points using operator '<->'\n\ninfix operator <->: AdditionPrecedence\nextension Point {\n  static func <-> (left: Point, right: Point) -> Double {\n    let xDistance = (left.x - right.x)\n    let yDistance = (left.y - right.y)\n\n    return Double((xDistance * xDistance) + (yDistance * yDistance)).squareRoot()\n  }\n}\n\n\nclass Tour: SAObject {\n  var tour: Points\n  var energy: Double = 0.0\n  var count: Int {\n    get {\n      return self.tour.count\n    }\n  }\n  \n  init(points: Points){\n    self.tour = points.clone()\n  }\n  \n  required init(current: Tour) {\n    self.tour = current.tour.clone()\n  }\n}\n\n// MARK: - calculate current tour distance ( energy ).\n\nextension Tour {\n  func randSwap(a: Int, b: Int) -> Void {\n    let (cpos1, cpos2) = (self[a], self[b])\n    self[a] = cpos2\n    self[b] = cpos1\n  }\n\n  func currentEnergy() -> Double {\n    if self.energy == 0 {\n      var tourEnergy: Double = 0.0\n      for i in 0..<self.count {\n        let fromCity = self[i]\n        var destCity = self[0]\n        if i+1 < self.count {\n          destCity = self[i+1]\n        }\n        let e = fromCity<->destCity\n        tourEnergy = tourEnergy + e\n        \n      }\n      self.energy = tourEnergy\n    }\n    return self.energy\n  }\n\n  func shuffle() {\n    self.tour.shuffle()\n  }\n}\n\n// MARK: - subscript to manipulate elements of Tour.\n\nextension Tour {\n  subscript(index: Int) -> Point {\n    get {\n      return self.tour[index]\n    }\n    set(newValue) {\n      self.tour[index] = newValue\n    }\n  }\n}\n\nfunc SimulatedAnnealing<T: SAObject>(initial: T, temperature: Double, coolingRate: Double, acceptance: AcceptanceFunc) -> T {\n  var temp: Double = temperature\n  var currentSolution = initial.clone()\n  currentSolution.shuffle()\n  var bestSolution = currentSolution.clone()\n  print(\"Initial solution: \", bestSolution.currentEnergy())\n  \n  while temp > 1 {\n    let newSolution: T = currentSolution.clone()\n    let pos1: Int = Int.random(in: 0 ..< newSolution.count)\n    let pos2: Int = Int.random(in: 0 ..< newSolution.count)\n    newSolution.randSwap(a: pos1, b: pos2)\n    let currentEnergy: Double  = currentSolution.currentEnergy()\n    let newEnergy: Double = newSolution.currentEnergy()\n    \n    if acceptance(currentEnergy, newEnergy, temp) > Double.random(in: 0 ..< 1) {\n      currentSolution = newSolution.clone()\n    }\n    if currentSolution.currentEnergy() < bestSolution.currentEnergy() {\n      bestSolution = currentSolution.clone()\n    }\n    \n    temp *= 1-coolingRate\n  }\n  \n  print(\"Best solution: \", bestSolution.currentEnergy())\n  return bestSolution\n}\n\nlet points: [Point] = [\n  (60 , 200), (180, 200), (80 , 180), (140, 180),\n  (20 , 160), (100, 160), (200, 160), (140, 140),\n  (40 , 120), (100, 120), (180, 100), (60 , 80) ,\n  (120, 80) , (180, 60) , (20 , 40) , (100, 40) ,\n  (200, 40) , (20 , 20) , (60 , 20) , (160, 20) ,\n  ].map{ Point(x: $0.0, y: $0.1) }\n\nlet acceptance : AcceptanceFunc = {\n  (e: Double, ne: Double, te: Double) -> Double in\n  if ne < e {\n    return 1.0\n  }\n  return exp((e - ne) / te)\n}\n\nlet result: Tour = SimulatedAnnealing(initial     : Tour(points: points),\n                                      temperature : 100000.0,\n                                      coolingRate : 0.003,\n                                      acceptance  : acceptance)\n"
  },
  {
    "path": "Single-Source Shortest Paths (Weighted)/README.markdown",
    "content": "# Single-Source Shortest Paths\n\nThe Single-Source shortest path problem finds the shortest paths from a given source vertex to all other vertices in a directed weighted graph. Many variations exist on the problem, specifying whether or not edges may have negative values, whether cycles exist, or whether a path between a specific pair of vertices.\n\n## Bellman-Ford\n\nThe Bellman-Ford shortest paths algorithm finds the shortest paths to all vertices from a given source vertex `s` in a directed graph that may contain negative edge weights. It iterates over all edges for each other vertex in the graph, applying a relaxation to the current state of known shortest path weights. The intuition here is that a path will not contain more vertices than are present in the graph, so performing a pass over all edges `|V|-1` number of times is sufficient to compare all possible paths. \n\nAt each step, a value is stored for each vertex `v`, which is the weight of the current known shortest path `s`~>`v`. This value remains 0 for the source vertex itself, and all others are initially `∞`. Then, they are \"relaxed\" by applying the following test to each edge `e = (u, v)` (where `u` is a source vertex and `v` is a destination vertex for the directed edge):\n\n\tif weights[v] > weights[u] + e.weight {\n\t\tweights[v] = weights[u] + e.weight\n\t}\n\nBellman-Ford in essence only computes the lengths of the shortest paths, but can optionally maintain a structure that memoizes the predecessor of each vertex on its shortest path from the source vertex.  Then the paths themselves can be reconstructed by recursing through this structure from a destination vertex to the source vertex. This is maintained by simply adding the statement\n\n\tpredecessors[v] = u\n\t\ninside of the `if` statement's body above.\n\n### Example\n\nFor the following weighted directed graph:\n\n<img src=\"img/example_graph.png\" width=\"200px\" />\n\nlet's compute the shortest paths from vertex `s`. First, we prepare our `weights` and `predecessors` structures thusly:\n\n| weights | predecessors |\n| ------------- |:-------------:|\n| `weights[s] = 0` | `predecessors[s] = 1` |\n| `weights[t] = ∞` | `predecessors[t] = ø` |\n| `weights[x] = ∞` | `predecessors[x] = ø` |\n| `weights[y] = ∞` | `predecessors[y] = ø` |\n| `weights[z] = ∞` | `predecessors[z] = ø` |\n\nHere are their states after each relaxation iteration (each iteration is a pass over all edges, and there are 4 iterations total for this graph):\n\n###### Iteration 1:\n\n| weights | predecessors |\n| ------------- |:-------------:|\n| `weights[s] = 0` | `predecessors[s] = s` |\n| `weights[t] = 6` | `predecessors[t] = s` |\n| `weights[x] = 4` | `predecessors[x] = y` |\n| `weights[y] = 7` | `predecessors[y] = s` |\n| `weights[z] = 2` | `predecessors[z] = t` |\n\n###### Iteration 2:\n\n| weights | predecessors |\n| ------------- |:-------------:|\n| `weights[s] = 0` | `predecessors[s] = s` |\n| `weights[t] = 2` | `predecessors[t] = x` |\n| `weights[x] = 4` | `predecessors[x] = y` |\n| `weights[y] = 7` | `predecessors[y] = s` |\n| `weights[z] = 2` | `predecessors[z] = t` |\n\n###### Iteration 3:\n\n| weights | predecessors |\n| ------------- |:-------------:|\n| `weights[s] = 0` | `predecessors[s] = s` |\n| `weights[t] = 2` | `predecessors[t] = x` |\n| `weights[x] = 4` | `predecessors[x] = y` |\n| `weights[y] = 7` | `predecessors[y] = s` |\n| `weights[z] = -2` | `predecessors[z] = t` |\n\n###### Iteration 4:\n\n| weights | predecessors |\n| ------------- |:-------------:|\n| `weights[s] = 0` | `predecessors[s] = s` |\n| `weights[t] = 2` | `predecessors[t] = x` |\n| `weights[x] = 4` | `predecessors[x] = y` |\n| `weights[y] = 7` | `predecessors[y] = s` |\n| `weights[z] = -2` | `predecessors[z] = t` |\n\n#### Negative weight cycles\n\nAn additional useful property of the solution structure is that it can answer whether or not a negative weight cycle exists in the graph and is reachable from the source vertex. A negative weight cycle is a cycle whose sum of edge weights is negative. This means that shortest paths are not well defined in the graph from the specified source, because you can decrease the weight of a path by reentering the cycle, pushing the path's weight towards `-∞`. After fully relaxing the paths, simply running a check over each edge `e = (u, v)` to see if the weight of the shortest path to `v` is greater than the path to `u`, plus the edge weight itself, signals that the edge has a negative weight and would decrease the shortest path's weight further. Since we know we've already performed the relaxations enough times according to the intuition stated above, we can safely assume this further decrease of weight will continue infinitely.\n\n##### Example\n\nFor this example, we try to compute the shortest paths from `a`:\n\n<img src=\"img/negative_cycle_example.png\" width=\"200px\" />\n\nThe cycle `a`->`t`->`s`->`a` has a total edge weight of -9, therefore shortest paths for `a`~>`t` and `a`~>`s` are not well-defined. `a`~>`b` is also not well-defined because `b`->`t`->`s` is also a negative weight cycle.\n\nThis is confirmed after running the relaxation loop, and checking all the edges as mentioned above. For this graph, we would have after relaxation:\n\n| weights |\n| ------------- |\n| `weights[a] = -5` |\n| `weights[b] = -5` |\n| `weights[s] = -18` |\n| `weights[t] = -3` |\n\nOne of the edge checks we would perform afterwards would be the following:\n\n\te = (s, a)\n\te.weight = 4\n\tweight[a] > weight[s] + e.weight => -5 > -18 + 4 => -5 > -14 => true\n\t\nBecause this check is true, we know the graph has a negative weight cycle reachable from `a`.\n\n#### Complexity\n\nThe relaxation step requires constant time (`O(1)`) as it simply performs comparisons. That step is performed once per edge (`Θ(|E|)`), and the edges are iterated over `|V|-1` times. This would mean a total complexity of `Θ(|V||E|)`, but there is an optimization we can make: if the outer loop executes and no changes are made to the recorded weights, we can safely terminate the relaxation phase, which means it may execute in `O(|V|)` steps instead of `Θ(|V|)` steps (that is, the best case for any size graph is actually a constant number of iterations; the worst case is still iterating `|V|-1` times).\n\nThe check for negative weight cycles at the end is `O(|E|)` if we return once we find a hit. To find all negative weight cycles reachable from the source vertex, we'd have to iterate `Θ(|E|)` times (we currently do not attempt to report the cycles, we simply return a `nil` result if such a cycle is present).\n\nThe total running time of Bellman-Ford is therefore `O(|V||E|)`.\n\n## TODO\n\n- Dijkstra's algorithm for computing SSSP on a directed non-negative weighted graph\n\n# References\n\n- Chapter 24 of Introduction to Algorithms, Third Edition by Cormen, Leiserson, Rivest and Stein [https://mitpress.mit.edu/books/introduction-algorithms](https://mitpress.mit.edu/books/introduction-algorithms)\n- Wikipedia: [Bellman–Ford algorithm](https://en.wikipedia.org/wiki/Bellman–Ford_algorithm)\n\n*Written for Swift Algorithm Club by [Andrew McKnight](https://github.com/armcknight)*"
  },
  {
    "path": "Single-Source Shortest Paths (Weighted)/SSSP/BellmanFord.swift",
    "content": "//\n//  BellmanFord.swift\n//  SSSP\n//\n//  Created by Andrew McKnight on 5/8/16.\n//\n\nimport Foundation\nimport Graph\n\npublic struct BellmanFord<T> where T: Hashable {\n  public typealias Q = T\n}\n\n/**\n Encapsulation of the Bellman-Ford Single-Source Shortest Paths algorithm,\n which operates on a general directed graph that may contain negative edge weights.\n\n - note: In all complexity bounds, `V` is the number of vertices in the graph, and `E` is the number of edges.\n */\nextension BellmanFord: SSSPAlgorithm {\n\n  /**\n   Compute the shortest path from `source` to each other vertex in `graph`,\n   if such paths exist. Also report negative weight cycles reachable from `source`,\n   which are cycles whose sum of edge weights is negative.\n\n   - precondition: `graph` must have no negative weight cycles\n   - complexity: `O(VE)` time, `Θ(V)` space\n   - returns a `BellmanFordResult` struct which can be queried for\n   shortest paths and their total weights, or `nil` if a negative weight cycle exists\n */\n  public static func apply(_ graph: AbstractGraph<T>, source: Vertex<Q>) -> BellmanFordResult<T>? {\n    let vertices = graph.vertices\n    let edges = graph.edges\n\n    var predecessors = Array<Int?>(repeating: nil, count: vertices.count)\n    var weights = Array(repeating: Double.infinity, count: vertices.count)\n    predecessors[source.index] = source.index\n    weights[source.index] = 0\n\n    for _ in 0 ..< vertices.count - 1 {\n      var weightsUpdated = false\n      edges.forEach { edge in\n        let weight = edge.weight!\n        let relaxedDistance = weights[edge.from.index] + weight\n        let nextVertexIdx = edge.to.index\n        if relaxedDistance < weights[nextVertexIdx] {\n          predecessors[nextVertexIdx] = edge.from.index\n          weights[nextVertexIdx] = relaxedDistance\n          weightsUpdated = true\n        }\n      }\n      if !weightsUpdated {\n        break\n      }\n    }\n\n    // check for negative weight cycles reachable from the source vertex\n    // TO DO: modify to incorporate solution to 24.1-4, pg 654, to set the\n    //       weight of a path containing a negative weight cycle to -∞,\n    //       instead of returning nil for the entire result\n    for edge in edges {\n      if weights[edge.to.index] > weights[edge.from.index] + edge.weight! {\n        return nil\n      }\n    }\n\n    return BellmanFordResult(predecessors: predecessors, weights: weights)\n  }\n\n}\n\n/**\n `BellmanFordResult` encapsulates the result of the computation,\n namely the minimized distances, and the predecessor indices.\n\n It conforms to the `SSSPResult` procotol which provides methods to\n retrieve distances and paths between given pairs of start and end nodes.\n */\npublic struct BellmanFordResult<T> where T: Hashable {\n\n  fileprivate var predecessors: [Int?]\n  fileprivate var weights: [Double]\n\n}\n\nextension BellmanFordResult: SSSPResult {\n\n  /**\n   - returns: the total weight of the path from the source vertex to a destination.\n   This value is the minimal connected weight between the two vertices, or `nil` if no path exists\n   - complexity: `Θ(1)` time/space\n   */\n  public func distance(to: Vertex<T>) -> Double? {\n    let distance = weights[to.index]\n\n    guard distance != Double.infinity else {\n      return nil\n    }\n\n    return distance\n  }\n\n  /**\n   - returns: the reconstructed path from the source vertex to a destination,\n   as an array containing the data property of each vertex, or `nil` if no path exists\n   - complexity: `Θ(V)` time, `Θ(V^2)` space\n   */\n  public func path(to: Vertex<T>, inGraph graph: AbstractGraph<T>) -> [T]? {\n    guard weights[to.index] != Double.infinity else {\n      return nil\n    }\n\n    guard let path = recursePath(to: to, inGraph: graph, path: [to]) else {\n      return nil\n    }\n\n    return path.map { vertex in\n      return vertex.data\n    }\n  }\n\n  /**\n   The recursive component to rebuilding the shortest path between two vertices using predecessors.\n\n   - returns: the list of predecessors discovered so far, or `nil` if the next vertex has no predecessor\n   */\n  fileprivate func recursePath(to: Vertex<T>, inGraph graph: AbstractGraph<T>, path: [Vertex<T>]) -> [Vertex<T>]? {\n    guard let predecessorIdx = predecessors[to.index] else {\n      return nil\n    }\n\n    let predecessor = graph.vertices[predecessorIdx]\n    if predecessor.index == to.index {\n      return [ to ]\n    }\n\n    guard let buildPath = recursePath(to: predecessor, inGraph: graph, path: path) else {\n      return nil\n    }\n\n    return buildPath + [ to ]\n  }\n\n}\n"
  },
  {
    "path": "Single-Source Shortest Paths (Weighted)/SSSP/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>FMWK</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>$(CURRENT_PROJECT_VERSION)</string>\n\t<key>NSPrincipalClass</key>\n\t<string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Single-Source Shortest Paths (Weighted)/SSSP/SSSP.h",
    "content": "//\n//  SSSP.h\n//  SSSP\n//\n//  Created by Andrew McKnight on 5/8/16.\n//\n\n#import <Cocoa/Cocoa.h>\n\n//! Project version number for SSSP.\nFOUNDATION_EXPORT double SSSPVersionNumber;\n\n//! Project version string for SSSP.\nFOUNDATION_EXPORT const unsigned char SSSPVersionString[];\n\n// In this header, you should import all the public headers of your framework using statements like #import <SSSP/PublicHeader.h>\n\n\n"
  },
  {
    "path": "Single-Source Shortest Paths (Weighted)/SSSP/SSSP.swift",
    "content": "//\n//  SSSP.swift\n//  SSSP\n//\n//  Created by Andrew McKnight on 5/8/16.\n//\n\nimport Foundation\nimport Graph\n\n/**\n `SSSPAlgorithm` is a protocol for encapsulating a Single-Source Shortest Path algorithm.\n It provides a single function `apply` that accepts a subclass of `AbstractGraph` and returns\n an object conforming to `SSSPResult`.\n */\nprotocol SSSPAlgorithm {\n\n  associatedtype Q: Equatable, Hashable\n  associatedtype P: SSSPResult\n\n  static func apply(_ graph: AbstractGraph<Q>, source: Vertex<Q>) -> P?\n\n}\n\n/**\n `SSSPResult` is a protocol defining functions `distance` and `path`, allowing\n for opaque queries into the actual data structures that represent the SSSP\n solution according to the algorithm used.\n */\nprotocol SSSPResult {\n\n  associatedtype T: Equatable, Hashable\n\n  func distance(to: Vertex<T>) -> Double?\n  func path(to: Vertex<T>, inGraph graph: AbstractGraph<T>) -> [T]?\n}\n"
  },
  {
    "path": "Single-Source Shortest Paths (Weighted)/SSSP.playground/Contents.swift",
    "content": "import Graph\nimport SSSP\n\n// last checked with Xcode 9.0b4\n#if swift(>=4.0)\nprint(\"Hello, Swift 4!\")\n#endif\n\nlet graph = AdjacencyMatrixGraph<String>()\nlet s = graph.createVertex(\"s\")\nlet t = graph.createVertex(\"t\")\nlet x = graph.createVertex(\"x\")\nlet y = graph.createVertex(\"y\")\nlet z = graph.createVertex(\"z\")\n\ngraph.addDirectedEdge(s, to: t, withWeight: 6)\ngraph.addDirectedEdge(s, to: y, withWeight: 7)\n\ngraph.addDirectedEdge(t, to: x, withWeight: 5)\ngraph.addDirectedEdge(t, to: y, withWeight: 8)\ngraph.addDirectedEdge(t, to: z, withWeight: -4)\n\ngraph.addDirectedEdge(x, to: t, withWeight: -2)\n\ngraph.addDirectedEdge(y, to: x, withWeight: -3)\ngraph.addDirectedEdge(y, to: z, withWeight: 9)\n\ngraph.addDirectedEdge(z, to: s, withWeight: 2)\ngraph.addDirectedEdge(z, to: x, withWeight: 7)\n\nlet result = BellmanFord<String>.apply(graph, source: s)!\n\nlet path = result.path(to: z, inGraph: graph)\n"
  },
  {
    "path": "Single-Source Shortest Paths (Weighted)/SSSP.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Single-Source Shortest Paths (Weighted)/SSSP.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Single-Source Shortest Paths (Weighted)/SSSP.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t49763FF21CF08FC500202EA9 /* Graph.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 49763FEF1CF08FB100202EA9 /* Graph.framework */; };\n\t\t49BFA2971CDF86E100522D66 /* SSSP.h in Headers */ = {isa = PBXBuildFile; fileRef = 49BFA2961CDF86E100522D66 /* SSSP.h */; settings = {ATTRIBUTES = (Public, ); }; };\n\t\t49BFA29E1CDF86E100522D66 /* SSSP.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 49BFA2931CDF86E100522D66 /* SSSP.framework */; };\n\t\t49BFA2A31CDF86E100522D66 /* SSSPTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49BFA2A21CDF86E100522D66 /* SSSPTests.swift */; };\n\t\t49BFA2AE1CDF86FD00522D66 /* SSSP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49BFA2AD1CDF86FD00522D66 /* SSSP.swift */; };\n\t\t49BFA2B01CDF870600522D66 /* BellmanFord.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49BFA2AF1CDF870600522D66 /* BellmanFord.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t49763FEE1CF08FB100202EA9 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 49763FE91CF08FB100202EA9 /* Graph.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 49BFA2FD1CDF886B00522D66;\n\t\t\tremoteInfo = Graph;\n\t\t};\n\t\t49763FF01CF08FB100202EA9 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 49763FE91CF08FB100202EA9 /* Graph.xcodeproj */;\n\t\t\tproxyType = 2;\n\t\t\tremoteGlobalIDString = 49BFA3071CDF886B00522D66;\n\t\t\tremoteInfo = GraphTests;\n\t\t};\n\t\t49763FF31CF08FC900202EA9 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 49763FE91CF08FB100202EA9 /* Graph.xcodeproj */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 49BFA2FC1CDF886B00522D66;\n\t\t\tremoteInfo = Graph;\n\t\t};\n\t\t49BFA29F1CDF86E100522D66 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 49BFA28A1CDF86E100522D66 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 49BFA2921CDF86E100522D66;\n\t\t\tremoteInfo = SSSP;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\t49763FE91CF08FB100202EA9 /* Graph.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = \"wrapper.pb-project\"; name = Graph.xcodeproj; path = ../Graph/Graph.xcodeproj; sourceTree = \"<group>\"; };\n\t\t49BFA2931CDF86E100522D66 /* SSSP.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SSSP.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t49BFA2961CDF86E100522D66 /* SSSP.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SSSP.h; sourceTree = \"<group>\"; };\n\t\t49BFA2981CDF86E100522D66 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t49BFA29D1CDF86E100522D66 /* SSSPTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SSSPTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t49BFA2A21CDF86E100522D66 /* SSSPTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SSSPTests.swift; sourceTree = \"<group>\"; };\n\t\t49BFA2A41CDF86E100522D66 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t49BFA2AD1CDF86FD00522D66 /* SSSP.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SSSP.swift; sourceTree = \"<group>\"; };\n\t\t49BFA2AF1CDF870600522D66 /* BellmanFord.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BellmanFord.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t49BFA28F1CDF86E100522D66 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t49763FF21CF08FC500202EA9 /* Graph.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t49BFA29A1CDF86E100522D66 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t49BFA29E1CDF86E100522D66 /* SSSP.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t49763FEA1CF08FB100202EA9 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t49763FEF1CF08FB100202EA9 /* Graph.framework */,\n\t\t\t\t49763FF11CF08FB100202EA9 /* GraphTests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t49BFA2891CDF86E100522D66 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t49763FE91CF08FB100202EA9 /* Graph.xcodeproj */,\n\t\t\t\t49BFA2951CDF86E100522D66 /* SSSP */,\n\t\t\t\t49BFA2A11CDF86E100522D66 /* SSSPTests */,\n\t\t\t\t49BFA2941CDF86E100522D66 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t49BFA2941CDF86E100522D66 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t49BFA2931CDF86E100522D66 /* SSSP.framework */,\n\t\t\t\t49BFA29D1CDF86E100522D66 /* SSSPTests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t49BFA2951CDF86E100522D66 /* SSSP */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t49BFA2961CDF86E100522D66 /* SSSP.h */,\n\t\t\t\t49BFA2AD1CDF86FD00522D66 /* SSSP.swift */,\n\t\t\t\t49BFA2AF1CDF870600522D66 /* BellmanFord.swift */,\n\t\t\t\t49BFA2981CDF86E100522D66 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = SSSP;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t49BFA2A11CDF86E100522D66 /* SSSPTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t49BFA2A21CDF86E100522D66 /* SSSPTests.swift */,\n\t\t\t\t49BFA2A41CDF86E100522D66 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = SSSPTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXHeadersBuildPhase section */\n\t\t49BFA2901CDF86E100522D66 /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t49BFA2971CDF86E100522D66 /* SSSP.h in Headers */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXHeadersBuildPhase section */\n\n/* Begin PBXNativeTarget section */\n\t\t49BFA2921CDF86E100522D66 /* SSSP */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 49BFA2A71CDF86E100522D66 /* Build configuration list for PBXNativeTarget \"SSSP\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t49BFA28E1CDF86E100522D66 /* Sources */,\n\t\t\t\t49BFA28F1CDF86E100522D66 /* Frameworks */,\n\t\t\t\t49BFA2901CDF86E100522D66 /* Headers */,\n\t\t\t\t49BFA2911CDF86E100522D66 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t49763FF41CF08FC900202EA9 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = SSSP;\n\t\t\tproductName = SSSP;\n\t\t\tproductReference = 49BFA2931CDF86E100522D66 /* SSSP.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t49BFA29C1CDF86E100522D66 /* SSSPTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 49BFA2AA1CDF86E100522D66 /* Build configuration list for PBXNativeTarget \"SSSPTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t49BFA2991CDF86E100522D66 /* Sources */,\n\t\t\t\t49BFA29A1CDF86E100522D66 /* Frameworks */,\n\t\t\t\t49BFA29B1CDF86E100522D66 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t49BFA2A01CDF86E100522D66 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = SSSPTests;\n\t\t\tproductName = SSSPTests;\n\t\t\tproductReference = 49BFA29D1CDF86E100522D66 /* SSSPTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t49BFA28A1CDF86E100522D66 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0730;\n\t\t\t\tLastUpgradeCheck = 0810;\n\t\t\t\tORGANIZATIONNAME = \"Swift Algorithm Club\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t49BFA2921CDF86E100522D66 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.3;\n\t\t\t\t\t\tLastSwiftMigration = 0810;\n\t\t\t\t\t};\n\t\t\t\t\t49BFA29C1CDF86E100522D66 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.3;\n\t\t\t\t\t\tLastSwiftMigration = 0810;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 49BFA28D1CDF86E100522D66 /* Build configuration list for PBXProject \"SSSP\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t);\n\t\t\tmainGroup = 49BFA2891CDF86E100522D66;\n\t\t\tproductRefGroup = 49BFA2941CDF86E100522D66 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectReferences = (\n\t\t\t\t{\n\t\t\t\t\tProductGroup = 49763FEA1CF08FB100202EA9 /* Products */;\n\t\t\t\t\tProjectRef = 49763FE91CF08FB100202EA9 /* Graph.xcodeproj */;\n\t\t\t\t},\n\t\t\t);\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t49BFA2921CDF86E100522D66 /* SSSP */,\n\t\t\t\t49BFA29C1CDF86E100522D66 /* SSSPTests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXReferenceProxy section */\n\t\t49763FEF1CF08FB100202EA9 /* Graph.framework */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = wrapper.framework;\n\t\t\tpath = Graph.framework;\n\t\t\tremoteRef = 49763FEE1CF08FB100202EA9 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n\t\t49763FF11CF08FB100202EA9 /* GraphTests.xctest */ = {\n\t\t\tisa = PBXReferenceProxy;\n\t\t\tfileType = wrapper.cfbundle;\n\t\t\tpath = GraphTests.xctest;\n\t\t\tremoteRef = 49763FF01CF08FB100202EA9 /* PBXContainerItemProxy */;\n\t\t\tsourceTree = BUILT_PRODUCTS_DIR;\n\t\t};\n/* End PBXReferenceProxy section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t49BFA2911CDF86E100522D66 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t49BFA29B1CDF86E100522D66 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t49BFA28E1CDF86E100522D66 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t49BFA2B01CDF870600522D66 /* BellmanFord.swift in Sources */,\n\t\t\t\t49BFA2AE1CDF86FD00522D66 /* SSSP.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t49BFA2991CDF86E100522D66 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t49BFA2A31CDF86E100522D66 /* SSSPTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t49763FF41CF08FC900202EA9 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\tname = Graph;\n\t\t\ttargetProxy = 49763FF31CF08FC900202EA9 /* PBXContainerItemProxy */;\n\t\t};\n\t\t49BFA2A01CDF86E100522D66 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 49BFA2921CDF86E100522D66 /* SSSP */;\n\t\t\ttargetProxy = 49BFA29F1CDF86E100522D66 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin XCBuildConfiguration section */\n\t\t49BFA2A51CDF86E100522D66 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t49BFA2A61CDF86E100522D66 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t49BFA2A81CDF86E100522D66 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tFRAMEWORK_VERSION = A;\n\t\t\t\tINFOPLIST_FILE = SSSP/Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.swift-algorithm-club.SSSP\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t49BFA2A91CDF86E100522D66 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tFRAMEWORK_VERSION = A;\n\t\t\t\tINFOPLIST_FILE = SSSP/Info.plist;\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.swift-algorithm-club.SSSP\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t49BFA2AB1CDF86E100522D66 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = SSSPTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.swift-algorithm-club.SSSPTests\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t49BFA2AC1CDF86E100522D66 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = SSSPTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"com.swift-algorithm-club.SSSPTests\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t49BFA28D1CDF86E100522D66 /* Build configuration list for PBXProject \"SSSP\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t49BFA2A51CDF86E100522D66 /* Debug */,\n\t\t\t\t49BFA2A61CDF86E100522D66 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t49BFA2A71CDF86E100522D66 /* Build configuration list for PBXNativeTarget \"SSSP\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t49BFA2A81CDF86E100522D66 /* Debug */,\n\t\t\t\t49BFA2A91CDF86E100522D66 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t49BFA2AA1CDF86E100522D66 /* Build configuration list for PBXNativeTarget \"SSSPTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t49BFA2AB1CDF86E100522D66 /* Debug */,\n\t\t\t\t49BFA2AC1CDF86E100522D66 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 49BFA28A1CDF86E100522D66 /* Project object */;\n}\n"
  },
  {
    "path": "Single-Source Shortest Paths (Weighted)/SSSP.xcodeproj/xcshareddata/xcschemes/SSSP.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0810\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"49BFA2921CDF86E100522D66\"\n               BuildableName = \"SSSP.framework\"\n               BlueprintName = \"SSSP\"\n               ReferencedContainer = \"container:SSSP.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"49BFA29C1CDF86E100522D66\"\n               BuildableName = \"SSSPTests.xctest\"\n               BlueprintName = \"SSSPTests\"\n               ReferencedContainer = \"container:SSSP.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"49BFA2921CDF86E100522D66\"\n            BuildableName = \"SSSP.framework\"\n            BlueprintName = \"SSSP\"\n            ReferencedContainer = \"container:SSSP.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"49BFA2921CDF86E100522D66\"\n            BuildableName = \"SSSP.framework\"\n            BlueprintName = \"SSSP\"\n            ReferencedContainer = \"container:SSSP.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"49BFA2921CDF86E100522D66\"\n            BuildableName = \"SSSP.framework\"\n            BlueprintName = \"SSSP\"\n            ReferencedContainer = \"container:SSSP.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Single-Source Shortest Paths (Weighted)/SSSP.xcodeproj/xcshareddata/xcschemes/SSSPTests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0810\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"49BFA29C1CDF86E100522D66\"\n               BuildableName = \"SSSPTests.xctest\"\n               BlueprintName = \"SSSPTests\"\n               ReferencedContainer = \"container:SSSP.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"49BFA29C1CDF86E100522D66\"\n               BuildableName = \"SSSPTests.xctest\"\n               BlueprintName = \"SSSPTests\"\n               ReferencedContainer = \"container:SSSP.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"49BFA29C1CDF86E100522D66\"\n            BuildableName = \"SSSPTests.xctest\"\n            BlueprintName = \"SSSPTests\"\n            ReferencedContainer = \"container:SSSP.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"49BFA29C1CDF86E100522D66\"\n            BuildableName = \"SSSPTests.xctest\"\n            BlueprintName = \"SSSPTests\"\n            ReferencedContainer = \"container:SSSP.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Single-Source Shortest Paths (Weighted)/SSSP.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:SSSP.playground\">\n   </FileRef>\n   <FileRef\n      location = \"group:SSSP.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Single-Source Shortest Paths (Weighted)/SSSP.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Single-Source Shortest Paths (Weighted)/SSSPTests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Single-Source Shortest Paths (Weighted)/SSSPTests/SSSPTests.swift",
    "content": "//\n//  SSSPTests.swift\n//  SSSPTests\n//\n//  Created by Andrew McKnight on 5/8/16.\n//\n\nimport Graph\nimport XCTest\n@testable import SSSP\n\nclass SSSPTests: XCTestCase {\n  \n  func testSwift4() {\n    // last checked with Xcode 9.0b4\n    #if swift(>=4.0)\n      print(\"Hello, Swift 4!\")\n    #endif\n  }\n\n  /**\n   See Figure 24.4 of “Introduction to Algorithms” by Cormen et al, 3rd ed., pg 652\n   */\n  func testExampleFromBook() {\n    let graph = AdjacencyMatrixGraph<String>()\n    let s = graph.createVertex(\"s\")\n    let t = graph.createVertex(\"t\")\n    let x = graph.createVertex(\"x\")\n    let y = graph.createVertex(\"y\")\n    let z = graph.createVertex(\"z\")\n\n    graph.addDirectedEdge(s, to: t, withWeight: 6)\n    graph.addDirectedEdge(s, to: y, withWeight: 7)\n\n    graph.addDirectedEdge(t, to: x, withWeight: 5)\n    graph.addDirectedEdge(t, to: y, withWeight: 8)\n    graph.addDirectedEdge(t, to: z, withWeight: -4)\n\n    graph.addDirectedEdge(x, to: t, withWeight: -2)\n\n    graph.addDirectedEdge(y, to: x, withWeight: -3)\n    graph.addDirectedEdge(y, to: z, withWeight: 9)\n\n    graph.addDirectedEdge(z, to: s, withWeight: 2)\n    graph.addDirectedEdge(z, to: x, withWeight: 7)\n\n    let result = BellmanFord<String>.apply(graph, source: s)!\n\n    let expectedPath = [\"s\", \"y\", \"x\", \"t\", \"z\"]\n    let computedPath = result.path(to: z, inGraph: graph)!\n    XCTAssertEqual(expectedPath, computedPath, \"expected path of \\(expectedPath) but got \\(computedPath)\")\n\n    let expectedWeight = -2.0\n    let computedWeight = result.distance(to: z)\n    XCTAssertEqual(expectedWeight, computedWeight, \"expected weight of \\(expectedWeight) but got \\(computedWeight)\")\n  }\n\n  func testSimpleExample() {\n    let graph = AdjacencyMatrixGraph<String>()\n    let a = graph.createVertex(\"a\")\n    let b = graph.createVertex(\"b\")\n    let c = graph.createVertex(\"c\")\n    let d = graph.createVertex(\"d\")\n    let e = graph.createVertex(\"e\")\n\n    graph.addDirectedEdge(a, to: b, withWeight: 4)\n    graph.addDirectedEdge(a, to: c, withWeight: 5)\n    graph.addDirectedEdge(a, to: d, withWeight: 8)\n\n    graph.addDirectedEdge(b, to: c, withWeight: -2)\n\n    graph.addDirectedEdge(c, to: e, withWeight: 4)\n\n    graph.addDirectedEdge(d, to: e, withWeight: 2)\n\n    graph.addDirectedEdge(e, to: d, withWeight: 1)\n\n    let result = BellmanFord<String>.apply(graph, source: a)!\n\n    let expectedPath = [\"a\", \"b\", \"c\", \"e\", \"d\"]\n    let computedPath = result.path(to: d, inGraph: graph)!\n    XCTAssertEqual(expectedPath, computedPath, \"expected path of \\(expectedPath) but got \\(computedPath)\")\n\n    let expectedWeight = 7.0\n    let computedWeight = result.distance(to: d)\n    XCTAssertEqual(expectedWeight, computedWeight, \"expected weight of \\(expectedWeight) but got \\(computedWeight)\")\n  }\n\n  /**\n   Construct a nearly bipartite graph, except one vertex only has out-edges. Then no path should exist from the source to that vertex.\n   */\n  func testGraphWithUnreachableVertex() {\n    let graph = AdjacencyMatrixGraph<String>()\n    let a = graph.createVertex(\"a\")\n    let b = graph.createVertex(\"b\")\n    let s = graph.createVertex(\"s\")\n    let t = graph.createVertex(\"t\")\n\n    graph.addDirectedEdge(a, to: s, withWeight: 9)\n    graph.addDirectedEdge(a, to: t, withWeight: 2)\n\n    graph.addDirectedEdge(b, to: a, withWeight: 1)\n    graph.addDirectedEdge(b, to: s, withWeight: 2)\n    graph.addDirectedEdge(b, to: t, withWeight: 3)\n\n    graph.addDirectedEdge(s, to: a, withWeight: 4)\n    graph.addDirectedEdge(s, to: t, withWeight: 1)\n\n    graph.addDirectedEdge(t, to: a, withWeight: 7)\n    graph.addDirectedEdge(t, to: s, withWeight: 5)\n\n    let result = BellmanFord<String>.apply(graph, source: a)!\n\n    XCTAssertNil(result.path(to: b, inGraph: graph), \"a path should not be defined from a ~> b\")\n    XCTAssertNil(result.distance(to: b), \"a path should not be defined from a ~> b\")\n    XCTAssertNotNil(result.path(to: s, inGraph: graph), \"a path should be defined from a ~> s\")\n    XCTAssertNotNil(result.distance(to: s), \"a path should be defined from a ~> s\")\n    XCTAssertNotNil(result.path(to: t, inGraph: graph), \"a path should be defined from a ~> t\")\n    XCTAssertNotNil(result.distance(to: t), \"a path should be defined from a ~> t\")\n  }\n\n  func testNegativeWeightCycle() {\n    let graph = AdjacencyMatrixGraph<String>()\n    let a = graph.createVertex(\"a\")\n    let b = graph.createVertex(\"b\")\n    let s = graph.createVertex(\"s\")\n    let t = graph.createVertex(\"t\")\n\n    graph.addDirectedEdge(a, to: t, withWeight: 2)\n\n    graph.addDirectedEdge(b, to: t, withWeight: 5)\n\n    graph.addDirectedEdge(s, to: a, withWeight: 4)\n    graph.addDirectedEdge(s, to: b, withWeight: 4)\n\n    graph.addDirectedEdge(t, to: s, withWeight: -15)\n\n    XCTAssertNil(BellmanFord<String>.apply(graph, source: s), \"negative weight cycle not reported\")\n  }\n\n}\n"
  },
  {
    "path": "Singly Linked List/KeyValuePair.swift",
    "content": "/// Conformers of this protocol represent a pair of comparable values\n/// This can be useful in many data structures and algorithms where items\n/// stored contain a value, but are ordered or retrieved according to a key.\npublic protocol KeyValuePair : Comparable {\n    \n  associatedtype K : Comparable, Hashable\n  associatedtype V : Comparable, Hashable\n  \n  // Identifier used in many algorithms to search by, order by, etc\n  var key : K {get set}\n  \n  // A data container\n  var value : V {get set}\n  \n  \n  /// Initializer\n  ///\n  /// - Parameters:\n  ///   - key: Identifier used in many algorithms to search by, order by, etc.\n  ///   - value: A data container.\n  init(key: K, value: V)\n  \n  \n  /// Creates a copy\n  ///\n  /// - Abstract: Conformers of this class can be either value or reference types.\n  ///   Some algorithms might need to guarantee that a conformer instance gets copied.\n  ///   This will perform an innecessary in the case of value types.\n  ///   TODO: is there a better way?\n  /// - Returns: A new instance with the old one's values copied.\n  func copy() -> Self\n}\n\n\n/// Conformance to Equatable and Comparable protocols\nextension KeyValuePair {\n    \n  // MARK: - Equatable protocol\n  public static func ==(lhs: Self, rhs: Self) -> Bool {\n    return lhs.key == rhs.key\n  }\n  \n  \n  \n  // MARK: - Comparable protocol\n  \n  public static func <(lhs: Self, rhs: Self) -> Bool {\n    return lhs.key < rhs.key\n  }\n  \n  public static func <=(lhs: Self, rhs: Self) -> Bool {\n    return lhs.key <= rhs.key\n  }\n  \n  public static func >=(lhs: Self, rhs: Self) -> Bool {\n    return lhs.key >= rhs.key\n  }\n  \n  public static func >(lhs: Self, rhs: Self) -> Bool {\n    return lhs.key > rhs.key\n  }\n}\n\n\n\n/// Concrete impletation of a KeyValuePair where  both the key and the value\n/// are Integers.\nstruct IntegerPair : KeyValuePair {\n    \n  // MARK - KeyValuePair protocol\n  var key : Int\n  var value : Int\n  \n  func copy() -> IntegerPair {\n    return IntegerPair(key: self.key, value: self.value)\n  }\n}\n"
  },
  {
    "path": "Singly Linked List/README.markdown",
    "content": "# Singly-Linked List\n\n#### How is this different to the Linked List implementation?\nThe existing Linked list implementation represents the same concept. However, the existing implementation has reference semantics and does not conform to the Collection protocol implemented in the Swift's standard Library. What SinglyLinkedList aims to contribute is a more idiomatic Swift implementation, that uses value semantics and copy-on-write as well as conforms to the collection protocol.\n\n#### Conceptual representation\nA Singly linked list is a non-contiguous sequence of data items in memory. Each element links to the next via a memory reference. Additionally, this implementation keeps track of the last element, which can be retrived in order O(1). However, the list can only be traversed from head to tail.\n\n    +--------+    +--------+    +--------+    +--------+\n    |        |    |        |    |        |    |        |\n    | node 0 |--->| node 1 |--->| node 2 |--->| node 3 |---> nil\n    |        |    |        |    |        |    |        |\n    +--------+    +--------+    +--------+    +--------+\n    ^                                         ^\n    |                                         |\n    Head                                      Tail\n\nEach element in the list is represented with an instance of SinglyLinkedListNode class, which basically contains some data and a reference of optional type to the next node, which means that the last node's next reference is `nil`.\n\n#### In-memory representation\nIn Swift, data types can have value or reference semantics. This implementation of a singly-linked list uses value semantics. Support for copy-on-write has been added in order to improve performance and delay copying the elements of the array until strictly necessary.\n\nThe image below shows how initially, after variable `l2` is assigned `l1`, a new instance of the struct SinglyLinkedList is created. Nevertheless, the indirect storage is still shared as indicated by the references that both l1 and l2 have pointing to a common area in memory.\n\n![alt text](Images/SharedIndirectStorage.png \"Two linked lists sharing the indirect storage\")\n\nOnce a mutating operation happens --for example on `l2` to append a new element--, then the indirect storage and all nodes in the list is actually copied and the references from `l1` and `l2` are updated. This is ilustrated in the following figure.\n\n![alt text](Images/CopiedIndirectStorage.png \"A copy is created after editing one of the lists\")\n\n#### Implementation details\n1. Direct access to the tail in O(1) by keeping a reference that gets updated only when an operation to the list modifies the tail.\n2. Value semantics. This implementation of a singly-linked list uses a struct. When the list struct is assigned into another variable or passed as an argument to a function, a copy of the struct is made.\n3. Copy-on write. Instances of SinglyLinkedList have an internal reference to an indirect storage allocated in the heap. When a copy of the list is made (according to its value semantics) the indirect storage is initialy shared between the copies. This means that a potentially large list can be accessed to read values in it without an expensive copy having to take place. However, as soon as there is a write access to the indirect storage when there are more than one instances referencing to it, a copy will be performed to guarantee value semantics.\n4. Conformance to the Collection protocol.\n\n\n\n\n\n## Performance of linked lists\n\nEDITION\n- *append*: Appends a new node to the end of the list. This method will modify the list's tail. If the list is empty, it will also modify the head. This operation's time complexity is *O(1)* since there's a reference to the tail node in this implementation.\n- *prepend*: Inserts a new node at the start of the list. If the list is empty, it will also modify the head. This operation's time complexity is *O(1)* since there's a reference to the head node.\n- *delete*: Finds a node in the list and deletes it. This operation's time complexity has an upper bound described by a linear function; O(n).\n\nSEARCH\n- find k-th to last element. Given a list with `n` number of elements and `k` being the passed parameter with `0` <= `k` <= `n`, this method has *O(k)*.\n\n## Conforming to the Collection protocol\nCollections are sequences, therefore the first step is to conform to the Sequence protocol.\n\n```\nextension SinglyLinkedList: Sequence {\n    public func makeIterator() -> SinglyLinkedListForwardIterator<T> {\n        return SinglyLinkedListForwardIterator(head: self.storage.head)\n    }\n}\n```\n\nWe have used `SinglyLinkedListForwardIterator` an iterator class to keep track of the progress while iterating the structure:\n\n```\npublic struct SinglyLinkedListForwardIterator<T> : IteratorProtocol {\n\n    public typealias Element = T\n\n    private(set) var head: SinglyLinkedListNode<T>?\n\n    mutating public func next() -> T? {\n        let result = self.head?.value\n        self.head = self.head?.next\n        return result\n    }\n}\n```\n\nNext, a collection needs to be indexable. Indexes are implemented by the data structure class. We have encapsulated this knowledge in instances of the class `SinglyLinkedListIndex`. \n\n```\npublic struct SinglyLinkedListIndex<T>: Comparable {\n    fileprivate let node: SinglyLinkedListNode<T>?\n    fileprivate let tag: Int\n\n    public static func==<T>(lhs: SinglyLinkedListIndex<T>, rhs: SinglyLinkedListIndex<T>) -> Bool {\n        return (lhs.tag == rhs.tag)\n    }\n\n    public static func< <T>(lhs: SinglyLinkedListIndex<T>, rhs: SinglyLinkedListIndex<T>) -> Bool {\n        return (lhs.tag < rhs.tag)\n    }\n}\n```\n\nFinally, the methods in the collection to manipulate indexes are implemented below:\n- startIndex: Index of the first element. Can be calculated with O(1).\n- endIndex: Index that follows the last valid index in the collection. That is, the index that follows the tail's index. Can be calculated with O(1) if the count of elements is kept internally. However, the implementation below is O(n) with `n` being the number of elements in the list. \n\n```\nextension SinglyLinkedList : Collection {\n\n    public typealias Index = SinglyLinkedListIndex<T>\n\n    public var startIndex: Index {\n        get {\n            return SinglyLinkedListIndex<T>(node: self.storage.head, tag: 0)\n        }\n    }\n\npublic var endIndex: Index {\n    get {\n        if let h = self.storage.head {\n        let (_, numberOfElements) = findTail(in: h)\n            return SinglyLinkedListIndex<T>(node: h, tag: numberOfElements)\n        } else {\n            return SinglyLinkedListIndex<T>(node: nil, tag: self.startIndex.tag)\n        }\n    }\n}\n\npublic subscript(position: Index) -> T {\n    get {\n        return position.node!.value\n    }\n}\n\npublic func index(after idx: Index) -> Index {\n    return SinglyLinkedListIndex<T>(node: idx.node?.next, tag: idx.tag+1)\n    }\n}\n```\n\nConforming to the Collection protocol allows our class SinglyLinkedList to take adventage of all the collection methods included in the Stardard Library.\n\n*Written by Borja Arias Drake*\n"
  },
  {
    "path": "Singly Linked List/SinglyLinkedList.playground/Contents.swift",
    "content": "//: # Linked Lists\n\n// For best results, don't forget to select \"Show Rendered Markup\" from XCode's \"Editor\" menu\n\n//: Linked List Class Declaration:\n// last checked with Xcode 9M136h\n#if swift(>=4.0)\nprint(\"Hello, Swift 4!\")\n#endif\n\n//: We will start by defining a protocol that elements inserted into this implementation of a List will conform to. This is useful, because many algorithms are only interested in a key that all elements have.\n\n/// Conformers of this protocol represent a pair of comparable values\n/// This can be useful in many data structures and algorithms where items\n/// stored contain a value, but are ordered or retrieved according to a key.\npublic protocol KeyValuePair : Comparable {\n    \n    associatedtype K : Comparable, Hashable\n    associatedtype V : Comparable, Hashable\n    \n    // Identifier used in many algorithms to search by, order by, etc\n    var key : K {get set}\n    \n    // A data container\n    var value : V {get set}\n    \n    \n    /// Initializer\n    ///\n    /// - Parameters:\n    ///   - key: Identifier used in many algorithms to search by, order by, etc.\n    ///   - value: A data container.\n    init(key: K, value: V)\n    \n    \n    /// Creates a copy\n    ///\n    /// - Abstract: Conformers of this class can be either value or reference types.\n    ///   Some algorithms might need to guarantee that a conformer instance gets copied.\n    ///   This will perform an innecessary in the case of value types.\n    ///   TODO: is there a better way?\n    /// - Returns: A new instance with the old one's values copied.\n    func copy() -> Self\n}\n\n\n/// Conformance to Equatable and Comparable protocols\nextension KeyValuePair {\n    \n    // MARK: - Equatable protocol\n    public static func ==(lhs: Self, rhs: Self) -> Bool {\n        return lhs.key == rhs.key\n    }\n    \n    \n    \n    // MARK: - Comparable protocol\n    \n    public static func <(lhs: Self, rhs: Self) -> Bool {\n        return lhs.key < rhs.key\n    }\n    \n    public static func <=(lhs: Self, rhs: Self) -> Bool {\n        return lhs.key <= rhs.key\n    }\n    \n    public static func >=(lhs: Self, rhs: Self) -> Bool {\n        return lhs.key >= rhs.key\n    }\n    \n    public static func >(lhs: Self, rhs: Self) -> Bool {\n        return lhs.key > rhs.key\n    }\n}\n\n//: Concrete impletation of a KeyValuePair where  both the key and the value that we'll use in the examples in this playground\n\nstruct IntegerPair : KeyValuePair {\n    \n    // MARK - KeyValuePair protocol\n    var key : Int\n    var value : Int\n    \n    func copy() -> IntegerPair {\n        return IntegerPair(key: self.key, value: self.value)\n    }\n}\n\n//: Lists are usually used as queues. As an example, we'll define these expectations in a protocol and we'll make the the SinglyLinkedList class conform to it.\n\n/// Data structure that provides FIFO access\nprotocol Queue\n{\n    associatedtype Item\n    \n    \n    /// Adds an element to the queue\n    ///\n    /// - Parameter item: Item to be added\n    /// - Throws: There are cases where the operation might fail. For example if there is not enough space.\n    mutating func enqueue(item: Item) throws\n    \n    \n    /// Returns the oldest element in the queue.\n    ///\n    /// - Returns: The oldest element in the queue. It does not dequeue it.\n    func getFirst() -> Item?\n    \n    \n    /// Dequeues the oldest element in the queue.\n    ///\n    /// - Returns: The oldest element in the queue, which gets removed from it.\n    mutating func dequeue() -> Item?\n}\n\n\n//: Next, we are going to implement a list that has value semantics. Value semantics imply that the values will be copied when assigned and passed as a parameter to functions and methods. In order to prevent unnecesasry copies, Swift uses a technique called copy-on-write; copies are only performed when a mutating operation is performed on an instance that is referenced by more than one objects. In Swift, this is ahieved with an additional level of indirection, an internal class instance, therefore with reference semantics, that will be shared, until a mutating operation occurs.\n\n\n/// Helper class to implement copy-on-write\nfileprivate class IndirectStorage<T> {\n    \n    var head: SinglyLinkedListNode<T>?\n    \n    var tail: SinglyLinkedListNode<T>?\n    \n    init(head: SinglyLinkedListNode<T>?, tail: SinglyLinkedListNode<T>?) {\n        self.head = head\n        self.tail = tail\n    }\n    \n    convenience init() {\n        self.init(head: nil, tail: nil)\n    }\n}\n\n\n//: Node of the list\n\n\n// MARK: - NODE -\n\n/// A node is the building block of a linked list.\n/// It can be used on its own to create linked lists. However users of this class,\n/// will need to manipulate references directly.\npublic class SinglyLinkedListNode<T> {\n    \n    /// Data container\n    public var value: T\n    \n    /// Link to the next node\n    public var next: SinglyLinkedListNode<T>?\n    \n    /// Designated initializer\n    ///\n    /// - Parameter value: A value\n    public init(value: T) {\n        self.value = value\n    }\n}\n\n//: The list with value semantics\n\n// MARK: - LINKED LIST -\n\n/// Data structure to hold a collection of items.\n/// Each nodes contains a reference to the next node.\n/// The last node does not reference any other node.\n/// This class implements value semantics based on copy-on-write.\n///\n/// However, the elements contained in the list, will be shallow copied if they\n/// implement reference semantics.\npublic struct SinglyLinkedList<T>\n{\n    // MARK: PROPERTIES\n    \n    // A level of inderiction, with reference semantics to allow easy\n    // detection of when there are more than one references of the storage.\n    private var storage: IndirectStorage<T>\n    \n    /// Whenever there's a change that potentially can change the value, this reference to the\n    /// storage should be used to guarantee that a new copy is created and written on.\n    private var storageForWritting: IndirectStorage<T> {\n        \n        mutating get {\n            if !isKnownUniquelyReferenced(&self.storage) {\n                self.storage = self.copyStorage()\n            }\n            return self.storage\n        }\n    }\n    \n    /// Returns the last element in the collection\n    public var last: T? {\n        get {\n            return self.storage.tail?.value\n        }\n    }\n    \n    \n    \n    // MARK: INITIALIZERS\n    \n    /// Creates a list with the given node.\n    /// NOTE: This method can break value semantics by accepting a node.\n    ///\n    /// - Parameter head: First node\n    internal init(head: SinglyLinkedListNode<T>)\n    {\n        self.storage = IndirectStorage()\n        self.append(node: head)\n    }\n    \n    \n    /// Creates a list with a single element\n    ///\n    /// - Parameter value: element to populate the list with\n    public init(value: T)\n    {\n        let node = SinglyLinkedListNode<T>(value: value)\n        self.init(head: node)\n    }\n    \n    \n    /// Creates an empty list\n    public init()\n    {\n        self.storage = IndirectStorage()\n    }\n    \n    \n    // MARK: EDITION\n    \n    /// Convenience method to append a value directly to the list\n    ///\n    /// - Parameter value: value to be added\n    public mutating func append(value: T)\n    {\n        let node = SinglyLinkedListNode<T>(value: value)\n        self.append(node: node)\n    }\n    \n    \n    /// Convenience method to prepend a value directly to the list\n    ///\n    /// - Parameter value: value to be added as the new head of the list\n    public mutating func prepend(value: T)\n    {\n        let node = SinglyLinkedListNode<T>(value: value)\n        self.prepend(node: node)\n    }\n    \n    \n    public mutating func deleteItem(at index:Int) -> T\n    {\n        precondition((index >= 0) && (index < self.count))\n        \n        var previous: SinglyLinkedListNode<T>? = nil\n        var current = self.storageForWritting.head\n        var i = 0\n        var elementToDelete: SinglyLinkedListNode<T>\n        \n        while (i < index) {\n            previous = current\n            current = current?.next\n            i += 1\n        }\n        \n        // Current is now the element to delete (at index position.tag)\n        elementToDelete = current!\n        if (self.storage.head === current) {\n            self.storageForWritting.head = current?.next\n        }\n        \n        if (self.storage.tail === current) {\n            self.storageForWritting.tail = previous\n        }\n        \n        previous?.next = current?.next\n        \n        return elementToDelete.value\n    }\n    \n    \n    \n    // MARK: SEARCH\n    \n    /// Returns the node located at the k-th to last position\n    ///\n    /// - Parameter kthToLast: 1 <= k <= N\n    private func find(kthToLast: UInt, startingAt node: SinglyLinkedListNode<T>?, count: UInt) -> SinglyLinkedListNode<T>?\n    {\n        guard kthToLast <= count else {\n            return nil\n        }\n        \n        guard (node != nil) else {\n            return nil\n        }\n        \n        let i = (count - kthToLast)\n        \n        if (i == 0) {\n            return node\n        }\n        \n        return find(kthToLast: kthToLast, startingAt: node?.next, count: (count - 1))\n    }\n    \n    \n    /// Returns the kth-to-last element in the list\n    ///\n    /// - Parameter kthToLast: Reversed ordinal number of the node to fetch.\n    public func find(kthToLast: UInt) -> SinglyLinkedListNode<T>?\n    {\n        return self.find(kthToLast: kthToLast, startingAt: self.storage.head, count: UInt(self.count))\n    }\n    \n    \n    \n    // MARK: LOOP DETECTION\n    \n    /// A singly linked list contains a loop if one node references back to a previous node.\n    ///\n    /// - Returns: Whether the linked list contains a loop\n    public func containsLoop() -> Bool\n    {\n        /// Advances a node at a time\n        var current = self.storage.head\n        \n        /// Advances twice as fast\n        var runner = self.storage.head\n        \n        while (runner != nil) && (runner?.next != nil) {\n            \n            current = current?.next\n            runner = runner?.next?.next\n            \n            if runner === current {\n                return true\n            }\n        }\n        \n        return false\n    }\n    \n}\n\n\n\n// MARK:- Private Methods\n\nprivate extension SinglyLinkedList {\n    \n    /// Adds a new node to the current head. This method can easily break value semantics. It is left\n    /// for internal use.\n    ///\n    /// - Parameter node: the node that will be the new head of the list.\n    private mutating func prepend(node: SinglyLinkedListNode<T>)\n    {\n        let (tailFromNewNode, _) = findTail(in: node)\n        tailFromNewNode.next = self.storageForWritting.head\n        self.storageForWritting.head = node\n        \n        if self.storage.tail == nil {\n            self.storageForWritting.tail = tailFromNewNode\n        }\n    }\n    \n    /// Appends a new node to the list. This method can easily break value semantics. It is left\n    /// for internal use.\n    /// - Discussion: If the node to be inserted contains a loop, the node is appended but tail is set to nil.\n    ///   This is a private method, therefore this can only happen directly under the control of this class.\n    /// - Parameter node: node to be appended. (It can be a list, even contain loops).\n    private mutating func append(node: SinglyLinkedListNode<T>)\n    {\n        if self.storage.tail != nil\n        {\n            // Copy on write: we are about to modify next a property in\n            // a potentially shared node. Make sure it's new if necessary.\n            self.storageForWritting.tail?.next = node\n            if !self.containsLoop() {\n                let (tail, _) = findTail(in: node)\n                self.storageForWritting.tail = tail // There\n            } else {\n                self.storageForWritting.tail = nil\n            }\n        }\n        else\n        {\n            // This also means that there's no head.\n            // Otherwise the state would be inconsistent.\n            // This will be checked when adding and deleting nodes.\n            self.storageForWritting.head = node\n            if !self.containsLoop() {\n                let (tail, _) = findTail(in: node)\n                self.storageForWritting.tail = tail // There\n            } else {\n                self.storageForWritting.tail = nil\n            }\n        }\n    }\n    \n    /// Creates a copy of the linked list in a diffent memory location.\n    ///\n    /// - Returns: The copy to a new storage or a reference to the old one if no copy was necessary.\n    private func copyStorage() -> IndirectStorage<T> {\n        // If the list is empty, next time an item will be created, it won't affect\n        // other instances of the list that came from copies derived from value types.\n        // like assignments or parameters\n        guard (self.storage.head != nil) && (self.storage.tail != nil) else {\n            return IndirectStorage(head: nil, tail: nil)\n        }\n        \n        // Create a new position in memory.\n        // Note that we are shallow copying the value. If it was reference type\n        // we just make a copy of the reference.\n        let copiedHead = SinglyLinkedListNode<T>(value: self.storage.head!.value)\n        var previousCopied: SinglyLinkedListNode<T> = copiedHead\n        \n        // Iterate through current list of nodes and copy them.\n        var current: SinglyLinkedListNode<T>? = self.storage.head?.next\n        \n        while (current != nil) {\n            // Create a copy\n            let currentCopy = SinglyLinkedListNode<T>(value: current!.value)\n            \n            // Create links\n            previousCopied.next = currentCopy\n            \n            // Update pointers\n            current = current?.next\n            previousCopied = currentCopy\n        }\n        \n        return IndirectStorage(head: copiedHead, tail: previousCopied)\n    }\n}\n\n\n\n// MARK:- Extensions when comparable\n\nextension SinglyLinkedList where T: Comparable\n{\n    /// Deletes node containing a given value\n    ///\n    /// - Parameter v: value of the node to be deleted.\n    public mutating func deleteNode(withValue v: T) {\n        \n        guard self.storage.head != nil else {\n            return\n        }\n        \n        var previous: SinglyLinkedListNode<T>? = nil\n        var current = self.storage.head\n        \n        while (current != nil) && (current?.value != v) {\n            previous = current\n            current = current?.next\n        }\n        \n        if let foundNode = current {\n            \n            if (self.storage.head === foundNode) {\n                self.storageForWritting.head = foundNode.next\n            }\n            \n            if (self.storage.tail === foundNode) {\n                self.storage.tail = previous\n            }\n            \n            previous?.next = foundNode.next\n            foundNode.next = nil\n        }\n    }\n    \n    \n    /// Deletes duplicates without using additional structures like a set to keep track the visited nodes.\n    /// - Complexity: O(N^2)\n    public mutating func deleteDuplicatesInPlace()\n    {\n        // Copy on write: this updates self.storage if necessary.\n        var current = self.storageForWritting.head\n        \n        while (current != nil)\n        {\n            var previous: SinglyLinkedListNode<T>? = current\n            var next = current?.next\n            \n            while (next != nil)\n            {\n                if (current?.value == next?.value) {\n                    \n                    if (self.storage.head === next) {\n                        self.storage.head = next?.next\n                    }\n                    \n                    if (self.storage.tail === next) {\n                        self.storage.tail = previous\n                    }\n                    \n                    // Delete next\n                    previous?.next = next?.next\n                }\n                previous = next\n                next = next?.next\n            }\n            current = current?.next\n        }\n    }\n}\n\n\n\n// MARK: - ITERATOR -\n\npublic struct SinglyLinkedListForwardIterator<T> : IteratorProtocol {\n    \n    public typealias Element = T\n    \n    private(set) var head: SinglyLinkedListNode<T>?\n    \n    mutating public func next() -> T?\n    {\n        let result = self.head?.value\n        self.head = self.head?.next\n        return result\n    }\n}\n\n\n\n// MARK: - SEQUENCE -\n\nextension SinglyLinkedList : Sequence\n{\n    public func makeIterator() -> SinglyLinkedListForwardIterator<T>\n    {\n        return SinglyLinkedListForwardIterator(head: self.storage.head)\n    }\n}\n\n\n\n// MARK: - COLLECTION -\n\nextension SinglyLinkedList : Collection {\n    \n    public typealias Index = SinglyLinkedListIndex<T>\n    \n    public var startIndex: Index {\n        get {\n            return SinglyLinkedListIndex<T>(node: self.storage.head, tag: 0)\n        }\n    }\n    \n    public var endIndex: Index {\n        get {\n            if let h = self.storage.head {\n                let (_, numberOfElements) = findTail(in: h)\n                return SinglyLinkedListIndex<T>(node: h, tag: numberOfElements)\n            } else {\n                return SinglyLinkedListIndex<T>(node: nil, tag: self.startIndex.tag)\n            }\n        }\n    }\n    \n    public subscript(position: Index) -> T {\n        get {\n            return position.node!.value\n        }\n    }\n    \n    public func index(after idx: Index) -> Index {\n        return SinglyLinkedListIndex<T>(node: idx.node?.next, tag: idx.tag+1)\n    }\n}\n\n\n\n// MARK: - QUEUE -\n\nextension SinglyLinkedList : Queue\n{\n    typealias Item = T\n    \n    /// Returns the oldest element in the queue.\n    ///\n    /// - Returns: The oldest element in the queue. It does not dequeue it.\n    func getFirst() -> T? {\n        return self.storage.head?.value\n    }\n    \n    /// Adds an element to the queue\n    ///\n    /// - Parameter item: Item to be added\n    /// - Throws: There are cases where the operation might fail. For example if there is not enough space.\n    mutating func enqueue(item: T) throws {\n        self.append(node: SinglyLinkedListNode<T>(value: item))\n    }\n    \n    /// Dequeues the oldest element in the queue.\n    ///\n    /// - Returns: The oldest element in the queue, which gets removed from it.\n    mutating func dequeue() -> T?\n    {\n        guard self.count > 0 else {\n            return nil\n        }\n        \n        return self.deleteItem(at: 0)\n    }\n}\n\n\n\n// MARK: - EXPRESSIBLE-BY-ARRAY-LITERAL -\n\nextension SinglyLinkedList : ExpressibleByArrayLiteral\n{\n    public typealias Element = T\n    \n    public init(arrayLiteral elements: Element...)\n    {\n        var headSet = false\n        var current : SinglyLinkedListNode<T>?\n        var numberOfElements = 0\n        self.storage = IndirectStorage()\n        \n        for element in elements {\n            \n            numberOfElements += 1\n            \n            if headSet == false {\n                self.storage.head = SinglyLinkedListNode<T>(value: element)\n                current = self.storage.head\n                headSet = true\n            } else {\n                let newNode = SinglyLinkedListNode<T>(value: element)\n                current?.next = newNode\n                current = newNode\n            }\n        }\n        self.storage.tail = current\n    }\n}\n\n\n\n// MARK: - FORWARD-INDEX -\n\npublic struct SinglyLinkedListIndex<T> : Comparable\n{\n    fileprivate let node: SinglyLinkedListNode<T>?\n    fileprivate let tag: Int\n    \n    public static func==<T>(lhs: SinglyLinkedListIndex<T>, rhs: SinglyLinkedListIndex<T>) -> Bool {\n        return (lhs.tag == rhs.tag)\n    }\n    \n    public static func< <T>(lhs: SinglyLinkedListIndex<T>, rhs: SinglyLinkedListIndex<T>) -> Bool {\n        return (lhs.tag < rhs.tag)\n    }\n}\n\n\nextension SinglyLinkedList where T : KeyValuePair {\n    \n    public func find(elementWithKey key: T.K) -> T? {\n        let searchResults = self.filter { (keyValuePair) -> Bool in\n            return keyValuePair.key == key\n        }\n        \n        return searchResults.first\n    }\n}\n\n// MARK: - HELPERS -\n\nfunc findTail<T>(in node: SinglyLinkedListNode<T>) -> (tail: SinglyLinkedListNode<T>, count: Int)\n{\n    // Assign the tail\n    // Note that the passed node can already be linking to other nodes,\n    // so the tail needs to be calculated.\n    var current: SinglyLinkedListNode<T>? = node\n    var count = 1\n    \n    while (current?.next != nil) {\n        current = current?.next\n        count += 1\n    }\n    \n    if current != nil {\n        return (tail: current!, count: count)\n    } else {\n        return (tail: node, count: 1)\n    }\n}\n\n\n\n//: EXAMPLES\n//: Let's create a list\n\nvar l1: SinglyLinkedList<Int> = [1,2,3,4,5,6,7]\n\n//: Because it has value semantics, if we assign it, a new value will be created. However, internally the storage is shared.\n\nvar l2 = l1\n\n//: If we modify l2, l1 will remain unaffected.\nl2.append(value: 67)\n\nassert(l1.count == 7)\nassert(l1.contains(67) == false)\n\n//: However, as expected, l2 has changed\nassert(l2.count == 8)\nassert(l2.contains(67) == true)\n\n\n//: Notice that because our implementation conforms to the Collection protocol, we can use a lot of methods already implemented for us in Swift's standard library, for example, contains, dropLast, etc.\n\nlet l3 = l2.dropLast()\nassert(l3.count == 7)\nassert(l3.contains(67) == false)\n"
  },
  {
    "path": "Singly Linked List/SinglyLinkedList.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx' display-mode='raw'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Singly Linked List/SinglyLinkedList.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Singly Linked List/SinglyLinkedList.swift",
    "content": "import Foundation\n\n\n/// Helper class to implement copy-on-write\nfileprivate class IndirectStorage<T> {\n    \n  var head: SinglyLinkedListNode<T>?\n    \n  var tail: SinglyLinkedListNode<T>?\n  \n  init(head: SinglyLinkedListNode<T>?, tail: SinglyLinkedListNode<T>?) {\n    self.head = head\n    self.tail = tail\n  }\n  \n  convenience init() {\n    self.init(head: nil, tail: nil)\n  }\n}\n\n\n\n// MARK: - NODE -\n\n/// A node is the building block of a linked list.\n/// It can be used on its own to create linked lists. However users of this class,\n/// will need to manipulate references directly.\npublic class SinglyLinkedListNode<T> {\n    \n  /// Data container\n  public var value: T\n  \n  /// Link to the next node\n  public var next: SinglyLinkedListNode<T>?\n  \n  /// Designated initializer\n  ///\n  /// - Parameter value: A value\n  public init(value: T) {\n    self.value = value\n  }\n}\n\n\n\n// MARK: - LINKED LIST -\n\n/// Data structure to hold a collection of items.\n/// Each nodes contains a reference to the next node.\n/// The last node does not reference any other node.\n/// This class implements value semantics based on copy-on-write.\n///\n/// However, the elements contained in the list, will be shallow copied if they\n/// implement reference semantics.\npublic struct SinglyLinkedList<T> {\n  // MARK: PROPERTIES\n  \n  // A level of inderiction, with reference semantics to allow easy\n  // detection of when there are more than one references of the storage.\n  private var storage: IndirectStorage<T>\n  \n  /// Whenever there's a change that potentially can change the value, this reference to the\n  /// storage should be used to guarantee that a new copy is created and written on.\n  private var storageForWritting: IndirectStorage<T> {\n    \n    mutating get {\n      if !isKnownUniquelyReferenced(&storage) {\n          storage = copyStorage()\n      }\n      return storage\n    }\n  }\n  \n  /// Returns the last element in the collection\n  public var last: T? {\n    get {\n      return storage.tail?.value\n    }\n  }\n  \n  \n  \n  // MARK: INITIALIZERS\n  \n  /// Creates an empty list\n  public init() {\n    self.storage = IndirectStorage()\n  }\n  \n  \n  // MARK: EDITION\n  \n  /// Convenience method to append a value directly to the list\n  ///\n  /// - Parameter value: value to be added\n  public mutating func append(value: T) {\n    let node = SinglyLinkedListNode<T>(value: value)\n    append(node: node)\n  }\n  \n  \n  /// Convenience method to prepend a value directly to the list\n  ///\n  /// - Parameter value: value to be added as the new head of the list\n  public mutating func prepend(value: T) {\n    let node = SinglyLinkedListNode<T>(value: value)\n    prepend(node: node)\n  }\n  \n  \n  public mutating func deleteItem(at index:Int) -> T {\n    precondition((index >= 0) && (index < count))\n    \n    var previous: SinglyLinkedListNode<T>? = nil\n    var current = storageForWritting.head\n    var i = 0\n    var elementToDelete: SinglyLinkedListNode<T>\n    \n    while i < index {\n      previous = current\n      current = current?.next\n      i += 1\n    }\n    \n    // Current is now the element to delete (at index position.tag)\n    elementToDelete = current!\n    if storage.head === current {\n      storageForWritting.head = current?.next\n    }\n    \n    if storage.tail === current {\n      storageForWritting.tail = previous\n    }\n    \n    previous?.next = current?.next\n    \n    return elementToDelete.value\n  }\n  \n  \n  \n  // MARK: SEARCH\n  \n  /// Returns the node located at the k-th to last position\n  ///\n  /// - Parameter kthToLast: 1 <= k <= N\n  private func find(kthToLast: UInt, startingAt node: SinglyLinkedListNode<T>?, count: UInt) -> SinglyLinkedListNode<T>? {\n    guard kthToLast <= count else {\n      return nil\n    }\n    \n    guard (node != nil) else {\n      return nil\n    }\n    \n    let i = (count - kthToLast)\n    \n    if i == 0 {\n      return node\n    }\n    \n    return find(kthToLast: kthToLast, startingAt: node?.next, count: (count - 1))\n  }\n  \n  \n  /// Returns the kth-to-last element in the list\n  ///\n  /// - Parameter kthToLast: Reversed ordinal number of the node to fetch.\n  public func find(kthToLast: UInt) -> SinglyLinkedListNode<T>? {\n    return find(kthToLast: kthToLast, startingAt: storage.head, count: UInt(count))\n  }\n    \n}\n\n\n\n// MARK:- Private Methods\n\nprivate extension SinglyLinkedList {\n    \n  /// Adds a new node to the current head. This method can easily break value semantics. It is left\n  /// for internal use.\n  ///\n  /// - Parameter node: the node that will be the new head of the list.\n  private mutating func prepend(node: SinglyLinkedListNode<T>) {\n    let (tailFromNewNode, _) = findTail(in: node)\n    tailFromNewNode.next = storageForWritting.head\n    storageForWritting.head = node\n    \n    if storage.tail == nil {\n      storageForWritting.tail = tailFromNewNode\n    }\n  }\n  \n  /// Appends a new node to the list. This method can easily break value semantics. It is left\n  /// for internal use.\n  /// - Discussion: If the node to be inserted contains a loop, the node is appended but tail is set to nil.\n  ///   This is a private method, therefore this can only happen directly under the control of this class.\n  /// - Parameter node: node to be appended. (It can be a list, even contain loops).\n  private mutating func append(node: SinglyLinkedListNode<T>) {\n    if storage.tail != nil {\n      // Copy on write: we are about to modify next a property in\n      // a potentially shared node. Make sure it's new if necessary.\n      storageForWritting.tail?.next = node\n      let (tail, _) = findTail(in: node)\n      storageForWritting.tail = tail // There\n    } else {\n      // This also means that there's no head.\n      // Otherwise the state would be inconsistent.\n      // This will be checked when adding and deleting nodes.\n      storageForWritting.head = node\n      let (tail, _) = findTail(in: node)\n      storageForWritting.tail = tail // There\n    }\n  }\n  \n  /// Creates a copy of the linked list in a diffent memory location.\n  ///\n  /// - Returns: The copy to a new storage or a reference to the old one if no copy was necessary.\n  private func copyStorage() -> IndirectStorage<T> {\n    // If the list is empty, next time an item will be created, it won't affect\n    // other instances of the list that came from copies derived from value types.\n    // like assignments or parameters\n    guard (storage.head != nil) && (storage.tail != nil) else {\n      return IndirectStorage(head: nil, tail: nil)\n    }\n    \n    // Create a new position in memory.\n    // Note that we are shallow copying the value. If it was reference type\n    // we just make a copy of the reference.\n    let copiedHead = SinglyLinkedListNode<T>(value: storage.head!.value)\n    var previousCopied: SinglyLinkedListNode<T> = copiedHead\n    \n    // Iterate through current list of nodes and copy them.\n    var current: SinglyLinkedListNode<T>? = storage.head?.next\n    \n    while current != nil {\n      // Create a copy\n      let currentCopy = SinglyLinkedListNode<T>(value: current!.value)\n      \n      // Create links\n      previousCopied.next = currentCopy\n      \n      // Update pointers\n      current = current?.next\n      previousCopied = currentCopy\n    }\n    \n    return IndirectStorage(head: copiedHead, tail: previousCopied)\n  }\n}\n\n\n\n// MARK:- Extensions when comparable\n\nextension SinglyLinkedList where T: Comparable {\n  /// Deletes node containing a given value\n  ///\n  /// - Parameter v: value of the node to be deleted.\n  public mutating func deleteNode(withValue v: T) {\n    \n    guard storage.head != nil else {\n      return\n    }\n    \n    var previous: SinglyLinkedListNode<T>? = nil\n    var current = storage.head\n    \n    while (current != nil) && (current?.value != v) {\n      previous = current\n      current = current?.next\n    }\n    \n    if let foundNode = current {\n      \n      if storage.head === foundNode {\n        storageForWritting.head = foundNode.next\n      }\n      \n      if storage.tail === foundNode {\n        storage.tail = previous\n      }\n      \n      previous?.next = foundNode.next\n      foundNode.next = nil\n    }\n  }\n  \n  \n  /// Deletes duplicates without using additional structures like a set to keep track the visited nodes.\n  /// - Complexity: O(N^2)\n  public mutating func deleteDuplicatesInPlace() {\n    // Copy on write: this updates storage if necessary.\n    var current = storageForWritting.head\n    \n    while current != nil {\n      var previous: SinglyLinkedListNode<T>? = current\n      var next = current?.next\n      \n      while next != nil {\n        if current?.value == next?.value {\n          \n          if storage.head === next {\n            storage.head = next?.next\n          }\n          \n          if storage.tail === next {\n            storage.tail = previous\n          }\n          \n          // Delete next\n          previous?.next = next?.next\n        }\n        previous = next\n        next = next?.next\n      }\n      current = current?.next\n    }\n  }\n}\n\n\n\n// MARK: - COLLECTION -\n\nextension SinglyLinkedList : Collection {\n    \n  public typealias Index = SinglyLinkedListIndex<T>\n  \n  public var startIndex: Index {\n    get {\n      return SinglyLinkedListIndex<T>(node: storage.head, tag: 0)\n    }\n  }\n  \n  public var endIndex: Index {\n    get {\n      if let h = storage.head {\n        let (_, numberOfElements) = findTail(in: h)\n        return SinglyLinkedListIndex<T>(node: h, tag: numberOfElements)\n      } else {\n        return SinglyLinkedListIndex<T>(node: nil, tag: startIndex.tag)\n      }\n    }\n  }\n  \n  public subscript(position: Index) -> T {\n    get {\n      return position.node!.value\n    }\n  }\n  \n  public func index(after idx: Index) -> Index {\n    return SinglyLinkedListIndex<T>(node: idx.node?.next, tag: idx.tag+1)\n  }\n}\n\n\n\n// MARK: - EXPRESSIBLE-BY-ARRAY-LITERAL -\n\nextension SinglyLinkedList : ExpressibleByArrayLiteral {\n  public typealias Element = T\n  \n  public init(arrayLiteral elements: Element...) {\n    var headSet = false\n    var current : SinglyLinkedListNode<T>?\n    var numberOfElements = 0\n    storage = IndirectStorage()\n    \n    for element in elements {\n      \n      numberOfElements += 1\n      \n      if headSet == false {\n        storage.head = SinglyLinkedListNode<T>(value: element)\n        current = storage.head\n        headSet = true\n      } else {\n        let newNode = SinglyLinkedListNode<T>(value: element)\n        current?.next = newNode\n        current = newNode\n      }\n    }\n    storage.tail = current\n  }\n}\n\n\n\n// MARK: - FORWARD-INDEX -\n\npublic struct SinglyLinkedListIndex<T> : Comparable {\n  fileprivate let node: SinglyLinkedListNode<T>?\n  fileprivate let tag: Int\n  \n  public static func==<T>(lhs: SinglyLinkedListIndex<T>, rhs: SinglyLinkedListIndex<T>) -> Bool {\n    return (lhs.tag == rhs.tag)\n  }\n  \n  public static func< <T>(lhs: SinglyLinkedListIndex<T>, rhs: SinglyLinkedListIndex<T>) -> Bool {\n    return (lhs.tag < rhs.tag)\n  }\n}\n\n\nextension SinglyLinkedList where T : KeyValuePair {\n    \n  public func find(elementWithKey key: T.K) -> T? {\n    let searchResults = filter { (keyValuePair) -> Bool in\n      return keyValuePair.key == key\n    }\n    \n    return searchResults.first\n  }\n}\n\n// MARK: - HELPERS -\n\nfunc findTail<T>(in node: SinglyLinkedListNode<T>) -> (tail: SinglyLinkedListNode<T>, count: Int) {\n  // Assign the tail\n  // Note that the passed node can already be linking to other nodes,\n  // so the tail needs to be calculated.\n  var current: SinglyLinkedListNode<T>? = node\n  var count = 1\n  \n  while current?.next != nil {\n    current = current?.next\n    count += 1\n  }\n  \n  if current != nil {\n    return (tail: current!, count: count)\n  } else {\n    return (tail: node, count: 1)\n  }\n}\n"
  },
  {
    "path": "Singly Linked List/Tests/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Singly Linked List/Tests/Tests/SinglyLinkedListTests.swift",
    "content": "import XCTest\n\n\nclass FindTailInNodeTests: XCTestCase {\n    \n  func testExample() {\n    let n1 = SinglyLinkedListNode<Int>(value: 34)\n    let n2 = SinglyLinkedListNode<Int>(value: 35)\n    let n3 = SinglyLinkedListNode<Int>(value: 36)\n    let n4 = SinglyLinkedListNode<Int>(value: 37)\n    \n    n1.next = n2\n    n2.next = n3\n    n3.next = n4\n    \n    XCTAssertTrue(findTail(in: n1).tail === n4)\n    XCTAssertTrue(findTail(in: n2).tail === n4)\n    XCTAssertTrue(findTail(in: n4).tail === n4)\n    XCTAssertTrue(findTail(in: n4).tail === n4)\n  }\n}\n\nclass SinglyLinkedListTests: XCTestCase {\n    \n  func testAppendOneNodeFromEmptyList() {\n    var list = SinglyLinkedList<Int>()\n    list.append(value: 34)\n    XCTAssertTrue(list.first == 34)\n    XCTAssertTrue(list.count == 1, \"Found \\(list.count)\")\n  }\n    \n  func testAppendMultipleNodesFromEmptyList() {\n    var list = SinglyLinkedList<Int>()\n    list.append(value: 34)\n    list.append(value: 35)\n    list.append(value: 36)\n    list.append(value: 34)\n    XCTAssertTrue(list.first == 34)\n    let second = list.index(list.startIndex, offsetBy: 1)\n    let third = list.index(list.startIndex, offsetBy: 2)\n    let fouth = list.index(list.startIndex, offsetBy: 3)\n    XCTAssertTrue(list[second] == 35)\n    XCTAssertTrue(list[third] == 36)\n    XCTAssertTrue(list[fouth] == 34)\n    XCTAssertTrue(list.count == 4, \"Found \\(list.count)\")\n  }\n    \n  func testDelete() {\n    var list: SinglyLinkedList<Int> = [1]\n    list.append(value: 2)\n    list.append(value: 3)\n    list.append(value: 4)\n    list.append(value: 5)\n    \n    list.deleteNode(withValue: 1)\n    var second = list.index(list.startIndex, offsetBy: 1)\n    var third = list.index(list.startIndex, offsetBy: 2)\n    XCTAssertTrue(list.first == 2)\n    XCTAssertTrue(list[second] == 3)\n    XCTAssertTrue(list[third] == 4)\n    XCTAssertTrue(list.last == 5)\n    XCTAssertTrue(list.count == 4)\n    \n    list.deleteNode(withValue: 5)\n    second = list.index(list.startIndex, offsetBy: 1)\n    third = list.index(list.startIndex, offsetBy: 2)\n    XCTAssertTrue(list.first == 2)\n    XCTAssertTrue(list[second] == 3)\n    XCTAssertTrue(list.last == 4)\n    XCTAssertTrue(list.count == 3)\n    \n    list.deleteNode(withValue: 3)\n    XCTAssertTrue(list.first == 2)\n    XCTAssertTrue(list.last == 4)\n    XCTAssertTrue(list.count == 2)\n    \n    list.deleteNode(withValue: 2)\n    XCTAssertTrue(list.first == 4)\n    XCTAssertTrue(list.last == 4)\n    XCTAssertTrue(list.count == 1)\n    \n    list.deleteNode(withValue: 4)\n    XCTAssertTrue(list.first == nil)\n    XCTAssertTrue(list.last == nil)\n    XCTAssertTrue(list.count == 0)\n  }\n    \n  func testDeleteDuplicatesInPlace() {\n    var list: SinglyLinkedList<Int> = [1]\n    list.append(value: 2)\n    list.append(value: 2)\n    list.append(value: 3)\n    list.append(value: 5)\n    list.append(value: 2)\n    list.append(value: 4)\n    list.append(value: 2)\n    list.append(value: 5)\n    \n    list.deleteDuplicatesInPlace()\n    let second = list.index(list.startIndex, offsetBy: 1)\n    let third = list.index(list.startIndex, offsetBy: 2)\n    let fourth = list.index(list.startIndex, offsetBy: 3)\n    XCTAssertTrue(list.first == 1)\n    XCTAssertTrue(list[second] == 2)\n    XCTAssertTrue(list[third] == 3)\n    XCTAssertTrue(list[fourth] == 5)\n    XCTAssertTrue(list.last == 4)\n    XCTAssertTrue(list.count == 5)\n  }\n    \n  func testFindKthToLast() {\n    let list: SinglyLinkedList<Int> = [2,2,3,5,2,4,2,5]\n    XCTAssertTrue(list.find(kthToLast: 1)?.value == 5)\n    XCTAssertTrue(list.find(kthToLast: 2)?.value == 2)\n    XCTAssertTrue(list.find(kthToLast: 3)?.value == 4)\n    XCTAssertTrue(list.find(kthToLast: 4)?.value == 2)\n    XCTAssertTrue(list.find(kthToLast: 5)?.value == 5)\n    XCTAssertTrue(list.find(kthToLast: 6)?.value == 3)\n    XCTAssertTrue(list.find(kthToLast: 7)?.value == 2)\n    XCTAssertTrue(list.find(kthToLast: 8)?.value == 2)\n    XCTAssertTrue(list.find(kthToLast: 9)?.value == nil)\n  }\n    \n  func testConstructorFromArrayLiteralWhenEmpty() {\n    let list: SinglyLinkedList<Int> = []\n    XCTAssertTrue(list.first == nil)\n    XCTAssertTrue(list.last == nil)\n    XCTAssertTrue(list.count == 0, \"Found \\(list.count)\")\n  }\n    \n  func testConstructorFromArrayLiteralWithSingleElement() {\n    let list: SinglyLinkedList<Int> = [5]\n    XCTAssertTrue(list.first == 5)\n    XCTAssertTrue(list.last == 5)\n    XCTAssertTrue(list.count == 1, \"Found \\(list.count)\")\n  }\n  \n  func testAppendValue() {\n    var list = SinglyLinkedList<Int>()\n    list.append(value: 1)\n    list.append(value: 1)\n    list.append(value: 2)\n    list.append(value: 2)\n    list.append(value: 4)\n    \n    let result = string(from: list)\n    XCTAssertTrue(result == \"11224\", \"Found \\(result)\")\n    XCTAssertTrue(list.count == 5, \"Found \\(list.count)\")\n    XCTAssertTrue(list.last == 4, \"Found \\(String(describing: list.last))\")\n  }\n    \n  func testPrependValue() {\n    var list = SinglyLinkedList<Int>()\n    list.prepend(value: 1)\n    list.prepend(value: 2)\n    list.prepend(value: 3)\n    list.prepend(value: 4)\n    list.prepend(value: 5)\n    list.prepend(value: 6)\n    \n    let result = string(from: list)\n    XCTAssertTrue(result == \"654321\", \"Found \\(result)\")\n    XCTAssertTrue(list.count == 6, \"Found \\(list.count)\")\n    XCTAssertTrue(list.last == 1, \"Found \\(String(describing: list.last))\")\n  }\n    \n  func testDeleteHeadInListWithMultipleItems() {\n    var list: SinglyLinkedList<Int> = [1,2,3,4,5,6,7,8]\n    \n    let _ = list.deleteItem(at: 0)\n    let result = string(from: list)\n    XCTAssertTrue(result == \"2345678\", \"Found \\(result)\")\n    XCTAssertTrue(list.first == 2, \"Found \\(String(describing: list.first))\")\n    XCTAssertTrue(list.count == 7, \"Found \\(list.count)\")\n  }\n    \n  func testDeleteTailInListWithMultipleItems() {\n    var list: SinglyLinkedList<Int> = [1,2,3,4,5,6,7,8]\n    \n    let _ = list.deleteItem(at: 7)\n    let result = string(from: list)\n    XCTAssertTrue(result == \"1234567\", \"Found \\(result)\")\n    XCTAssertTrue(list.last == 7, \"Found \\(String(describing: list.last))\")\n    XCTAssertTrue(list.count == 7, \"Found \\(list.count)\")\n  }\n    \n  func testDeleteItemInListWithMultipleItems() {\n    var list: SinglyLinkedList<Int> = [1,2,3,4,5,6,7,8]\n    \n    let _ = list.deleteItem(at: 4)\n    let result = string(from: list)\n    XCTAssertTrue(result == \"1234678\", \"Found \\(result)\")\n    XCTAssertTrue(list.first == 1, \"Found \\(String(describing: list.first))\")\n    XCTAssertTrue(list.last == 8, \"Found \\(String(describing: list.last))\")\n    XCTAssertTrue(list.count == 7, \"Found \\(list.count)\")\n  }\n    \n  func testDeleteHeadInListWithSingleElement() {\n    var list: SinglyLinkedList<Int> = [1]\n    \n    let _ = list.deleteItem(at: 0)\n    let result = string(from: list)\n    XCTAssertTrue(result == \"\", \"Found \\(result)\")\n    XCTAssertTrue(list.first == nil, \"Found \\(String(describing: list.first))\")\n    XCTAssertTrue(list.last == nil, \"Found \\(String(describing: list.last))\")\n    XCTAssertTrue(list.count == 0, \"Found \\(list.count)\")\n  }\n    \n  func testDirectIndexAccess() {\n    let list: SinglyLinkedList<Int> = [1,2,3,4,5,6,7,8]\n    let fifthElementIndex = list.index(list.startIndex, offsetBy: 5)\n    XCTAssertTrue(list[fifthElementIndex] == 6 ,  \"Found \\(list.count)\")\n  }\n  \n  \n  func string(from list: SinglyLinkedList<Int>) -> String {\n    var result = \"\"\n    var iterator = list.makeIterator()\n    while let current = iterator.next() {\n        result += String(describing: current)\n    }\n    \n    return result\n  }\n  \n  func testCopyOnWriteUsingLiterals() {\n    var l1: SinglyLinkedList<Int> = [1,2,3,4,5,6,7,8]\n    l1.append(value: 0)\n    var l2 = l1\n  \n    _ = l2.deleteItem(at: 3)\n    XCTAssertTrue(l1.count == 9)\n    XCTAssertTrue(l2.count == 8)\n  \n    _ = l1.deleteItem(at: 0)\n    _ = l1.deleteItem(at: 0)\n    _ = l1.deleteItem(at: 0)\n    _ = l1.deleteItem(at: 0)\n    _ = l1.deleteItem(at: 0)\n    _ = l1.deleteItem(at: 0)\n    _ = l1.deleteItem(at: 0)\n    _ = l1.deleteItem(at: 0)\n    _ = l1.deleteItem(at: 0)\n  \n    XCTAssertTrue(l1.count == 0)\n    XCTAssertTrue(l2.count == 8)\n  }\n    \n}\n"
  },
  {
    "path": "Singly Linked List/Tests/Tests.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t006104711F361359007A6F50 /* SinglyLinkedListTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 006104701F361359007A6F50 /* SinglyLinkedListTests.swift */; };\n\t\t006104791F36144E007A6F50 /* KeyValuePair.swift in Sources */ = {isa = PBXBuildFile; fileRef = 006104761F36144E007A6F50 /* KeyValuePair.swift */; };\n\t\t0061047B1F36144E007A6F50 /* SinglyLinkedList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 006104781F36144E007A6F50 /* SinglyLinkedList.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t0061046D1F361359007A6F50 /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t006104701F361359007A6F50 /* SinglyLinkedListTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SinglyLinkedListTests.swift; sourceTree = \"<group>\"; };\n\t\t006104721F361359007A6F50 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t006104761F36144E007A6F50 /* KeyValuePair.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = KeyValuePair.swift; path = ../../KeyValuePair.swift; sourceTree = \"<group>\"; };\n\t\t006104781F36144E007A6F50 /* SinglyLinkedList.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SinglyLinkedList.swift; path = ../../SinglyLinkedList.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t0061046A1F361359007A6F50 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t006104621F36104C007A6F50 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t0061046F1F361359007A6F50 /* Tests */,\n\t\t\t\t0061046E1F361359007A6F50 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t0061046E1F361359007A6F50 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t0061046D1F361359007A6F50 /* Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t0061046F1F361359007A6F50 /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t006104701F361359007A6F50 /* SinglyLinkedListTests.swift */,\n\t\t\t\t006104761F36144E007A6F50 /* KeyValuePair.swift */,\n\t\t\t\t006104781F36144E007A6F50 /* SinglyLinkedList.swift */,\n\t\t\t\t006104721F361359007A6F50 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = Tests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t0061046C1F361359007A6F50 /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 006104731F361359007A6F50 /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t006104691F361359007A6F50 /* Sources */,\n\t\t\t\t0061046A1F361359007A6F50 /* Frameworks */,\n\t\t\t\t0061046B1F361359007A6F50 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tproductName = Tests;\n\t\t\tproductReference = 0061046D1F361359007A6F50 /* Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t006104631F36104C007A6F50 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0830;\n\t\t\t\tLastUpgradeCheck = 0830;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t0061046C1F361359007A6F50 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.3.3;\n\t\t\t\t\t\tLastSwiftMigration = 0900;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 006104661F36104C007A6F50 /* Build configuration list for PBXProject \"Tests\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t);\n\t\t\tmainGroup = 006104621F36104C007A6F50;\n\t\t\tproductRefGroup = 0061046E1F361359007A6F50 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t0061046C1F361359007A6F50 /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t0061046B1F361359007A6F50 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t006104691F361359007A6F50 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t006104711F361359007A6F50 /* SinglyLinkedListTests.swift in Sources */,\n\t\t\t\t0061047B1F36144E007A6F50 /* SinglyLinkedList.swift in Sources */,\n\t\t\t\t006104791F36144E007A6F50 /* KeyValuePair.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t006104671F36104C007A6F50 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t006104681F36104C007A6F50 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t006104741F361359007A6F50 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = Tests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = On;\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t006104751F361359007A6F50 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = Tests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = On;\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t006104661F36104C007A6F50 /* Build configuration list for PBXProject \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t006104671F36104C007A6F50 /* Debug */,\n\t\t\t\t006104681F36104C007A6F50 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t006104731F361359007A6F50 /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t006104741F361359007A6F50 /* Debug */,\n\t\t\t\t006104751F361359007A6F50 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 006104631F36104C007A6F50 /* Project object */;\n}\n"
  },
  {
    "path": "Singly Linked List/Tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Tests.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Singly Linked List/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0830\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"0061046C1F361359007A6F50\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Skip-List/README.md",
    "content": "# Skip List\n\nSkip List is a probablistic data-structure  with same logarithmic time bound and\nefficiency  as AVL/  or  Red-Black  tree and  provides  a  clever compromise  to\nefficiently support  search and update  operations and is relatively  simpler to\nimplement compared to other map data structures.\n\nA skip  list *S*  consists of  series of  sorted linked  lists *{L0,  ..., Ln}*,\nlayered hierarchicaly and each layer *L* stores  a subset of items in layer *L0*\nin incremental order.  The items in layers  *{L1, ... Ln}* are  chosen at random\nbased on a coin flipping function  with probability 1/2 .  For traversing, every\nitem in  a layer  hold references  to the node  below and  the next  node.  This\nlayers serve as  express lanes to the layer underneath  them, effectively making\nfast O(log n) searching possible by  skipping lanes and reducing travel distance\nand in worse case  searching degrades to O (n), as  expected with regular linked\nlist.\n\nFor a skip list *S*:\n\n1. List *L0* contains every inserted item.\n2.  For lists *{L1, ..., Ln}*, *Li*  contains a randomly generated subset of the\n   items in *Li-1*\n3. Height is determined by coin-flipping.\n\n![Schematic view](Images/Intro.png)\nFigure 1\n\n\n#Searching\n\nSearching for  element *N* starts by  traversing from top most  layer *Ln* until\n*L0*.\n\nOur objective  is to find an  element *K* such  that its value at  the rightmost\nposition of current layer, is less-than  target item and its subsequent node has\na greater-equal  value or nil (  *K.key < N.key  <= (K.next.key or nil)*  ). if\nvalue of *K.next* is equal to *N*,  search is terminated and we return *K.next*,\notherwise drop underneath using *K.down* to the node below ( at layer Ln-1 ) and\nrepeat the process until *L0* where *K.down* is `nil` which indicates that level\nis *L0* and item doesn't exists.\n\n\n###Example:\n\n![Inserting first element](Images/Search1.png)\n\n#Inserting\n\nInserting  element  *N*  has  a  similar process  as  searching.  It  starts  by\ntraversing from  top most layer *Ln*  until *L0*. We  need to keep track  of our\ntraversal path  using a  stack. It  helps us  to traverse  the path  upward when\ncoin-flipping starts, so we can insert  our new element and update references to\nit.\n\nOur objective  is to find  a element  *K* such that  its value at  the rightmost\nposition of  layer *Ln*,  is less-than new  item and its  subsequent node  has a\ngreater-equal value  or nil (  *K.key  < N.key <  (K.next.key or nil)*  ). Push\nelement *K*  to the stack and  with element *K*,  go down using *K.down*  to the\nnode below  ( at layer Ln-1  ) and repeat the  process ( forward searching  ) up\nuntil  *L0* where  *K.down* is  `nil`  which indicates  that level  is *L0*.  We\nterminate the process when *K.down* is nil.\n\nAt *L0*, *N* can be inserted after *K*.\n\nHere is the  interesting part. We use coin flipping  function to randomly create\nlayers.\n\nWhen  coin flip  function returns  0,  the whole  process is  finished but  when\nreturns 1, there are two possibilities:\n\n1. Stack is empty ( Level is *L0* /- *Ln* or at uninitialized stage)\n2. Stack has items ( traversing upward is possible )\n\nIn case 1:\n\nA new layer M*  is created with a head node *NM* referencing  head node of layer\nbelow  and *NM.next*  referencing new  element *N*.  New element  *N* referecing\nelement *N* at previous layer.\n\nIn case 2:\n\nrepeat until stack is empty Pop an item *F* from stack and update the references\naccordingly.  *F.next* will be *K.next* and *K.next* will be *F*\n\t\nwhen  stack  is  empty Create  a  new  layer  consisintg  of a  head  node  *NM*\nreferencing  head node  of layer  below  and *NM.next*  referencing new  element\n*N*. New element *N* referencing element *N* at previous layer.\n\t\t \n\n###Example:\n\nInserting 13. with coin flips (0)\n\n![Inserting first element](Images/Insert5.png)\n![Inserting first element](Images/Insert6.png)\n![Inserting first element](Images/insert7.png)\n![Inserting first element](Images/Insert8.png)\n![Inserting first element](Images/Insert9.png)\n\n\n\nInserting 20. with 4 times coin flips (1) \n![Inserting first element](Images/Insert9.png)\n![Inserting first element](Images/Insert10.png)\n![Inserting first element](Images/Insert11.png)\n![Inserting first element](Images/Insert12.png)\n\n#Removing\n\nRemoving works similar to insert procedure.\n\nTODO\n\n#See also\n\n[Skip List on Wikipedia](https://en.wikipedia.org/wiki/Skip_list) \n\nWritten for Swift Algorithm Club by [Mike Taghavi](https://github.com/mitghi)\n"
  },
  {
    "path": "Skip-List/SkipList.playground/Contents.swift",
    "content": "// last checked with Xcode 9.0b4\n#if swift(>=4.0)\nprint(\"Hello, Swift 4!\")\n#endif\n\n// SkipList is ready for Swift 4.\n// TODO: Add Test\n\nlet k = SkipList<Int, String>()\nk.insert(key: 10, data: \"10\")\nk.insert(key: 12, data: \"12\")\nk.insert(key: 13, data: \"13\")\nk.insert(key: 20, data: \"20\")\nk.insert(key: 24, data: \"24\")\n\nif let value = k.get(key: 20) {\n  print(value)\n} else {\n  print(\"not found!\")\n}\n"
  },
  {
    "path": "Skip-List/SkipList.playground/Sources/SkipList.swift",
    "content": "// The MIT License (MIT)\n\n// Copyright (c) 2016 Mike Taghavi (mitghi[at]me.com)\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nimport Foundation\n\n// Stack from : https://github.com/raywenderlich/swift-algorithm-club/tree/master/Stack\npublic struct Stack<T> {\n  fileprivate var array: [T] = []\n\n  public var isEmpty: Bool {\n    return array.isEmpty\n  }\n\n  public var count: Int {\n    return array.count\n  }\n\n  public mutating func push(_ element: T) {\n    array.append(element)\n  }\n\n  public mutating func pop() -> T? {\n    return array.popLast()\n  }\n\n  public func peek() -> T? {\n    return array.last\n  }\n}\n\nextension Stack: Sequence {\n  public func makeIterator() -> AnyIterator<T> {\n    var curr = self\n    return AnyIterator { curr.pop() }\n  }\n}\n\nprivate func coinFlip() -> Bool {\n  return arc4random_uniform(2) == 1\n}\n\npublic class DataNode<Key: Comparable, Payload> {\n  public typealias Node = DataNode<Key, Payload>\n\n  var data: Payload?\n  fileprivate var key: Key?\n  var next: Node?\n  var down: Node?\n\n  public init(key: Key, data: Payload) {\n    self.key  = key\n    self.data = data\n  }\n\n  public init(asHead head: Bool) {}\n\n}\n\nopen class SkipList<Key: Comparable, Payload> {\n  public typealias Node = DataNode<Key, Payload>\n\n  fileprivate(set) var head: Node?\n\n  public init() {}\n\n}\n\n// MARK: - Search lanes for a node with a given key\n\nextension SkipList {\n\n  func findNode(key: Key) -> Node? {\n    var currentNode: Node? = head\n    var isFound: Bool = false\n\n    while !isFound {\n      if let node = currentNode {\n\n        switch node.next {\n        case .none:\n\n          currentNode = node.down\n        case .some(let value) where value.key != nil:\n\n          if value.key == key {\n            isFound = true\n            break\n          } else {\n            if key < value.key! {\n              currentNode = node.down\n            } else {\n              currentNode = node.next\n            }\n          }\n\n        default:\n          continue\n        }\n\n      } else {\n        break\n      }\n    }\n\n    if isFound {\n      return currentNode\n    } else {\n      return nil\n    }\n\n  }\n\n  func search(key: Key) -> Payload? {\n    guard let node = findNode(key: key) else {\n      return nil\n    }\n\n    return node.next!.data\n  }\n\n}\n\n// MARK: - Insert a node into lanes depending on skip list status ( bootstrap base-layer if head is empty / start insertion from current head ).\n\nextension SkipList {\n  private func bootstrapBaseLayer(key: Key, data: Payload) {\n    head       = Node(asHead: true)\n    var node   = Node(key: key, data: data)\n\n    head!.next = node\n\n    var currentTopNode = node\n\n    while coinFlip() {\n      let newHead    = Node(asHead: true)\n      node           = Node(key: key, data: data)\n      node.down      = currentTopNode\n      newHead.next   = node\n      newHead.down   = head\n      head           = newHead\n      currentTopNode = node\n    }\n\n  }\n\n  private func insertItem(key: Key, data: Payload) {\n    var stack              = Stack<Node>()\n    var currentNode: Node? = head\n\n    while currentNode != nil {\n\n      if let nextNode = currentNode!.next {\n        if nextNode.key! > key {\n          stack.push(currentNode!)\n          currentNode = currentNode!.down\n        } else {\n          currentNode = nextNode\n        }\n\n      } else {\n        stack.push(currentNode!)\n        currentNode = currentNode!.down\n      }\n\n    }\n\n    let itemAtLayer    = stack.pop()\n    var node           = Node(key: key, data: data)\n    node.next          = itemAtLayer!.next\n    itemAtLayer!.next  = node\n    var currentTopNode = node\n\n    while coinFlip() {\n      if stack.isEmpty {\n        let newHead    = Node(asHead: true)\n\n        node           = Node(key: key, data: data)\n        node.down      = currentTopNode\n        newHead.next   = node\n        newHead.down   = head\n        head           = newHead\n        currentTopNode = node\n\n      } else {\n        let nextNode  = stack.pop()\n\n        node           = Node(key: key, data: data)\n        node.down      = currentTopNode\n        node.next      = nextNode!.next\n        nextNode!.next = node\n        currentTopNode = node\n      }\n    }\n  }\n\n  public func insert(key: Key, data: Payload) {\n    if head != nil {\n      if let node = findNode(key: key) {\n        // replace, in case of key already exists.\n        var currentNode = node.next\n        while currentNode != nil && currentNode!.key == key {\n          currentNode!.data = data\n          currentNode       = currentNode!.down\n        }\n      } else {\n        insertItem(key: key, data: data)\n      }\n\n    } else {\n      bootstrapBaseLayer(key: key, data: data)\n    }\n  }\n\n}\n\n// MARK: - Remove a node with a given key. First, find its position in layers at the top, then remove it from each lane by traversing down to the base layer.\n\nextension SkipList {\n  public func remove(key: Key) {\n    guard let item = findNode(key: key) else {\n      return\n    }\n\n    var currentNode = Optional(item)\n\n    while currentNode != nil {\n      let node   = currentNode!.next\n\n      if node!.key != key {\n        currentNode = node\n        continue\n      }\n\n      let nextNode      = node!.next\n\n      currentNode!.next = nextNode\n      currentNode       = currentNode!.down\n\n    }\n\n  }\n}\n\n// MARK: - Get associated payload from a node with a given key.\n\nextension SkipList {\n\n  public func get(key: Key) -> Payload? {\n    return search(key: key)\n  }\n}\n"
  },
  {
    "path": "Skip-List/SkipList.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Skip-List/SkipList.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Skip-List/SkipList.swift",
    "content": "// The MIT License (MIT)\n\n// Copyright (c) 2016 Mike Taghavi (mitghi[at]me.com)\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nimport Foundation\n\n// Stack from : https://github.com/raywenderlich/swift-algorithm-club/tree/master/Stack\npublic struct Stack<T> {\n  fileprivate var array: [T] = []\n\n  public var isEmpty: Bool {\n    return array.isEmpty\n  }\n\n  public var count: Int {\n    return array.count\n  }\n\n  public mutating func push(_ element: T) {\n    array.append(element)\n  }\n\n  public mutating func pop() -> T? {\n    return array.popLast()\n  }\n\n  public func peek() -> T? {\n    return array.last\n  }\n}\n\nextension Stack: Sequence {\n  public func makeIterator() -> AnyIterator<T> {\n    var curr = self\n    return AnyIterator { curr.pop() }\n  }\n}\n\nprivate func coinFlip() -> Bool {\n  return arc4random_uniform(2) == 1\n}\n\npublic class DataNode<Key: Comparable, Payload> {\n  public typealias Node = DataNode<Key, Payload>\n\n  var data: Payload?\n  fileprivate var key: Key?\n  var next: Node?\n  var down: Node?\n\n  public init(key: Key, data: Payload) {\n    self.key  = key\n    self.data = data\n  }\n\n  public init(asHead head: Bool) {}\n\n}\n\nopen class SkipList<Key: Comparable, Payload> {\n  public typealias Node = DataNode<Key, Payload>\n\n  fileprivate(set) var head: Node?\n\n  public init() {}\n\n}\n\n// MARK: - Search lanes for a node with a given key\n\nextension SkipList {\n\n  func findNode(key: Key) -> Node? {\n    var currentNode: Node? = head\n    var isFound: Bool = false\n\n    while !isFound {\n      if let node = currentNode {\n\n        switch node.next {\n        case .none:\n\n          currentNode = node.down\n        case .some(let value) where value.key != nil:\n\n          if value.key == key {\n            isFound = true\n            break\n          } else {\n            if key < value.key! {\n              currentNode = node.down\n            } else {\n              currentNode = node.next\n            }\n          }\n\n        default:\n          continue\n        }\n\n      } else {\n        break\n      }\n    }\n\n    if isFound {\n      return currentNode\n    } else {\n      return nil\n    }\n\n  }\n\n  func search(key: Key) -> Payload? {\n    guard let node = findNode(key: key) else {\n      return nil\n    }\n\n    return node.next!.data\n  }\n\n}\n\n// MARK: - Insert a node into lanes depending on skip list status ( bootstrap base-layer if head is empty / start insertion from current head ).\n\nextension SkipList {\n  private func bootstrapBaseLayer(key: Key, data: Payload) {\n    head       = Node(asHead: true)\n    var node   = Node(key: key, data: data)\n\n    head!.next = node\n\n    var currentTopNode = node\n\n    while coinFlip() {\n      let newHead    = Node(asHead: true)\n      node           = Node(key: key, data: data)\n      node.down      = currentTopNode\n      newHead.next   = node\n      newHead.down   = head\n      head           = newHead\n      currentTopNode = node\n    }\n\n  }\n\n  private func insertItem(key: Key, data: Payload) {\n    var stack              = Stack<Node>()\n    var currentNode: Node? = head\n\n    while currentNode != nil {\n\n      if let nextNode = currentNode!.next {\n        if nextNode.key! > key {\n          stack.push(currentNode!)\n          currentNode = currentNode!.down\n        } else {\n          currentNode = nextNode\n        }\n\n      } else {\n        stack.push(currentNode!)\n        currentNode = currentNode!.down\n      }\n\n    }\n\n    let itemAtLayer    = stack.pop()\n    var node           = Node(key: key, data: data)\n    node.next          = itemAtLayer!.next\n    itemAtLayer!.next  = node\n    var currentTopNode = node\n\n    while coinFlip() {\n      if stack.isEmpty {\n        let newHead    = Node(asHead: true)\n\n        node           = Node(key: key, data: data)\n        node.down      = currentTopNode\n        newHead.next   = node\n        newHead.down   = head\n        head           = newHead\n        currentTopNode = node\n\n      } else {\n        let nextNode  = stack.pop()\n\n        node           = Node(key: key, data: data)\n        node.down      = currentTopNode\n        node.next      = nextNode!.next\n        nextNode!.next = node\n        currentTopNode = node\n      }\n    }\n  }\n\n  public func insert(key: Key, data: Payload) {\n    if head != nil {\n      if let node = findNode(key: key) {\n        // replace, in case of key already exists.\n        var currentNode = node.next\n        while currentNode != nil && currentNode!.key == key {\n          currentNode!.data = data\n          currentNode       = currentNode!.down\n        }\n      } else {\n        insertItem(key: key, data: data)\n      }\n\n    } else {\n      bootstrapBaseLayer(key: key, data: data)\n    }\n  }\n\n}\n\n// MARK: - Remove a node with a given key. First, find its position in layers at the top, then remove it from each lane by traversing down to the base layer.\n\nextension SkipList {\n  public func remove(key: Key) {\n    guard let item = findNode(key: key) else {\n      return\n    }\n\n    var currentNode = Optional(item)\n\n    while currentNode != nil {\n      let node   = currentNode!.next\n\n      if node!.key != key {\n        currentNode = node\n        continue\n      }\n\n      let nextNode      = node!.next\n\n      currentNode!.next = nextNode\n      currentNode       = currentNode!.down\n\n    }\n\n  }\n}\n\n// MARK: - Get associated payload from a node with a given key.\n\nextension SkipList {\n\n  public func get(key: Key) -> Payload? {\n    return search(key: key)\n  }\n}\n\n"
  },
  {
    "path": "Slow Sort/README.markdown",
    "content": "# Slow Sort\n\nGoal: Sort an array of numbers from low to high (or high to low).\n\nYou are given an array of numbers and need to put them in the right order. The insertion sort algorithm works as follows:\n\nWe can decompose the problem of sorting n numbers in ascending order into\n\n1. find the maximum of the numbers\n 1. find the maximum of the first n/2 elements\n 2. find the maximum of the remaining n/2 elements\n 3. find the largest of those two maxima\n2. sorting the remaining ones\n\n## The code\n\nHere is an implementation of slow sort in Swift:\n\n```swift\nfunc slowSort(_ i: Int, _ j: Int, _ numberList: inout [Int]) {\n    guard if i < j else { return }\n    let m = (i+j)/2\n    slowSort(i, m, &numberList)\n    slowSort(m+1, j, &numberList)\n    if numberList[j] < numberList[m] {\n        let temp = numberList[j]\n        numberList[j] = numberList[m]\n        numberList[m] = temp\n    }\n    slowSort(i, j-1, &numberList)\n}\n```\n\n## Performance\n\n| Case  | Performance |\n|:-------------: |:---------------:|\n| Worst       |  slow |\n| Best      | \tO(n^(log(n)/(2+e))))        |\n|  Average | \tO(n^(log(n)/2))       | \n\n## See also\n\n[Slow Sort explanation in the Internet](http://c2.com/cgi/wiki?SlowSort)\n\n*Written for Swift Algorithm Club by Lukas Schramm*\n\n(used the Insertion Sort Readme as template)\n"
  },
  {
    "path": "Slow Sort/SlowSort.playground/Contents.swift",
    "content": "var numberList = [1, 12, 9, 17, 13, 12]\n\nslowSort(0, numberList.count-1, &numberList)\nprint(numberList)\n"
  },
  {
    "path": "Slow Sort/SlowSort.playground/Sources/SlowSort.swift",
    "content": "import Foundation\n\npublic func slowSort(_ i: Int, _ j: Int, _ numberList: inout [Int]) {\n  guard i < j else { return }\n    \n  let m = (i+j)/2\n  slowSort(i, m, &numberList)\n  slowSort(m+1, j, &numberList)\n  if numberList[j] < numberList[m] {\n    let temp = numberList[j]\n    numberList[j] = numberList[m]\n    numberList[m] = temp\n  }\n  slowSort(i, j-1, &numberList)\n}\n"
  },
  {
    "path": "Slow Sort/SlowSort.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Slow Sort/SlowSort.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Slow Sort/SlowSort.swift",
    "content": "//\n//  SlowSort.swift\n//\n//\n//  Created by Pope Lukas Schramm (Dabendorf Orthodox Religion) on 16-07-16.\n//\n//\n\nfunc slowSort(_ i: Int, _ j: Int, _ numberList: inout [Int]) {\n  guard if i < j else { return }\n  let m = (i+j)/2\n  slowSort(i, m, &numberList)\n  slowSort(m+1, j, &numberList)\n  if numberList[j] < numberList[m] {\n    let temp = numberList[j]\n    numberList[j] = numberList[m]\n    numberList[m] = temp\n  }\n  slowSort(i, j-1, &numberList)\n}\n"
  },
  {
    "path": "Sorted Set/README.markdown",
    "content": "# Sorted Set\n\n## Sorted Array Version\n\nAn Sorted Set is a collection of unique items in sorted order. Items are usually sorted from least to greatest.\n\nThe Sorted Set data type is a hybrid of:\n\n- a [Set](https://en.wikipedia.org/wiki/Set_%28mathematics%29), a collection of unique items where the order does not matter, and\n- a [Sequence](https://en.wikipedia.org/wiki/Sequence), an sorted list of items where each item may appear more than once.\n\nIt's important to keep in mind that two items can have the same *value* but still may not be equal. For example, we could define \"a\" and \"z\" to have the same value (their lengths), but clearly \"a\" != \"z\".\n\n## Why use an sorted set?\n\nSorted Sets should be considered when you need to keep your collection sorted at all times, and you do lookups on the collection much more frequently than inserting or deleting items. Many of the lookup operations for an Sorted Set are **O(1)**.\n\nA good example would be keeping track of the rankings of players in a scoreboard (see example 2 below).\n\n#### These are sorted sets\n\nA set of integers:\n\n\t[1, 2, 3, 6, 8, 10, 1000]\n\nA set of strings:\n\n\t[\"a\", \"is\", \"set\", \"this\"]\n\nThe \"value\" of these strings could be their text content, but also for example their length.\n\n#### These are not sorted sets\n\nThis set violates the property of uniqueness:\n\n\t[1, 1, 2, 3, 5, 8]\n\nThis set violates the sorted property:\n\n\t[1, 11, 2, 3]\n\n## The code\n\nWe'll start by creating our internal representation for the Sorted Set. Since the idea of a set is similar to that of an array, we will use an array to represent our set. Furthermore, since we'll need to keep the set sorted, we need to be able to compare the individual elements. Thus, any type must conform to the [Comparable Protocol](https://developer.apple.com/library/watchos/documentation/Swift/Reference/Swift_Comparable_Protocol/index.html).\n\n```swift\npublic struct SortedSet<T: Comparable> {\n  private var internalSet = [T]()\n\n  // Returns the number of elements in the SortedSet.\n  public var count: Int {\n    return internalSet.count\n  }\n  ...\n```\n\nLets take a look at the `insert()` function first. This first checks if the item already exists in the collection. If so, it returns and does not insert the item.  Otherwise, it will insert the item through straightforward iteration.\n\n```swift\n  public mutating func insert(_ item: T){\n    if exists(item) {\n      return  // don't add an item if it already exists\n    }\n\n    // Insert new the item just before the one that is larger.\n    for i in 0..<count {\n      if internalSet[i] > item {\n        internalSet.insert(item, at: i)\n        return\n      }\n    }\n\n    // Append to the back if the new item is greater than any other in the set.\n    internalSet.append(item)\n  }\n```\n\nAs we'll see later on, checking if the item is already in the set has an efficiency of **O(log(n) + k)** where **k** is the number of items with the same value as the item we are inserting.\n\nTo insert the new item, the `for` loop starts from the beginning of the array, and checks to see if each item is larger than the item we want to insert. Once we find such an item, we insert the new one into its place. This shifts the rest of the array over to the right by 1 position. This loop is at worst **O(n)**.\n\nThe total performance of the `insert()` function is therefore **O(n)**.\n\nNext up is the `remove()` function:\n\n```swift\n  public mutating func remove(_ item: T) {\n    if let index = index(of: item) {\n      internalSet.remove(at: index)\n    }\n  }\n```\n\nFirst this checks if the item exists and then removes it from the array. Because of the `removeAtIndex()` function, the efficiency for remove is **O(n)**.\n\nThe next function is `indexOf()`, which takes in an object of type `T` and returns the index of the corresponding item if it is in the set, or `nil` if it is not. Since our set is sorted, we can use a binary search to quickly search for the item.\n\n```swift\n  public func index(of item: T) -> Int? {\n    var leftBound = 0\n    var rightBound = count - 1\n\n    while leftBound <= rightBound {\n      let mid = leftBound + ((rightBound - leftBound) / 2)\n\n      if internalSet[mid] > item {\n        rightBound = mid - 1\n      } else if internalSet[mid] < item {\n        leftBound = mid + 1\n      } else if internalSet[mid] == item {\n        return mid\n      } else {\n      \t// see below\n      }\n    }\n    return nil\n  }\n```\n\n> **Note:** If you are not familiar with the concept of binary search, we have an [article that explains all about it](../Binary%20Search).\n\nHowever, there is an important issue to deal with here. Recall that two objects can be unequal yet still have the same \"value\" for the purposes of comparing them. Since a set can contain multiple items with the same value, it is important to check that the binary search has landed on the correct item.\n\nFor example, consider this sorted set of `Player` objects. Each `Player` has a name and a number of points:\n\n\t[ (\"Bill\", 50), (\"Ada\", 50), (\"Jony\", 50), (\"Steve\", 200), (\"Jean-Louis\", 500), (\"Woz\", 1000) ]\n\nWe want the set to be sorted by points, from low to high. Multiple players can have the same number of points. The name of the player is not important for this ordering. However, the name *is* important for retrieving the correct item.\n\nLet's say we do `indexOf(bill)` where `bill` is player object `(\"Bill\", 50)`. If we did a traditional binary search we'd land on index 2, which is the object `(\"Jony\", 50)`. The value 50 matches, but it's not the object we're looking for!\n\nTherefore, we also need to check the items with the same value to the right and left of the midpoint. The code to check the left and right side looks like this:\n\n```swift\n        // Check to the right.\n        for j in mid.stride(to: count - 1, by: 1) {\n          if internalSet[j + 1] == item {\n            return j + 1\n          } else if internalSet[j] < internalSet[j + 1] {\n            break\n          }\n        }\n\n        // Check to the left.\n        for j in mid.stride(to: 0, by: -1) {\n          if internalSet[j - 1] == item {\n            return j - 1\n          } else if internalSet[j] > internalSet[j - 1] {\n            break\n          }\n        }\n\n        return nil\n```\n\nThese loops start at the current `mid` value and then look at the neighboring values until we've found the correct object.\n\nThe combined runtime for `indexOf()` is **O(log(n) + k)** where **n** is the length of the set, and **k** is the number of items with the same *value* as the one that is being searched for.\n\nSince the set is sorted, the following operations are all **O(1)**:\n\n```swift\n  // Returns the 'maximum' or 'largest' value in the set.\n  public func max() -> T? {\n    return count == 0 ? nil : internalSet[count - 1]\n  }\n\n  // Returns the 'minimum' or 'smallest' value in the set.\n  public func min() -> T? {\n    return count == 0 ? nil : internalSet[0]\n  }\n\n  // Returns the k-th largest element in the set, if k is in the range\n  // [1, count]. Returns nil otherwise.\n  public func kLargest(_ k: Int) -> T? {\n    return k > count || k <= 0 ? nil : internalSet[count - k]\n  }\n\n  // Returns the k-th smallest element in the set, if k is in the range\n  // [1, count]. Returns nil otherwise.\n  public func kSmallest(_ k: Int) -> T? {\n    return k > count || k <= 0 ? nil : internalSet[k - 1]\n  }\n```\n\n## Examples\n\nBelow are a few examples that can be found in the playground file.\n\n### Example 1\n\nHere we create a set with random Integers. Printing the largest/smallest 5 numbers in the set is fairly easy.\n\n```swift\n// Example 1 with type Int\nvar mySet = SortedSet<Int>()\n\n// Insert random numbers into the set\nfor _ in 0..<50 {\n  mySet.insert(randomNum(50, max: 500))\n}\n\nprint(mySet)\n\nprint(mySet.max())\nprint(mySet.min())\n\n// Print the 5 largest values\nfor k in 1...5 {\n  print(mySet.kLargest(k))\n}\n\n// Print the 5 lowest values\nfor k in 1...5 {\n  print(mySet.kSmallest(k))\n}\n```\n\n### Example 2\n\nIn this example we take a look at something a bit more interesting. We define a `Player` struct as follows:\n\n```swift\npublic struct Player: Comparable {\n  public var name: String\n  public var points: Int\n}\n```\n\nThe `Player` also gets its own `==` and `<` operators. The `<` operator is used to determine the sort order of the set, while `==` determines whether two objects are really equal.\n\nNote that `==` compares both the name and the points:  \n\n```swifr\nfunc ==(x: Player, y: Player) -> Bool {\n  return x.name == y.name && x.points == y.points\n}\n```\n\nBut `<` only compares the points:\n\n```swift\nfunc <(x: Player, y: Player) -> Bool {\n  return x.points < y.points\n}\n```\n\nTherefore, two `Player`s can each have the same value (the number of points), but are not guaranteed to be equal (they can have different names).\n\nWe create a new set and insert 20 random players. The `Player()` constructor gives each player a random name and score:\n\n```swift\nvar playerSet = SortedSet<Player>()\n\n// Populate the set with random players.\nfor _ in 0..<20 {\n  playerSet.insert(Player())\n}\n```\n\nInsert another player:\n\n```swift\nvar anotherPlayer = Player()\nplayerSet.insert(anotherPlayer)\n```\n\nNow we use the `indexOf()` function to find out what rank `anotherPlayer` is.\n\n```swift\nlet level = playerSet.count - playerSet.indexOf(anotherPlayer)!\nprint(\"\\(anotherPlayer.name) is ranked at level \\(level) with \\(anotherPlayer.points) points\")\n```\n\n### Example 3\n\nThe final example demonstrates the need to look for the right item even after the binary search has completed.\n\nWe insert 9 players into the set:\n\n```swift\nvar repeatedSet = SortedSet<Player>()\n\nrepeatedSet.insert(Player(name: \"Player 1\", points: 100))\nrepeatedSet.insert(Player(name: \"Player 2\", points: 100))\nrepeatedSet.insert(Player(name: \"Player 3\", points: 100))\nrepeatedSet.insert(Player(name: \"Player 4\", points: 100))\nrepeatedSet.insert(Player(name: \"Player 5\", points: 100))\nrepeatedSet.insert(Player(name: \"Player 6\", points: 50))\nrepeatedSet.insert(Player(name: \"Player 7\", points: 200))\nrepeatedSet.insert(Player(name: \"Player 8\", points: 250))\nrepeatedSet.insert(Player(name: \"Player 9\", points: 25))\n```\n\nNotice how several of these players have the same value of 100 points.\n\nThe set looks something like this:\n\n\t[Player 9, Player 6, Player 1, Player 2, Player 3, Player 4, Player 5, Player 7, Player 8]\n\nThe next line looks for `Player 2`:\n\n```swift\nprint(repeatedSet.index(of: Player(name: \"Player 2\", points: 100)))\n```\n\nAfter the binary search finishes, the value of `mid` is at index 5:\n\n\t[Player 9, Player 6, Player 1, Player 2, Player 3, Player 4, Player 5, Player 7, Player 8]\n\t                                                      mid\n\nHowever, this is not `Player 2`. Both `Player 4` and `Player 2` have the same points, but a different name. The binary search only looked at the points, not the name.\n\nBut we do know that `Player 2` must be either to the immediate left or the right of `Player 4`, so we check both sides of `mid`. We only need to look at the objects with the same value as `Player 4`. The others are replaced by `X`:\n\n\t[X, X, Player 1, Player 2, Player 3, Player 4, Player 5, X, X]\n\t                                       mid\n\nThe code then first checks on the right of `mid` (where the `*` is):\n\n\t[X, X, Player 1, Player 2, Player 3, Player 4, Player 5, X, X]\n\t                                       mid        *\n\nThe right side did not contain the item, so we look at the left side:\n\n\t[X, X, Player 1, Player 2, Player 3, Player 4, Player 5, X, X]\n\t                              *        mid        \n\t\n\t[X, X, Player 1, Player 2, Player 3, Player 4, Player 5, X, X]\n\t                    *                  mid        \n\nFinally, we've found `Player 2`, and return index 3.\n\n*Written By Zain Humayun*\n"
  },
  {
    "path": "Sorted Set/SortedSet.playground/Pages/Example 1.xcplaygroundpage/Contents.swift",
    "content": "//: # Example 1 with type Int\n\nvar mySet = SortedSet<Int>()\n\n// Insert random numbers into the set\nfor _ in 0..<50 {\n  mySet.insert(random(min: 50, max: 500))\n}\n\nprint(mySet)\n\nprint(\"\\nMaximum:\")\nprint(mySet.max())\n\nprint(\"\\nMinimum:\")\nprint(mySet.min())\n\n// Print the 5 largest values\nprint(\"\\n5 Largest:\")\nfor k in 1...5 {\n  print(mySet.kLargest(k))\n}\n\n// Print the 5 lowest values\nprint(\"\\n5 Smallest:\")\nfor k in 1...5 {\n  print(mySet.kSmallest(k))\n}\n\n//: [Next](@next)\n"
  },
  {
    "path": "Sorted Set/SortedSet.playground/Pages/Example 1.xcplaygroundpage/timeline.xctimeline",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Timeline\n   version = \"3.0\">\n   <TimelineItems>\n      <LoggerValueHistoryTimelineItem\n         documentLocation = \"file:///Users/kaichen/src/swift-algorithm-club/Sorted%20Set/SortedSet.playground/Pages/Example%201.xcplaygroundpage#CharacterRangeLen=21&amp;CharacterRangeLoc=370&amp;EndingColumnNumber=0&amp;EndingLineNumber=24&amp;StartingColumnNumber=1&amp;StartingLineNumber=23&amp;Timestamp=532757103.131521\"\n         selectedRepresentationIndex = \"0\"\n         shouldTrackSuperviewWidth = \"NO\">\n      </LoggerValueHistoryTimelineItem>\n      <LoggerValueHistoryTimelineItem\n         documentLocation = \"file:///Users/kaichen/src/swift-algorithm-club/Sorted%20Set/SortedSet.playground/Pages/Example%201.xcplaygroundpage#CharacterRangeLen=24&amp;CharacterRangeLoc=411&amp;EndingColumnNumber=0&amp;EndingLineNumber=26&amp;StartingColumnNumber=3&amp;StartingLineNumber=25&amp;Timestamp=532757103.131695\"\n         selectedRepresentationIndex = \"0\"\n         shouldTrackSuperviewWidth = \"NO\">\n      </LoggerValueHistoryTimelineItem>\n      <LoggerValueHistoryTimelineItem\n         documentLocation = \"file:///Users/kaichen/src/swift-algorithm-club/Sorted%20Set/SortedSet.playground/Pages/Example%201.xcplaygroundpage#CharacterRangeLen=25&amp;CharacterRangeLoc=510&amp;EndingColumnNumber=0&amp;EndingLineNumber=32&amp;StartingColumnNumber=3&amp;StartingLineNumber=31&amp;Timestamp=532757103.131826\"\n         selectedRepresentationIndex = \"0\"\n         shouldTrackSuperviewWidth = \"NO\">\n      </LoggerValueHistoryTimelineItem>\n   </TimelineItems>\n</Timeline>\n"
  },
  {
    "path": "Sorted Set/SortedSet.playground/Pages/Example 2.xcplaygroundpage/Contents.swift",
    "content": "//: [Previous](@previous)\n\n//: # Example 2 with Player objects\n\nvar playerSet = SortedSet<Player>()\n\n// Populate the set with random players.\nfor _ in 0..<20 {\n  playerSet.insert(Player())\n}\n\n// We'll look for this player later.\nvar anotherPlayer = Player()\nplayerSet.insert(anotherPlayer)\n\n// Print all players in order from highest points to lowest points.\n// (Note: this is the reverse order of how they are stored in the set!)\nprint(playerSet)\n//debugPrint(playerSet)\n\n// Highest and lowest players:\nprint(playerSet.max())\nprint(playerSet.min())\n\n// We'll find our player now:\nlet level = playerSet.count - playerSet.index(of: anotherPlayer)!\nprint(\"\\(anotherPlayer.name) is ranked at level \\(level) with \\(anotherPlayer.points) points\")\n\n//: [Next](@next)\n"
  },
  {
    "path": "Sorted Set/SortedSet.playground/Pages/Example 3.xcplaygroundpage/Contents.swift",
    "content": "//: [Previous](@previous)\n\n//: # Example 3: multiple entries with the same value\n\nvar repeatedSet = SortedSet<Player>()\n\nrepeatedSet.insert(Player(name: \"Player 1\", points: 100))\nrepeatedSet.insert(Player(name: \"Player 2\", points: 100))\nrepeatedSet.insert(Player(name: \"Player 3\", points: 100))\nrepeatedSet.insert(Player(name: \"Player 4\", points: 100))\nrepeatedSet.insert(Player(name: \"Player 5\", points: 100))\nrepeatedSet.insert(Player(name: \"Player 6\", points: 50))\nrepeatedSet.insert(Player(name: \"Player 7\", points: 200))\nrepeatedSet.insert(Player(name: \"Player 8\", points: 250))\nrepeatedSet.insert(Player(name: \"Player 9\", points: 25))\n\nprint(repeatedSet)\n//debugPrint(repeatedSet)\n\nprint(repeatedSet.index(of: Player(name: \"Player 5\", points: 100)))\nprint(repeatedSet.index(of: Player(name: \"Random Player\", points: 100)))\nprint(repeatedSet.index(of: Player(name: \"Player 5\", points: 1000)))\n"
  },
  {
    "path": "Sorted Set/SortedSet.playground/Sources/Player.swift",
    "content": "// The Player data type stores a random name, and a random number of\n// points from 0 - 5000.\npublic struct Player: Comparable {\n  public var name: String\n  public var points: Int\n  \n  public init() {\n    self.name = String.random()\n    self.points = random(min: 0, max: 5000)\n  }\n  \n  public init(name: String, points: Int) {\n    self.name = name\n    self.points = points\n  }\n}\n\n// Player x is equal to Player y if and only if both players have the\n// same name and number of points.\npublic func == (x: Player, y: Player) -> Bool {\n  return x.name == y.name && x.points == y.points\n}\n\n// Player x is less than Player y if x has less points than y.\npublic func < (x: Player, y: Player) -> Bool {\n  return x.points < y.points\n}\n\n// Prints a Player formatted with their name and number of points.\npublic func print(player: Player) {\n  print(\"Player: \\(player.name) | Points: \\(player.points)\")\n}\n\npublic func print(set: SortedSet<Player>) {\n  for i in 0..<set.count {\n    print(set[set.count - i - 1])\n  }\n}\n"
  },
  {
    "path": "Sorted Set/SortedSet.playground/Sources/Random.swift",
    "content": "import Foundation\n\n// Returns a random number between the given range.\npublic func random(min: Int, max: Int) -> Int {\n  return min + Int(arc4random_uniform(UInt32(max - min + 1)))\n}\n\n// Generates a random alphanumeric string of a given length.\nextension String {\n  public static func random(length: Int = 8) -> String {\n    let base = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\"\n    var randomString: String = \"\"\n    \n    for _ in 0..<length {\n      let randomValue = arc4random_uniform(UInt32(base.count))\n      randomString += \"\\(base[base.index(base.startIndex, offsetBy: Int(randomValue))])\"\n    }\n    return randomString\n  }\n}\n"
  },
  {
    "path": "Sorted Set/SortedSet.playground/Sources/SortedSet.swift",
    "content": "/*\n An Sorted Set is a collection where all items in the set follow an ordering,\n usually sorted from 'least' to 'most'. The way you value and compare items\n can be user-defined.\n */\npublic struct SortedSet<T: Comparable> {\n  private var internalSet = [T]()\n  \n  public init() { }\n  \n  // Returns the number of elements in the SortedSet.\n  public var count: Int {\n    return internalSet.count\n  }\n  \n  // Inserts an item. Performance: O(n)\n  public mutating func insert(_ item: T) {\n    if exists(item) {\n      return  // don't add an item if it already exists\n    }\n    \n    // Insert new the item just before the one that is larger.\n    for i in 0..<count {\n      if internalSet[i] > item {\n        internalSet.insert(item, at: i)\n        return\n      }\n    }\n    \n    // Append to the back if the new item is greater than any other in the set.\n    internalSet.append(item)\n  }\n  \n  // Removes an item if it exists. Performance: O(n)\n  public mutating func remove(_ item: T) {\n    if let index = index(of: item) {\n      internalSet.remove(at: index)\n    }\n  }\n  \n  // Returns true if and only if the item exists somewhere in the set.\n  public func exists(_ item: T) -> Bool {\n    return index(of: item) != nil\n  }\n  \n  // Returns the index of an item if it exists, or -1 otherwise.\n  public func index(of item: T) -> Int? {\n    var leftBound = 0\n    var rightBound = count - 1\n    \n    while leftBound <= rightBound {\n      let mid = leftBound + ((rightBound - leftBound) / 2)\n      \n      if internalSet[mid] > item {\n        rightBound = mid - 1\n      } else if internalSet[mid] < item {\n        leftBound = mid + 1\n      } else if internalSet[mid] == item {\n        return mid\n      } else {\n        // When we get here, we've landed on an item whose value is equal to the\n        // value of the item we're looking for, but the items themselves are not\n        // equal. We need to check the items with the same value to the right\n        // and to the left in order to find an exact match.\n        \n        // Check to the right.\n        for j in stride(from: mid, to: count - 1, by: 1) {\n          if internalSet[j + 1] == item {\n            return j + 1\n          } else if internalSet[j] < internalSet[j + 1] {\n            break\n          }\n        }\n        \n        // Check to the left.\n        for j in stride(from: mid, to: 0, by: -1) {\n          if internalSet[j - 1] == item {\n            return j - 1\n          } else if internalSet[j] > internalSet[j - 1] {\n            break\n          }\n        }\n        return nil\n      }\n    }\n    return nil\n  }\n  \n  // Returns the item at the given index.\n  // Assertion fails if the index is out of the range of [0, count).\n  public subscript(index: Int) -> T {\n    assert(index >= 0 && index < count)\n    return internalSet[index]\n  }\n  \n  // Returns the 'maximum' or 'largest' value in the set.\n  public func max() -> T? {\n    return count == 0 ? nil : internalSet[count - 1]\n  }\n  \n  // Returns the 'minimum' or 'smallest' value in the set.\n  public func min() -> T? {\n    return count == 0 ? nil : internalSet[0]\n  }\n  \n  // Returns the k-th largest element in the set, if k is in the range\n  // [1, count]. Returns nil otherwise.\n  public func kLargest(_ k: Int) -> T? {\n    return k > count || k <= 0 ? nil : internalSet[count - k]\n  }\n  \n  // Returns the k-th smallest element in the set, if k is in the range\n  // [1, count]. Returns nil otherwise.\n  public func kSmallest(_ k: Int) -> T? {\n    return k > count || k <= 0 ? nil : internalSet[k - 1]\n  }\n}\n\n"
  },
  {
    "path": "Sorted Set/SortedSet.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='6.0' target-platform='ios' display-mode='raw' executeOnSourceChanges='false'>\n    <pages>\n        <page name='Example 1'/>\n        <page name='Example 2'/>\n        <page name='Example 3'/>\n    </pages>\n</playground>"
  },
  {
    "path": "Sorted Set/SortedSet.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Sorted Set/SortedSet.swift",
    "content": "/*\n An Sorted Set is a collection where all items in the set follow an ordering,\n usually sorted from 'least' to 'most'. The way you value and compare items\n can be user-defined.\n */\npublic struct SortedSet<T: Comparable> {\n  private var internalSet = [T]()\n  \n  public init() { }\n  \n  // Returns the number of elements in the SortedSet.\n  public var count: Int {\n    return internalSet.count\n  }\n  \n  // Inserts an item. Performance: O(n)\n  public mutating func insert(_ item: T) {\n    if exists(item) {\n      return  // don't add an item if it already exists\n    }\n    \n    // Insert new the item just before the one that is larger.\n    for i in 0..<count {\n      if internalSet[i] > item {\n        internalSet.insert(item, at: i)\n        return\n      }\n    }\n    \n    // Append to the back if the new item is greater than any other in the set.\n    internalSet.append(item)\n  }\n  \n  // Removes an item if it exists. Performance: O(n)\n  public mutating func remove(_ item: T) {\n    if let index = index(of: item) {\n      internalSet.remove(at: index)\n    }\n  }\n  \n  // Returns true if and only if the item exists somewhere in the set.\n  public func exists(_ item: T) -> Bool {\n    return index(of: item) != nil\n  }\n  \n  // Returns the index of an item if it exists, or -1 otherwise.\n  public func index(of item: T) -> Int? {\n    var leftBound = 0\n    var rightBound = count - 1\n    \n    while leftBound <= rightBound {\n      let mid = leftBound + ((rightBound - leftBound) / 2)\n      \n      if internalSet[mid] > item {\n        rightBound = mid - 1\n      } else if internalSet[mid] < item {\n        leftBound = mid + 1\n      } else if internalSet[mid] == item {\n        return mid\n      } else {\n        // When we get here, we've landed on an item whose value is equal to the\n        // value of the item we're looking for, but the items themselves are not\n        // equal. We need to check the items with the same value to the right\n        // and to the left in order to find an exact match.\n        \n        // Check to the right.\n        for j in stride(from: mid, to: count - 1, by: 1) {\n          if internalSet[j + 1] == item {\n            return j + 1\n          } else if internalSet[j] < internalSet[j + 1] {\n            break\n          }\n        }\n        \n        // Check to the left.\n        for j in stride(from: mid, to: 0, by: -1) {\n          if internalSet[j - 1] == item {\n            return j - 1\n          } else if internalSet[j] > internalSet[j - 1] {\n            break\n          }\n        }\n        return nil\n      }\n    }\n    return nil\n  }\n  \n  // Returns the item at the given index.\n  // Assertion fails if the index is out of the range of [0, count).\n  public subscript(index: Int) -> T {\n    assert(index >= 0 && index < count)\n    return internalSet[index]\n  }\n  \n  // Returns the 'maximum' or 'largest' value in the set.\n  public func max() -> T? {\n    return count == 0 ? nil : internalSet[count - 1]\n  }\n  \n  // Returns the 'minimum' or 'smallest' value in the set.\n  public func min() -> T? {\n    return count == 0 ? nil : internalSet[0]\n  }\n  \n  // Returns the k-th largest element in the set, if k is in the range\n  // [1, count]. Returns nil otherwise.\n  public func kLargest(_ k: Int) -> T? {\n    return k > count || k <= 0 ? nil : internalSet[count - k]\n  }\n  \n  // Returns the k-th smallest element in the set, if k is in the range\n  // [1, count]. Returns nil otherwise.\n  public func kSmallest(_ k: Int) -> T? {\n    return k > count || k <= 0 ? nil : internalSet[k - 1]\n  }\n}\n\n"
  },
  {
    "path": "Sparse Table/README.markdown",
    "content": "# Sparse Table\n\nI'm excited to present **Sparse Tables**. Despite being somewhat niche, Sparse Tables are simple to implement and extremely powerful.\n\n### The Problem\n\nLet's suppose:\n- we have an array **a** of some type\n- we have some associative binary function **f** <sup>[\\*]</sup>. The function can be: min, max, [gcd](../GCD/), boolean AND, boolean OR ...\n\n*<sup>[\\*]</sup> where **f** is also \"idempotent\". Don't worry, I'll explain this in a moment.*\n\nOur task is as follows:\n\n- Given two indices **l** and **r**, answer a **query** for the interval `[l, r)` by performing `f(a[l], a[l + 1], a[l + 2], ..., a[r - 1])`; taking all the elements in the range and applying **f** to them\n- There will be a *huge* number **Q** of these queries to answer ... so we should be able to answer each query *quickly*!  \n\nFor example, if we have an array of numbers:\n\n```swift\nvar a = [ 20, 3, -1, 101, 14, 29, 5, 61, 99 ]\n```\nand our function **f** is the *min* function.\n\nThen we may be given a query for interval `[3, 8)`. That means we look at the elements:\n\n```\n101, 14, 29, 5, 61\n```\n\nbecause these are the elements of **a** with indices \nthat lie in our range `[3, 8)` – elements from index 3 up to, but not including, index 8.\nWe then we pass all of these numbers into the min function, \nwhich takes the minimum. The answer to the query is `5`, because that's the result of `min(101, 14, 29, 5, 61)`.\n\nImagine we have millions of these queries to process.\n> - *Query 1*: Find minimum of all elements between 2 and 5\n> - *Query 2*: Find minimum of all elements between 3 and 9\n> - ...\n> - *Query 1000000*: Find minimum of all elements between 1 and 4\n\nAnd our array is very large. Here, let's say **Q** = 1000000 and **N** = 500000. Both numbers are *huge*. We want to make sure that we can answer each query really quickly, or else the number of queries will overwhelm us! \n\n*So that's the problem.* \n\nThe naive solution to this problem is to perform a `for` loop\nto compute the answer for each query. However, for very large **Q** and very large **N** this \nwill be too slow. We can speed up the time to compute the answer by using a data structure called\na **Sparse Table**. You'll notice that so far, our problem is exactly the same as that of the [Segment Tree](https://github.com/raywenderlich/swift-algorithm-club/tree/master/Segment%20Tree) \n(assuming you're familiar). However! ... there's one crucial difference between Segment Trees\nand Sparse Tables ... and it concerns our choice of **f**.\n\n\n### A small gotcha ... Idempotency\n\nSuppose we wanted to find the answer to **`[A, D)`**.\nAnd we already know the answer to two ranges  **`[A, B)`** and **`[C, D)`**.\nAnd importantly here, ... *these ranges overlap*!! We have **C** < **B**. \n\n![Overlapping ranges](Images/idempotency.png)\n\n\nSo what? Well, for **f** = minimum function, we can take our answers for **`[A, B)`** and **`[C, D)`** \nand combine them!\nWe can just take the minimum of the two answers: `result = min(x1, x2)` ... *voilà!*, we have the minimum for **`[A, D)`**.\nIt didn't matter that the intervals overlap - we still found the correct minimum.\nBut now suppose **f** is the addition operation `+`. Ok, so now we're taking sums over ranges.\nIf we tried the same approach again, it wouldn't work. That is, \nif we took our answers for **`[A, B)`** and **`[C, D)`** \nand added them together we'd get a wrong answer for **`[A, D)`**.\n*Why?* Well, we'd have counted some elements twice because of the overlap.\n\nLater, we'll see that in order to answer queries, Sparse Tables use this very technique. \nThey combine answers in the same way as shown above. Unfortunately this means\nwe have to exclude certain binary operators from being **f**, including `+`, `*`, XOR, ...\nbecause they don't work with this technique.\nIn order to get the best speed of a Sparse Table, \nwe need to make sure that the **f** we're using is an **[idempotent](https://en.wikipedia.org/wiki/Idempotence)** binary operator.\nMathematically, these are operators that satisfy `f(x, x) = x` for all possible **x** that could be in **a**. \nPractically speaking, these are the only operators that work; allowing us to combine answers from overlapping ranges.\nExamples of idempotent **f**'s are min, max, gcd, boolean AND, boolean OR, bitwise AND and bitwise OR.\nNote that for Segment Trees, **f** does not have to be idempotent. That's the crucial difference between\nSegment Trees and Sparse Tables.\n\n*Phew!* Now that we've got that out of the way, let's dive in!\n\n## Structure of a Sparse Table\n\nLet's use **f** = min and use the array:\n\n```swift\nvar a = [ 10, 6, 5, -7, 9, -8, 2, 4, 20 ]\n```\n\nIn this case, the Sparse Table looks like this:\n\n![Sparse Table](Images/structure.png)\n\nWhat's going on here? There seems to be loads of intervals.\n*Correct!* Sparse tables are preloaded with the answers for lots of queries `[l, r)`.\nHere's the idea. Before we process our **Q** queries, we'll pre-populate our Sparse Table `table`\nwith answers to loads of queries;\nmaking it act a bit like a *cache*. When we come to answer one of our queries, we can break the query\ndown into smaller \"sub-queries\", each having an answer that's already in the cache. \nWe lookup the cached answers for the sub-queries in \n`table` in constant time\nand combine the answers together \nto give the overall answer to the original query in speedy time.\n\nThe problem is, we can't store the answers for every single possible query that we could ever have ... \nor else our table would be too big! After all, our Sparse Table needs to be *sparse*. So what do we do?\nWe only pick the \"best\" intervals to store answers for. And as it turns out, the \"best\" intervals are those \nthat have a **width that is a power of two**!\n\nFor example, the answer for the query `[10, 18)` is in our table \nbecause the interval width: `18 - 10 = 8 = 2**3` is a power of two (`**` is the [exponentiation operator](https://en.wikipedia.org/wiki/Exponentiation)).\nAlso, the answer for `[15, 31)` is in our table because its width: `31 - 15 = 16 = 2**4` is again a power of two.\nHowever, the answer for `[1, 6)` is *not* in there because the interval's width: `6 - 1 = 5` is *not* a power of two.\nConsequently, we don't store answers for *all* possible intervals that fit inside **a** –\nonly the ones with a width that is a power of two. \nThis is true irrespective of where the interval starts within **a**.\nWe'll gradually see that this approach works and that relatively speaking, it uses very little space.\n\nA **Sparse Table** is a table where `table[w][l]` contains the answer for `[l, l + 2**w)`.     \nIt has entries `table[w][l]` where:\n- **w** tells us our **width** ... the number of elements or the *width* is `2**w`\n- **l** tells us the **lower bound** ... it's the starting point of our interval\n\nSome examples:\n- `table[3][0] = -8`: our width is `2**3`, we start at `l = 0` so our query is `[0, 0 + 2**3) = [0, 8)`.    \n   The answer for this query is `min(10, 6, 5, -7, 9, -8, 2, 4, 20) = -8`.\n- `table[2][1] = -7`: our width is `2**2`, we start at `l = 1` so our query is  `[1, 1 + 2**2) = [1, 5)`.    \n   The answer for this query is `min(6, 5, -7, 9) = -7`.\n- `table[1][7] = 4`: our width is `2**1`, we start at `l = 7` so our query is `[7, 7 + 2**1) = [7, 9)`.     \n   The answer for this query is `min(4, 20) = 4`.\n- `table[0][8] = 20`: our width is `2**0`, we start at `l = 8` so our query is`[8, 8 + 2**0) = [8, 9)`.    \n   The answer for this query is `min(20) = 20`.\n\n\n![Sparse Table](Images/structure_examples.png)\n\n\nA Sparse Table can be implemented using a [two-dimentional array](../2D%20Array).    \n\n```swift\npublic class SparseTable<T> {\n  private var table: [[T]]\n\n  public init(array: [T], function: @escaping (T, T) -> T, defaultT: T) {\n      table = [[T]](repeating: [T](repeating: defaultT, count: N), count: W)\n  }\n  // ...    \n}\n```\n\n\n## Building a Sparse Table\n\nTo build a Sparse Table, we compute each table entry starting from the bottom-left and moving up towards\nthe top-right (in accordance with the diagram).\nFirst we'll compute all the intervals for  **w** = 0, then compute all the intervals\nand for **w**  = 1 and so on. We'll continue up until **w** is big enough such that our intervals are can cover at least half the array.\nFor each **w**, we compute the interval for **l** = 0, 1, 2, 3, ... until we reach **N**.\nThis is all achieved using a double `for`-`in` loop:\n\n```swift\nfor w in 0..<W {\n  for l in 0..<N {\n    // compute table[w][l]\n  }\n}\n```\n\nTo compute `table[w][l]`:\n\n- **Base Case (w = 0)**: Each interval has width `2**w = 1`. \n    - We have *one* element intervals of the form: `[l, l + 1)`. \n    - The answer is just `a[l]` (e.g. the minimum of over a list with one element \nis just the element itself).\n      ```\n      table[w][l] = a[l]\n      ``` \n- **Inductive Case (w > 0)**: We need to find out the answer to `[l, l + 2**w)` for some **l**. \nThis interval, like all of our intervals in our table has a width that\nis a power of two (e.g.  2, 4, 8, 16) ... so we can cut it into two equal halves.\n    - Our interval with width ``2**w`` is cut into two intervals, each of width ``2**(w - 1)``.\n    - Because each half has a width that is a power of two, we can look them up in our Sparse Table.\n    - We combine them together using **f**. \n        ```\n        table[w][l] = f(table[w - 1][l], table[w - 1][l + 2 ** (w - 1)])\n        ```     \n\n\n![Sparse Table](Images/recursion.png)\n\nFor example for `a = [ 10, 6, 5, -7, 9, -8, 2, 4, 20 ]` and **f** = *min*:\n\n- we compute `table[0][2] = 5`. We just had to look at `a[2]` because the range has a width of one.\n- we compute `table[1][7] = 4`. We looked at `table[0][7]` and `table[0][8]` and apply **f** to them.\n- we compute `table[3][1] = -8`. We looked at `table[2][1]` and `table[2][5]` and apply **f** to them.\n\n\n![Sparse Table](Images/recursion_examples.png)\n\n\n\n```swift\npublic init(array: [T], function: @escaping (T, T) -> T, defaultT: T) {\n let N = array.count\n let W = Int(ceil(log2(Double(N))))\n table = [[T]](repeating: [T](repeating: defaultT, count: N), count: W)\n self.function = function\n self.defaultT = defaultT\n\n for w in 0..<W {\n   for l in 0..<N {\n     if w == 0 {\n       table[w][l] = array[l]\n     } else {\n       let first = self.table[w - 1][l]\n       let secondIndex = l + (1 << (w - 1))\n       let second = ((0..<N).contains(secondIndex)) ? table[w - 1][secondIndex] : defaultT\n       table[w][l] = function(first, second)\n     }\n   }\n }\n}\n```\n\nBuilding a Sparse Table takes **O(NlogN)** time.    \nThe table itself uses **O(NlgN)** additional space.\n\n## Getting Answers to Queries\n\nSuppose we've built our Sparse Table. And now we're going to process our **Q** queries.\nHere's where our work pays off.\n\nLet's suppose **f** = min and we have: \n```swift\nvar a = [ 10, 6, 5, -7, 9, -8, 2, 4, 20 ]\n```\nAnd we have a query `[3, 9)`.\n\n1. First let's find the largest power of two that fits inside `[3, 9)`. Our interval has width `9 - 3 = 6`. So the largest power of two    that fits inside is four. \n2. We create two new queries of `[3, 7)` and `[5, 9)` that have a width of four.\n   And, we arrange them so that to that they span the whole interval without leaving any gaps.\n   ![Sparse Table](Images/query_example.png)\n\n3. Because these two intervals have a width that is exactly a power of two we can lookup their answers in the Sparse Table using the \n   entries for **w** = 2. The answer to `[3, 7)` is given by `table[2][3]`, and the answer to `[5, 9)` is given by `table[2][5]`.\n   We compute and return `min(table[2][3], table[2][5])`. This is our final answer! :tada:. Although the two intervals overlap, it doesn't matter because the **f** = min we originally chose is idempotent.\n\nIn general, for each query: `[l, r)` ...\n\n1. Find **W**, by looking for the largest width that fits inside the interval that's also a power of two. Let largest such width = `2**W`.\n2. Form two sub-queries of width `2**W` and arrange them to that they span the whole interval without leaving gaps.\n   To guarantee there are no gaps, we need to align one half to the left and the align other half to the right.\n   ![Sparse Table](Images/query.png)\n3. Compute and return `f(table[W][l], table[W][r - 2**W])`.\n\n      ```swift\n      public func query(from l: Int, until r: Int) -> T {\n        let width = r - l\n        let W = Int(floor(log2(Double(width))))\n        let lo = table[W][l]\n        let hi = table[W][r - (1 << W)]\n        return function(lo, hi)\n     }\n      ```\n\nFinding answers to queries takes **O(1)** time.\n\n## Analysing Sparse Tables\n\n- **Query Time** - Both table lookups take constant time. All other operations inside `query` take constant time. \nSo answering a single query also takes constant time: **O(1)**. But instead of one query we're actually answering **Q** queries, \nand we'll need time to built the table before-hand.\nOverall time is: **O(NlgN + Q)** to build the table and answer all queries. \nThe naive approach is to do a for loop for each query. The overall time for the naive approach is: **O(NQ)**. \nFor very large **Q**, the naive approach will scale poorly. For example if `Q = O(N*N)`\nthen the naive approach is `O(N*N*N)` where a Sparse Table takes time `O(N*N)`.\n- **Space**-  The number of possible **w** is **lgN** and the number of possible **l** our table is **N**. So the table\nhas uses **O(NlgN)** additional space.\n\n### Comparison with Segment Trees\n\n- **Pre-processing** - Segment Trees take **O(N)** time to build and use **O(N)** space. Sparse Tables take **O(NlgN)** time to build and use **O(NlgN)** space.\n- **Queries** - Segment Tree queries are **O(lgN)** time for any **f** (idempotent or not idempotent). Sparse Table queries are **O(1)** time if **f** is idempotent and are not supported if **f** is not idempotent. <sup>[†]</sup>\n- **Replacing Items** - Segment Trees allow us to efficiently update an element in **a** and update the segment tree in **O(lgN)** time. Sparse Tables do not allow this to be done efficiently. If we were to update an element in **a**, we'd have to rebuild the Sparse Table all over again in **O(NlgN)** time.\n\n\n<sup>[†]</sup> *Although technically, it's possible to rewrite the `query` method \nto add support for non-idempotent functions. But in doing so, we'd bump up the time up from O(1) to O(lgn), \ncompletely defeating the original purpose of Sparse Tables - supporting lightening quick queries. \nIn such a case, we'd be better off using a Segment Tree (or a Fenwick Tree)*\n\n## Summary\n\nThat's it! See the playground for more examples involving Sparse Tables.\nYou'll see examples for: min, max, gcd, boolean operators and logical operators. \n\n### See also\n\n- [Segment Trees (Swift Algorithm Club)](https://github.com/raywenderlich/swift-algorithm-club/tree/master/Segment%20Tree)\n- [How to write O(lgn) time query function to support non-idempontent functions (GeeksForGeeks)](https://www.geeksforgeeks.org/range-sum-query-using-sparse-table/) \n- [Fenwick Trees / Binary Indexed Trees (TopCoder)](https://www.topcoder.com/community/data-science/data-science-tutorials/binary-indexed-trees/) \n- [Semilattice (Wikipedia)](https://en.wikipedia.org/wiki/Semilattice)\n\n*Written for Swift Algorithm Club by [James Lawson](https://github.com/jameslawson)*\n\n"
  },
  {
    "path": "Sparse Table/Sparse Table.playground/Contents.swift",
    "content": "//\n//  Swift Algorithm Club - Sparse Table\n//  Author: James Lawson (github.com/jameslawson)\n//\n\nimport Foundation\n\n// Last checked with Xcode Version 9.2 (9C40b)\n#if swift(>=4.0)\nprint(\"Hello, Swift 4!\")\n#endif\n\npublic class SparseTable<T> {\n  private var defaultT: T\n  private var table: [[T]]\n  private var function: (T, T) -> T\n\n  public init(array: [T], function: @escaping (T, T) -> T, defaultT: T) {\n    let N = array.count\n    let W = Int(ceil(log2(Double(N))))\n    table = [[T]](repeating: [T](repeating: defaultT, count: N), count: W)\n    self.function = function\n    self.defaultT = defaultT\n\n    for w in 0..<W {\n      for l in 0..<N {\n        if w == 0 {\n          table[w][l] = array[l]\n        } else {\n          let first = self.table[w - 1][l]\n          let secondIndex = l + (1 << (w - 1))\n          let second = ((0..<N).contains(secondIndex)) ? table[w - 1][secondIndex] : defaultT\n          table[w][l] = function(first, second)\n        }\n      }\n    }\n  }\n\n  public func query(from l: Int, until r: Int) -> T {\n    let width = r - l\n    let N = table[0].count\n    if width <= 0 || l >= N {\n      return defaultT\n    }\n    let r = min(N, r)\n    let W = Int(floor(log2(Double(width))))\n    let lo = table[W][l]\n    let hi = table[W][r - (1 << W)]\n    return function(lo, hi)\n  }\n}\n\nprint(\"---------------------------- EXAMPLE 1 -------------------------------------\")\n// Here we have an array of integers and we're repeatedly\n// finding the minimum over various ranges\n\nlet intArray = [1, -11, -7, 3, 2, 4]\nlet minIntTable = SparseTable<Int>(array: intArray, function: min, defaultT: Int.max)\nprint(minIntTable.query(from: 0, until: 6)) // min(1, 3, -11, 3, 2, 4) = -11\nprint(minIntTable.query(from: 3, until: 5)) // min(3, 2) = 2\nprint(minIntTable.query(from: 2, until: 6)) // min(-7, 3, 2, 4) = -7\nprint(minIntTable.query(from: 0, until: 1)) // min(1) = 1\nprint(minIntTable.query(from: 0, until: 0)) // min(<empty range>) = Int.max\nprint(\"----------------------------------------------------------------------------\\n\\n\")\n\n\nprint(\"---------------------------- EXAMPLE 2 -------------------------------------\")\n// Now we have an array of doubles and we're repeatedly\n// finding the maximum over various ranges\n\nlet doubleArray = [1.5, 20.0, 3.5, 15.0, 18.0, -10.0, 5.5]\nlet maxDoubleTable = SparseTable<Double>(array: doubleArray, function: max, defaultT: -.infinity)\nprint(maxDoubleTable.query(from: 0, until: 4)) // max(1.5, 20.0, 3.5, 15.0) = 20.0\nprint(maxDoubleTable.query(from: 3, until: 4)) // max(3.5, 15.0) = 15.0\nprint(maxDoubleTable.query(from: 4, until: 6)) // max(18.0, -10.0, 5.5) = 18.0\nprint(maxDoubleTable.query(from: 1, until: 2)) // max(20.0) = 20.0\nprint(maxDoubleTable.query(from: 0, until: 0)) // max(<empty range>) = -inf\nprint(\"----------------------------------------------------------------------------\\n\\n\")\n\n\nprint(\"---------------------------- EXAMPLE 3 -------------------------------------\")\n// An array of booleans and we're repeatedly\n// finding the boolean AND over various ranges\n\nlet boolArray = [true, false, true, true, true, false, false]\nfunc and(_ x: Bool, _ y: Bool) -> Bool { return x && y }\n\nlet maxBoolTable = SparseTable<Bool>(array: boolArray, function: and, defaultT: false)\nprint(maxBoolTable.query(from: 0, until: 4)) // and(T, F, T, T) = F\nprint(maxBoolTable.query(from: 2, until: 5)) // and(T, T, T) = T\nprint(maxBoolTable.query(from: 2, until: 6)) // and(T, T, T, F) = F\nprint(maxBoolTable.query(from: 0, until: 1)) // and(T) = T\nprint(maxBoolTable.query(from: 1, until: 2)) // and(F) = F\nprint(maxBoolTable.query(from: 0, until: 0)) // and(<empty range>) = F\nprint(\"----------------------------------------------------------------------------\\n\\n\")\n\nprint(\"---------------------------- EXAMPLE 4 -------------------------------------\")\n// An array of positive integers and we're repeatedly finding\n// the gcd (greatest common divisor) over various ranges. The gcd operator is\n// associative and idempotent so we can use it with sparse tables\n\nlet posIntArray = [7, 2, 3, 4, 6, 5, 25, 75, 100]\nfunc gcd(_ m: Int, _ n: Int) -> Int {\n  var a = 0\n  var b = max(m, n)\n  var r = min(m, n)\n\n  while r != 0 {\n    a = b\n    b = r\n    r = a % b\n  }\n  return b\n}\n\nlet gcdTable = SparseTable<Int>(array: posIntArray, function: gcd, defaultT: 1)\nprint(gcdTable.query(from: 0, until: 4)) // gcd(7, 2, 3) = 1\nprint(gcdTable.query(from: 3, until: 5)) // gcd(4, 6) = 2\nprint(gcdTable.query(from: 5, until: 7)) // gcd(5, 25, 75) = 5\nprint(gcdTable.query(from: 6, until: 9)) // gcd(25, 75, 100) = 25\nprint(gcdTable.query(from: 3, until: 4)) // gcd(4) = 4\nprint(gcdTable.query(from: 0, until: 0)) // gcd(<empty range>) = 1\nprint(\"------------------------------------------------------------------------\\n\\n\")\n\n\n\nprint(\"---------------------------- EXAMPLE 5 -------------------------------------\")\n// An array of nonnegative integers where for each integer we consider its binary representation.\n// We're repeatedly finding the binary OR (|) over various ranges. The binary operator is\n// associative and idempotent so we can use it with sparse tables\n\nlet binArray = [0b1001, 0b1100, 0b0000, 0b0001, 0b0010, 0b0100, 0b0000, 0b1111]\n\n\nlet orTable = SparseTable<Int>(array: binArray, function: |, defaultT: 0b0000)\nprint(String(orTable.query(from: 0, until: 2), radix: 2)) // binary_or(1001, 1100) = 1101\nprint(String(orTable.query(from: 3, until: 5), radix: 2)) // binary_or(0001, 0010) = 0011\n\nprint(String(orTable.query(from: 3, until: 6), radix: 2)) // binary_or(0001, 0010, 0100) = 0111\nprint(String(orTable.query(from: 6, until: 8), radix: 2)) // binary_or(0000, 1111) = 1111\nprint(String(orTable.query(from: 1, until: 5), radix: 2)) // binary_or(1100, 0000, 0001, 0010) = 1111\nprint(String(orTable.query(from: 0, until: 1), radix: 2)) // binary_or(1001) = 1001\nprint(String(orTable.query(from: 0, until: 0), radix: 2)) // binary_or(<empty range>) = 0000\nprint(\"----------------------------------------------------------------------------\\n\\n\")\n"
  },
  {
    "path": "Sparse Table/Sparse Table.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Sparse Table/Sparse Table.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Splay Tree/SplayTree.playground/Contents.swift",
    "content": "//: Playground - Splay Tree Implementation\n\n// last checked with Xcode 9.0b4\n#if swift(>=4.0)\nprint(\"Hello, Swift 4!\")\n#endif\n\nvar tree = SplayTree<Int>(value: 0)\ntree.insert(value: 2)\ntree.insert(value: 3)\ntree.insert(value: 4)\ntree.insert(value: 7)\n_ = tree.search(value: 2)\ntree.remove(value: 2)\n"
  },
  {
    "path": "Splay Tree/SplayTree.playground/Sources/SplayTree.swift",
    "content": "/*\n *  Splay Tree\n *\n * Based on Binary Search Tree Implementation written by Nicolas Ameghino and Matthijs Hollemans for Swift Algorithms Club\n * https://github.com/raywenderlich/swift-algorithm-club/blob/master/Binary%20Search%20Tree\n * And extended for the specifics of a Splay Tree by Barbara Martina Rodeker\n *\n */\n\n/**\n Represent the 3 possible operations (combinations of rotations) that\n could be performed during the Splay phase in Splay Trees\n \n - zigZag       Left child of a right child OR right child of a left child\n - zigZig       Left child of a left child OR right child of a right child\n - zig          Only 1 parent and that parent is the root\n \n */\npublic enum SplayOperation {\n    case zigZag\n    case zigZig\n    case zig\n    \n    \n    /**\n     Splay the given node up to the root of the tree\n     \n     - Parameters:\n     - node      SplayTree node to move up to the root\n     */\n    public static func splay<T>(node: Node<T>) {\n        \n        while (node.parent != nil) {\n            operation(forNode: node).apply(onNode: node)\n        }\n    }\n    \n    /**\n     Compares the node and its parent and determine\n     if the rotations should be performed in a zigZag, zigZig or zig case.\n     \n     - Parmeters:\n     - forNode       SplayTree node to be checked\n     - Returns\n     - Operation     Case zigZag - zigZig - zig\n     */\n    public static func operation<T>(forNode node: Node<T>) -> SplayOperation {\n        \n        if let parent = node.parent, let _ = parent.parent {\n            if (node.isLeftChild && parent.isRightChild) || (node.isRightChild && parent.isLeftChild) {\n                return .zigZag\n            }\n            return .zigZig\n        }\n        return .zig\n    }\n    \n    /**\n     Applies the rotation associated to the case\n     Modifying the splay tree and briging the received node further to the top of the tree\n     \n     - Parameters:\n     - onNode    Node to splay up. Should be alwayas the node that needs to be splayed, neither its parent neither it's grandparent\n     */\n    public func apply<T>(onNode node: Node<T>) {\n        switch self {\n        case .zigZag:\n            assert(node.parent != nil && node.parent!.parent != nil, \"Should be at least 2 nodes up in the tree\")\n            rotate(child: node, parent: node.parent!)\n            rotate(child: node, parent: node.parent!)\n            \n        case .zigZig:\n            assert(node.parent != nil && node.parent!.parent != nil, \"Should be at least 2 nodes up in the tree\")\n            rotate(child: node.parent!, parent: node.parent!.parent!)\n            rotate(child: node, parent: node.parent!)\n            \n        case .zig:\n            assert(node.parent != nil && node.parent!.parent == nil, \"There should be a parent which is the root\")\n            rotate(child: node, parent: node.parent!)\n        }\n    }\n    \n    /**\n     Performs a single rotation from a node to its parent\n     re-arranging the children properly\n     */\n    public func rotate<T>(child: Node<T>, parent: Node<T>) {\n        \n        assert(child.parent != nil && child.parent!.value == parent.value, \"Parent and child.parent should match here\")\n        \n        var grandchildToMode: Node<T>?\n        \n        if child.isLeftChild {\n            \n            grandchildToMode = child.right\n            parent.left = grandchildToMode\n            grandchildToMode?.parent = parent\n            \n            let grandParent = parent.parent\n            child.parent = grandParent\n            \n            if parent.isLeftChild {\n                grandParent?.left = child\n            } else {\n                grandParent?.right = child\n            }\n            \n            child.right = parent\n            parent.parent = child\n            \n            \n        } else {\n            \n            grandchildToMode = child.left\n            parent.right = grandchildToMode\n            grandchildToMode?.parent = parent\n            \n            let grandParent = parent.parent\n            child.parent = grandParent\n            \n            if parent.isLeftChild {\n                grandParent?.left = child\n            } else {\n                grandParent?.right = child\n            }\n            \n            child.left = parent\n            parent.parent = child\n            \n        }\n        \n        \n    }\n}\n\npublic class Node<T: Comparable> {\n    \n    fileprivate(set) public var value: T?\n    fileprivate(set) public var parent: Node<T>?\n    fileprivate(set) public var left: Node<T>?\n    fileprivate(set) public var right: Node<T>?\n    \n    init(value: T) {\n        self.value = value\n    }\n    \n    public var isRoot: Bool {\n        return parent == nil\n    }\n    \n    public var isLeaf: Bool {\n        return left == nil && right == nil\n    }\n    \n    public var isLeftChild: Bool {\n        return parent?.left === self\n    }\n    \n    public var isRightChild: Bool {\n        return parent?.right === self\n    }\n    \n    public var hasLeftChild: Bool {\n        return left != nil\n    }\n    \n    public var hasRightChild: Bool {\n        return right != nil\n    }\n    \n    public var hasAnyChild: Bool {\n        return hasLeftChild || hasRightChild\n    }\n    \n    public var hasBothChildren: Bool {\n        return hasLeftChild && hasRightChild\n    }\n    \n    /* How many nodes are in this subtree. Performance: O(n). */\n    public var count: Int {\n        return (left?.count ?? 0) + 1 + (right?.count ?? 0)\n    }\n}\n\npublic class SplayTree<T: Comparable> {\n    \n    internal var root: Node<T>?\n    \n    var value: T? {\n        return root?.value\n    }\n    \n    //MARK: - Initializer\n    \n    public init(value: T) {\n        self.root = Node(value:value)\n    }\n    \n    public func insert(value: T) {\n        if let root = root {\n            self.root = root.insert(value: value)\n        } else {\n            root = Node(value: value)\n        }\n    }\n    \n    public func remove(value: T) {\n        root = root?.remove(value: value)\n    }\n    \n    public func search(value: T) -> Node<T>? {\n        root = root?.search(value: value)\n        return root\n    }\n    \n    public func minimum() -> Node<T>? {\n        root = root?.minimum(splayed: true)\n        return root\n    }\n    \n    public func maximum() -> Node<T>? {\n        root = root?.maximum(splayed: true)\n        return root\n    }\n    \n}\n\n// MARK: - Adding items\n\nextension Node {\n    \n    /*\n     Inserts a new element into the node tree.\n     \n     - Parameters:\n     - value T value to be inserted. Will be splayed to the root position\n     \n     - Returns:\n     - Node inserted\n     */\n    public func insert(value: T) -> Node {\n        if let selfValue = self.value {\n            if value < selfValue {\n                if let left = left {\n                    return left.insert(value: value)\n                } else {\n                    \n                    left = Node(value: value)\n                    left?.parent = self\n                    \n                    if let left = left {\n                        SplayOperation.splay(node: left)\n                        return left\n                    }\n                }\n            } else {\n                \n                if let right = right {\n                    return right.insert(value: value)\n                } else {\n                    \n                    right = Node(value: value)\n                    right?.parent = self\n                    \n                    if let right = right {\n                        SplayOperation.splay(node: right)\n                        return right\n                    }\n                }\n            }\n        }\n        return self\n    }\n}\n\n// MARK: - Deleting items\n\nextension Node {\n    \n    /*\n     Deletes the given node from the nodes tree.\n     Return the new tree generated by the removal.\n     The removed node (not necessarily the one containing the value), will be splayed to the root.\n     \n     - Parameters:\n     - value         To be removed\n     \n     - Returns:\n     - Node     Resulting from the deletion and the splaying of the removed node\n     \n     */\n    fileprivate func remove(value: T) -> Node<T>? {\n        guard let target = search(value: value) else { return self }\n        \n        if let left = target.left, let right = target.right {\n            let largestOfLeftChild = left.maximum()\n            left.parent = nil\n            right.parent = nil\n            \n            SplayOperation.splay(node: largestOfLeftChild)\n            largestOfLeftChild.right = right\n            \n            return largestOfLeftChild\n            \n        } else if let left = target.left {\n            replace(node: target, with: left)\n            return left\n            \n        } else if let right = target.right {\n            replace(node: target, with: right)\n            return right\n            \n        } else {\n            return nil\n        }\n    }\n    \n    private func replace(node: Node<T>, with newNode: Node<T>?) {\n        guard let sourceParent = sourceNode.parent else { return }\n        \n        if sourceNode.isLeftChild {\n            sourceParent.left = newNode\n        } else {\n            sourceParent.right = newNode\n        }\n        \n        newNode?.parent = sourceParent\n    }\n}\n\n// MARK: - Searching\n\nextension Node {\n    \n    /*\n     Finds the \"highest\" node with the specified value.\n     Performance: runs in O(h) time, where h is the height of the tree.\n     */\n    public func search(value: T) -> Node<T>? {\n        var node: Node? = self\n        var nodeParent: Node? = self\n        while case let n? = node, n.value != nil {\n            if value < n.value! {\n                if n.left != nil { nodeParent = n.left }\n                node = n.left\n            } else if value > n.value! {\n                node = n.right\n                if n.right != nil { nodeParent = n.right }\n            } else {\n                break\n            }\n        }\n        \n        if let node = node {\n            SplayOperation.splay(node: node)\n            return node\n        } else if let nodeParent = nodeParent {\n            SplayOperation.splay(node: nodeParent)\n            return nodeParent\n        }\n        \n        return nil\n    }\n    \n    public func contains(value: T) -> Bool {\n        return search(value: value) != nil\n    }\n    \n    /*\n     Returns the leftmost descendent. O(h) time.\n     */\n    public func minimum(splayed: Bool = false) -> Node<T> {\n        var node = self\n        while case let next? = node.left {\n            node = next\n        }\n        \n        if splayed == true {\n            SplayOperation.splay(node: node)\n        }\n        \n        return node\n    }\n    \n    /*\n     Returns the rightmost descendent. O(h) time.\n     */\n    public func maximum(splayed: Bool = false) -> Node<T> {\n        var node = self\n        while case let next? = node.right {\n            node = next\n        }\n        \n        if splayed == true {\n            SplayOperation.splay(node: node)\n        }\n        \n        return node\n    }\n    \n    /*\n     Calculates the depth of this node, i.e. the distance to the root.\n     Takes O(h) time.\n     */\n    public func depth() -> Int {\n        var node = self\n        var edges = 0\n        while case let parent? = node.parent {\n            node = parent\n            edges += 1\n        }\n        return edges\n    }\n    \n    /*\n     Calculates the height of this node, i.e. the distance to the lowest leaf.\n     Since this looks at all children of this node, performance is O(n).\n     */\n    public func height() -> Int {\n        if isLeaf {\n            return 0\n        } else {\n            return 1 + max(left?.height() ?? 0, right?.height() ?? 0)\n        }\n    }\n    \n    /*\n     Finds the node whose value precedes our value in sorted order.\n     */\n    public func predecessor() -> Node<T>? {\n        if let left = left {\n            return left.maximum()\n        } else {\n            var node = self\n            while case let parent? = node.parent, parent.value != nil, value != nil {\n                if parent.value! < value! { return parent }\n                node = parent\n            }\n            return nil\n        }\n    }\n    \n    /*\n     Finds the node whose value succeeds our value in sorted order.\n     */\n    public func successor() -> Node<T>? {\n        if let right = right {\n            return right.minimum()\n        } else {\n            var node = self\n            while case let parent? = node.parent, parent.value != nil , value != nil {\n                if parent.value! > value! { return parent }\n                node = parent\n            }\n            return nil\n        }\n    }\n}\n\n// MARK: - Traversal\nextension Node {\n    \n    public func traverseInOrder(process: (T) -> Void) {\n        left?.traverseInOrder(process: process)\n        process(value!)\n        right?.traverseInOrder(process: process)\n    }\n    \n    public func traversePreOrder(process: (T) -> Void) {\n        process(value!)\n        left?.traversePreOrder(process: process)\n        right?.traversePreOrder(process: process)\n    }\n    \n    public func traversePostOrder(process: (T) -> Void) {\n        left?.traversePostOrder(process: process)\n        right?.traversePostOrder(process: process)\n        process(value!)\n    }\n    \n    /*\n     Performs an in-order traversal and collects the results in an array.\n     */\n    public func map(formula: (T) -> T) -> [T] {\n        var a = [T]()\n        if let left = left { a += left.map(formula: formula) }\n        a.append(formula(value!))\n        if let right = right { a += right.map(formula: formula) }\n        return a\n    }\n}\n\n/*\n Is this binary tree a valid binary search tree?\n */\nextension Node {\n    \n    public func isBST(minValue: T, maxValue: T) -> Bool {\n        if let value = value {\n            if value < minValue || value > maxValue { return false }\n            let leftBST = left?.isBST(minValue: minValue, maxValue: value) ?? true\n            let rightBST = right?.isBST(minValue: value, maxValue: maxValue) ?? true\n            return leftBST && rightBST\n        }\n        return false\n    }\n}\n\n// MARK: - Debugging\n\nextension Node: CustomStringConvertible {\n    public var description: String {\n        var s = \"\"\n        if let left = left {\n            s += \"left: (\\(left.description)) <- \"\n        }\n        if let v = value {\n            s += \"\\(v)\"\n        }\n        if let right = right {\n            s += \" -> (right: \\(right.description))\"\n        }\n        return s\n    }\n}\n\nextension SplayTree: CustomStringConvertible {\n    public var description: String {\n        return root?.description ?? \"Empty tree\"\n    }\n}\n\nextension Node: CustomDebugStringConvertible {\n    public var debugDescription: String {\n      var s = \"value: \\(String(describing: value))\"\n        if let parent = parent, let v = parent.value {\n            s += \", parent: \\(v)\"\n        }\n        if let left = left {\n            s += \", left = [\" + left.debugDescription + \"]\"\n        }\n        if let right = right {\n            s += \", right = [\" + right.debugDescription + \"]\"\n        }\n        return s\n    }\n    \n    public func toArray() -> [T] {\n        return map { $0 }\n    }\n}\n\nextension SplayTree: CustomDebugStringConvertible {\n    public var debugDescription: String {\n        return root?.debugDescription ?? \"Empty tree\"\n    }\n}\n"
  },
  {
    "path": "Splay Tree/SplayTree.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Splay Tree/SplayTree.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Splay Tree/SplayTree.swift",
    "content": "/*\n *  Splay Tree \n *\n * Based on Binary Search Tree Implementation written by Nicolas Ameghino and Matthijs Hollemans for Swift Algorithms Club\n * https://github.com/raywenderlich/swift-algorithm-club/blob/master/Binary%20Search%20Tree\n * And extended for the specifics of a Splay Tree by Barbara Martina Rodeker\n *\n */\n\n/**\n    Represent the 3 possible operations (combinations of rotations) that\n    could be performed during the Splay phase in Splay Trees\n \n    - zigZag       Left child of a right child OR right child of a left child\n    - zigZig       Left child of a left child OR right child of a right child\n    - zig          Only 1 parent and that parent is the root\n \n */\npublic enum SplayOperation {\n    case zigZag\n    case zigZig\n    case zig\n    \n    \n    /**\n        Splay the given node up to the root of the tree\n     \n        - Parameters:\n            - node      SplayTree node to move up to the root\n     */\n    public static func splay<T: Comparable>(node: Node<T>) {\n        \n        while (node.parent != nil) {\n            operation(forNode: node).apply(onNode: node)\n        }\n    }\n    \n    /**\n        Compares the node and its parent and determine\n        if the rotations should be performed in a zigZag, zigZig or zig case.\n     \n        - Parmeters:\n            - forNode       SplayTree node to be checked\n        - Returns\n            - Operation     Case zigZag - zigZig - zig\n     */\n    public static func operation<T>(forNode node: Node<T>) -> SplayOperation {\n        \n        if let parent = node.parent, let _ = parent.parent {\n            if (node.isLeftChild && parent.isRightChild) || (node.isRightChild && parent.isLeftChild) {\n                return .zigZag\n            }\n            return .zigZig\n        }\n        return .zig\n    }\n    \n    /**\n        Applies the rotation associated to the case \n        Modifying the splay tree and briging the received node further to the top of the tree\n     \n        - Parameters:\n            - onNode    Node to splay up. Should be alwayas the node that needs to be splayed, neither its parent neither it's grandparent\n     */\n    public func apply<T: Comparable>(onNode node: Node<T>) {\n        switch self {\n        case .zigZag:\n            assert(node.parent != nil && node.parent!.parent != nil, \"Should be at least 2 nodes up in the tree\")\n            rotate(child: node, parent: node.parent!)\n            rotate(child: node, parent: node.parent!)\n\n        case .zigZig:\n            assert(node.parent != nil && node.parent!.parent != nil, \"Should be at least 2 nodes up in the tree\")\n            rotate(child: node.parent!, parent: node.parent!.parent!)\n            rotate(child: node, parent: node.parent!)\n        \n        case .zig:\n            assert(node.parent != nil && node.parent!.parent == nil, \"There should be a parent which is the root\")\n            rotate(child: node, parent: node.parent!)\n        }\n    }\n    \n    /**\n        Performs a single rotation from a node to its parent\n        re-arranging the children properly\n     */\n    public func rotate<T: Comparable>(child: Node<T>, parent: Node<T>) {\n        \n        assert(child.parent != nil && child.parent!.value == parent.value, \"Parent and child.parent should match here\")\n        \n        var grandchildToMode: Node<T>?\n        \n        if child.isLeftChild {\n            \n            grandchildToMode = child.right\n            parent.left = grandchildToMode\n            grandchildToMode?.parent = parent\n\n            let grandParent = parent.parent\n            child.parent = grandParent\n\n            if parent.isLeftChild {\n                grandParent?.left = child\n            } else {\n                grandParent?.right = child\n            }\n\n            child.right = parent\n            parent.parent = child\n    \n\n        } else {\n            \n            grandchildToMode = child.left\n            parent.right = grandchildToMode\n            grandchildToMode?.parent = parent\n\n            let grandParent = parent.parent\n            child.parent = grandParent\n\n            if parent.isLeftChild {\n                grandParent?.left = child\n            } else {\n                grandParent?.right = child\n            }\n\n            child.left = parent\n            parent.parent = child\n\n        }\n        \n\n    }\n}\n\npublic class Node<T: Comparable> {\n    \n    fileprivate(set) public var value: T?\n    fileprivate(set) public var parent: Node<T>?\n    fileprivate(set) public var left: Node<T>?\n    fileprivate(set) public var right: Node<T>?\n    \n    init(value: T) {\n        self.value = value\n    }\n    \n    public var isRoot: Bool {\n        return parent == nil\n    }\n    \n    public var isLeaf: Bool {\n        return left == nil && right == nil\n    }\n    \n    public var isLeftChild: Bool {\n        return parent?.left === self\n    }\n    \n    public var isRightChild: Bool {\n        return parent?.right === self\n    }\n    \n    public var hasLeftChild: Bool {\n        return left != nil\n    }\n    \n    public var hasRightChild: Bool {\n        return right != nil\n    }\n    \n    public var hasAnyChild: Bool {\n        return hasLeftChild || hasRightChild\n    }\n    \n    public var hasBothChildren: Bool {\n        return hasLeftChild && hasRightChild\n    }\n    \n    /* How many nodes are in this subtree. Performance: O(n). */\n    public var count: Int {\n        return (left?.count ?? 0) + 1 + (right?.count ?? 0)\n    }\n}\n\npublic class SplayTree<T: Comparable> {\n\n    internal var root: Node<T>?\n    \n    var value: T? {\n        return root?.value\n    }\n\n    //MARK: - Initializer\n    \n    public init(value: T) {\n        self.root = Node(value:value)\n    }\n    \n    public func insert(value: T) {\n        if let root = root {\n            self.root = root.insert(value: value)\n        } else {\n            root = Node(value: value)\n        }\n    }\n    \n    public func remove(value: T) {\n        root = root?.remove(value: value)\n    }\n\n    public func search(value: T) -> Node<T>? {\n        root = root?.search(value: value)\n        return root\n    }\n    \n    public func minimum() -> Node<T>? {\n        root = root?.minimum(splayed: true)\n        return root\n    }\n    \n    public func maximum() -> Node<T>? {\n        root = root?.maximum(splayed: true)\n        return root\n    }\n    \n}\n\n// MARK: - Adding items\n\nextension Node {\n    \n    /*\n     Inserts a new element into the node tree.\n     \n     - Parameters:\n            - value T value to be inserted. Will be splayed to the root position\n     \n     - Returns:\n            - Node inserted\n     */\n    public func insert(value: T) -> Node {\n        if let selfValue = self.value {\n            if value < selfValue {\n                if let left = left {\n                    return left.insert(value: value)\n                } else {\n                    \n                    left = Node(value: value)\n                    left?.parent = self\n                    \n                    if let left = left {\n                        SplayOperation.splay(node: left)\n                        return left\n                    }\n                }\n            } else {\n                \n                if let right = right {\n                    return right.insert(value: value)\n                } else {\n                    \n                    right = Node(value: value)\n                    right?.parent = self\n                    \n                    if let right = right {\n                        SplayOperation.splay(node: right)\n                        return right\n                    }\n                }\n            }\n        }\n        return self\n    }\n}\n\n// MARK: - Deleting items\n\nextension Node {\n    \n    /*\n     Deletes the given node from the nodes tree.\n     Return the new tree generated by the removal. \n     The removed node (not necessarily the one containing the value), will be splayed to the root.\n     \n     - Parameters:\n            - value         To be removed\n     \n     - Returns:\n            - Node     Resulting from the deletion and the splaying of the removed node\n     \n     */\n    fileprivate func remove(value: T) -> Node<T>? {\n        guard let target = search(value: value) else { return self }\n        \n        if let left = target.left, let right = target.right {\n            let largestOfLeftChild = left.maximum()\n            left.parent = nil\n            right.parent = nil\n            \n            SplayOperation.splay(node: largestOfLeftChild)\n            largestOfLeftChild.right = right\n            \n            return largestOfLeftChild\n            \n        } else if let left = target.left {\n            replace(node: target, with: left)\n            return left\n            \n        } else if let right = target.right {\n            replace(node: target, with: right)\n            return right\n            \n        } else {\n            return nil\n        }\n    }\n    \n    private func replace(node: Node<T>, with newNode: Node<T>?) {\n        guard let sourceParent = sourceNode.parent else { return }\n        \n        if sourceNode.isLeftChild {\n            sourceParent.left = newNode\n        } else {\n            sourceParent.right = newNode\n        }\n        \n        newNode?.parent = sourceParent\n    }\n}\n\n// MARK: - Searching\n\nextension Node {\n    \n    /*\n     Finds the \"highest\" node with the specified value.\n     Performance: runs in O(h) time, where h is the height of the tree.\n     */\n    public func search(value: T) -> Node<T>? {\n        var node: Node? = self\n        var nodeParent: Node? = self\n        while case let n? = node, n.value != nil {\n            if value < n.value! {\n                if n.left != nil { nodeParent = n.left }\n                node = n.left\n            } else if value > n.value! {\n                node = n.right\n                if n.right != nil { nodeParent = n.right }\n            } else {\n                break\n            }\n        }\n        \n        if let node = node {\n            SplayOperation.splay(node: node)\n            return node\n        } else if let nodeParent = nodeParent {\n            SplayOperation.splay(node: nodeParent)\n            return nodeParent\n        }\n        \n        return nil\n    }\n    \n    public func contains(value: T) -> Bool {\n        return search(value: value) != nil\n    }\n    \n    /*\n     Returns the leftmost descendent. O(h) time.\n     */\n    public func minimum(splayed: Bool = false) -> Node<T> {\n        var node = self\n        while case let next? = node.left {\n            node = next\n        }\n        \n        if splayed == true {\n            SplayOperation.splay(node: node)\n        }\n        \n        return node\n    }\n    \n    /*\n     Returns the rightmost descendent. O(h) time.\n     */\n    public func maximum(splayed: Bool = false) -> Node<T> {\n        var node = self\n        while case let next? = node.right {\n            node = next\n        }\n        \n        if splayed == true {\n            SplayOperation.splay(node: node)\n        }\n        \n        return node\n    }\n    \n    /*\n     Calculates the depth of this node, i.e. the distance to the root.\n     Takes O(h) time.\n     */\n    public func depth() -> Int {\n        var node = self\n        var edges = 0\n        while case let parent? = node.parent {\n            node = parent\n            edges += 1\n        }\n        return edges\n    }\n    \n    /*\n     Calculates the height of this node, i.e. the distance to the lowest leaf.\n     Since this looks at all children of this node, performance is O(n).\n     */\n    public func height() -> Int {\n        if isLeaf {\n            return 0\n        } else {\n            return 1 + max(left?.height() ?? 0, right?.height() ?? 0)\n        }\n    }\n    \n    /*\n     Finds the node whose value precedes our value in sorted order.\n     */\n    public func predecessor() -> Node<T>? {\n        if let left = left {\n            return left.maximum()\n        } else {\n            var node = self\n            while case let parent? = node.parent, parent.value != nil, value != nil {\n                if parent.value! < value! { return parent }\n                node = parent\n            }\n            return nil\n        }\n    }\n    \n    /*\n     Finds the node whose value succeeds our value in sorted order.\n     */\n    public func successor() -> Node<T>? {\n        if let right = right {\n            return right.minimum()\n        } else {\n            var node = self\n            while case let parent? = node.parent, parent.value != nil , value != nil {\n                if parent.value! > value! { return parent }\n                node = parent\n            }\n            return nil\n        }\n    }\n}\n\n// MARK: - Traversal\nextension Node {\n    \n    public func traverseInOrder(process: (T) -> Void) {\n        left?.traverseInOrder(process: process)\n        process(value!)\n        right?.traverseInOrder(process: process)\n    }\n    \n    public func traversePreOrder(process: (T) -> Void) {\n        process(value!)\n        left?.traversePreOrder(process: process)\n        right?.traversePreOrder(process: process)\n    }\n    \n    public func traversePostOrder(process: (T) -> Void) {\n        left?.traversePostOrder(process: process)\n        right?.traversePostOrder(process: process)\n        process(value!)\n    }\n    \n    /*\n     Performs an in-order traversal and collects the results in an array.\n     */\n    public func map(formula: (T) -> T) -> [T] {\n        var a = [T]()\n        if let left = left { a += left.map(formula: formula) }\n        a.append(formula(value!))\n        if let right = right { a += right.map(formula: formula) }\n        return a\n    }\n}\n\n/*\n Is this binary tree a valid binary search tree?\n */\nextension Node {\n    \n    public func isBST(minValue: T, maxValue: T) -> Bool {\n        if let value = value {\n            if value < minValue || value > maxValue { return false }\n            let leftBST = left?.isBST(minValue: minValue, maxValue: value) ?? true\n            let rightBST = right?.isBST(minValue: value, maxValue: maxValue) ?? true\n            return leftBST && rightBST\n        }\n        return false\n    }\n}\n\n// MARK: - Debugging\n\nextension Node: CustomStringConvertible {\n    public var description: String {\n        var s = \"\"\n        if let left = left {\n            s += \"left: (\\(left.description)) <- \"\n        }\n        if let v = value {\n            s += \"\\(v)\"\n        }\n        if let right = right {\n            s += \" -> (right: \\(right.description))\"\n        }\n        return s\n    }\n}\n\nextension SplayTree: CustomStringConvertible {\n    public var description: String {\n        return root?.description ?? \"Empty tree\"\n    }\n}\n\nextension Node: CustomDebugStringConvertible {\n    public var debugDescription: String {\n        var s = \"value: \\(value)\"\n        if let parent = parent, let v = parent.value {\n            s += \", parent: \\(v)\"\n        }\n        if let left = left {\n            s += \", left = [\" + left.debugDescription + \"]\"\n        }\n        if let right = right {\n            s += \", right = [\" + right.debugDescription + \"]\"\n        }\n        return s\n    }\n    \n    public func toArray() -> [T] {\n        return map { $0 }\n    }\n}\n\nextension SplayTree: CustomDebugStringConvertible {\n    public var debugDescription: String {\n        return root?.debugDescription ?? \"Empty tree\"\n    }\n}\n"
  },
  {
    "path": "Splay Tree/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Splay Tree/Tests/SplayTreeTests.swift",
    "content": "import XCTest\n\nclass SplayTreeTests: XCTestCase {\n   \n    var tree1: SplayTree<Int>!\n    var tree2: SplayTree<Int>!\n    \n    override func setUp() {\n        super.setUp()\n        tree1 = SplayTree<Int>(value: 1)\n        \n        tree2 = SplayTree<Int>(value: 1)\n        tree2.insert(value: 10)\n        tree2.insert(value: 20)\n        tree2.insert(value: 3)\n        tree2.insert(value: 6)\n        tree2.insert(value: 100)\n        tree2.insert(value: 44)\n    }\n    \n    func testInsertion() {\n        tree1.insert(value: 10)\n        assert(tree1.value == 10)\n        \n        tree2.insert(value: 2)\n        assert(tree2.root?.value == 2)\n    }\n    \n    func testSearchNonExisting() {\n        let t = tree2.search(value: 5)\n        assert(t?.value == 10)\n    }\n\n    func testSearchExisting() {\n        let t = tree2.search(value: 6)\n        assert(t?.value == 6)\n    }\n    \n    func testDeleteExistingOnlyLeftChild() {\n        tree2.remove(value: 3)\n        assert(tree2.value == 6)\n    }\n\n    func testDeleteExistingOnly2Children() {\n        tree2.remove(value: 6)\n        assert(tree2.value == 20)\n    }\n    \n    func testDeleteRoot() {\n        tree2.remove(value: 44)\n        assert(tree2.value == 100)\n    }\n    \n    func testMinimum() {\n        let v = tree2.minimum()\n        assert(v?.value == 1)\n    }\n\n    func testMaximum() {\n        let v = tree2.maximum()\n        assert(v?.value == 100)\n    }\n    \n    func testInsertionRemovals() {\n        let splayTree = SplayTree(value: 1)\n        splayTree.insert(value: 2)\n        splayTree.insert(value: 10)\n        splayTree.insert(value: 6)\n        \n        splayTree.remove(value: 10)\n        splayTree.remove(value: 6)\n        \n        assert(splayTree.value == 2)\n    }\n    \n}\n"
  },
  {
    "path": "Splay Tree/Tests/Tests-Bridging-Header.h",
    "content": "//\n//  Use this file to import your target's public headers that you would like to expose to Swift.\n//\n\n"
  },
  {
    "path": "Splay Tree/Tests/Tests.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t763F9E771E59DAEF00AC5031 /* SplayTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = 763F9E761E59DAEF00AC5031 /* SplayTree.swift */; };\n\t\t763F9E791E59DAFE00AC5031 /* SplayTreeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 763F9E781E59DAFE00AC5031 /* SplayTreeTests.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t056E92A21E25D04D00B30F52 /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t056E92A61E25D04D00B30F52 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t763F9E761E59DAEF00AC5031 /* SplayTree.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SplayTree.swift; path = ../SplayTree.swift; sourceTree = \"<group>\"; };\n\t\t763F9E781E59DAFE00AC5031 /* SplayTreeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SplayTreeTests.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t056E929F1E25D04D00B30F52 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t056E92851E25D03300B30F52 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t056E92A31E25D04D00B30F52 /* Tests */,\n\t\t\t\t056E928F1E25D03300B30F52 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t056E928F1E25D03300B30F52 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t056E92A21E25D04D00B30F52 /* Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t056E92A31E25D04D00B30F52 /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t056E92A61E25D04D00B30F52 /* Info.plist */,\n\t\t\t\t763F9E781E59DAFE00AC5031 /* SplayTreeTests.swift */,\n\t\t\t\t763F9E761E59DAEF00AC5031 /* SplayTree.swift */,\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tsourceTree = SOURCE_ROOT;\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t056E92A11E25D04D00B30F52 /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 056E92A71E25D04D00B30F52 /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t056E929E1E25D04D00B30F52 /* Sources */,\n\t\t\t\t056E929F1E25D04D00B30F52 /* Frameworks */,\n\t\t\t\t056E92A01E25D04D00B30F52 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tproductName = Tests;\n\t\t\tproductReference = 056E92A21E25D04D00B30F52 /* Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t056E92861E25D03300B30F52 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0820;\n\t\t\t\tLastUpgradeCheck = 0820;\n\t\t\t\tORGANIZATIONNAME = \"Swift Algorithm Club\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t056E92A11E25D04D00B30F52 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.2;\n\t\t\t\t\t\tLastSwiftMigration = 0820;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 056E92891E25D03300B30F52 /* Build configuration list for PBXProject \"Tests\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 056E92851E25D03300B30F52;\n\t\t\tproductRefGroup = 056E928F1E25D03300B30F52 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t056E92A11E25D04D00B30F52 /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t056E92A01E25D04D00B30F52 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t056E929E1E25D04D00B30F52 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t763F9E771E59DAEF00AC5031 /* SplayTree.swift in Sources */,\n\t\t\t\t763F9E791E59DAFE00AC5031 /* SplayTreeTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t056E92991E25D03300B30F52 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t056E929A1E25D03300B30F52 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t056E92A81E25D04D00B30F52 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = Swift.Algorithm.Club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Tests-Bridging-Header.h\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 3.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t056E92A91E25D04D00B30F52 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = Swift.Algorithm.Club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OBJC_BRIDGING_HEADER = \"Tests-Bridging-Header.h\";\n\t\t\t\tSWIFT_VERSION = 3.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t056E92891E25D03300B30F52 /* Build configuration list for PBXProject \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t056E92991E25D03300B30F52 /* Debug */,\n\t\t\t\t056E929A1E25D03300B30F52 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t056E92A71E25D04D00B30F52 /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t056E92A81E25D04D00B30F52 /* Debug */,\n\t\t\t\t056E92A91E25D04D00B30F52 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 056E92861E25D03300B30F52 /* Project object */;\n}\n"
  },
  {
    "path": "Splay Tree/Tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Tests.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Splay Tree/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0820\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"056E92A11E25D04D00B30F52\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"056E92A11E25D04D00B30F52\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"056E92A11E25D04D00B30F52\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"056E92A11E25D04D00B30F52\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"056E92A11E25D04D00B30F52\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Splay Tree/readme.md",
    "content": "# Splay Tree\nSplay tree is a data structure, structurally identitical to a balanced binary search tree. Every operation performed on a Splay Tree causes a readjustment in order to provide fast access to recently operated values. On every access, the tree is rearranged and the node accessed is moved to the root of the tree using a set of specific rotations, which together are referred to as **Splaying**.\n\n\n## Rotations\n\nThere are 3 types of rotations that can form an **Splaying**:\n\n- ZigZig\n- ZigZag\n- Zig\n\n### Zig-Zig\n\nGiven a node *a* if *a* is not the root, and *a* has a child *b*, and both *a* and *b* are left children or right children, a **Zig-Zig** is performed.\n\n### Case both nodes right children\n![ZigZigCase1](Images/zigzig1.png)\n\n### Case both nodes left children\n![ZigZigCase2](Images/zigzig2.png)\n\n**IMPORTANT** is to note that a *ZigZig* performs first the rotation of the middle node with its parent (call it the grandparent) and later the rotation of the remaining node (grandchild). Doing that helps to keep the trees balanced even if it was first created by inserted a sequence of increasing values (see below worst case scenario followed by an explanation about why ZigZig rotates first to the grandparent).\n\n### Zig-Zag\n\nGiven a node *a* if *a* is not the root, and *a* has a child *b*, and *b* is the left child of *a* being the right child (or the opposite), a **Zig-Zag** is performed.\n\n### Case right - left\n![ZigZagCase1](Images/zigzag1.png)\n\n### Case left - right\n![ZigZagCase2](Images/zigzag2.png)\n\n**IMPORTANT** A *ZigZag* performs first the rotation of the grandchild node and later the same node with its new parent again. \n\n### Zig\n\nA **Zig** is performed when the node *a* to be rotated has the root as parent.\n\n![ZigCase](Images/zig.png)\n\n\n## Splaying\n\nSplaying consists in making so many rotations as needed until the node affected by the operation is at the top and becomes the root of the tree.\n\n```\nwhile (node.parent != nil) {\n    operation(forNode: node).apply(onNode: node)\n}\n```\n\nWhere operation returns the required rotation to be applied. \n\n```\npublic static func operation<T>(forNode node: Node<T>) -> SplayOperation {\n    \n    if let parent = node.parent, let _ = parent.parent {\n        if (node.isLeftChild && parent.isRightChild) || (node.isRightChild && parent.isLeftChild) {\n            return .zigZag\n        }\n        return .zigZig\n    }\n    return .zig\n}\n```\n\nDuring the applying phase, the algorithms determines which nodes are involved depending on the rotation to be applied and proceeding to re-arrange the node with its parent.\n\n```\npublic func apply<T>(onNode node: Node<T>) {\n    switch self {\n    case .zigZag:\n        assert(node.parent != nil && node.parent!.parent != nil, \"Should be at least 2 nodes up in the tree\")\n        rotate(child: node, parent: node.parent!)\n        rotate(child: node, parent: node.parent!)\n\n    case .zigZig:\n        assert(node.parent != nil && node.parent!.parent != nil, \"Should be at least 2 nodes up in the tree\")\n        rotate(child: node.parent!, parent: node.parent!.parent!)\n        rotate(child: node, parent: node.parent!)\n    \n    case .zig:\n        assert(node.parent != nil && node.parent!.parent == nil, \"There should be a parent which is the root\")\n        rotate(child: node, parent: node.parent!)\n    }\n}\n```\n\n\n## Operations on an Splay Tree\n\n### Insertion \n\nTo insert a value:\n\n- Insert it as in a binary search tree\n- Splay the value to the root\n\n### Deletion \n\nTo delete a value: \n\n- Perform search for the value, after performed search function if the tree contains the value, it'll be the root of the new tree.\n- If the tree has only left child, change left child to the root of the tree, remove the old root node\n- If the tree has only right child, change right child to the root of the tree, remove the old root node\n- Else, the tree has both two children, set parent of two children to nil, so that they're two new trees (left-tree and right-tree).\n- Splay the minimum node of right-tree (or minimum node of left-tree), then set left-tree as left child of new root of right-tree (or set right-tree as right child of new root of left-tree), return right-tree\n\n### Search \n\nTo search a value: \n\n- Search for it as in a binary search tree \n- Splay the node containing the value to the root \n- If not found splay the node that would had been the parent of the searched value \n\n### Minimum and maximum \n\n- Search the tree for the required value \n- Splay the node to the root \n\n## Examples \n\n### Example 1\n\nLets suppose a *find(20)* operation was performed and now the values **20** needs to be splayed to the root. \nThe sequence of steps will be the following: \n\n\n1. Since we are in a *ZigZig* case, we need to rotate **9** to **4**\n\n![ZiggEx1](Images/examplezigzig1.png)\n\n2. We got the following tree after the first rotation: \n\n![ZiggEx2](Images/examplezigzig2.png)\n\n3. And finally the **20** is rotated to the **9**\n\n![ZiggEx3](Images/examplezigzig3.png)\n\n\n### Example 2\n\nNow suppose a *insert(7)* operation was performed and we're in a *ZigZag* case.\n\n\n1. First **7** is rotated to **9**\n\n![ZigggEx21](Images/example1-1.png)\n\n2. And the result tree is: \n\n![ZigggEx22](Images/example1-2.png)\n\n3. Finally **7** is rotated to **4**\n\n![ZigggEx23](Images/example1-3.png)\n\n\n## Advantages \n\nSplay trees provide an efficient way to quickly access elements that are frequently requested. This characteristic makes then a good choice to implement, for example, caches or garbage collection algorithms, or in any other problem involving frequent access to a certain numbers of elements from a data set.\n\n## Disadvantages\n\nSplay tree are not perfectly balanced always, so in case of accessing all the elements in the tree in an increasing order, the height of the tree becomes *n*.\n\n## Time complexity\n\n| Case        |    Performance        |\n| ------------- |:-------------:|\n| Average      | O(log n) |\n| Worst      | n |\n\nWith *n* being the number of items in the tree.\n\n# An example of the Worst Case Performance \n\nSuppose the a sequence of consecutive values are inserted in an Splay Tree. \nLet's take for example [1,2,3,4,5,6,7,8].\n\nThe tree construction will be like following: \n\n\n1. Insert the number **1**\n\n2. Insert **2** \n\n\n![WorstCase1](Images/worst-case-1.png)\n\n\n3. Splay **2** to the root \n\n\n![WorstCase2](Images/worst-case-2.png)\n\n\n4. Insert **3** \n\n\n![WorstCase3](Images/worst-case-3.png)\n\n5. Splay **3** to the root \n\n\n![WorstCase4](Images/worst-case-4.png)\n\n\n6. Insert **4** \n\n\n![WorstCase5](Images/worst-case-5.png)\n\n\n7. After inserting the rest of the values the tree will look like this: \n\n\n![WorstCase6](Images/worst-case-6.png)\n\n\n\nIf we keep insert number following the same sequence, that tree becomes inbalanced and have a height of **n** with **n** being the numbers of values inserted. \nAfter getting this tree, a *find(1)* operation for example will take **O(n)**\n\n## ZigZig rotation order: first grandparent\n\nBut thanks to the properties of the **Splay Tree** and the *ZigZig* rotations after the *find(1)* operation the tree becomes balanced again. This only happens if we respect the order of the *ZigZig* rotation, and the rotation to the grandparent happens first. \n\nThe sequence of *ZigZigs* rotations will look like follows: \n\n1. Rotate **2** to **3**\n\n![ZigZig1](Images/example-zigzig-1.png)\n\n2. Rotate **1** to **2** \n\n![ZigZig2](Images/example-zigzig-2.png)\n\n3. Rotate **4** to **5**\n\n![ZigZig3](Images/example-zigzig-3.png)\n\n4. Rotate **1** to **4** \n\n![ZigZig4](Images/example-zigzig-4.png)\n\n5. Finally after splaying **1** to the root the tree will look like this: \n\n![ZigZig5](Images/example-zigzig-5.png)\n\n\nBased on the example above, we can see why it's important to rotate first to the grandparent. We got a tree of height = 6, from an initial tree of height = 8. If the tree would had been taller, we would have achieved almost half of the initial height after the splaying operation.\n\n## ZigZig wrong rotation order \n\nIf the rotations would had been taking first the parent and not the grandparent we would have finished with the following, yet unbalanced tree, just inverting the side of the elements.\n\n![ZigZigWrong](Images/zigzig-wrongrotated.png)\n\n\n## See also\n\n[Splay Tree on Wikipedia](https://en.wikipedia.org/wiki/Splay_tree)\n\n[Splay Tree by University of California in Berkeley - CS 61B Lecture 34](https://www.youtube.com/watch?v=8Zs1lj_bUV0)\n\n\n----------------\n\n*Written for Swift Algorithm Club by Barbara Martina Rodeker*\n\n----------------\n\n"
  },
  {
    "path": "Stack/README.markdown",
    "content": "# Stack\n\n> This topic has been tutorialized [here](https://www.raywenderlich.com/149213/swift-algorithm-club-swift-stack-data-structure)\n\nA stack is like an array but with limited functionality. You can only *push* to add a new element to the top of the stack, *pop* to remove the element from the top, and *peek* at the top element without popping it off.\n\nWhy would you want to do this? Well, in many algorithms you want to add objects to a temporary list at some point and then pull them off this list again at a later time. Often the order in which you add and remove these objects matters.\n\nA stack gives you a LIFO or last-in first-out order. The element you pushed last is the first one to come off with the next pop. (A very similar data structure, the [queue](../Queue/), is FIFO or first-in first-out.)\n\nFor example, let's push a number on the stack:\n\n```swift\nstack.push(10)\n```\n\nThe stack is now `[ 10 ]`. Push the next number:\n\n```swift\nstack.push(3)\n```\n\nThe stack is now `[ 10, 3 ]`. Push one more number:\n\n```swift\nstack.push(57)\n```\n\nThe stack is now `[ 10, 3, 57 ]`. Let's pop the top number off the stack:\n\n```swift\nstack.pop()\n```\n\nThis returns `57`, because that was the most recent number we pushed. The stack is `[ 10, 3 ]` again.\n\n```swift\nstack.pop()\n```\n\nThis returns `3`, and so on. If the stack is empty, popping returns `nil` or in some implementations it gives an error message (\"stack underflow\").\n\nA stack is easy to create in Swift. It's just a wrapper around an array that just lets you push, pop, and look at the top element of the stack:\n\n```swift\npublic struct Stack<T> {\n  fileprivate var array = [T]()\n\n  public var isEmpty: Bool {\n    return array.isEmpty\n  }\n\n  public var count: Int {\n    return array.count\n  }\n\n  public mutating func push(_ element: T) {\n    array.append(element)\n  }\n\n  public mutating func pop() -> T? {\n    return array.popLast()\n  }\n\n  public var top: T? {\n    return array.last\n  }\n}\n```\n\nNotice that a push puts the new element at the end of the array, not the beginning. Inserting at the beginning of an array is expensive, an **O(n)** operation, because it requires all existing array elements to be shifted in memory. Adding at the end is **O(1)**; it always takes the same amount of time, regardless of the size of the array.\n\nFun fact about stacks: Each time you call a function or a method, the CPU places the return address on a stack. When the function ends, the CPU uses that return address to jump back to the caller. That's why if you call too many functions -- for example in a recursive function that never ends -- you get a so-called \"stack overflow\" as the CPU stack has run out of space.\n\n*Written for Swift Algorithm Club by Matthijs Hollemans*\n"
  },
  {
    "path": "Stack/Stack.playground/Contents.swift",
    "content": "/**\n  Stack\n\n  A stack is like an array but with limited functionality. You can only push\n  to add a new element to the top of the stack, pop to remove the element from\n  the top, and peek at the top element without popping it off.\n\n  A stack gives you a LIFO or last-in first-out order. The element you pushed\n  last is the first one to come off with the next pop.\n\n  Push and pop are O(1) operations.\n \n  ## Usage\n  ```\n  var myStack = Stack(array: [])\n  myStack.push(10)\n  myStack.push(3)\n  myStack.push(57)\n  myStack.pop() // 57\n  myStack.pop() // 3\n ```\n*/\npublic struct Stack<T> {\n    \n  /// Datastructure consisting of a generic item.\n  fileprivate var array = [T]()\n\n  /// The number of items in the stack.\n  public var count: Int {\n    return array.count\n  }\n\n  /// Verifies if the stack is empty.\n  public var isEmpty: Bool {\n    return array.isEmpty\n  }\n\n  /**\n     Pushes an item to the top of the stack.\n     \n     - Parameter element: The item being pushed.\n  */\n  public mutating func push(_ element: T) {\n    array.append(element)\n  }\n\n  /**\n     Removes and returns the item at the top of the stack.\n     \n     - Returns: The item at the top of the stack.\n  */\n  public mutating func pop() -> T? {\n    return array.popLast()\n  }\n\n  /// Returns the item at the top of the stack.\n  public var top: T? {\n    return array.last\n  }\n}\n\n// Create a stack and put some elements on it already.\nvar stackOfNames = Stack(array: [\"Carl\", \"Lisa\", \"Stephanie\", \"Jeff\", \"Wade\"])\n\n// Add an element to the top of the stack.\nstackOfNames.push(\"Mike\")\n\n// The stack is now [\"Carl\", \"Lisa\", \"Stephanie\", \"Jeff\", \"Wade\", \"Mike\"]\nprint(stackOfNames.array)\n\n// Remove and return the first element from the stack. This returns \"Mike\".\nstackOfNames.pop()\n\n// Look at the first element from the stack.\n// Returns \"Wade\" since \"Mike\" was popped on the previous line.\nstackOfNames.top\n\n// Check to see if the stack is empty.\n// Returns \"false\" since the stack still has elements in it.\nstackOfNames.isEmpty\n"
  },
  {
    "path": "Stack/Stack.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios' last-migration='1000'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Stack/Stack.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Stack/Stack.swift",
    "content": "/*\n Last-in first-out stack (LIFO)\n Push and pop are O(1) operations.\n */\npublic struct Stack<T> {\n  fileprivate var array = [T]()\n  \n  public var isEmpty: Bool {\n    return array.isEmpty\n  }\n  \n  public var count: Int {\n    return array.count\n  }\n  \n  public mutating func push(_ element: T) {\n    array.append(element)\n  }\n  \n  public mutating func pop() -> T? {\n    return array.popLast()\n  }\n  \n  public var top: T? {\n    return array.last\n  }\n}\n\nextension Stack: Sequence {\n  public func makeIterator() -> AnyIterator<T> {\n    var curr = self\n    return AnyIterator {\n      return curr.pop()\n    }\n  }\n}\n"
  },
  {
    "path": "Stack/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Stack/Tests/StackTests.swift",
    "content": "import Foundation\nimport XCTest\n\nclass StackTest: XCTestCase {\n  func testEmpty() {\n    var stack = Stack<Int>()\n    XCTAssertTrue(stack.isEmpty)\n    XCTAssertEqual(stack.count, 0)\n    XCTAssertEqual(stack.top, nil)\n    XCTAssertNil(stack.pop())\n  }\n\n  func testOneElement() {\n    var stack = Stack<Int>()\n\n    stack.push(123)\n    XCTAssertFalse(stack.isEmpty)\n    XCTAssertEqual(stack.count, 1)\n    XCTAssertEqual(stack.top, 123)\n\n    let result = stack.pop()\n    XCTAssertEqual(result, 123)\n    XCTAssertTrue(stack.isEmpty)\n    XCTAssertEqual(stack.count, 0)\n    XCTAssertEqual(stack.top, nil)\n    XCTAssertNil(stack.pop())\n  }\n\n  func testTwoElements() {\n    var stack = Stack<Int>()\n\n    stack.push(123)\n    stack.push(456)\n    XCTAssertFalse(stack.isEmpty)\n    XCTAssertEqual(stack.count, 2)\n    XCTAssertEqual(stack.top, 456)\n\n    let result1 = stack.pop()\n    XCTAssertEqual(result1, 456)\n    XCTAssertFalse(stack.isEmpty)\n    XCTAssertEqual(stack.count, 1)\n    XCTAssertEqual(stack.top, 123)\n\n    let result2 = stack.pop()\n    XCTAssertEqual(result2, 123)\n    XCTAssertTrue(stack.isEmpty)\n    XCTAssertEqual(stack.count, 0)\n    XCTAssertEqual(stack.top, nil)\n    XCTAssertNil(stack.pop())\n  }\n\n  func testMakeEmpty() {\n    var stack = Stack<Int>()\n\n    stack.push(123)\n    stack.push(456)\n    XCTAssertNotNil(stack.pop())\n    XCTAssertNotNil(stack.pop())\n    XCTAssertNil(stack.pop())\n\n    stack.push(789)\n    XCTAssertEqual(stack.count, 1)\n    XCTAssertEqual(stack.top, 789)\n\n    let result = stack.pop()\n    XCTAssertEqual(result, 789)\n    XCTAssertTrue(stack.isEmpty)\n    XCTAssertEqual(stack.count, 0)\n    XCTAssertEqual(stack.top, nil)\n    XCTAssertNil(stack.pop())\n  }\n}\n"
  },
  {
    "path": "Stack/Tests/Tests.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t7B80C4061C77A70A003CECC7 /* Stack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C4051C77A70A003CECC7 /* Stack.swift */; };\n\t\t7B80C4081C77A711003CECC7 /* StackTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B80C4071C77A711003CECC7 /* StackTests.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t7B2BBC801C779D720067B71D /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7B2BBC941C779E7B0067B71D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };\n\t\t7B80C4051C77A70A003CECC7 /* Stack.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Stack.swift; path = ../Stack.swift; sourceTree = SOURCE_ROOT; };\n\t\t7B80C4071C77A711003CECC7 /* StackTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StackTests.swift; sourceTree = SOURCE_ROOT; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t7B2BBC7D1C779D720067B71D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t7B2BBC681C779D710067B71D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC831C779D720067B71D /* Tests */,\n\t\t\t\t7B2BBC721C779D710067B71D /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC721C779D710067B71D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC801C779D720067B71D /* Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC831C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B80C4051C77A70A003CECC7 /* Stack.swift */,\n\t\t\t\t7B80C4071C77A711003CECC7 /* StackTests.swift */,\n\t\t\t\t7B2BBC941C779E7B0067B71D /* Info.plist */,\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tpath = TestsTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t7B2BBC7F1C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t7B2BBC7C1C779D720067B71D /* Sources */,\n\t\t\t\t7B2BBC7D1C779D720067B71D /* Frameworks */,\n\t\t\t\t7B2BBC7E1C779D720067B71D /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tproductName = TestsTests;\n\t\t\tproductReference = 7B2BBC801C779D720067B71D /* Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t7B2BBC691C779D710067B71D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0720;\n\t\t\t\tLastUpgradeCheck = 0800;\n\t\t\t\tORGANIZATIONNAME = \"Swift Algorithm Club\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t7B2BBC7F1C779D720067B71D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2;\n\t\t\t\t\t\tLastSwiftMigration = 0800;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 7B2BBC681C779D710067B71D;\n\t\t\tproductRefGroup = 7B2BBC721C779D710067B71D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t7B2BBC7F1C779D720067B71D /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t7B2BBC7E1C779D720067B71D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t7B2BBC7C1C779D720067B71D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7B80C4081C77A711003CECC7 /* StackTests.swift in Sources */,\n\t\t\t\t7B80C4061C77A70A003CECC7 /* Stack.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t7B2BBC871C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC881C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t7B2BBC8D1C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 3.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC8E1C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 3.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC871C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC881C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC8D1C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC8E1C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 7B2BBC691C779D710067B71D /* Project object */;\n}\n"
  },
  {
    "path": "Stack/Tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Tests.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Stack/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0800\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Strassen Matrix Multiplication/README.markdown",
    "content": "# Strassen Matrix Multiplication\n\n## Goal\n+ To quickly perform a matrix multiplication operation on two matricies\n\n## What is Matrix Multiplication??\n\n> Note: If you are already familiar with Linear Algebra/Matrix Multiplication, feel free to skip this section\n\nBefore we begin, you may ask what is matrix multiplication? Great question! It is **NOT** multiplying two matricies term-by-term. Matrix multiplication is a mathematical operation that combines two matricies into a single one. Sounds like multiplying term-by-term huh? It's not... our lives would be much easier if it were. To see how matrix multiplcation works, let's look at an example.\n\n### Example: Matrix Multiplication\n\n```\nmatrix A = |1 2|, matrix B = |5 6|\n           |3 4|             |7 8|\n\t\nA * B = C\n\t\n|1 2| * |5 6| = |1*5+2*7 1*6+2*8| = |19 22|\n|3 4|   |7 8|   |3*5+4*7 3*6+4*8|   |43 50|\n```\n\nWhat's going on here? To start, we're multiplying matricies A & B. Our new matrix, C's, elements `[i, j]` are determined by the dot product of the first matrix's ith row and the second matrix's jth column. See [here](https://www.khanacademy.org/math/linear-algebra/vectors-and-spaces/dot-cross-products/v/vector-dot-product-and-vector-length) for a refresher on the dot product.\n\nSo the upper left element `[i=1, j=1]` of our new matrix is a combination of A's 1st row and B's 1st column.\n\n\tA's first row = [1, 2]\n\tB's first column = [5, 7]\n\n\t[1, 2] dot [5, 7] = [1*5 + 2*7] = [19] = C[1, 1]\n\nNow let's try this for `[i=1, j=2]`. Because `i=1` and `j=2`, this will represent the upper right element in our new matrix, C.\n\n\tA's first row = [1, 2]\n\tB's second column = [6, 8]\n\t\n\t[1, 2] dot [6, 8] = [1*6 + 2*8] = [22] = C[1, 2]\n\nIf we do this for each row & column of A & B we'll get our result matrix C!\n\nHere's a great graphic that visually shows you what's going on.\n\n![](https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/Matrix_multiplication_principle.svg/1024px-Matrix_multiplication_principle.svg.png)\n\n[Source](https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/Matrix_multiplication_principle.svg/1024px-Matrix_multiplication_principle.svg.png)\n\n\n## Matix Multiplication Algorithm\n\nSo how do we implement matrix multiplication in an algoirthm? We'll start with the basic version and from there move on to Strassen's Algorithm.\n\n+ [Basic Version](#basic-version)\n+ [Strassen's Algorithm](#strassens-algorithm)\n\n### Basic Version\n\nRemember the method we used to solve matrix multiplication [above](#what-is-matrix-multiplication??)? Let's try to implement that first! We first assert that the two matricies are the right size. \n\n`assert(A.columns == B.rows, \"Two matricies can only be matrix mulitiplied if one has dimensions mxn & the other has dimensions nxp where m, n, p are in R\")`\n\n> **NOTE:** A's # of columns HAS to equal B's # of rows for matrix multiplication to work\n\nNext, we loop over A's columns and B's rows. Because we know both A's columns & B's rows are the same length, we set that length equal to `n`.\n\n```swift\nfor i in 0..<n {\n  for j in 0..<n {\n```\n\nThen, for each row in A and column in B, we take the dot product of the ith row in A with the jth column in B and set that result equal to the `[i, j]` element in C. Or `C[i, j]`.\n\n```swift\nfor k in 0..<n {\n  C[i, j] += A[i, k] * B[k, j]\n}\n```\n\nFinally, we return our new matrix C!\n\nHere's the full implementation:\n\n```swift\npublic func matrixMultiply(by B: Matrix<T>) -> Matrix<T> {\n  let A = self\n  assert(A.columns == B.rows, \"Two matricies can only be matrix mulitiplied if one has dimensions mxn & the other has dimensions nxp where m, n, p are in R\")\n  let n = A.columns\n  var C = Matrix<T>(rows: A.rows, columns: B.columns)\n    \n  for i in 0..<n {\n    for j in 0..<n {\n      for k in 0..<n {\n        C[i, j] += A[i, k] * B[k, j]\n      }\n    }\n  }\n    \n  return C\n}\n```\n\nThis algorithm has a runtime of **O(n^3)**. The **O(n^3)** comes from the three `for` loops. Two from the loop over the rows & columns and one from the dot product!\n\nNow, **O(n^3)** is not very fast and a great question we should ask is can we do better? Indeed we can!\n\n### Strassens Algorithm\n\nVolker Strassen first published his algorithm in 1969. It was the first algorithm to prove that the basic **O(n^3)** runtime was not optiomal. \n\nThe basic idea behind Strassen's algorithm is to split A & B into 8 submatricies and then recursively compute the submatricies of C. This strategy is called *Divide and Conquer*.\n\n```\nmatrix A = |a b|, matrix B = |e f|\n           |c d|             |g h|\n```\n\n*There will be 8 recursive calls:*\n\n1. a * e\n2. b * g\n3. a * f \n4. b * h\n5. c * e\n6. d * g \n7. c * f \n8. d * h\n\nWe then use these results to compute C's submatricies.\n\n\tmatrix C = |ae+bg af+bh|\n\t\t\t   |ce+dg cf+dh| \n\n![http://d1hyf4ir1gqw6c.cloudfront.net//wp-content/uploads/strassen_new.png](http://d1hyf4ir1gqw6c.cloudfront.net//wp-content/uploads/strassen_new.png)\n\nThis step alone, however, doesn't help our runtime at all. Using the [Master Theorem](https://en.wikipedia.org/wiki/Master_theorem) with `T(n) = 8T(n/2) + O(n^2)` we still get a runtime of `O(n^3)`.\n\nStrassen's insight was that we don't actually need **8** recursive calls to complete this process. We can finish the call with **7** recursive calls and a little bit of addition and subtraction.\n\nStrassen's **7** calls are as follows:\n\n1. a * (f - h)\n2. (a + b) * h\n3. (c + d) * e\n4. d * (g - e)\n5. (a + d) * (e + h)\n6. (b - d) * (g + h)\n7. (a - c) * (e + f)\n\nNow we can compute our new matrix C's new quardents!\n\n```\nmatrix C = |p5+p4-p2+p6    p1+p2   |\n           |   p3+p4    p1+p5-p3-p7|    \n```\n\nA great reaction right now would be !!??!?!?!!?! How does this even work??\n\nLet's prove it!\n\n**First** Submatrix:\n\n```\np5+p4-p2+p6 = (a+d)*(e+h) + d*(g-e) - (a+b)*h + (b-d)*(g+h)\n            = (ae+de+ah+dh) + (dg-de) - (ah+bh) + (bg-dg+bh-dh)\n            = ae+bg ✅\n```\n\t\t\t\t\nExactly what we got the first time!\n\nNow let's prove the others.\n\n**Second** submatrix:\n\n```\np1+p2 = a*(f-h) + (a+b)*h\n      = (af-ah) + (ah+bh)\n      = af+bh ✅\n```\n\t\t  \n**Third** submatrix:\n\n```\np3+p4 = (c+d)*e + d*(g-e)\n      = (ce+de) + (dg-de)\n      = ce+dg ✅\n```\n\n**Fourth** submatrix: \n\n```\np1+p5-p3-p7 = a*(f-h) + (a+d)*(e+h) - (c+d)*e - (a-c)*(e+f)\n            = (af-ah) + (ae+de+ah+dh) -(ce+de) - (ae-ce+af-cf)\n            = cf+dh ✅\n```\n\nGreat! The math checks out!\n\nHere's the process in action.\n\n![](http://d1hyf4ir1gqw6c.cloudfront.net//wp-content/uploads/stressen_formula_new_new.png)\n\n[Source](http://www.geeksforgeeks.org/strassens-matrix-multiplication/)\n\n#### Implementation\n\nOk so now to the implementation. We'll start with the same first step from the basic implementation. We need to assert that A's # of columns are equal to B's number of rows.\n\n\tassert(A.columns == B.rows, \"Two matricies can only be matrix mulitiplied if one has dimensions mxn & the other has dimensions nxp where m, n, p are in R\")\n\t\nNow time for some prep work! We make each matrix a square and increase it's size to the next power of two. This ensures makes Strassen's Algorithm much easier to manage. We now only need to deal with square matricies that can be broken up an even number of times!\n\n```swift\nlet n = max(A.rows, A.columns, B.rows, B.columns)\nlet m = nextPowerOfTwo(after: n)\n    \nvar APrep = Matrix(size: m)\nvar BPrep = Matrix(size: m)\n   \nfor i in A.rows {\n  for j in A.columns {\n    APrep[i, j] = A[i,j]\n  }\n}\n\nfor i in B.rows {\n  for j in B.columns {\n    BPrep[i, j] = B[i, j]\n  }\n}\n```\n\nFinally, we recursively compute the matrix using Strassen's algorithm and the transform our new matrix `C` back to the correct dimensions!\n\n```swift\nlet CPrep = APrep.strassenR(by: BPrep)\nvar C = Matrix(rows: A.rows, columns: B.columns)\n    \nfor i in 0..<A.rows {\n  for j in 0..<B.columns {\n    C[i,j] = CPrep[i,j]\n  }\n}\n```\n\n#### Recursively Computing the Matrix Multiplication\n\nNext let's explore this recursive function `strassenR`.\n\nWe start by initializing 8 submatricies.\n\n```swift\nvar a = Matrix(size: nBy2)\nvar b = Matrix(size: nBy2)\nvar c = Matrix(size: nBy2)\nvar d = Matrix(size: nBy2)\nvar e = Matrix(size: nBy2)\nvar f = Matrix(size: nBy2)\nvar g = Matrix(size: nBy2)\nvar h = Matrix(size: nBy2)\n    \nfor i in 0..<nBy2 {\n  for j in 0..<nBy2 {\n    a[i,j] = A[i,j]\n    b[i,j] = A[i, j+nBy2]\n    c[i,j] = A[i+nBy2, j]\n    d[i,j] = A[i+nBy2, j+nBy2]\n    e[i,j] = B[i,j]\n    f[i,j] = B[i, j+nBy2]\n    g[i,j] = B[i+nBy2, j]\n    h[i,j] = B[i+nBy2, j+nBy2]\n  }\n}\n```\n\nWe next recursively compute the 7 matrix multiplications.\n\n```swift\nlet p1 = a.strassenR(by: f-h)       // a * (f - h)\nlet p2 = (a+b).strassenR(by: h)     // (a + b) * h\nlet p3 = (c+d).strassenR(by: e)     // (c + d) * e\nlet p4 = d.strassenR(by: g-e)       // d * (g - e)\nlet p5 = (a+d).strassenR(by: e+h)   // (a + d) * (e + h)\nlet p6 = (b-d).strassenR(by: g+h)   // (b - d) * (g + h)\nlet p7 = (a-c).strassenR(by: e+f)   // (a - c) * (e + f)\n```\n\nNext, we compute the submatricies of C.\n\n```swift\nlet c11 = p5 + p4 - p2 + p6         // p5 + p4 - p2 + p6\nlet c12 = p1 + p2                   // p1 + p2\nlet c21 = p3 + p4                   // p3 + p4\nlet c22 = p1 + p5 - p3 - p7         // p1 + p5 - p3 - p7\n```\n\nAnd finally, we combine these submatricies into our new matrix C!\n\n```swift\nvar C = Matrix(size: n)    \nfor i in 0..<nBy2 {\n  for j in 0..<nBy2 {\n    C[i, j]           = c11[i,j]\n    C[i, j+nBy2]      = c12[i,j]\n    C[i+nBy2, j]      = c21[i,j]\n    C[i+nBy2, j+nBy2] = c22[i,j]\n  }\n}\n```\n\nAs before, we can analyze the time completxity using the [Master Theorem](https://en.wikipedia.org/wiki/Master_theorem). `T(n) = 7T(n/2) +  O(n^2)` which leads to `O(n^log(7))` runtime. This comes out to approxiamtely `O(n^2.8074)` which is better than `O(n^3)`!\n\nAnd that's Strassen's algorithm! Here's the full implementation:\n\n```swift\n// MARK: - Strassen Multiplication\n\nextension Matrix {\n  public func strassenMatrixMultiply(by B: Matrix<T>) -> Matrix<T> {\n    let A = self\n    assert(A.columns == B.rows, \"Two matricies can only be matrix mulitiplied if one has dimensions mxn & the other has dimensions nxp where m, n, p are in R\")\n    \n    let n = max(A.rows, A.columns, B.rows, B.columns)\n    let m = nextPowerOfTwo(after: n)\n    \n    var APrep = Matrix(size: m)\n    var BPrep = Matrix(size: m)\n    \n    A.forEach { (i, j) in\n      APrep[i,j] = A[i,j]\n    }\n    \n    B.forEach { (i, j) in\n      BPrep[i,j] = B[i,j]\n    }\n    \n    let CPrep = APrep.strassenR(by: BPrep)\n    var C = Matrix(rows: A.rows, columns: B.columns)\n    for i in 0..<A.rows {\n      for j in 0..<B.columns {\n        C[i,j] = CPrep[i,j]\n      }\n    }\n    \n    return C\n  }\n  \n  private func strassenR(by B: Matrix<T>) -> Matrix<T> {\n    let A = self\n    assert(A.isSquare && B.isSquare, \"This function requires square matricies!\")\n    guard A.rows > 1 && B.rows > 1 else { return A * B }\n    \n    let n    = A.rows\n    let nBy2 = n / 2\n    \n    /*\n    Assume submatricies are allocated as follows\n    \n     matrix A = |a b|,    matrix B = |e f|\n                |c d|                |g h|\n    */\n    \n    var a = Matrix(size: nBy2)\n    var b = Matrix(size: nBy2)\n    var c = Matrix(size: nBy2)\n    var d = Matrix(size: nBy2)\n    var e = Matrix(size: nBy2)\n    var f = Matrix(size: nBy2)\n    var g = Matrix(size: nBy2)\n    var h = Matrix(size: nBy2)\n    \n    for i in 0..<nBy2 {\n      for j in 0..<nBy2 {\n        a[i,j] = A[i,j]\n        b[i,j] = A[i, j+nBy2]\n        c[i,j] = A[i+nBy2, j]\n        d[i,j] = A[i+nBy2, j+nBy2]\n        e[i,j] = B[i,j]\n        f[i,j] = B[i, j+nBy2]\n        g[i,j] = B[i+nBy2, j]\n        h[i,j] = B[i+nBy2, j+nBy2]\n      }\n    }\n    \n    let p1 = a.strassenR(by: f-h)       // a * (f - h)\n    let p2 = (a+b).strassenR(by: h)     // (a + b) * h\n    let p3 = (c+d).strassenR(by: e)     // (c + d) * e\n    let p4 = d.strassenR(by: g-e)       // d * (g - e)\n    let p5 = (a+d).strassenR(by: e+h)   // (a + d) * (e + h)\n    let p6 = (b-d).strassenR(by: g+h)   // (b - d) * (g + h)\n    let p7 = (a-c).strassenR(by: e+f)   // (a - c) * (e + f)\n    \n    let c11 = p5 + p4 - p2 + p6         // p5 + p4 - p2 + p6\n    let c12 = p1 + p2                   // p1 + p2\n    let c21 = p3 + p4                   // p3 + p4\n    let c22 = p1 + p5 - p3 - p7         // p1 + p5 - p3 - p7\n    \n    var C = Matrix(size: n)\n    for i in 0..<nBy2 {\n      for j in 0..<nBy2 {\n        C[i, j]           = c11[i,j]\n        C[i, j+nBy2]      = c12[i,j]\n        C[i+nBy2, j]      = c21[i,j]\n        C[i+nBy2, j+nBy2] = c22[i,j]\n      }\n    }\n    \n    return C\n  }\n  \n  private func nextPowerOfTwo(after n: Int) -> Int {\n    return Int(pow(2, ceil(log2(Double(n)))))\n  }\n}\n```\n\n## Appendix\n\n### Number Protocol\n\nI use a number protocol to enable by Matrix to be generic. \n\nThe Number protocol ensures three things:\n\n1. Everything that is a number can be multiplied\n2. Everything that is a number can be added/subtracted\n3. Everything that is a number has a zero value\n\nExtending `Int`, `Float`, and `Double` to conform to this protocol is now very straightforward. All you need to do is implement the `static var zero`! \n\n```swift\npublic protocol Number: Multipliable, Addable {\n  static var zero: Self { get }\n}\n\npublic protocol Addable {\n  static func +(lhs: Self, rhs: Self) -> Self\n  static func -(lhs: Self, rhs: Self) -> Self\n}\n\npublic protocol Multipliable {\n  static func *(lhs: Self, rhs: Self) -> Self\n}\n```\n\n### Dot Product\n\nI extend `Array` to include a dot product function for when the Array's element conform to the `Number` protocol.\n\n```swift\nextension Array where Element: Number {\n  public func dot(_ b: Array<Element>) -> Element {\n    let a = self\n    assert(a.count == b.count, \"Can only take the dot product of arrays of the same length!\")\n    let c = a.indices.map{ a[$0] * b[$0] }\n    return c.reduce(Element.zero, { $0 + $1 })\n  }\n}\n```\n\n## Resources\n\n+ [Intro to Matrix Multiplication | Khan Academy](https://www.khanacademy.org/math/precalculus/precalc-matrices/multiplying-matrices-by-matrices/v/matrix-multiplication-intro)\n+ [Matrix Multiplication | Wikipedia](https://en.wikipedia.org/wiki/Matrix_multiplication)\n+ [Strassen Algorithm | Wikipedia](https://en.wikipedia.org/wiki/Strassen_algorithm)\n+ [Strassen Algorithm | Wolfram MathWorld](http://mathworld.wolfram.com/StrassenFormulas.html)\n+ [Strassens Algorithm | Geeks for Geeks](http://www.geeksforgeeks.org/strassens-matrix-multiplication/)\n\n*Written for Swift Algorithm Club by Richard Ash*"
  },
  {
    "path": "Strassen Matrix Multiplication/StrassensMatrixMultiplication.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\nimport Foundation\n\nvar A = Matrix(rows: 2, columns: 4, initialValue: 0)\nA[.row, 0] = [2, 3, -1, 0]\nA[.row, 1] = [-7, 2, 1, 10]\n\nvar B = Matrix(rows: 4, columns: 2, initialValue: 0)\nprint(B)\nB[.column, 0] = [3, 2, -1, 2]\nB[.column, 1] = [4, 1, 2, 7]\n\nlet C = A.matrixMultiply(by: B)\nlet D = A.strassenMatrixMultiply(by: B)\nlet E = B.matrixMultiply(by: A)\nlet F = B.strassenMatrixMultiply(by: A)\nprint(C)\nprint(D)\nprint(E)\nprint(F)\n"
  },
  {
    "path": "Strassen Matrix Multiplication/StrassensMatrixMultiplication.playground/Sources/Matrix.swift",
    "content": "//\n//  Matrix.swift\n//  \n//\n//  Created by Richard Ash on 10/28/16.\n//\n//\n\nimport Foundation\n\npublic struct Matrix<T: Number> {\n\n  // MARK: - Martix Objects\n\n  public enum Index {\n    case row, column\n  }\n\n  public struct Size: Equatable {\n    let rows: Int, columns: Int\n\n    public static func == (lhs: Size, rhs: Size) -> Bool {\n      return lhs.columns == rhs.columns && lhs.rows == rhs.rows\n    }\n  }\n\n  // MARK: - Variables\n\n  let rows: Int, columns: Int\n  let size: Size\n\n  var grid: [T]\n\n  var isSquare: Bool {\n    return rows == columns\n  }\n\n  // MARK: - Init\n\n  public init(rows: Int, columns: Int, initialValue: T = T.zero) {\n    self.rows = rows\n    self.columns = columns\n    self.size = Size(rows: rows, columns: columns)\n    self.grid = Array(repeating: initialValue, count: rows * columns)\n  }\n\n  public init(size: Int, initialValue: T = T.zero) {\n    self.init(rows: size, columns: size, initialValue: initialValue)\n  }\n\n  // MARK: - Private Functions\n\n  fileprivate func indexIsValid(row: Int, column: Int) -> Bool {\n    return row >= 0 && row < rows && column >= 0 && column < columns\n  }\n\n  // MARK: - Subscript\n\n  public subscript(row: Int, column: Int) -> T {\n    get {\n      assert(indexIsValid(row: row, column: column), \"Index out of range\")\n      return grid[(row * columns) + column]\n    } set {\n      assert(indexIsValid(row: row, column: column), \"Index out of range\")\n      grid[(row * columns) + column] = newValue\n    }\n  }\n\n  public subscript(type: Matrix.Index, value: Int) -> [T] {\n    get {\n      switch type {\n      case .row:\n        assert(indexIsValid(row: value, column: 0), \"Index out of range\")\n        return Array(grid[(value * columns)..<(value * columns) + columns])\n      case .column:\n        assert(indexIsValid(row: 0, column: value), \"Index out of range\")\n        let column = (0..<rows).map { (currentRow) -> T in\n          let currentColumnIndex = currentRow * columns + value\n          return grid[currentColumnIndex]\n        }\n        return column\n      }\n    } set {\n      switch type {\n      case .row:\n        assert(newValue.count == columns)\n        for (column, element) in newValue.enumerated() {\n          grid[(value * columns) + column] = element\n        }\n      case .column:\n        assert(newValue.count == rows)\n        for (row, element) in newValue.enumerated() {\n          grid[(row * columns) + value] = element\n        }\n      }\n    }\n  }\n\n  // MARK: - Public Functions\n\n  public func row(for columnIndex: Int) -> [T] {\n    assert(indexIsValid(row: columnIndex, column: 0), \"Index out of range\")\n    return Array(grid[(columnIndex * columns)..<(columnIndex * columns) + columns])\n  }\n\n  public func column(for rowIndex: Int) -> [T] {\n    assert(indexIsValid(row: 0, column: rowIndex), \"Index out of range\")\n\n    let column = (0..<rows).map { (currentRow) -> T in\n      let currentColumnIndex = currentRow * columns + rowIndex\n      return grid[currentColumnIndex]\n    }\n    return column\n  }\n\n  public func forEach(_ body: (Int, Int) throws -> Void) rethrows {\n    for row in 0..<rows {\n      for column in 0..<columns {\n        try body(row, column)\n      }\n    }\n  }\n}\n\n// MARK: - Matrix Multiplication Function\n\nextension Matrix {\n  public func matrixMultiply(by B: Matrix<T>) -> Matrix<T> {\n    let A = self\n    assert(A.columns == B.rows, \"Two matricies can only be matrix mulitiplied if one has dimensions mxn & the other has dimensions nxp where m, n, p are in R\")\n\n    var C = Matrix<T>(rows: A.rows, columns: B.columns)\n\n    for i in 0..<A.rows {\n      for j in 0..<B.columns {\n        C[i, j] = A[.row, i].dot(B[.column, j])\n      }\n    }\n\n    return C\n  }\n}\n\n// MARK: - Strassen Multiplication\n\nextension Matrix {\n  public func strassenMatrixMultiply(by B: Matrix<T>) -> Matrix<T> {\n    let A = self\n    assert(A.columns == B.rows, \"Two matricies can only be matrix mulitiplied if one has dimensions mxn & the other has dimensions nxp where m, n, p are in R\")\n\n    let n = max(A.rows, A.columns, B.rows, B.columns)\n    let m = nextPowerOfTwo(after: n)\n\n    var APrep = Matrix(size: m)\n    var BPrep = Matrix(size: m)\n\n    A.forEach { (i, j) in\n      APrep[i, j] = A[i, j]\n    }\n\n    B.forEach { (i, j) in\n      BPrep[i, j] = B[i, j]\n    }\n\n    let CPrep = APrep.strassenR(by: BPrep)\n    var C = Matrix(rows: A.rows, columns: B.columns)\n    for i in 0..<A.rows {\n      for j in 0..<B.columns {\n        C[i, j] = CPrep[i, j]\n      }\n    }\n\n    return C\n  }\n\n  private func strassenR(by B: Matrix<T>) -> Matrix<T> {\n    let A = self\n    assert(A.isSquare && B.isSquare, \"This function requires square matricies!\")\n    guard A.rows > 1 && B.rows > 1 else { return A * B }\n\n    let n    = A.rows\n    let nBy2 = n / 2\n\n    /*\n    Assume submatricies are allocated as follows\n    \n     matrix A = |a b|,    matrix B = |e f|\n                |c d|                |g h|\n    */\n\n    var a = Matrix(size: nBy2)\n    var b = Matrix(size: nBy2)\n    var c = Matrix(size: nBy2)\n    var d = Matrix(size: nBy2)\n    var e = Matrix(size: nBy2)\n    var f = Matrix(size: nBy2)\n    var g = Matrix(size: nBy2)\n    var h = Matrix(size: nBy2)\n\n    for i in 0..<nBy2 {\n      for j in 0..<nBy2 {\n        a[i, j] = A[i, j]\n        b[i, j] = A[i, j+nBy2]\n        c[i, j] = A[i+nBy2, j]\n        d[i, j] = A[i+nBy2, j+nBy2]\n        e[i, j] = B[i, j]\n        f[i, j] = B[i, j+nBy2]\n        g[i, j] = B[i+nBy2, j]\n        h[i, j] = B[i+nBy2, j+nBy2]\n      }\n    }\n\n    let p1 = a.strassenR(by: f-h)       // a * (f - h)\n    let p2 = (a+b).strassenR(by: h)     // (a + b) * h\n    let p3 = (c+d).strassenR(by: e)     // (c + d) * e\n    let p4 = d.strassenR(by: g-e)       // d * (g - e)\n    let p5 = (a+d).strassenR(by: e+h)   // (a + d) * (e + h)\n    let p6 = (b-d).strassenR(by: g+h)   // (b - d) * (g + h)\n    let p7 = (a-c).strassenR(by: e+f)   // (a - c) * (e + f)\n\n    let c11 = p5 + p4 - p2 + p6         // p5 + p4 - p2 + p6\n    let c12 = p1 + p2                   // p1 + p2\n    let c21 = p3 + p4                   // p3 + p4\n    let c22 = p1 + p5 - p3 - p7         // p1 + p5 - p3 - p7\n\n    var C = Matrix(size: n)\n    for i in 0..<nBy2 {\n      for j in 0..<nBy2 {\n        C[i, j]           = c11[i, j]\n        C[i, j+nBy2]      = c12[i, j]\n        C[i+nBy2, j]      = c21[i, j]\n        C[i+nBy2, j+nBy2] = c22[i, j]\n      }\n    }\n\n    return C\n  }\n\n  private func nextPowerOfTwo(after n: Int) -> Int {\n    return Int(pow(2, ceil(log2(Double(n)))))\n  }\n}\n\n// Term-by-term Matrix Math\n\nextension Matrix: Addable {\n  public static func +<T: Number>(lhs: Matrix<T>, rhs: Matrix<T>) -> Matrix<T> {\n    assert(lhs.size == rhs.size, \"To term-by-term add matricies they need to be the same size!\")\n    let rows = lhs.rows\n    let columns = lhs.columns\n\n    var newMatrix = Matrix<T>(rows: rows, columns: columns)\n    for row in 0..<rows {\n      for column in 0..<columns {\n        newMatrix[row, column] = lhs[row, column] + rhs[row, column]\n      }\n    }\n    return newMatrix\n  }\n\n  public static func -<T: Number>(lhs: Matrix<T>, rhs: Matrix<T>) -> Matrix<T> {\n    assert(lhs.size == rhs.size, \"To term-by-term subtract matricies they need to be the same size!\")\n    let rows = lhs.rows\n    let columns = lhs.columns\n\n    var newMatrix = Matrix<T>(rows: rows, columns: columns)\n    for row in 0..<rows {\n      for column in 0..<columns {\n        newMatrix[row, column] = lhs[row, column] - rhs[row, column]\n      }\n    }\n    return newMatrix\n  }\n}\n\nextension Matrix: Multipliable {\n  public static func *<T: Number>(lhs: Matrix<T>, rhs: Matrix<T>) -> Matrix<T> {\n    assert(lhs.size == rhs.size, \"To term-by-term multiply matricies they need to be the same size!\")\n    let rows = lhs.rows\n    let columns = lhs.columns\n\n    var newMatrix = Matrix<T>(rows: rows, columns: columns)\n    for row in 0..<rows {\n      for column in 0..<columns {\n        newMatrix[row, column] = lhs[row, column] * rhs[row, column]\n      }\n    }\n    return newMatrix\n  }\n}\n"
  },
  {
    "path": "Strassen Matrix Multiplication/StrassensMatrixMultiplication.playground/Sources/Number.swift",
    "content": "//\n//  Number.swift\n//  \n//\n//  Created by Richard Ash on 10/28/16.\n//\n//\n\nimport Foundation\n\npublic protocol Number: Multipliable, Addable {\n  static var zero: Self { get }\n}\n\npublic protocol Addable {\n  static func + (lhs: Self, rhs: Self) -> Self\n  static func - (lhs: Self, rhs: Self) -> Self\n}\n\npublic protocol Multipliable {\n  static func * (lhs: Self, rhs: Self) -> Self\n}\n\nextension Int: Number {\n  public static var zero: Int { return 0 }\n}\n\nextension Double: Number {\n  public static var zero: Double { return 0.0 }\n}\n\nextension Float: Number {\n  public static var zero: Float { return 0.0 }\n}\n\nextension Array where Element: Number {\n  public func dot(_ b: Array<Element>) -> Element {\n    let a = self\n    assert(a.count == b.count, \"Can only take the dot product of arrays of the same length!\")\n    let c = a.indices.map { a[$0] * b[$0] }\n    return c.reduce(Element.zero, { $0 + $1 })\n  }\n}\n"
  },
  {
    "path": "Strassen Matrix Multiplication/StrassensMatrixMultiplication.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios' executeOnSourceChanges='false'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Strassen Matrix Multiplication/StrassensMatrixMultiplication.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Ternary Search Tree/README.markdown",
    "content": "# Ternary Search Tree\n\nData structure and simple test in playground has been implemented. \nDocumentation and examples coming soon!! :)\n"
  },
  {
    "path": "Ternary Search Tree/TST.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\nimport Cocoa\nimport Foundation\n\n// last checked with Xcode 9.0b4\n#if swift(>=4.0)\nprint(\"Hello, Swift 4!\")\n#endif\n\nlet treeOfStrings = TernarySearchTree<String>()\n\nvar testStrings: [(key: String, data: String)] = []\nlet testCount = 30\nfor _ in (1...testCount) {\n    let randomLength = Int(arc4random_uniform(10))\n    let key = Utils.shared.randomAlphaNumericString(withLength: randomLength)\n    let data = Utils.shared.randomAlphaNumericString(withLength: randomLength)\n//    print(\"Key: \\(key) Data: \\(data)\")\n\n    if key != \"\" && data != \"\" {\n        testStrings.append((key, data))\n        treeOfStrings.insert(data: data, withKey: key)\n    }\n}\n\nfor aTest in testStrings {\n    let data = treeOfStrings.find(key: aTest.key)\n\n    if data == nil {\n        print(\"TEST FAILED. Key: \\(aTest.key) Data: \\(aTest.data)\")\n    }\n    if data != aTest.data {\n        print(\"TEST FAILED. Key: \\(aTest.key) Data: \\(aTest.data)\")\n    }\n}\n\nvar testNums: [(key: String, data: Int)] = []\nlet treeOfInts = TernarySearchTree<Int>()\nfor _ in (1...testCount) {\n    let randomNum = Int(arc4random_uniform(UInt32.max))\n    let randomLength = Int(arc4random_uniform(10))\n    let key = Utils.shared.randomAlphaNumericString(withLength: randomLength)\n\n    if key != \"\" {\n        testNums.append((key, randomNum))\n        treeOfInts.insert(data: randomNum, withKey: key)\n    }\n}\n\nfor aTest in testNums {\n    let data = treeOfInts.find(key: aTest.key)\n    if data == nil {\n        print(\"TEST FAILED. Key: \\(aTest.key) Data: \\(aTest.data)\")\n    }\n    if data != aTest.data {\n        print(\"TEST FAILED. Key: \\(aTest.key) Data: \\(aTest.data)\")\n    }\n}\n"
  },
  {
    "path": "Ternary Search Tree/TST.playground/Sources/TSTNode.swift",
    "content": "//\n//  TSTNode.swift\n//\n//\n//  Created by Siddharth Atre on 3/15/16.\n//\n//\n\nimport Foundation\n\nclass TSTNode<Element> {\n    //Member properties of a particular node.\n    var key: Character\n    var data: Element?\n    var hasData: Bool\n\n    //Children\n    var left: TSTNode?, right: TSTNode?, middle: TSTNode?\n\n    init(key: Character, data: Element?) {\n        self.key = key\n        self.data = data\n        self.hasData = (data != nil)\n    }\n\n    init(key: Character) {\n        self.key = key\n        self.data = nil\n        self.hasData = false\n    }\n\n}\n"
  },
  {
    "path": "Ternary Search Tree/TST.playground/Sources/TernarySearchTree.swift",
    "content": "//\n//  TernarySearchTree.swift\n//\n//\n//  Created by Siddharth Atre on 3/15/16.\n//\n//\n\nimport Foundation\n\npublic class TernarySearchTree<Element> {\n\n    var root: TSTNode<Element>?\n\n    public init() {}\n\n    // MARK: - Insertion\n\n    public func insert(data: Element, withKey key: String) -> Bool {\n        return insert(node: &root, withData: data, andKey: key, atIndex: 0)\n    }\n\n    private func insert(node: inout TSTNode<Element>?, withData data: Element, andKey key: String, atIndex charIndex: Int) -> Bool {\n\n        //sanity check.\n        if key.characters.count == 0 {\n            return false\n        }\n\n        //create a new node if necessary.\n        if node == nil {\n            let index = key.index(key.startIndex, offsetBy: charIndex)\n            node = TSTNode<Element>(key: key[index])\n        }\n\n        //if current char is less than the current node's char, go left\n        let index = key.index(key.startIndex, offsetBy: charIndex)\n        if key[index] < node!.key {\n            return insert(node: &node!.left, withData: data, andKey: key, atIndex: charIndex)\n        }\n            //if it's greater, go right.\n        else if key[index] > node!.key {\n            return insert(node: &node!.right, withData: data, andKey: key, atIndex: charIndex)\n        }\n            //current char is equal to the current nodes, go middle\n        else {\n            //continue down the middle.\n            if charIndex + 1 < key.characters.count {\n                return insert(node: &node!.middle, withData: data, andKey: key, atIndex: charIndex + 1)\n            }\n                //otherwise, all done.\n            else {\n                node!.data = data\n                node?.hasData = true\n                return true\n            }\n        }\n    }\n\n    // MARK: - Finding\n\n    public func find(key: String) -> Element? {\n        return find(node: root, withKey: key, atIndex: 0)\n    }\n\n    private func find(node: TSTNode<Element>?, withKey key: String, atIndex charIndex: Int) -> Element? {\n\n        //Given key does not exist in tree.\n        if node == nil {\n            return nil\n        }\n\n        let index = key.index(key.startIndex, offsetBy: charIndex)\n        //go left\n        if key[index] < node!.key {\n            return find(node: node!.left, withKey: key, atIndex: charIndex)\n        }\n            //go right\n        else if key[index] > node!.key {\n            return find(node: node!.right, withKey: key, atIndex: charIndex)\n        }\n            //go middle\n        else {\n            if charIndex + 1 < key.characters.count {\n                return find(node: node!.middle, withKey: key, atIndex: charIndex + 1)\n            } else {\n                return node!.data\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Ternary Search Tree/TST.playground/Sources/Utils.swift",
    "content": "//\n//  Utils.swift\n//  \n//\n//  Created by Peter Bødskov on 10/01/17.\n//\n//\n\nimport Foundation\n\npublic struct Utils {\n\n    public static let shared = Utils()\n\n    let allowedChars = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\"\n    //Random string generator from:\n    //http://stackoverflow.com/questions/26845307/generate-random-alphanumeric-string-in-swift/26845710\n    public func randomAlphaNumericString(withLength length: Int) -> String {\n        let allowedCharsCount = UInt32(allowedChars.characters.count)\n        var randomString = \"\"\n\n        for _ in (0..<length) {\n            let randomNum = Int(arc4random_uniform(allowedCharsCount))\n            let newCharacter = allowedChars[allowedChars.index(allowedChars.startIndex, offsetBy: randomNum)]\n            randomString += String(newCharacter)\n        }\n\n        return randomString\n    }\n}\n"
  },
  {
    "path": "Ternary Search Tree/TST.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx' last-migration='0810'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Ternary Search Tree/TST.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Ternary Search Tree/TSTNode.swift",
    "content": "//\n//  TSTNode.swift\n//\n//\n//  Created by Siddharth Atre on 3/15/16.\n//\n//\n\nimport Foundation\n\n/**\n This class represents a node in the Ternary Search Tree.\n A node has two main data members, the key and the data.\n All nodes in a TST must have keys, but only some will have data.\n This can be seen in the way the data variable is of Optional type.\n*/\nclass TSTNode<Element> {\n    //Member properties of a particular node.\n\n    /// The key that identifies this node.\n    var key: Character\n    /// The data stored in this node. May be `nil`\n    var data: Element?\n    /// Boolean flag to depict whether this node holds data or not.\n    var hasData: Bool\n\n    /// The children of this node\n    var left: TSTNode?, right: TSTNode?, middle: TSTNode?\n\n    /**\n     Initializer for key and/or data\n\n     - parameter key:  The key to set for this node.\n     - parameter data: The optional data to set in this node.\n     */\n    init(key: Character, data: Element?) {\n        self.key = key\n        self.data = data\n        self.hasData = (data != nil)\n    }\n\n    /**\n     Make a node that only has a key\n\n     - parameter key: The key to ascribe to this node.\n     */\n    init(key: Character) {\n        self.key = key\n        self.data = nil\n        self.hasData = false\n    }\n\n}\n"
  },
  {
    "path": "Ternary Search Tree/TernarySearchTree.swift",
    "content": "//\n//  TernarySearchTree.swift\n//\n//\n//  Created by Siddharth Atre on 3/15/16.\n//\n//\n\nimport Foundation\n\n/**\nThe Ternary Search Tree (TST) Data structure.\nData structure uses key-value mappings. Keys are strings used to map to any data element.\nSee README for more information.\n*/\npublic class TernarySearchTree<Element> {\n\n    /// A reference to the root node of this TST\n    var root: TSTNode<Element>?\n\n    /**\n     Standard initializer\n     */\n    public init() {}\n\n    // MARK: - Insertion\n\n    /**\n    Public insertion method.\n\n    - parameter data: The value to store in this TST.\n    - parameter key:  The key to associate with this value.\n\n    - returns: Value indicating insertion success/failure.\n    */\n    @discardableResult public func insert(data: Element, withKey key: String) -> Bool {\n        return insert(node: &root, withData: data, andKey: key, atIndex: 0)\n    }\n\n    /**\n     Helper method for insertion that does the actual legwork. Insertion is performed recursively.\n\n     - parameter node:      The current node to insert below.\n     - parameter data:      The data being inserted.\n     - parameter key:       The key being used to find an insertion location for the given data\n     - parameter charIndex: The index of the character in the key string to use to for the next node.\n\n     - returns: Value indicating insertion success/failure.\n     */\n    private func insert(node: inout TSTNode<Element>?, withData data: Element, andKey key: String, atIndex charIndex: Int) -> Bool {\n\n        //sanity check.\n        guard key.characters.count > 0 else {\n            return false\n        }\n\n        //create a new node if necessary.\n        if node == nil {\n            let index = key.index(key.startIndex, offsetBy: charIndex)\n            node = TSTNode<Element>(key: key[index])\n        }\n\n        //if current char is less than the current node's char, go left\n        let index = key.index(key.startIndex, offsetBy: charIndex)\n        if key[index] < node!.key {\n            return insert(node: &node!.left, withData: data, andKey: key, atIndex: charIndex)\n        }\n            //if it's greater, go right.\n        else if key[index] > node!.key {\n            return insert(node: &node!.right, withData: data, andKey: key, atIndex: charIndex)\n        }\n            //current char is equal to the current nodes, go middle\n        else {\n            //continue down the middle.\n            if charIndex + 1 < key.characters.count {\n                return insert(node: &node!.middle, withData: data, andKey: key, atIndex: charIndex + 1)\n            }\n            //otherwise, all done.\n            else {\n                node!.data = data\n                node?.hasData = true\n                return true\n            }\n        }\n    }\n\n    // MARK: - Finding\n\n    /**\n    Public find method.\n\n    - parameter key: Search for an object associated with this key.\n\n    - returns: The element, if found. Otherwise, nil.\n    */\n    public func find(key: String) -> Element? {\n        return find(node: root, withKey: key, atIndex: 0)\n    }\n\n    /**\n     Helper method that performs actual legwork of find operation. Implemented recursively.\n\n     - parameter node:      The current node being evaluated.\n     - parameter key:       The key being used for the search.\n     - parameter charIndex: The index of the current char in the search key\n\n     - returns: The element, if found. Nil otherwise.\n     */\n    private func find(node: TSTNode<Element>?, withKey key: String, atIndex charIndex: Int) -> Element? {\n\n        //Given key does not exist in tree.\n        guard let node = node else {\n            return nil\n        }\n\n        let index = key.index(key.startIndex, offsetBy: charIndex)\n        //go left\n        if key[index] < node.key {\n            return find(node: node.left, withKey: key, atIndex: charIndex)\n        }\n            //go right\n        else if key[index] > node.key {\n            return find(node: node.right, withKey: key, atIndex: charIndex)\n        }\n            //go middle\n        else {\n            if charIndex + 1 < key.characters.count {\n                return find(node: node.middle, withKey: key, atIndex: charIndex + 1)\n            } else {\n                return node.data\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Ternary Search Tree/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Ternary Search Tree/Tests/TernarySearchTreeTests.swift",
    "content": "//\n//  Tests.swift\n//  Tests\n//\n//  Created by Peter Bødskov on 10/01/17.\n//  Copyright © 2017 Swift Algorithm Club. All rights reserved.\n//\n\nimport XCTest\n\nclass TernarySearchTreeTests: XCTestCase {\n\n  let testCount = 30\n\n  func testSwift4() {\n    // last checked with Xcode 9.0b4\n    #if swift(>=4.0)\n      print(\"Hello, Swift 4!\")\n    #endif\n  }\n\n  func testCanFindStringInTree() {\n    var testStrings: [(key: String, data: String)] = []\n    let treeOfStrings = TernarySearchTree<String>()\n\n    for _ in (1...testCount) {\n      var randomLength = Int(arc4random_uniform(10))\n\n      var key = Utils.shared.randomAlphaNumericString(withLength: randomLength)\n\n      while testStrings.contains(where: { $0.key == key}) {\n        //That key is taken, so we generate a new one with another length\n        randomLength = Int(arc4random_uniform(10))\n        key = Utils.shared.randomAlphaNumericString(withLength: randomLength)\n      }\n      let data = Utils.shared.randomAlphaNumericString(withLength: randomLength)\n      //    print(\"Key: \\(key) Data: \\(data)\")\n\n      if key != \"\" && data != \"\" {\n        testStrings.append((key, data))\n        treeOfStrings.insert(data: data, withKey: key)\n      }\n    }\n\n    for aTest in testStrings {\n      let data = treeOfStrings.find(key: aTest.key)\n      XCTAssertNotNil(data)\n      XCTAssertEqual(data, aTest.data)\n    }\n  }\n\n  func testCanFindNumberInTree() {\n    var testNums: [(key: String, data: Int)] = []\n    let treeOfInts = TernarySearchTree<Int>()\n    for _ in (1...testCount) {\n      let randomNum = Int(arc4random_uniform(UInt32.max))\n      var randomLength = Int(arc4random_uniform(10))\n      var key = Utils.shared.randomAlphaNumericString(withLength: randomLength)\n      while testNums.contains(where: { $0.key == key}) {\n        //That key is taken, so we generate a new one with another length\n        randomLength = Int(arc4random_uniform(10))\n        key = Utils.shared.randomAlphaNumericString(withLength: randomLength)\n      }\n\n      if key != \"\" {\n        testNums.append((key, randomNum))\n        treeOfInts.insert(data: randomNum, withKey: key)\n      }\n    }\n\n    for aTest in testNums {\n      let data = treeOfInts.find(key: aTest.key)\n      XCTAssertNotNil(data)\n      XCTAssertEqual(data, aTest.data)\n    }\n  }\n}\n"
  },
  {
    "path": "Ternary Search Tree/Tests/Tests.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\tD06C22031E24D02800622925 /* TernarySearchTreeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06C22021E24D02800622925 /* TernarySearchTreeTests.swift */; };\n\t\tD0957B8A1E24D92D00417988 /* TernarySearchTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0957B891E24D92D00417988 /* TernarySearchTree.swift */; };\n\t\tD0957B8C1E24D9A300417988 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0957B8B1E24D9A300417988 /* Utils.swift */; };\n\t\tD0957B8E1E24DA0100417988 /* TSTNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0957B8D1E24DA0100417988 /* TSTNode.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\tD06C22021E24D02800622925 /* TernarySearchTreeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TernarySearchTreeTests.swift; sourceTree = \"<group>\"; };\n\t\tD06C22041E24D02800622925 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tD06C22081E24D16800622925 /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tD0957B891E24D92D00417988 /* TernarySearchTree.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TernarySearchTree.swift; path = ../TernarySearchTree.swift; sourceTree = \"<group>\"; };\n\t\tD0957B8B1E24D9A300417988 /* Utils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Utils.swift; path = ../Utils.swift; sourceTree = \"<group>\"; };\n\t\tD0957B8D1E24DA0100417988 /* TSTNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TSTNode.swift; path = ../TSTNode.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\tD06C21FD1E24D02800622925 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\tD06C21B61E24CC9600622925 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tD0957B891E24D92D00417988 /* TernarySearchTree.swift */,\n\t\t\t\tD0957B8B1E24D9A300417988 /* Utils.swift */,\n\t\t\t\tD06C22021E24D02800622925 /* TernarySearchTreeTests.swift */,\n\t\t\t\tD0957B8D1E24DA0100417988 /* TSTNode.swift */,\n\t\t\t\tD06C22041E24D02800622925 /* Info.plist */,\n\t\t\t\tD06C22081E24D16800622925 /* Tests.xctest */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\tD06C21FF1E24D02800622925 /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = D06C22051E24D02800622925 /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tD06C21FC1E24D02800622925 /* Sources */,\n\t\t\t\tD06C21FD1E24D02800622925 /* Frameworks */,\n\t\t\t\tD06C21FE1E24D02800622925 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tproductName = Tests;\n\t\t\tproductReference = D06C22081E24D16800622925 /* Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\tD06C21B71E24CC9600622925 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0810;\n\t\t\t\tLastUpgradeCheck = 0810;\n\t\t\t\tORGANIZATIONNAME = \"Swift Algorithm Club\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\tD06C21FF1E24D02800622925 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.1;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = D06C21BA1E24CC9600622925 /* Build configuration list for PBXProject \"Tests\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t);\n\t\t\tmainGroup = D06C21B61E24CC9600622925;\n\t\t\tproductRefGroup = D06C21B61E24CC9600622925;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\tD06C21FF1E24D02800622925 /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\tD06C21FE1E24D02800622925 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\tD06C21FC1E24D02800622925 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tD06C22031E24D02800622925 /* TernarySearchTreeTests.swift in Sources */,\n\t\t\t\tD0957B8E1E24DA0100417988 /* TSTNode.swift in Sources */,\n\t\t\t\tD0957B8A1E24D92D00417988 /* TernarySearchTree.swift in Sources */,\n\t\t\t\tD0957B8C1E24D9A300417988 /* Utils.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\tD06C21C31E24CC9600622925 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVES = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tD06C21C41E24CC9600622925 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVES = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tD06C22061E24D02800622925 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tD06C22071E24D02800622925 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\tD06C21BA1E24CC9600622925 /* Build configuration list for PBXProject \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tD06C21C31E24CC9600622925 /* Debug */,\n\t\t\t\tD06C21C41E24CC9600622925 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tD06C22051E24D02800622925 /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tD06C22061E24D02800622925 /* Debug */,\n\t\t\t\tD06C22071E24D02800622925 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = D06C21B71E24CC9600622925 /* Project object */;\n}\n"
  },
  {
    "path": "Ternary Search Tree/Tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Ternary Search Tree/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0810\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"D06C21FF1E24D02800622925\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Ternary Search Tree/Utils.swift",
    "content": "//\n//  Utils.swift\n//  \n//\n//  Created by Peter Bødskov on 10/01/17.\n//\n//\n\nimport Foundation\n\npublic struct Utils {\n\n    public static let shared = Utils()\n\n    let allowedChars = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\"\n    //Random string generator from:\n    //http://stackoverflow.com/questions/26845307/generate-random-alphanumeric-string-in-swift/26845710\n    public func randomAlphaNumericString(withLength length: Int) -> String {\n        let allowedCharsCount = UInt32(allowedChars.characters.count)\n        var randomString = \"\"\n\n        for _ in (0..<length) {\n            let randomNum = Int(arc4random_uniform(allowedCharsCount))\n            let newCharacter = allowedChars[allowedChars.index(allowedChars.startIndex, offsetBy: randomNum)]\n            randomString += String(newCharacter)\n        }\n\n        return randomString\n    }\n}\n"
  },
  {
    "path": "Threaded Binary Tree/README.markdown",
    "content": "# Threaded Binary Tree\n\nA threaded binary tree is a special kind of [binary tree](../Binary%20Tree/) (a\ntree in which each node has at most two children) that maintains a few extra\nvariables to allow cheap and fast **in-order traversal** of the tree.  We will\nexplore the general structure of threaded binary trees, as well as\n[the Swift implementation](ThreadedBinaryTree.swift) of a fully functioning\nthreaded binary tree.\n\nIf you don't know what a tree is or what it is for, then\n[read this first](../Tree/).\n\n\n## In-order traversal\n\nThe main motivation behind using a threaded binary tree over a simpler and\nsmaller standard binary tree is to increase the speed of an in-order traversal\nof the tree.  An in-order traversal of a binary tree visits the nodes in the\norder in which they are stored, which matches the underlying ordering of a\n[binary search tree](../Binary%20Search%20Tree/).  This means most threaded binary\ntrees are also binary search trees.  The idea is to visit all the left children\nof a node first, then visit the node itself, and then visit the right children\nlast.\n\nAn in-order traversal of any binary tree generally goes as follows (using Swift\nsyntax):\n\n```swift\nfunc traverse(n: Node?) {\n  if (n == nil) { return\n  } else {\n    traverse(n.left)\n    visit(n)\n    traverse(n.right)\n  }\n}\n```\nWhere `n` is a a node in the tree (or `nil`), each node stores its children as\n`left` and `right`, and \"visiting\" a node can mean performing any desired\naction on it.  We would call this function by passing to it the root of the\ntree we wish to traverse.\n\nWhile simple and understandable, this algorithm uses stack space proportional\nto the height of the tree due to its recursive nature.  If the tree has **n**\nnodes, this usage can range anywhere from **O(log n)** for a fairly balanced\ntree, to **O(n)** to a very unbalanced tree.\n\nA threaded binary tree fixes this problem.\n\n> For more information about in-order traversals [see here](../Binary%20Tree/).\n\n\n## Predecessors and successors\n\nAn in-order traversal of a tree yields a linear ordering of the nodes.  Thus\neach node has both a **predecessor** and a **successor** (except for the first\nand last nodes, which only have a successor or a predecessor respectively).  In\na threaded binary tree, each left child that would normally be `nil` instead\nstores the node's predecessor (if it exists), and each right child that would\nnormally be `nil` instead stores the node's successor (if it exists).  This is\nwhat separates threaded binary trees from standard binary trees.\n\nThere are two types of threaded binary trees:  **single threaded** and **double\nthreaded**:\n- A single threaded tree keeps track of **either** the in-order predecessor\n  **or** successor (left **or** right).\n- A double threaded tree keeps track of **both** the in-order predecessor\n  **and** successor (left **and** right).\n\nUsing a single or double threaded tree depends on what we want to accomplish.\nIf we only need to traverse the tree in one direction (either forward or\nbackward), then we use a single threaded tree.  If we want to traverse in both\ndirections, then we use a double threaded tree.\n\nIt is important to note that each node stores either its predecessor or its\nleft child, and either its successor or its right child.  The nodes do not\nneed to keep track of both.  For example, in a double threaded tree, if a node\nhas a right child but no left child, it will track its predecessor in place of\nits left child.\n\nHere is an example valid \"full\" threaded binary tree:\n\n![Full](Images/Full.png)\n\nWhile the following threaded binary tree is not \"full,\" it is still valid.  The\nstructure of the tree does not matter as long as it follows the definition of a\nbinary search tree:\n\n![Partial](Images/Partial.png)\n\nThe solid lines denote the links between parents and children, while the dotted\nlines denote the \"threads.\"  It is important to note how the children and\nthread edges interact with each other.  Every node besides the root has one\nentering edge (from its parent), and two leaving edges: one to the left and one\nto the right.  The left leaving edge goes to the node's left child if it\nexists, and to its in-order predecessor if it does not.  The right leaving edge\ngoes to the node's right child if it exists, and to its in-order successor if\nit does not.  The exceptions are the left-most node and the right-most node,\nwhich do not have a predecessor or successor, respectively.\n\n\n## Representation\n\nBefore we go into detail about the methods of a threaded binary tree, we should\nfirst explain how the tree itself is represented.  The core of this data\nstructure is the `ThreadedBinaryTree<T: Comparable>` class.  Each instance of\nthis class represents a node with six member variables:  `value`, `parent`,\n`left`, `right`, `leftThread`, and `rightThread`.  Of all of these, only\n`value` is required.  The other five are Swift *optionals* (they may be `nil`).\n- `value: T` is the value of this node (e.g. 1, 2, A, B, etc.)\n- `parent: ThreadedBinaryTree?` is the parent of this node\n- `left: ThreadedBinaryTree?` is the left child of this node\n- `right: ThreadedBinaryTree?` is the right child of this node\n- `leftThread: ThreadedBinaryTree?` is the in-order predecessor of this node\n- `rightThread: ThreadedBinaryTree?` is the in-order successor of this node\n\nAs we are storing both `leftThread` and `rightThread`, this is a double\nthreaded tree. Now we are ready to go over some of the member functions in our\n`ThreadedBinaryTree` class.\n\n\n## Traversal algorithm\n\nLet's start with the main reason we're using a threaded binary tree.  It is now\nvery easy to find the in-order predecessor and the in-order successor of any\nnode in the tree.  If the node has no `left`/`right` child, we can simply\nreturn the node's `leftThread`/`rightThread`.  Otherwise, it is trivial to move\ndown the tree and find the correct node.\n\n```swift\n  func predecessor() -> ThreadedBinaryTree<T>? {\n    if let left = left {\n      return left.maximum()\n    } else {\n      return leftThread\n    }\n  }\n\n  func successor() -> ThreadedBinaryTree<T>? {\n    if let right = right {\n      return right.minimum()\n    } else {\n      return rightThread\n    }\n  }\n```\n> Note: `maximum()` and `minimum()` are methods of `ThreadedBinaryTree` which\nreturn the largest/smallest node in a given sub-tree.  See\n[the implementation](ThreadedBinaryTree.swift) for more detail.\n\nBecause these are `ThreadedBinaryTree` methods, we can call\n`node.predecessor()` or `node.successor()` to obtain the predecessor or\nsuccessor of any `node`, provided that `node` is a `ThreadedBinaryTree` object.\n\nBecause predecessors and/or successors are tracked, an in-order traversal of a\nthreaded binary tree is much more efficient than the recursive algorithm\noutlined above.  We use these predecessor/successor attributes to great effect\nin this new algorithm for both forward and backward traversals:\n\n```swift\n    public func traverseInOrderForward(_ visit: (T) -> Void) {\n        var n: ThreadedBinaryTree\n        n = minimum()\n        while true {\n            visit(n.value)\n            if let successor = n.successor() {\n                n = successor\n            } else {\n                break\n            }\n        }\n    }\n\n    public func traverseInOrderBackward(_ visit: (T) -> Void) {\n        var n: ThreadedBinaryTree\n        n = maximum()\n        while true {\n            visit(n.value)\n            if let predecessor = n.predecessor() {\n                n = predecessor\n            } else {\n                break\n            }\n        }\n    }\n```\nAgain, this a method of `ThreadedBinaryTree`, so we'd call it via\n`node.traverseInorderForward(visitFunction)`.  Note that we are able to specify\na function that executes on each node as they are visited.  This function can\nbe anything you want, as long as it accepts `T` (the type of the values of the\nnodes of the tree) and has no return value.\n\nLet's walk through a forward traversal of a tree by hand to get a better idea\nof how a computer would do it.  For example, take this simple threaded tree:\n\n![Base](Images/Base.png)\n\nWe start at the root of the tree, **9**.  Note that we don't `visit(9)` yet.\nFrom there we want to go to the `minimum()` node in the tree, which is **2** in\nthis case.  We then `visit(2)` and see that it has a `rightThread`, and thus\nwe immediately know what its `successor()` is.  We follow the thread to **5**,\nwhich does not have any leaving threads.  Therefore, after we `visit(5)`, we go\nto the `minimum()` node in its `right` subtree, which is **7**.  We then\n`visit(7)` and see that it has a `rightThread`, which we follow to get back to\n**9**.  *Now* we `visit(9)`, and after noticing that it has no `rightThread`,\nwe go to the `minimum()` node in its `right` subtree, which is **12**.  This\nnode has a `rightThread` that leads to `nil`, which signals that we have\ncompleted the traversal!  We visited the nodes in order **2, 5, 7, 9, 12**,\nwhich intuitively makes sense, as that is their natural increasing order.\n\nA backward traversal would be very similar, but you would replace `right`,\n`rightThread`, `minimum()`, and `successor()` with `left`, `leftThread`,\n`maximum()`, and `predecessor()`.\n\n\n## Insertion and deletion\n\nThe quick in-order traversal that a threaded binary trees gives us comes at a\nsmall cost.  Inserting/deleting nodes becomes more complicated, as we have to\ncontinuously manage the `leftThread` and `rightThread` variables.  Rather than\nwalking through some boring code, it is best to explain this with an example\n(although you can read through [the implementation](ThreadedBinaryTree.swift)\nif you want to know the finer details).  Please note that this requires\nknowledge of binary search trees, so make sure you have\n[read this first](../Binary%20Search%20Tree/).\n\n> Note: we do allow duplicate nodes in this implementation of a threaded binary\n> tree.  We break ties by defaulting insertion to the right.\n\nLet's start with the same tree that we used for the above traversal example:\n\n![Base](Images/Base.png)\n\nSuppose we insert **10** into this tree.  The resulting graph would look like\nthis, with the changes highlighted in red:\n\n![Insert1](Images/Insert1.png)\n\nIf you've done your homework and are familiar with binary search trees, the\nplacement of this node should not surprise you.  What's new is how we maintain\nthe threads between nodes.  So we know that we want to insert **10** as\n**12**'s `left` child.  The first thing we do is set **12**'s `left` child to\n**10**, and set **10**'s `parent` to **12**.  Because **10** is being inserted\non the `left`, and **10** has no children of its own, we can safely set\n**10**'s `rightThread` to its `parent` **12**.  What about **10**'s\n`leftThread`?  Because we know that **10** < **12**, and **10** is the only\n`left` child of **12**, we can safely set **10**'s `leftThread` to **12**'s\n(now outdated) `leftThread`.  Finally we set **12**'s `leftThread = nil`, as it\nnow has a `left` child.\n\nLet's now insert another node, **4**, into the tree:\n\n![Insert2](Images/Insert2.png)\n\nWhile we are inserting **4** as a `right` child, it follows the exact same\nprocess as above, but mirrored (swap `left` and `right`).  For the sake of\ncompleteness, we'll insert one final node, **15**:\n\n![Insert3](Images/Insert3.png)\n\nNow that we have a fairly crowded tree, let's try removing some nodes.\nCompared to insertion, deletion is a little more complicated.  Let's start with\nsomething simple, like removing **7**, which has no children:\n\n![Remove1](Images/Remove1.png)\n\nBefore we can just throw **7** away, we have to perform some clean-up.  In this\ncase, because **7** is a `right` child and has no children itself, we can\nsimply set the `rightThread` of **7**'s `parent`(**5**) to **7**'s (now\noutdated) `rightThread`. Then we can just set **7**'s `parent`, `left`,\n`right`, `leftThread`, and `rightThread` to `nil`, effectively removing it from\nthe tree. We also set the parent's `rightChild` to `nil`, which completes the deletion of this right child. \n\nLet's try something a little harder.  Say we remove **5** from the tree:\n\n![Remove2](Images/Remove2.png)\n\nThis is a little trickier, as **5** has some children that we have to deal\nwith.  The core idea is to replace **5** with its first child, **2**.  To\naccomplish this, we of course set **2**'s `parent` to **9** and set **9**'s\n`left` child to **2**.  Note that **4**'s `rightThread` used to be **5**, but\nwe are removing **5**, so it needs to change.  It is now important to\nunderstand two important properties of threaded binary trees:\n\n1. For the rightmost node **m** in the `left` subtree of any node **n**,\n**m**'s `rightThread` is **n**.\n2. For the leftmost node **m** in the `right` subtree of any node **n**,\n**m**'s `leftThread` is **n**.\n\nNote how these properties held true before the removal of **5**, as **4** was\nthe rightmost node in **5**'s `left` subtree.  In order to maintain this\nproperty, we must set **4**'s `rightThread` to **9**, as **4** is now the\nrightmost node in **9**'s `left` subtree.  To completely remove **5**, all we\nnow have to do is set **5**'s `parent`, `left`, `right`, `leftThread`, and\n`rightThread` to `nil`.\n\nHow about we do something crazy?  What would happen if we tried to remove\n**9**, the root node?  This is the resulting tree:\n\n![Remove3](Images/Remove3.png)\n\nWhenever we want to remove a node that has two children, we take a slightly\ndifferent approach than the above examples.  The basic idea is to replace the\nnode that we want to remove with the leftmost node in its `right`  subtree,\nwhich we call the replacement node.\n\n> Note: we could also replace the node with the rightmost node in its `left`\n> subtree.  Choosing left or right is mostly an arbitrary decision.\n\nOnce we find the replacement node, **10** in this case, we remove it from the\ntree using the algorithms outlined above.  This ensures that the edges in the\n`right` subtree remain correct.  From there it is easy to replace **9** with\n**10**, as we just have to update the edges leaving **10**.  Now all we have to\ndo is fiddle with the threads in order to maintain the two properties outlined\nabove.  In this case, **12**'s `leftThread` is now **10**. Node **9** is no\nlonger needed, so we can finish the removal process by setting all of its\nvariables to `nil`.\n\nIn order to illustrate how to remove a node that has only a `right` child,\nwe'll remove one final node, **12** from the tree:\n\n![Remove4](Images/Remove4.png)\n\nThe process to remove **12** is identical to the process we used to remove\n**5**, but mirrored.  **5** had a `left` child, while **12** has a `right`\nchild, but the core algorithm is the same.\n\nAnd that's it!  This was just a quick overview of how insertion and deletion\nwork in threaded binary trees, but if you understood these examples, you should\nbe able to insert or remove any node from any tree you want.  More detail can\nof course be found in\n[the implementation](ThreadedBinaryTree.swift).\n\n\n## Miscellaneous methods\n\nThere are many other smaller operations that a threaded binary tree can do,\nsuch as `searching()` for a node in the tree, finding the `depth()` or\n`height()` of a node, etc.  You can check\n[the implementation](ThreadedBinaryTree.swift) for the full technical details.\nMany of these methods are inherent to binary search trees as well, so you can\nfind [further documentation here](../Binary%20Search%20Tree/).\n\n\n## See also\n\n[Threaded Binary Tree on Wikipedia](https://en.wikipedia.org/wiki/Threaded_binary_tree)\n\n*Written for the Swift Algorithm Club by\n[Jayson Tung](https://github.com/JFTung)*\n*Migrated to Swift 3 by Jaap Wijnen*\n\n*Images made using www.draw.io*\n"
  },
  {
    "path": "Threaded Binary Tree/ThreadedBinaryTree.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\n// Simple little debug function to make testing output pretty\nfunc check(_ tree: ThreadedBinaryTree<Int>?) {\n  if let tree = tree {\n    print(\"\\(tree.count) Total Nodes:\")\n    print(tree)\n    print(\"Debug Info:\")\n    print(tree.debugDescription)\n    print(\"In-Order Traversal:\")\n    let myArray = tree.toArray()\n    for node in myArray {\n      print(node)\n    }\n    if tree.isBST(minValue: Int.min, maxValue: Int.max) {\n      print(\"This is a VALID binary search tree.\")\n    } else {\n      print(\"This is an INVALID binary search tree.\")\n    }\n    if tree.isThreaded() {\n      print(\"This is a VALID threaded binary tree.\")\n    } else {\n      print(\"This is an INVALID threaded binary tree.\")\n    }\n    } else {\n      print(\"This tree is nil.\")\n    }\n}\n\nprint(\"\\nTree with Single Node\")\nlet emptyTree = ThreadedBinaryTree<Int>(value: 1)\ncheck(emptyTree)\n\nprint(\"\\nFull Balanced Binary Tree with 7 Nodes\")\nlet fullTree = ThreadedBinaryTree<Int>(value: 4)\nfullTree.insert(2)\nfullTree.insert(1)\nfullTree.insert(6)\nfullTree.insert(5)\nfullTree.insert(3)\nfullTree.insert(7)\ncheck(fullTree)\n\nprint(\"\\n\\nBase Binary Tree with 5 Nodes\")\nlet tree = ThreadedBinaryTree<Int>(array: [9, 5, 12, 2, 7])\ncheck(tree)\n\nprint(\"\\nInsert 10\")\ntree.insert(10)\ncheck(tree)\n\nprint(\"\\nInsert 4\")\ntree.insert(4)\ncheck(tree)\n\nprint(\"\\nInsert 15\")\ntree.insert(15)\ncheck(tree)\n\nprint(\"\\nRemove 13 (Not in the Tree)\")\ntree.remove(13)\ncheck(tree)\n\nprint(\"\\nRemove 7\")\ntree.remove(7)\ncheck(tree)\n\nprint(\"\\nRemove 5\")\ntree.remove(5)\ncheck(tree)\n\nprint(\"\\nRemove 9 (root)\")\nlet newRoot = tree.remove(9)\ncheck(newRoot)\n\nprint(\"\\nRemove 12\")\nnewRoot?.remove(12)\ncheck(newRoot)\n\nprint(\"\\n\\nDone with Tests!\\n\")\n"
  },
  {
    "path": "Threaded Binary Tree/ThreadedBinaryTree.playground/Sources/ThreadedBinaryTree.swift",
    "content": "/*\n A Threaded Binary Tree.\n Based on this club's Binary Search Tree implementation.\n \n Each node stores a value and two children. The left child contains a smaller\n value; the right a larger (or equal) value.\n \n Any nodes that lack either a left or right child instead keep track of their\n in-order predecessor and/or successor.\n \n This tree allows duplicate elements (we break ties by defaulting right).\n \n This tree does not automatically balance itself. To make sure it is balanced,\n you should insert new values in randomized order, not in sorted order.\n */\npublic class ThreadedBinaryTree<T: Comparable> {\n  fileprivate(set) public var value: T\n  fileprivate(set) public var parent: ThreadedBinaryTree?\n  fileprivate(set) public var left: ThreadedBinaryTree?\n  fileprivate(set) public var right: ThreadedBinaryTree?\n  fileprivate(set) public var leftThread: ThreadedBinaryTree?\n  fileprivate(set) public var rightThread: ThreadedBinaryTree?\n\n  public init(value: T) {\n    self.value = value\n  }\n\n  public convenience init(array: [T]) {\n    precondition(array.count > 0)\n    self.init(value: array.first!)\n    for v in array.dropFirst() {\n      insert(v, parent: self)\n    }\n  }\n\n  public var isRoot: Bool {\n    return parent == nil\n  }\n\n  public var isLeaf: Bool {\n    return left == nil && right == nil\n  }\n\n  public var isLeftChild: Bool {\n    return parent?.left === self\n  }\n\n  public var isRightChild: Bool {\n    return parent?.right === self\n  }\n\n  public var hasLeftChild: Bool {\n    return left != nil\n  }\n\n  public var hasRightChild: Bool {\n    return right != nil\n  }\n\n  public var hasAnyChild: Bool {\n    return hasLeftChild || hasRightChild\n  }\n\n  public var hasBothChildren: Bool {\n    return hasLeftChild && hasRightChild\n  }\n\n  /* How many nodes are in this subtree. Performance: O(n). */\n  public var count: Int {\n    return (left?.count ?? 0) + 1 + (right?.count ?? 0)\n  }\n}\n\n// MARK: - Adding items\n\nextension ThreadedBinaryTree {\n  /*\n  Inserts a new element into the tree. You should only insert elements\n  at the root, to make to sure this remains a valid binary tree!\n  Performance: runs in O(h) time, where h is the height of the tree.\n  */\n  public func insert(_ value: T) {\n    insert(value, parent: self)\n  }\n\n  fileprivate func insert(_ value: T, parent: ThreadedBinaryTree) {\n    if value < self.value {\n      if let left = left {\n        left.insert(value, parent: left)\n      } else {\n        left = ThreadedBinaryTree(value: value)\n        left?.parent = parent\n        left?.rightThread = parent\n        left?.leftThread = leftThread\n        leftThread = nil\n      }\n    } else {\n      if let right = right {\n        right.insert(value, parent: right)\n      } else {\n        right = ThreadedBinaryTree(value: value)\n        right?.parent = parent\n        right?.leftThread = parent\n        right?.rightThread = rightThread\n        rightThread = nil\n      }\n    }\n  }\n}\n\n// MARK: - Deleting items\n\nextension ThreadedBinaryTree {\n  /*\n  Deletes the \"highest\" node with the specified value.\n     \n  Returns the node that has replaced this removed one (or nil if this was a\n  leaf node). That is primarily useful for when you delete the root node, in\n  which case the tree gets a new root.\n     \n  Performance: runs in O(h) time, where h is the height of the tree.\n  */\n  @discardableResult public func remove(_ value: T) -> ThreadedBinaryTree? {\n    return search(value)?.remove()\n  }\n\n  /*\n  Deletes \"this\" node from the tree.\n  */\n  public func remove() -> ThreadedBinaryTree? {\n    let replacement: ThreadedBinaryTree?\n\n    if let left = left {\n      if let right = right {\n        replacement = removeNodeWithTwoChildren(left, right)\n        replacement?.leftThread = leftThread\n        replacement?.rightThread = rightThread\n        left.maximum().rightThread = replacement\n        right.minimum().leftThread = replacement\n      } else {\n        // This node only has a left child. The left child replaces the node.\n        replacement = left\n        left.maximum().rightThread = rightThread\n      }\n    } else if let right = right {\n      // This node only has a right child. The right child replaces the node.\n      replacement = right\n      right.minimum().leftThread = leftThread\n    } else {\n      // This node has no children. We just disconnect it from its parent.\n      replacement = nil\n      if isLeftChild {\n        parent?.leftThread = leftThread\n      } else {\n        parent?.rightThread = rightThread\n      }\n    }\n\n    reconnectParentToNode(replacement)\n\n    // The current node is no longer part of the tree, so clean it up.\n    parent = nil\n    left = nil\n    right = nil\n    leftThread = nil\n    rightThread = nil\n\n    return replacement\n  }\n\n  private func removeNodeWithTwoChildren(_ left: ThreadedBinaryTree, _ right: ThreadedBinaryTree) -> ThreadedBinaryTree {\n    // This node has two children. It must be replaced by the smallest\n    // child that is larger than this node's value, which is the leftmost\n    // descendent of the right child.\n    let successor = right.minimum()\n\n    // If this in-order successor has a right child of its own (it cannot\n    // have a left child by definition), then that must take its place.\n    _ = successor.remove()\n\n    // Connect our left child with the new node.\n    successor.left = left\n    left.parent = successor\n\n    // Connect our right child with the new node. If the right child does\n    // not have any left children of its own, then the in-order successor\n    // *is* the right child.\n    if right !== successor {\n      successor.right = right\n      right.parent = successor\n    } else {\n      successor.right = nil\n    }\n\n    // And finally, connect the successor node to our parent.\n    return successor\n  }\n\n  private func reconnectParentToNode(_ node: ThreadedBinaryTree?) {\n    if let parent = parent {\n      if isLeftChild {\n        parent.left = node\n      } else {\n        parent.right = node\n      }\n    }\n    node?.parent = parent\n  }\n}\n\n// MARK: - Searching\n\nextension ThreadedBinaryTree {\n  /*\n  Finds the \"highest\" node with the specified value.\n  Performance: runs in O(h) time, where h is the height of the tree.\n  */\n  public func search(_ value: T) -> ThreadedBinaryTree? {\n    var node: ThreadedBinaryTree? = self\n    while let n = node {\n      if value < n.value {\n        node = n.left\n      } else if value > n.value {\n        node = n.right\n      } else {\n        return node\n      }\n    }\n    return nil\n  }\n\n  /*\n  // Recursive version of search\n  // Educational but undesirable due to the overhead cost of recursion\n  public func search(value: T) -> ThreadedBinaryTree? {\n    if value < self.value {\n      return left?.search(value)\n    } else if value > self.value {\n      return right?.search(value)\n    } else {\n      return self\n    }\n  }\n  */\n\n  public func contains(value: T) -> Bool {\n    return search(value) != nil\n  }\n\n  /*\n  Returns the leftmost descendent. O(h) time.\n  */\n  public func minimum() -> ThreadedBinaryTree {\n    var node = self\n    while let next = node.left {\n      node = next\n    }\n    return node\n  }\n\n  /*\n  Returns the rightmost descendent. O(h) time.\n  */\n  public func maximum() -> ThreadedBinaryTree {\n    var node = self\n    while let next = node.right {\n      node = next\n    }\n    return node\n  }\n\n  /*\n  Calculates the depth of this node, i.e. the distance to the root.\n  Takes O(h) time.\n  */\n  public func depth() -> Int {\n    var node = self\n    var edges = 0\n    while let parent = node.parent {\n      node = parent\n      edges += 1\n    }\n    return edges\n  }\n\n  /*\n  Calculates the height of this node, i.e. the distance to the lowest leaf.\n  Since this looks at all children of this node, performance is O(n).\n  */\n  public func height() -> Int {\n    if isLeaf {\n      return 0\n    } else {\n      return 1 + max(left?.height() ?? 0, right?.height() ?? 0)\n    }\n  }\n\n  /*\n  Finds the node whose value precedes our value in sorted order.\n  */\n  public func predecessor() -> ThreadedBinaryTree<T>? {\n    if let left = left {\n      return left.maximum()\n    } else {\n      return leftThread\n    }\n  }\n\n  /*\n  Finds the node whose value succeeds our value in sorted order.\n  */\n  public func successor() -> ThreadedBinaryTree<T>? {\n    if let right = right {\n      return right.minimum()\n    } else {\n      return rightThread\n    }\n  }\n}\n\n// MARK: - Traversal\n\nextension ThreadedBinaryTree {\n  public func traverseInOrderForward(_ visit: (T) -> Void) {\n    var n: ThreadedBinaryTree\n    n = minimum()\n    while true {\n      visit(n.value)\n      if let successor = n.successor() {\n        n = successor\n      } else {\n        break\n      }\n    }\n  }\n\n  public func traverseInOrderBackward(_ visit: (T) -> Void) {\n    var n: ThreadedBinaryTree\n    n = maximum()\n    while true {\n      visit(n.value)\n      if let predecessor = n.predecessor() {\n        n = predecessor\n      } else {\n        break\n      }\n    }\n  }\n\n  public func traversePreOrder(_ visit: (T) -> Void) {\n    visit(value)\n    left?.traversePreOrder(visit)\n    right?.traversePreOrder(visit)\n  }\n\n  public func traversePostOrder(_ visit: (T) -> Void) {\n    left?.traversePostOrder(visit)\n    right?.traversePostOrder(visit)\n    visit(value)\n  }\n\n  /*\n  Performs an in-order traversal and collects the results in an array.\n  */\n  public func map(formula: (T) -> T) -> [T] {\n    var a = [T]()\n    var n: ThreadedBinaryTree\n    n = minimum()\n    while true {\n      a.append(formula(n.value))\n      if let successor = n.successor() {\n        n = successor\n      } else {\n        break\n      }\n    }\n    return a\n  }\n}\n\n// MARK: - Verification\n\nextension ThreadedBinaryTree {\n  /*\n  Is this threaded binary tree a valid binary search tree?\n  */\n  public func isBST(minValue: T, maxValue: T) -> Bool {\n    if value < minValue || value > maxValue { return false }\n    let leftBST = left?.isBST(minValue: minValue, maxValue: value) ?? true\n    let rightBST = right?.isBST(minValue: value, maxValue: maxValue) ?? true\n    return leftBST && rightBST\n  }\n\n  /*\n  Is this binary tree properly threaded?\n  Either left or leftThread (but not both) must be nil (likewise for right).\n  The first and last nodes in the in-order traversal are exempt from this,\n  as the first has leftThread = nil, and the last has rightThread = nil.\n  */\n  public func isThreaded() -> Bool {\n    if left == nil && leftThread == nil {\n      if self !== minimum() { return false }\n    }\n    if left != nil && leftThread != nil {\n      return false\n    }\n    if right == nil && rightThread == nil {\n      if self !== maximum() { return false }\n    }\n    if right != nil && rightThread != nil {\n      return false\n    }\n    let leftThreaded = left?.isThreaded() ?? true\n    let rightThreaded = right?.isThreaded() ?? true\n    return leftThreaded && rightThreaded\n  }\n}\n\n// MARK: - Debugging\n\nextension ThreadedBinaryTree: CustomStringConvertible {\n  public var description: String {\n    var s = \"\"\n    if let left = left {\n      s += \"(\\(left.description)) <- \"\n    }\n    s += \"\\(value)\"\n    if let right = right {\n      s += \" -> (\\(right.description))\"\n    }\n    return s\n  }\n}\n\nextension ThreadedBinaryTree: CustomDebugStringConvertible {\n  public var debugDescription: String {\n    var s = \"value: \\(value)\"\n    if let parent = parent {\n      s += \", parent: \\(parent.value)\"\n    }\n    if let leftThread = leftThread {\n      s += \", leftThread: \\(leftThread.value)\"\n    }\n    if let rightThread = rightThread {\n      s += \", rightThread: \\(rightThread.value)\"\n    }\n    if let left = left {\n      s += \", left = [\" + left.debugDescription + \"]\"\n    }\n    if let right = right {\n      s += \", right = [\" + right.debugDescription + \"]\"\n    }\n    return s\n  }\n\n  public func toArray() -> [T] {\n    return map { $0 }\n  }\n}\n"
  },
  {
    "path": "Threaded Binary Tree/ThreadedBinaryTree.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Threaded Binary Tree/ThreadedBinaryTree.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Threaded Binary Tree/ThreadedBinaryTree.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Topological Sort/Graph.swift",
    "content": "public class Graph: CustomStringConvertible {\n  public typealias Node = String\n\n  private(set) public var adjacencyLists: [Node : [Node]]\n\n  public init() {\n    adjacencyLists = [Node: [Node]]()\n  }\n\n  public func addNode(_ value: Node) -> Node {\n    adjacencyLists[value] = []\n    return value\n  }\n\n  public func addEdge(fromNode from: Node, toNode to: Node) -> Bool {\n    adjacencyLists[from]?.append(to)\n    return adjacencyLists[from] != nil ? true : false\n  }\n\n  public var description: String {\n    return adjacencyLists.description\n  }\n\n  public func adjacencyList(forNode node: Node) -> [Node]? {\n    for (key, adjacencyList) in adjacencyLists {\n      if key == node {\n        return adjacencyList\n      }\n    }\n    return nil\n  }\n}\n\nextension Graph {\n  typealias InDegree = Int\n\n  func calculateInDegreeOfNodes() -> [Node : InDegree] {\n    var inDegrees = [Node: InDegree]()\n\n    for (node, _) in adjacencyLists {\n      inDegrees[node] = 0\n    }\n\n    for (_, adjacencyList) in adjacencyLists {\n      for nodeInList in adjacencyList {\n        inDegrees[nodeInList] = (inDegrees[nodeInList] ?? 0) + 1\n      }\n    }\n    return inDegrees\n  }\n}\n"
  },
  {
    "path": "Topological Sort/README.markdown",
    "content": "# Topological Sort\n\nTopological sort is an algorithm that orders a directed graph such that for each directed edge *u→v*, vertex *u* comes before vertex *v*.\n\nIn other words, a topological sort places the vertices of a [directed acyclic graph](../Graph/) on a line so that all directed edges go from left to right. \n\nConsider the graph in the following example:\n\n![Example](Images/Graph.png)\n\nThis graph has two possible topological sorts:\n\n![Example](Images/TopologicalSort.png)\n\nThe topological orderings are **S, V, W, T, X** and **S, W, V, T, X**. Notice how the arrows all go from left to right.\n\nThe following is not a valid topological sort for this graph, since **X** and **T** cannot happen before **V**:\n\n![Example](Images/InvalidSort.png)\n\n## Where is this used?\n\nLet's consider that you want to learn all the algorithms and data structures from the Swift Algorithm Club. This might seem daunting at first but we can use topological sort to get things organized.\n\nSince you're learning about topological sort, let's take this topic as an example. What else do you need to learn first before you can fully understand topological sort? Well, topological sort uses [depth-first search](../Depth-First%20Search/) as well as a [stack](../Stack/). But before you can learn about the depth-first search algorithm, you need to know what a [graph](../Graph/) is, and it helps to know what a [tree](../Tree/) is. In turn, graphs and trees use the idea of linking objects together, so you may need to read up on that first. And so on...\n\nIf we were to represent these objectives in the form of a graph it would look as follows:\n\n![Example](Images/Algorithms.png)\n\nIf we consider each algorithm to be a vertex in the graph you can clearly see the dependencies between them. To learn something you might have to know something else first. This is exactly what topological sort is used for -- it will sort things out so that you know what to do first.\n\n## How does it work?\n\n**Step 1: Find all vertices that have in-degree of 0**\n\nThe *in-degree* of a vertex is the number of edges pointing at that vertex. Vertices with no incoming edges have an in-degree of 0. These vertices are the starting points for the topological sort.\n\nIn the context of the previous example, these starting vertices represent algorithms and data structures that don't have any prerequisites; you don't need to learn anything else first, hence the sort starts with them.\n\n**Step 2: Traverse the graph with depth-first search**\n\nDepth-first search is an algorithm that starts traversing the graph from a certain vertex and explores as far as possible along each branch before backtracking. To find out more about depth-first search, please take a look at the [detailed explanation](../Depth-First%20Search/).\n\nWe perform a depth-first search on each vertex with in-degree 0. This tells us which vertices are connected to each of these starting vertices.\n\n**Step 3: Remember all visited vertices**\n\nAs we perform the depth-first search, we maintain a list of all the vertices that have been visited. This is to avoid visiting the same vertex twice.\n\n**Step 4: Put it all together**\n\nThe last step of the sort is to combine the results of the different depth-first searches and put the vertices in a sorted list.\n\n## Example\n\nConsider the following graph:\n\n![Graph Example](Images/Example.png)\n\n**Step 1:** The vertices with 0 in-degree are: **3, 7, 5**. These are our starting vertices.\n\n**Step 2:** Perform depth-first search for each starting vertex, without remembering vertices that have already been visited:\n\n```\nVertex 3: 3, 10, 8, 9\nVertex 7: 7, 11, 2, 8, 9\nVertex 5: 5, 11, 2, 9, 10\n```\n\n**Step 3:** Filter out the vertices already visited in each previous search:\n\n```\nVertex 3: 3, 10, 8, 9\nVertex 7: 7, 11, 2\nVertex 5: 5\n```\n\n**Step 4:** Combine the results of these three depth-first searches. The final sorted order is **5, 7, 11, 2, 3, 10, 8, 9**. (Important: we need to add the results of each subsequent search to the *front* of the sorted list.)\n\nThe result of the topological sort looks like this:\n\n![Result of the sort](Images/GraphResult.png)\n\n> **Note:** This is not the only possible topological sort for this graph. For example, other valid solutions are **3, 7, 5, 10, 8, 11, 9, 2** and **3, 7, 5, 8, 11, 2, 9, 10**. Any order where all the arrows are going from left to right will do. \n\n## The code\n\nHere is how you could implement topological sort in Swift (see also [TopologicalSort1.swift](TopologicalSort1.swift)):\n\n```swift\nextension Graph {\n  public func topologicalSort() -> [Node] {\n    // 1\n    let startNodes = calculateInDegreeOfNodes().filter({ _, indegree in\n      return indegree == 0\n    }).map({ node, indegree in\n      return node\n    })\n    \n    // 2\n    var visited = [Node : Bool]()\n    for (node, _) in adjacencyLists {\n      visited[node] = false\n    }\n    \n    // 3\n    var result = [Node]()\n    for startNode in startNodes {\n      result = depthFirstSearch(startNode, visited: &visited) + result\n    }\n\n    // 4    \n    return result\n  }\n}\n```\n\nSome remarks:\n\n1. Find the in-degree of each vertex and put all the vertices with in-degree 0 in the `startNodes` array. In this graph implementation, vertices are called \"nodes\". Both terms are used interchangeably by people who write graph code.\n\n2. The `visited` array keeps track of whether we've already seen a vertex during the depth-first search. Initially, we set all elements to `false`.\n\n3. For each of the vertices in the `startNodes` array, perform a depth-first search. This returns an array of sorted `Node` objects. We prepend that array to our own `result` array.\n\n4. The `result` array contains all the vertices in topologically sorted order.\n\n> **Note:** For a slightly different implementation of topological sort using depth-first search, see [TopologicalSort3.swift](TopologicalSort3.swift). This uses a stack and does not require you to find all vertices with in-degree 0 first.\n\n## Kahn's algorithm\n\nEven though depth-first search is the typical way to perform a topological sort, there is another algorithm that also does the job. \n\n1. Find out what the in-degree is of every vertex.\n2. Put all the vertices that have no predecessors in a new array called `leaders`. These vertices have in-degree 0 and therefore do not depend on any other vertices.\n3. Go through this list of leaders and remove them one-by-one from the graph. We don't actually modify the graph, we just decrement the in-degree of the vertices they point to. That has the same effect.\n4. Look at the (former) immediate neighbor vertices of each leader. If any of them now have an in-degree of 0, then they no longer have any predecessors themselves. We'll add those vertices to the `leaders` array too.\n5. This repeats until there are no more vertices left to look at. At this point, the `leaders` array contains all the vertices in sorted order.\n\nThis is an **O(n + m)** algorithm where **n** is the number of vertices and **m** is the number of edges. You can see the implementation in [TopologicalSort2.swift](TopologicalSort2.swift).\n\nSource: I first read about this alternative algorithm in the Algorithm Alley column in Dr. Dobb's Magazine from May 1993.\n\n*Written for Swift Algorithm Club by Ali Hafizji and Matthijs Hollemans*\n"
  },
  {
    "path": "Topological Sort/Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Topological Sort/Tests/Tests.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t7B3471BB1C8F50CF008381CD /* TopologicalSortTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B3471BA1C8F50CF008381CD /* TopologicalSortTests.swift */; };\n\t\t7B3471BF1C8F50DD008381CD /* Graph.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B3471BC1C8F50DD008381CD /* Graph.swift */; };\n\t\t7B3471C11C8F50DD008381CD /* TopologicalSort1.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B3471BE1C8F50DD008381CD /* TopologicalSort1.swift */; };\n\t\t7B3471C31C8F5348008381CD /* TopologicalSort2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B3471C21C8F5348008381CD /* TopologicalSort2.swift */; };\n\t\t7BE143491C9C6A93001BC747 /* TopologicalSort3.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7BE143481C9C6A93001BC747 /* TopologicalSort3.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\t7B2BBC801C779D720067B71D /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t7B2BBC941C779E7B0067B71D /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };\n\t\t7B3471BA1C8F50CF008381CD /* TopologicalSortTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TopologicalSortTests.swift; sourceTree = SOURCE_ROOT; };\n\t\t7B3471BC1C8F50DD008381CD /* Graph.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Graph.swift; path = ../Graph.swift; sourceTree = SOURCE_ROOT; };\n\t\t7B3471BE1C8F50DD008381CD /* TopologicalSort1.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TopologicalSort1.swift; path = ../TopologicalSort1.swift; sourceTree = SOURCE_ROOT; };\n\t\t7B3471C21C8F5348008381CD /* TopologicalSort2.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TopologicalSort2.swift; path = ../TopologicalSort2.swift; sourceTree = SOURCE_ROOT; };\n\t\t7BE143481C9C6A93001BC747 /* TopologicalSort3.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TopologicalSort3.swift; path = ../TopologicalSort3.swift; sourceTree = SOURCE_ROOT; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t7B2BBC7D1C779D720067B71D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t7B2BBC681C779D710067B71D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC831C779D720067B71D /* Tests */,\n\t\t\t\t7B2BBC721C779D710067B71D /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC721C779D710067B71D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B2BBC801C779D720067B71D /* Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t7B2BBC831C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t7B3471BC1C8F50DD008381CD /* Graph.swift */,\n\t\t\t\t7B3471BE1C8F50DD008381CD /* TopologicalSort1.swift */,\n\t\t\t\t7B3471C21C8F5348008381CD /* TopologicalSort2.swift */,\n\t\t\t\t7BE143481C9C6A93001BC747 /* TopologicalSort3.swift */,\n\t\t\t\t7B3471BA1C8F50CF008381CD /* TopologicalSortTests.swift */,\n\t\t\t\t7B2BBC941C779E7B0067B71D /* Info.plist */,\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tpath = TestsTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t7B2BBC7F1C779D720067B71D /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t7B2BBC7C1C779D720067B71D /* Sources */,\n\t\t\t\t7B2BBC7D1C779D720067B71D /* Frameworks */,\n\t\t\t\t7B2BBC7E1C779D720067B71D /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tproductName = TestsTests;\n\t\t\tproductReference = 7B2BBC801C779D720067B71D /* Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t7B2BBC691C779D710067B71D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0720;\n\t\t\t\tLastUpgradeCheck = 0800;\n\t\t\t\tORGANIZATIONNAME = \"Swift Algorithm Club\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t7B2BBC7F1C779D720067B71D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2;\n\t\t\t\t\t\tLastSwiftMigration = 0800;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 7B2BBC681C779D710067B71D;\n\t\t\tproductRefGroup = 7B2BBC721C779D710067B71D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t7B2BBC7F1C779D720067B71D /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t7B2BBC7E1C779D720067B71D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t7B2BBC7C1C779D720067B71D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t7B3471C31C8F5348008381CD /* TopologicalSort2.swift in Sources */,\n\t\t\t\t7B3471BF1C8F50DD008381CD /* Graph.swift in Sources */,\n\t\t\t\t7B3471BB1C8F50CF008381CD /* TopologicalSortTests.swift in Sources */,\n\t\t\t\t7B3471C11C8F50DD008381CD /* TopologicalSort1.swift in Sources */,\n\t\t\t\t7BE143491C9C6A93001BC747 /* TopologicalSort3.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\t7B2BBC871C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC881C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t7B2BBC8D1C779D720067B71D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 3.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t7B2BBC8E1C779D720067B71D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = swift.algorithm.club.Tests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 3.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t7B2BBC6C1C779D710067B71D /* Build configuration list for PBXProject \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC871C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC881C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t7B2BBC8C1C779D720067B71D /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t7B2BBC8D1C779D720067B71D /* Debug */,\n\t\t\t\t7B2BBC8E1C779D720067B71D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 7B2BBC691C779D710067B71D /* Project object */;\n}\n"
  },
  {
    "path": "Topological Sort/Tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Tests.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Topological Sort/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0800\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Tests.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"7B2BBC7F1C779D720067B71D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Tests.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Topological Sort/Tests/TopologicalSortTests.swift",
    "content": "import Foundation\nimport XCTest\n\nextension Graph {\n  public func loadEdgeList(_ lines: [String]) {\n    for line in lines {\n      let items = line.components(separatedBy: \" \").filter { s in !s.isEmpty }\n      if adjacencyList(forNode: items[0]) == nil {\n        addNode(items[0])\n      }\n      if adjacencyList(forNode: items[1]) == nil {\n        addNode(items[1])\n      }\n      addEdge(fromNode: items[0], toNode: items[1])\n    }\n  }\n}\n\nclass TopologicalSort: XCTestCase {\n\n  // The topological sort is valid if a node does not have any of its\n  // predecessors in its adjacency list.\n  func checkIsValidTopologicalSort(_ graph: Graph, _ a: [Graph.Node]) {\n    for i in stride(from: (a.count - 1), to: 0, by: -1) {\n      if let neighbors = graph.adjacencyList(forNode: a[i]) {\n        for j in stride(from: (i - 1), through: 0, by: -1) {\n          XCTAssertFalse(neighbors.contains(a[j]), \"\\(a) is not a valid topological sort\")\n        }\n      }\n    }\n  }\n\n  func testTopologicalSort() {\n    let graph = Graph()\n\n    let node5 = graph.addNode(\"5\")\n    let node7 = graph.addNode(\"7\")\n    let node3 = graph.addNode(\"3\")\n    let node11 = graph.addNode(\"11\")\n    let node8 = graph.addNode(\"8\")\n    let node2 = graph.addNode(\"2\")\n    let node9 = graph.addNode(\"9\")\n    let node10 = graph.addNode(\"10\")\n\n    graph.addEdge(fromNode: node5, toNode: node11)\n    graph.addEdge(fromNode: node7, toNode: node11)\n    graph.addEdge(fromNode: node7, toNode: node8)\n    graph.addEdge(fromNode: node3, toNode: node8)\n    graph.addEdge(fromNode: node3, toNode: node10)\n    graph.addEdge(fromNode: node11, toNode: node2)\n    graph.addEdge(fromNode: node11, toNode: node9)\n    graph.addEdge(fromNode: node11, toNode: node10)\n    graph.addEdge(fromNode: node8, toNode: node9)\n\n    XCTAssertEqual(graph.topologicalSort(), [\"5\", \"7\", \"11\", \"2\", \"3\", \"10\", \"8\", \"9\"])\n    XCTAssertEqual(graph.topologicalSortKahn(), [\"3\", \"7\", \"5\", \"8\", \"11\", \"2\", \"9\", \"10\"])\n    XCTAssertEqual(graph.topologicalSortAlternative(), [\"5\", \"7\", \"3\", \"8\", \"11\", \"10\", \"9\", \"2\"])\n  }\n\n  func testTopologicalSortEdgeLists() {\n    let p1 = [\"A B\", \"A C\", \"B C\", \"B D\", \"C E\", \"C F\", \"E D\", \"F E\", \"G A\", \"G F\"]\n    let p2 = [\"B C\", \"C D\", \"C G\", \"B F\", \"D G\", \"G E\", \"F G\", \"F G\"]\n    let p3 = [\"S V\", \"S W\", \"V T\", \"W T\"]\n    let p4 = [\"5 11\", \"7 11\", \"7 8\", \"3 8\", \"3 10\", \"11 2\", \"11 9\", \"11 10\", \"8 9\"]\n\n    let data = [ p1, p2, p3, p4 ]\n\n    for d in data {\n      let graph = Graph()\n      graph.loadEdgeList(d)\n\n      let sorted1 = graph.topologicalSort()\n      checkIsValidTopologicalSort(graph, sorted1)\n\n      let sorted2 = graph.topologicalSortKahn()\n      checkIsValidTopologicalSort(graph, sorted2)\n\n      let sorted3 = graph.topologicalSortAlternative()\n      checkIsValidTopologicalSort(graph, sorted3)\n    }\n  }\n}\n"
  },
  {
    "path": "Topological Sort/Topological Sort.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\n// last checked with Xcode 9.0b4\n#if swift(>=4.0)\nprint(\"Hello, Swift 4!\")\n#endif\n\nimport UIKit\n\nlet graph = Graph()\n\nlet node5 = graph.addNode(\"5\")\nlet node7 = graph.addNode(\"7\")\nlet node3 = graph.addNode(\"3\")\nlet node11 = graph.addNode(\"11\")\nlet node8 = graph.addNode(\"8\")\nlet node2 = graph.addNode(\"2\")\nlet node9 = graph.addNode(\"9\")\nlet node10 = graph.addNode(\"10\")\n\ngraph.addEdge(fromNode: node5, toNode: node11)\ngraph.addEdge(fromNode: node7, toNode: node11)\ngraph.addEdge(fromNode: node7, toNode: node8)\ngraph.addEdge(fromNode: node3, toNode: node8)\ngraph.addEdge(fromNode: node3, toNode: node10)\ngraph.addEdge(fromNode: node11, toNode: node2)\ngraph.addEdge(fromNode: node11, toNode: node9)\ngraph.addEdge(fromNode: node11, toNode: node10)\ngraph.addEdge(fromNode: node8, toNode: node9)\n\n// using depth-first search\ngraph.topologicalSort()\n\n// also using depth-first search\ngraph.topologicalSortAlternative()\n\n// Kahn's algorithm\ngraph.topologicalSortKahn()\n"
  },
  {
    "path": "Topological Sort/Topological Sort.playground/Sources/Graph.swift",
    "content": "public class Graph: CustomStringConvertible {\n  public typealias Node = String\n\n  private(set) public var adjacencyLists: [Node : [Node]]\n\n  public init() {\n    adjacencyLists = [Node: [Node]]()\n  }\n\n  public func addNode(_ value: Node) -> Node {\n    adjacencyLists[value] = []\n    return value\n  }\n\n  public func addEdge(fromNode from: Node, toNode to: Node) -> Bool {\n    adjacencyLists[from]?.append(to)\n    return adjacencyLists[from] != nil ? true : false\n  }\n\n  public var description: String {\n    return adjacencyLists.description\n  }\n\n  public func adjacencyList(forNode node: Node) -> [Node]? {\n    for (key, adjacencyList) in adjacencyLists {\n      if key == node {\n        return adjacencyList\n      }\n    }\n    return nil\n  }\n}\n\nextension Graph {\n  typealias InDegree = Int\n\n  func calculateInDegreeOfNodes() -> [Node : InDegree] {\n    var inDegrees = [Node: InDegree]()\n\n    for (node, _) in adjacencyLists {\n      inDegrees[node] = 0\n    }\n\n    for (_, adjacencyList) in adjacencyLists {\n      for nodeInList in adjacencyList {\n        inDegrees[nodeInList] = (inDegrees[nodeInList] ?? 0) + 1\n      }\n    }\n    return inDegrees\n  }\n}\n"
  },
  {
    "path": "Topological Sort/Topological Sort.playground/Sources/TopologicalSort1.swift",
    "content": "extension Graph {\n  private func depthFirstSearch(_ source: Node, visited: inout [Node : Bool]) -> [Node] {\n    var result = [Node]()\n\n    if let adjacencyList = adjacencyList(forNode: source) {\n      for nodeInAdjacencyList in adjacencyList {\n        if let seen = visited[nodeInAdjacencyList], !seen {\n          result = depthFirstSearch(nodeInAdjacencyList, visited: &visited) + result\n        }\n      }\n    }\n\n    visited[source] = true\n    return [source] + result\n  }\n\n  /* Topological sort using depth-first search. */\n  public func topologicalSort() -> [Node] {\n\n    let startNodes = calculateInDegreeOfNodes().filter({ _, indegree in\n      return indegree == 0\n    }).map({ node, _ in\n      return node\n    })\n\n    var visited = [Node: Bool]()\n    for (node, _) in adjacencyLists {\n      visited[node] = false\n    }\n\n    var result = [Node]()\n    for startNode in startNodes {\n      result = depthFirstSearch(startNode, visited: &visited) + result\n    }\n\n    return result\n  }\n}\n"
  },
  {
    "path": "Topological Sort/Topological Sort.playground/Sources/TopologicalSort2.swift",
    "content": "extension Graph {\n  /* Topological sort using Kahn's algorithm. */\n  public func topologicalSortKahn() -> [Node] {\n    var nodes = calculateInDegreeOfNodes()\n\n    // Find vertices with no predecessors and puts them into a new list.\n    // These are the \"leaders\". The leaders array eventually becomes the\n    // topologically sorted list.\n    var leaders = nodes.filter({ _, indegree in\n      return indegree == 0\n    }).map({ node, _ in\n      return node\n    })\n\n    // \"Remove\" each of the leaders. We do this by decrementing the in-degree\n    // of the nodes they point to. As soon as such a node has itself no more\n    // predecessors, it is added to the leaders array. This repeats until there\n    // are no more vertices left.\n    var l = 0\n    while l < leaders.count {\n      if let edges = adjacencyList(forNode: leaders[l]) {\n        for neighbor in edges {\n          if let count = nodes[neighbor] {\n            nodes[neighbor] = count - 1\n            if count == 1 {             // this leader was the last predecessor\n              leaders.append(neighbor)  // so neighbor is now a leader itself\n            }\n          }\n        }\n      }\n      l += 1\n    }\n\n    // Was there a cycle in the graph?\n    if leaders.count != nodes.count {\n      print(\"Error: graphs with cycles are not allowed\")\n    }\n\n    return leaders\n  }\n}\n"
  },
  {
    "path": "Topological Sort/Topological Sort.playground/Sources/TopologicalSort3.swift",
    "content": "/*\n  An alternative implementation of topological sort using depth-first search.\n  This does not start at vertices with in-degree 0 but simply at the first one\n  it finds. It uses a stack to build up the sorted list, but in reverse order.\n*/\nextension Graph {\n  public func topologicalSortAlternative() -> [Node] {\n    var stack = [Node]()\n\n    var visited = [Node: Bool]()\n    for (node, _) in adjacencyLists {\n      visited[node] = false\n    }\n\n    func depthFirstSearch(_ source: Node) {\n      if let adjacencyList = adjacencyList(forNode: source) {\n        for neighbor in adjacencyList {\n          if let seen = visited[neighbor], !seen {\n            depthFirstSearch(neighbor)\n          }\n        }\n      }\n      stack.append(source)\n      visited[source] = true\n    }\n\n    for (node, _) in visited {\n      if let seen = visited[node], !seen {\n        depthFirstSearch(node)\n      }\n    }\n\n    return stack.reversed()\n  }\n}\n"
  },
  {
    "path": "Topological Sort/Topological Sort.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='ios'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Topological Sort/Topological Sort.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Topological Sort/TopologicalSort1.swift",
    "content": "extension Graph {\n  private func depthFirstSearch(_ source: Node, visited: inout [Node : Bool]) -> [Node] {\n    var result = [Node]()\n    visited[source] = true\n\n    if let adjacencyList = adjacencyList(forNode: source) {\n      for nodeInAdjacencyList in adjacencyList {\n        if let seen = visited[nodeInAdjacencyList], !seen {\n          result = depthFirstSearch(nodeInAdjacencyList, visited: &visited) + result\n        }\n      }\n    }\n\n    return [source] + result\n  }\n\n  /* Topological sort using depth-first search. */\n  public func topologicalSort() -> [Node] {\n\n    let startNodes = calculateInDegreeOfNodes().filter({ _, indegree in\n      return indegree == 0\n    }).map({ node, _ in\n      return node\n    })\n\n    var visited = [Node: Bool]()\n    for (node, _) in adjacencyLists {\n      visited[node] = false\n    }\n\n    var result = [Node]()\n    for startNode in startNodes {\n      result = depthFirstSearch(startNode, visited: &visited) + result\n    }\n\n    return result\n  }\n}\n"
  },
  {
    "path": "Topological Sort/TopologicalSort2.swift",
    "content": "extension Graph {\n  /* Topological sort using Kahn's algorithm. */\n  public func topologicalSortKahn() -> [Node] {\n    var nodes = calculateInDegreeOfNodes()\n\n    // Find vertices with no predecessors and puts them into a new list.\n    // These are the \"leaders\". The leaders array eventually becomes the\n    // topologically sorted list.\n    var leaders = nodes.filter({ _, indegree in\n      return indegree == 0\n    }).map({ node, _ in\n      return node\n    })\n\n    // \"Remove\" each of the leaders. We do this by decrementing the in-degree\n    // of the nodes they point to. As soon as such a node has itself no more\n    // predecessors, it is added to the leaders array. This repeats until there\n    // are no more vertices left.\n    var l = 0\n    while l < leaders.count {\n      if let edges = adjacencyList(forNode: leaders[l]) {\n        for neighbor in edges {\n          if let count = nodes[neighbor] {\n            nodes[neighbor] = count - 1\n            if count == 1 {             // this leader was the last predecessor\n              leaders.append(neighbor)  // so neighbor is now a leader itself\n            }\n          }\n        }\n      }\n      l += 1\n    }\n\n    // Was there a cycle in the graph?\n    if leaders.count != nodes.count {\n      print(\"Error: graphs with cycles are not allowed\")\n    }\n\n    return leaders\n  }\n}\n"
  },
  {
    "path": "Topological Sort/TopologicalSort3.swift",
    "content": "/*\n  An alternative implementation of topological sort using depth-first search.\n  This does not start at vertices with in-degree 0 but simply at the first one\n  it finds. It uses a stack to build up the sorted list, but in reverse order.\n*/\nextension Graph {\n  public func topologicalSortAlternative() -> [Node] {\n    var stack = [Node]()\n\n    var visited = [Node: Bool]()\n    for (node, _) in adjacencyLists {\n      visited[node] = false\n    }\n\n    func depthFirstSearch(_ source: Node) {\n      if let adjacencyList = adjacencyList(forNode: source) {\n        for neighbor in adjacencyList {\n          if let seen = visited[neighbor], !seen {\n            depthFirstSearch(neighbor)\n          }\n        }\n      }\n      stack.append(source)\n      visited[source] = true\n    }\n\n    for (node, _) in visited {\n      if let seen = visited[node], !seen {\n        depthFirstSearch(node)\n      }\n    }\n\n    return stack.reversed()\n  }\n}\n"
  },
  {
    "path": "Treap/Treap/Treap/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIconFile</key>\n\t<string></string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSMinimumSystemVersion</key>\n\t<string>$(MACOSX_DEPLOYMENT_TARGET)</string>\n\t<key>NSHumanReadableCopyright</key>\n\t<string>Copyright © 2016 WillowTree, Inc. All rights reserved.</string>\n\t<key>NSMainNibFile</key>\n\t<string>MainMenu</string>\n\t<key>NSPrincipalClass</key>\n\t<string>NSApplication</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Treap/Treap/Treap.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t750439C01DA9924E0045C660 /* Treap.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1E34DE11C7670350023AF4D /* Treap.swift */; };\n\t\t750439C11DA992510045C660 /* TreapMergeSplit.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1E34DE21C7670350023AF4D /* TreapMergeSplit.swift */; };\n\t\t750439C21DA992530045C660 /* TreapCollectionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1E34DE91C7671200023AF4D /* TreapCollectionType.swift */; };\n\t\tE1E34DD71C7670250023AF4D /* TreapTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1E34DD61C7670250023AF4D /* TreapTests.swift */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXFileReference section */\n\t\tE1E34DCD1C7670240023AF4D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tE1E34DD21C7670250023AF4D /* Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tE1E34DD61C7670250023AF4D /* TreapTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TreapTests.swift; sourceTree = \"<group>\"; };\n\t\tE1E34DD81C7670250023AF4D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tE1E34DE11C7670350023AF4D /* Treap.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Treap.swift; path = ../../Treap.swift; sourceTree = \"<group>\"; };\n\t\tE1E34DE21C7670350023AF4D /* TreapMergeSplit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TreapMergeSplit.swift; path = ../../TreapMergeSplit.swift; sourceTree = \"<group>\"; };\n\t\tE1E34DE91C7671200023AF4D /* TreapCollectionType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TreapCollectionType.swift; path = ../../TreapCollectionType.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\tE1E34DCF1C7670250023AF4D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\tE1E34DBA1C7670240023AF4D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tE1E34DC51C7670240023AF4D /* Treap */,\n\t\t\t\tE1E34DD51C7670250023AF4D /* TreapTests */,\n\t\t\t\tE1E34DC41C7670240023AF4D /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tE1E34DC41C7670240023AF4D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tE1E34DD21C7670250023AF4D /* Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tE1E34DC51C7670240023AF4D /* Treap */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tE1E34DE11C7670350023AF4D /* Treap.swift */,\n\t\t\t\tE1E34DE21C7670350023AF4D /* TreapMergeSplit.swift */,\n\t\t\t\tE1E34DE91C7671200023AF4D /* TreapCollectionType.swift */,\n\t\t\t\tE1E34DCD1C7670240023AF4D /* Info.plist */,\n\t\t\t);\n\t\t\tpath = Treap;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tE1E34DD51C7670250023AF4D /* TreapTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tE1E34DD61C7670250023AF4D /* TreapTests.swift */,\n\t\t\t\tE1E34DD81C7670250023AF4D /* Info.plist */,\n\t\t\t);\n\t\t\tpath = TreapTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\tE1E34DD11C7670250023AF4D /* Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = E1E34DDE1C7670250023AF4D /* Build configuration list for PBXNativeTarget \"Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tE1E34DCE1C7670250023AF4D /* Sources */,\n\t\t\t\tE1E34DCF1C7670250023AF4D /* Frameworks */,\n\t\t\t\tE1E34DD01C7670250023AF4D /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Tests;\n\t\t\tproductName = TreapTests;\n\t\t\tproductReference = E1E34DD21C7670250023AF4D /* Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\tE1E34DBB1C7670240023AF4D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0720;\n\t\t\t\tLastUpgradeCheck = 0800;\n\t\t\t\tORGANIZATIONNAME = \"WillowTree, Inc.\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\tE1E34DD11C7670250023AF4D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.2.1;\n\t\t\t\t\t\tLastSwiftMigration = 0800;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = E1E34DBE1C7670240023AF4D /* Build configuration list for PBXProject \"Treap\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = E1E34DBA1C7670240023AF4D;\n\t\t\tproductRefGroup = E1E34DC41C7670240023AF4D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\tE1E34DD11C7670250023AF4D /* Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\tE1E34DD01C7670250023AF4D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\tE1E34DCE1C7670250023AF4D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t750439C01DA9924E0045C660 /* Treap.swift in Sources */,\n\t\t\t\tE1E34DD71C7670250023AF4D /* TreapTests.swift in Sources */,\n\t\t\t\t750439C21DA992530045C660 /* TreapCollectionType.swift in Sources */,\n\t\t\t\t750439C11DA992510045C660 /* TreapMergeSplit.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin XCBuildConfiguration section */\n\t\tE1E34DD91C7670250023AF4D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tE1E34DDA1C7670250023AF4D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.11;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tE1E34DDF1C7670250023AF4D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = TreapTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.willowtree.TreapTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tE1E34DE01C7670250023AF4D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = TreapTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.willowtree.TreapTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\tE1E34DBE1C7670240023AF4D /* Build configuration list for PBXProject \"Treap\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tE1E34DD91C7670250023AF4D /* Debug */,\n\t\t\t\tE1E34DDA1C7670250023AF4D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tE1E34DDE1C7670250023AF4D /* Build configuration list for PBXNativeTarget \"Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tE1E34DDF1C7670250023AF4D /* Debug */,\n\t\t\t\tE1E34DE01C7670250023AF4D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = E1E34DBB1C7670240023AF4D /* Project object */;\n}\n"
  },
  {
    "path": "Treap/Treap/Treap.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Treap/Treap/Treap.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Treap/Treap/Treap.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"0800\"\n   version = \"1.7\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"E1E34DD11C7670250023AF4D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Treap.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"E1E34DD11C7670250023AF4D\"\n               BuildableName = \"Tests.xctest\"\n               BlueprintName = \"Tests\"\n               ReferencedContainer = \"container:Treap.xcodeproj\">\n            </BuildableReference>\n            <LocationScenarioReference\n               identifier = \"com.apple.dt.IDEFoundation.CurrentLocationScenarioIdentifier\"\n               referenceType = \"1\">\n            </LocationScenarioReference>\n         </TestableReference>\n      </Testables>\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"E1E34DD11C7670250023AF4D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Treap.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"E1E34DD11C7670250023AF4D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Treap.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"E1E34DD11C7670250023AF4D\"\n            BuildableName = \"Tests.xctest\"\n            BlueprintName = \"Tests\"\n            ReferencedContainer = \"container:Treap.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Treap/Treap/TreapTests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Treap/Treap/TreapTests/TreapTests.swift",
    "content": "//\n//  TreapTests.swift\n//  TreapTests\n//\n//  Created by Robert Thompson on 2/18/16.\n//  Copyright © 2016 Robert Thompson\n/* Permission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.*/\n\n// swiftlint:disable force_try\n\nimport XCTest\n\nclass TreapTests: XCTestCase {\n\n  override func setUp() {\n    super.setUp()\n    // Put setup code here. This method is called before the invocation of each test method in the class.\n  }\n\n  override func tearDown() {\n    // Put teardown code here. This method is called after the invocation of each test method in the class.\n    super.tearDown()\n  }\n\n  func testSwift4() {\n    // last checked with Xcode 9.0b4\n    #if swift(>=4.0)\n      print(\"Hello, Swift 4!\")\n    #endif\n  }\n\n  func testSanity() {\n    var treap = Treap<Int, String>.empty\n    treap = treap.set(key: 5, val: \"a\").set(key: 7, val: \"b\")\n    XCTAssert(treap.get(5) == \"a\")\n    XCTAssert(treap.get(7) == \"b\")\n    treap = treap.set(key: 2, val: \"c\")\n    XCTAssert(treap.get(2) == \"c\")\n    treap = treap.set(key: 2, val: \"d\")\n    XCTAssert(treap.get(2) == \"d\")\n    treap = try! treap.delete(key: 5)\n    XCTAssert(!treap.contains(5))\n    XCTAssert(treap.contains(7))\n  }\n\n  func testFairlyBalanced() {\n    var treap = Treap<Int, Int?>.empty\n    for i in 0..<1000 {\n      treap = treap.set(key: i, val: nil)\n    }\n    let depth = treap.depth\n    XCTAssert(depth < 30, \"treap.depth was \\(depth)\")\n  }\n\n  func testFairlyBalancedCollection() {\n    var treap = Treap<Int, Int?>()\n    for i in 0..<1000 {\n      treap[i] = Optional<Int>.none\n    }\n    let depth = treap.depth\n    XCTAssert(depth > 0 && depth < 30)\n  }\n\n}\n"
  },
  {
    "path": "Treap/Treap.swift",
    "content": "//\n//  Treap.swift\n//  TreapExample\n//\n//  Created by Robert Thompson on 7/27/15.\n//  Copyright © 2016 Robert Thompson\n/* Permission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.*/\n\nimport Foundation\n\npublic indirect enum Treap<Key: Comparable, Element> {\n  case empty\n  case node(key: Key, val: Element, p: Int, left: Treap, right: Treap)\n\n  public init() {\n    self = .empty\n  }\n\n  internal func get(_ key: Key) -> Element? {\n    switch self {\n    case .empty:\n      return nil\n    case let .node(treeKey, val, _, _, _) where treeKey == key:\n      return val\n    case let .node(treeKey, _, _, left, _) where key < treeKey:\n      return left.get(key)\n    case let .node(treeKey, _, _, _, right) where key > treeKey:\n      return right.get(key)\n    default:\n      return nil\n    }\n  }\n\n  public func contains(_ key: Key) -> Bool {\n    switch self {\n    case .empty:\n      return false\n    case let .node(treeKey, _, _, _, _) where treeKey == key:\n      return true\n    case let .node(treeKey, _, _, left, _) where key < treeKey:\n      return left.contains(key)\n    case let .node(treeKey, _, _, _, right) where key > treeKey:\n      return right.contains(key)\n    default:\n      return false\n    }\n  }\n\n  public var depth: Int {\n    switch self {\n    case .empty:\n      return 0\n    case let .node(_, _, _, left, .empty):\n      return 1 + left.depth\n    case let .node(_, _, _, .empty, right):\n      return 1 + right.depth\n    case let .node(_, _, _, left, right):\n      let leftDepth = left.depth\n      let rightDepth = right.depth\n      return 1 + leftDepth > rightDepth ? leftDepth : rightDepth\n    }\n  }\n\n  public var count: Int {\n    return Treap.countHelper(self)\n  }\n\n  fileprivate static func countHelper(_ treap: Treap<Key, Element>) -> Int {\n    if case let .node(_, _, _, left, right) = treap {\n      return countHelper(left) + 1 + countHelper(right)\n    }\n\n    return 0\n  }\n}\n\ninternal func leftRotate<Key: Comparable, Element>(_ tree: Treap<Key, Element>) -> Treap<Key, Element> {\n  if case let .node(key, val, p, .node(leftKey, leftVal, leftP, leftLeft, leftRight), right) = tree {\n    return .node(key: leftKey, val: leftVal, p: leftP, left: leftLeft,\n                 right: Treap.node(key: key, val: val, p: p, left: leftRight, right: right))\n  } else {\n    return .empty\n  }\n}\n\ninternal func rightRotate<Key: Comparable, Element>(_ tree: Treap<Key, Element>) -> Treap<Key, Element> {\n  if case let .node(key, val, p, left, .node(rightKey, rightVal, rightP, rightLeft, rightRight)) = tree {\n    return .node(key: rightKey, val: rightVal, p: rightP,\n                 left: Treap.node(key: key, val: val, p: p, left: left, right: rightLeft), right: rightRight)\n  } else {\n    return .empty\n  }\n}\n\npublic extension Treap {\n  internal func set(key: Key, val: Element, p: Int = Int(arc4random())) -> Treap {\n    switch self {\n    case .empty:\n      return .node(key: key, val: val, p: p, left: .empty, right: .empty)\n    case let .node(nodeKey, nodeVal, nodeP, left, right) where key != nodeKey:\n      return insertAndBalance(nodeKey, nodeVal, nodeP, left, right, key, val, p)\n    case let .node(nodeKey, _, nodeP, left, right) where key == nodeKey:\n      return .node(key: key, val: val, p: nodeP, left: left, right: right)\n    default: // should never happen\n      return .empty\n    }\n  }\n\n  fileprivate func insertAndBalance(_ nodeKey: Key, _ nodeVal: Element, _ nodeP: Int, _ left: Treap,\n                                    _ right: Treap, _ key: Key, _ val: Element, _ p: Int) -> Treap {\n    let newChild: Treap<Key, Element>\n    let newNode: Treap<Key, Element>\n    let rotate: (Treap) -> Treap\n    if key < nodeKey {\n      newChild = left.set(key: key, val: val, p: p)\n      newNode = .node(key: nodeKey, val: nodeVal, p: nodeP, left: newChild, right: right)\n      rotate = leftRotate\n    } else if key > nodeKey {\n      newChild = right.set(key: key, val: val, p: p)\n      newNode = .node(key: nodeKey, val: nodeVal, p: nodeP, left: left, right: newChild)\n      rotate = rightRotate\n    } else {\n      // It should be impossible to reach here\n      newChild = .empty\n      newNode = .empty\n      return newNode\n    }\n\n    if case let .node(_, _, newChildP, _, _) = newChild, newChildP < nodeP {\n      return rotate(newNode)\n    } else {\n      return newNode\n    }\n  }\n\n  internal func delete(key: Key) throws -> Treap {\n    switch self {\n    case .empty:\n      throw NSError(domain: \"com.wta.treap.errorDomain\", code: -1, userInfo: nil)\n    case let .node(nodeKey, val, p, left, right) where key < nodeKey:\n      return try Treap.node(key: nodeKey, val: val, p: p, left: left.delete(key: key), right: right)\n    case let .node(nodeKey, val, p, left, right) where key > nodeKey:\n      return try Treap.node(key: nodeKey, val: val, p: p, left: left, right: right.delete(key: key))\n    case let .node(_, _, _, left, right):\n      return merge(left, right: right)\n    }\n  }\n}\n"
  },
  {
    "path": "Treap/TreapCollectionType.swift",
    "content": "//\n//  TreapCollectionType.swift\n//  Treap\n//\n//  Created by Robert Thompson on 2/18/16.\n//  Copyright © 2016 Robert Thompson\n/* Permission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.*/\n\nimport Foundation\n\nextension Treap: MutableCollection {\n\n  public typealias Index = TreapIndex<Key>\n\n  public subscript(index: TreapIndex<Key>) -> Element {\n    get {\n      guard let result = self.get(index.keys[index.keyIndex]) else {\n        fatalError(\"Invalid index!\")\n      }\n\n      return result\n    }\n\n    mutating set {\n      let key = index.keys[index.keyIndex]\n      self = self.set(key: key, val: newValue)\n    }\n  }\n\n  public subscript(key: Key) -> Element? {\n    get {\n      return self.get(key)\n    }\n\n    mutating set {\n      guard let value = newValue else {\n        _ = try? self.delete(key: key)\n        return\n      }\n\n      self = self.set(key: key, val: value)\n    }\n  }\n\n  public var startIndex: TreapIndex<Key> {\n    return TreapIndex<Key>(keys: keys, keyIndex: 0)\n  }\n\n  public var endIndex: TreapIndex<Key> {\n    let keys = self.keys\n    return TreapIndex<Key>(keys: keys, keyIndex: keys.count)\n  }\n\n  public func index(after i: TreapIndex<Key>) -> TreapIndex<Key> {\n    return i.successor()\n  }\n\n  fileprivate var keys: [Key] {\n    var results: [Key] = []\n    if case let .node(key, _, _, left, right) = self {\n      results.append(contentsOf: left.keys)\n      results.append(key)\n      results.append(contentsOf: right.keys)\n    }\n\n    return results\n  }\n}\n\npublic struct TreapIndex<Key: Comparable>: Comparable {\n\n  public static func < (lhs: TreapIndex<Key>, rhs: TreapIndex<Key>) -> Bool {\n    return lhs.keyIndex < rhs.keyIndex\n  }\n\n  fileprivate let keys: [Key]\n  fileprivate let keyIndex: Int\n\n  public func successor() -> TreapIndex {\n    return TreapIndex(keys: keys, keyIndex: keyIndex + 1)\n  }\n\n  public func predecessor() -> TreapIndex {\n    return TreapIndex(keys: keys, keyIndex: keyIndex - 1)\n  }\n\n  fileprivate init(keys: [Key] = [], keyIndex: Int = 0) {\n    self.keys = keys\n    self.keyIndex = keyIndex\n  }\n}\n\npublic func ==<Key: Comparable>(lhs: TreapIndex<Key>, rhs: TreapIndex<Key>) -> Bool {\n  return lhs.keys == rhs.keys && lhs.keyIndex == rhs.keyIndex\n}\n"
  },
  {
    "path": "Treap/TreapMergeSplit.swift",
    "content": "//\n//  TreapMergeSplit.swift\n//  TreapExample\n//\n//  Created by Robert Thompson on 7/27/15.\n//  Copyright © 2016 Robert Thompson\n/* Permission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.*/\n\nimport Foundation\npublic extension Treap {\n  internal func split(_ key: Key) -> (left: Treap, right: Treap) {\n    var current = self\n    let val: Element\n    if let newVal = self.get(key) {\n      // swiftlint:disable force_try\n      current = try! current.delete(key: key)\n      // swiftlint:enable force_try\n      val = newVal\n    } else if case let .node(_, newVal, _, _, _) = self {\n      val = newVal\n    } else {\n      fatalError(\"No values in treap\")\n    }\n\n    switch self {\n    case .node:\n      if case let .node(_, _, _, left, right) = current.set(key: key, val: val, p: -1) {\n        return (left: left, right: right)\n      } else {\n        return (left: .empty, right: .empty)\n      }\n    default:\n      return (left: .empty, right: .empty)\n    }\n  }\n\n  internal var leastKey: Key? {\n    switch self {\n    case .empty:\n      return nil\n    case let .node(key, _, _, .empty, _):\n      return key\n    case let .node(_, _, _, left, _):\n      return left.leastKey\n    }\n  }\n\n  internal var mostKey: Key? {\n    switch self {\n    case .empty:\n      return nil\n    case let .node(key, _, _, _, .empty):\n      return key\n    case let .node(_, _, _, _, right):\n      return right.mostKey\n    }\n  }\n}\n\ninternal func merge<Key: Comparable, Element>(_ left: Treap<Key, Element>, right: Treap<Key, Element>) -> Treap<Key, Element> {\n  switch (left, right) {\n  case (.empty, _):\n    return right\n  case (_, .empty):\n    return left\n\n  case let (.node(leftKey, leftVal, leftP, leftLeft, leftRight), .node(rightKey, rightVal, rightP, rightLeft, rightRight)):\n    if leftP < rightP {\n      return .node(key: leftKey, val: leftVal, p: leftP, left: leftLeft, right: merge(leftRight, right: right))\n    } else {\n      return .node(key: rightKey, val: rightVal, p: rightP, left: merge(rightLeft, right: left), right: rightRight)\n    }\n  default:\n    break\n  }\n  return .empty\n}\n\nextension Treap: CustomStringConvertible {\n  public var description: String {\n    return Treap.descHelper(self, indent: 0)\n  }\n\n  fileprivate static func descHelper(_ treap: Treap<Key, Element>, indent: Int) -> String {\n    if case let .node(key, value, priority, left, right) = treap {\n      var result = \"\"\n      let tabs = String(repeating: \"\\t\", count: indent)\n\n      result += descHelper(left, indent: indent + 1)\n      result += \"\\n\" + tabs + \"\\(key), \\(value), \\(priority)\\n\"\n      result += descHelper(right, indent: indent + 1)\n\n      return result\n    } else {\n      return \"\"\n    }\n  }\n}\n"
  },
  {
    "path": "Tree/README.markdown",
    "content": "# Trees\n\n> This topic has been tutorialized [here](https://www.raywenderlich.com/138190/swift-algorithm-club-swift-tree-data-structure)\n\n\nA tree represents hierarchical relationships between objects. This is a tree:\n\n![A tree](Images/Tree.png)\n\nA tree consists of nodes, and these nodes are linked to one another.\n\nNodes have links to their children and usually to their parent as well. The children are the nodes below a given node; the parent is the node above. A node always has just one parent but can have multiple children.\n\n![A tree](Images/ParentChildren.png)\n\nA node without a parent is the *root* node. A node without children is a *leaf* node.\n\nThe pointers in a tree do not form cycles. This is not a tree:\n\n![Not a tree](Images/Cycles.png)\n\nSuch a structure is called a [graph](../Graph/). A tree is really a very simple form of a graph. (In a similar vein, a [linked list](../Linked%20List/) is a simple version of a tree. Think about it!)\n\nThis article talks about a general-purpose tree. That's a tree without any kind of restrictions on how many children each node may have, or on the order of the nodes in the tree.\n\nHere's a basic implementation in Swift:\n\n```swift\npublic class TreeNode<T> {\n  public var value: T\n\n  public weak var parent: TreeNode?\n  public var children = [TreeNode<T>]()\n\n  public init(value: T) {\n    self.value = value\n  }\n\n  public func addChild(_ node: TreeNode<T>) {\n    children.append(node)\n    node.parent = self\n  }\n}\n```\n\nThis describes a single node from the tree. It has a value of generic type `T`, a reference to a `parent` node, and an array of child nodes.\n\nIt will be useful to add a `description` method so you can print the tree:\n\n```swift\nextension TreeNode: CustomStringConvertible {\n  public var description: String {\n    var s = \"\\(value)\"\n    if !children.isEmpty {\n      s += \" {\" + children.map { $0.description }.joined(separator: \", \") + \"}\"\n    }\n    return s\n  }\n}\n```\n\nTo see this in action in a playground:\n\n```swift\nlet tree = TreeNode<String>(value: \"beverages\")\n\nlet hotNode = TreeNode<String>(value: \"hot\")\nlet coldNode = TreeNode<String>(value: \"cold\")\n\nlet teaNode = TreeNode<String>(value: \"tea\")\nlet coffeeNode = TreeNode<String>(value: \"coffee\")\nlet chocolateNode = TreeNode<String>(value: \"cocoa\")\n\nlet blackTeaNode = TreeNode<String>(value: \"black\")\nlet greenTeaNode = TreeNode<String>(value: \"green\")\nlet chaiTeaNode = TreeNode<String>(value: \"chai\")\n\nlet sodaNode = TreeNode<String>(value: \"soda\")\nlet milkNode = TreeNode<String>(value: \"milk\")\n\nlet gingerAleNode = TreeNode<String>(value: \"ginger ale\")\nlet bitterLemonNode = TreeNode<String>(value: \"bitter lemon\")\n\ntree.addChild(hotNode)\ntree.addChild(coldNode)\n\nhotNode.addChild(teaNode)\nhotNode.addChild(coffeeNode)\nhotNode.addChild(chocolateNode)\n\ncoldNode.addChild(sodaNode)\ncoldNode.addChild(milkNode)\n\nteaNode.addChild(blackTeaNode)\nteaNode.addChild(greenTeaNode)\nteaNode.addChild(chaiTeaNode)\n\nsodaNode.addChild(gingerAleNode)\nsodaNode.addChild(bitterLemonNode)\n```\n\nIf you print out the value of `tree`, you'll get:\n\n\tbeverages {hot {tea {black, green, chai}, coffee, cocoa}, cold {soda {ginger ale, bitter lemon}, milk}}\n\nThat corresponds to the following structure:\n\n![Example tree](Images/Example.png)\n\nThe `beverages` node is the root because it has no parent. The leaves are `black`, `green`, `chai`, `coffee`, `cocoa`, `ginger ale`, `bitter lemon`, `milk` because they don't have any child nodes.\n\nFor any node you can look at the `parent` property and work your way back up to the root:\n\n```swift\nteaNode.parent           // this is the \"hot\" node\nteaNode.parent!.parent   // this is the root\n```\n\nWe often use the following definitions when talking about trees:\n\n- **Height of the tree.** This is the number of links between the root node and the lowest leaf. In our example the height of the tree is 3 because it takes three jumps to go from the root to the bottom.\n\n- **Depth of a node.** The number of links between this node and the root node. For example, the depth of `tea` is 2 because it takes two jumps to reach the root. (The root itself has depth 0.)\n\nThere are many different ways to construct trees. For example, sometimes you don't need to have a `parent` property at all. Or maybe you only need to give each node a maximum of two children -- such a tree is called a [binary tree](../Binary%20Tree/). A very common type of tree is the [binary search tree](../Binary%20Search%20Tree/) (or BST), a stricter version of a binary tree where the nodes are ordered in a particular way to speed up searches.\n\nThe general purpose tree I've shown here is great for describing hierarchical data, but it really depends on your application what kind of extra functionality it needs to have.\n\nHere's an example of how you could use the `TreeNode` class to determine if the tree contains a particular value. You first look at the node's own `value` property. If there's no match, then you look at all your children in turn. Of course, those children are also `TreeNodes` so they will repeat the same process recursively: first look at their own value and then at their children. And their children will also do the same thing again, and so on... Recursion and trees go hand-in-hand.\n\nHere's the code:\n\n```swift\nextension TreeNode where T: Equatable {\n  func search(_ value: T) -> TreeNode? {\n    if value == self.value {\n      return self\n    }\n    for child in children {\n      if let found = child.search(value) {\n        return found\n      }\n    }\n    return nil\n  }\n}\n```\n\nAnd an example of how to use this:\n\n```swift\ntree.search(\"cocoa\")    // returns the \"cocoa\" node\ntree.search(\"chai\")     // returns the \"chai\" node\ntree.search(\"bubbly\")   // nil\n```\n\nIt's also possible to describe a tree using nothing more than an array. The indices in the array then create the links between the different nodes. For example, if we have:\n\n\t0 = beverage\t\t5 = cocoa\t\t9  = green\n\t1 = hot\t\t\t6 = soda\t\t10 = chai\n\t2 = cold\t\t7 = milk\t\t11 = ginger ale\n\t3 = tea\t\t\t8 = black\t\t12 = bitter lemon\n\t4 = coffee\t\t\t\t\n\nThen we can describe the tree with the following array:\n\n\t[ -1, 0, 0, 1, 1, 1, 2, 2, 3, 3, 3, 6, 6 ]\n\nEach entry in the array is a pointer to its parent node. The item at index 3, `tea`, has the value 1 because its parent is `hot`. The root node points to `-1` because it has no parent. You can only traverse such trees from a node back to the root but not the other way around.\n\nBy the way, sometimes you see algorithms using the term *forest*. Unsurprisingly, that is the name given to a collection of separate tree objects. For an example of this, see [union-find](../Union-Find/).\n\n*Written for Swift Algorithm Club by Matthijs Hollemans*\n"
  },
  {
    "path": "Tree/Tree.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\nlet tree = TreeNode<String>(value: \"beverages\")\n\nlet hotNode = TreeNode<String>(value: \"hot\")\nlet coldNode = TreeNode<String>(value: \"cold\")\n\nlet teaNode = TreeNode<String>(value: \"tea\")\nlet coffeeNode = TreeNode<String>(value: \"coffee\")\nlet chocolateNode = TreeNode<String>(value: \"cocoa\")\n\nlet blackTeaNode = TreeNode<String>(value: \"black\")\nlet greenTeaNode = TreeNode<String>(value: \"green\")\nlet chaiTeaNode = TreeNode<String>(value: \"chai\")\n\nlet sodaNode = TreeNode<String>(value: \"soda\")\nlet milkNode = TreeNode<String>(value: \"milk\")\n\nlet gingerAleNode = TreeNode<String>(value: \"ginger ale\")\nlet bitterLemonNode = TreeNode<String>(value: \"bitter lemon\")\n\ntree.addChild(hotNode)\ntree.addChild(coldNode)\n\nhotNode.addChild(teaNode)\nhotNode.addChild(coffeeNode)\nhotNode.addChild(chocolateNode)\n\ncoldNode.addChild(sodaNode)\ncoldNode.addChild(milkNode)\n\nteaNode.addChild(blackTeaNode)\nteaNode.addChild(greenTeaNode)\nteaNode.addChild(chaiTeaNode)\n\nsodaNode.addChild(gingerAleNode)\nsodaNode.addChild(bitterLemonNode)\n\ntree\n\nteaNode.parent\nteaNode.parent!.parent\n\nextension TreeNode where T: Equatable {\n  func search(_ value: T) -> TreeNode? {\n    if value == self.value {\n      return self\n    }\n    for child in children {\n      if let found = child.search(value) {\n        return found\n      }\n    }\n    return nil\n  }\n}\n\ntree.search(\"cocoa\")\ntree.search(\"chai\")\ntree.search(\"bubbly\")\n"
  },
  {
    "path": "Tree/Tree.playground/Sources/Tree.swift",
    "content": "public class TreeNode<T> {\n  public var value: T\n\n  public weak var parent: TreeNode?\n  public var children = [TreeNode<T>]()\n\n  public init(value: T) {\n    self.value = value\n  }\n\n  public func addChild(_ node: TreeNode<T>) {\n    children.append(node)\n    node.parent = self\n  }\n}\n\nextension TreeNode: CustomStringConvertible {\n  public var description: String {\n    var s = \"\\(value)\"\n    if !children.isEmpty {\n      s += \" {\" + children.map { $0.description }.joined(separator: \", \") + \"}\"\n    }\n    return s\n  }\n}\n\nextension TreeNode where T: Equatable {\n  public func search(_ value: T) -> TreeNode? {\n    if value == self.value {\n      return self\n    }\n    for child in children {\n      if let found = child.search(value) {\n        return found\n      }\n    }\n    return nil\n  }\n}\n"
  },
  {
    "path": "Tree/Tree.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx' last-migration='1000'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Tree/Tree.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Tree/Tree.swift",
    "content": "public class TreeNode<T> {\n    public var value: T\n\n    public weak var parent: TreeNode?\n    public var children = [TreeNode<T>]()\n\n    public init(value: T) {\n        self.value = value\n    }\n\n    public func addChild(_ node: TreeNode<T>) {\n        children.append(node)\n        node.parent = self\n    }\n}\n\nextension TreeNode: CustomStringConvertible {\n    public var description: String {\n        var s = \"\\(value)\"\n        if !children.isEmpty {\n            s += \" {\" + children.map { $0.description }.joined(separator: \", \") + \"}\"\n        }\n        return s\n    }\n}\n\nextension TreeNode where T: Equatable {\n    public func search(_ value: T) -> TreeNode? {\n        if value == self.value {\n            return self\n        }\n        for child in children {\n            if let found = child.search(value) {\n                return found\n            }\n        }\n        return nil\n    }\n}\n\n"
  },
  {
    "path": "Trie/ReadMe.md",
    "content": "# Trie\n\n> This topic has been tutorialized [here](https://www.raywenderlich.com/139410/swift-algorithm-club-swift-trie-data-structure)\n\n## What is a Trie?\n\nA `Trie`, (also known as a prefix tree, or radix tree in some other implementations) is a special type of tree used to store associative data structures. A `Trie` for a dictionary might look like this:\n\n![A Trie](images/trie.png)\n\nStoring the English language is a primary use case for a `Trie`. Each node in the `Trie` would represent a single character of a word. A series of nodes then make up a word.\n\n## Why a Trie?\n\nTries are very useful for certain situations. Here are some of the advantages:\n\n* Looking up values typically have a better worst-case time complexity.\n* Unlike a hash map, a `Trie` does not need to worry about key collisions.\n* Doesn't utilize hashing to guarantee a unique path to elements.\n* `Trie` structures can be alphabetically ordered by default.\n\n## Common Algorithms\n\n### Contains (or any general lookup method)\n\n`Trie` structures are great for lookup operations. For `Trie` structures that model the English language, finding a particular word is a matter of a few pointer traversals:\n\n```swift\nfunc contains(word: String) -> Bool {\n  guard !word.isEmpty else { return false }\n\n  // 1\n  var currentNode = root\n  \n  // 2\n  var characters = Array(word.lowercased())\n  var currentIndex = 0\n \n  // 3\n  while currentIndex < characters.count, \n    let child = currentNode.children[characters[currentIndex]] {\n\n    currentNode = child\n    currentIndex += 1\n  }\n\n  // 4\n  if currentIndex == characters.count && currentNode.isTerminating {\n    return true\n  } else {\n    return false\n  }\n}\n```\n\nThe `contains` method is fairly straightforward:\n\n1. Create a reference to the `root`. This reference will allow you to walk down a chain of nodes.\n2. Keep track of the characters of the word you're trying to match.\n3. Walk the pointer down the nodes.\n4. `isTerminating` is a boolean flag for whether or not this node is the end of a word. If this `if` condition is satisfied, it means you are able to find the word in the `trie`.\n\n### Insertion\n\nInsertion into a `Trie` requires you to walk over the nodes until you either halt on a node that must be marked as `terminating`, or reach a point where you need to add extra nodes.\n\n```swift\nfunc insert(word: String) {\n  guard !word.isEmpty else {\n    return\n  }\n\n  // 1\n  var currentNode = root\n\n  // 2\n  for character in word.lowercased() {\n    // 3\n    if let childNode = currentNode.children[character] {\n      currentNode = childNode\n    } else {\n      currentNode.add(value: character)\n      currentNode = currentNode.children[character]!\n    }\n  }\n  // Word already present?\n  guard !currentNode.isTerminating else {\n    return\n  }\n\n  // 4\n  wordCount += 1\n  currentNode.isTerminating = true\n}\n```\n\n1. Once again, you create a reference to the root node. You'll move this reference down a chain of nodes.\n2. Begin walking through your word letter by letter\n3. Sometimes, the required node to insert already exists. That is the case for two words inside the `Trie` that shares letters (i.e \"Apple\", \"App\"). If a letter already exists, you'll reuse it, and simply traverse deeper down the chain. Otherwise, you'll create a new node representing the letter.\n4. Once you get to the end, you mark `isTerminating` to true to mark that specific node as the end of a word.\n\n### Removal\n\nRemoving keys from the trie is a little tricky, as there are a few more cases you'll need to take into account. Nodes in a `Trie` may be shared between different words. Consider the two words \"Apple\" and \"App\". Inside a `Trie`, the chain of nodes representing \"App\" is shared with \"Apple\". \n\nIf you'd like to remove \"Apple\", you'll need to take care to leave the \"App\" chain in tact.\n\n```swift\nfunc remove(word: String) {\n  guard !word.isEmpty else {\n    return\n  }\n\n  // 1\n  guard let terminalNode = findTerminalNodeOf(word: word) else {\n    return\n  }\n\n  // 2\n  if terminalNode.isLeaf {\n    deleteNodesForWordEndingWith(terminalNode: terminalNode)\n  } else {\n    terminalNode.isTerminating = false\n  }\n  wordCount -= 1\n}\n```\n\n1. `findTerminalNodeOf` traverses through the Trie to find the last node that represents the `word`. If it is unable to traverse through the chain of characters, it returns `nil`.\n2. `deleteNodesForWordEndingWith` traverse backwords, deleting the nodes represented by the `word`.\n\n### Time Complexity\n\nLet n be the length of some value in the `Trie`.\n\n* `contains` - Worst case O(n)\n* `insert` - O(n)\n* `remove` - O(n)\n\n### Other Notable Operations\n\n* `count`: Returns the number of keys in the `Trie` - O(1)\n* `words`: Returns a list containing all the keys in the `Trie` - O(1)\n* `isEmpty`: Returns `true` if the `Trie` is empty, `false` otherwise - O(1)\n\nSee also [Wikipedia entry for Trie](https://en.wikipedia.org/wiki/Trie).\n\n*Written for the Swift Algorithm Club by Christian Encarnacion. Refactored by Kelvin Lau*\n\n# Changes by Rick Zaccone\n\n* Added comments to all methods\n* Refactored the `remove` method\n* Renamed some variables.  I have mixed feelings about the way Swift infers types.  It's not always apparent what type a variable will have.  To address this, I made changes such as renaming `parent` to `parentNode` to emphasize that it is a node and not the value contained within the node.\n* Added a `words` property that recursively traverses the trie and constructs an array containing all of the words in the trie.\n* Added a `isLeaf` property to `TrieNode` for readability.\n* Implemented `count` and `isEmpty` properties for the trie.\n* I tried stress testing the trie by adding 162,825 words.  The playground was very slow while adding the words and eventually crashed.  To fix this problem, I moved everything into a project and wrote `XCTest` tests that test the trie.  There are also several performance tests.  Everything passes.\n"
  },
  {
    "path": "Trie/Trie/Trie/AppDelegate.swift",
    "content": "//\n//  AppDelegate.swift\n//  Trie\n//\n//  Created by Rick Zaccone on 2016-12-12.\n//  Copyright © 2016 Rick Zaccone. All rights reserved.\n//\n\nimport Cocoa\n\n@NSApplicationMain\nclass AppDelegate: NSObject, NSApplicationDelegate {\n\n  func applicationDidFinishLaunching(_ aNotification: Notification) {\n    // Insert code here to initialize your application\n  }\n\n  func applicationWillTerminate(_ aNotification: Notification) {\n    // Insert code here to tear down your application\n  }\n\n}\n"
  },
  {
    "path": "Trie/Trie/Trie/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"16x16\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"16x16\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"32x32\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"32x32\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"128x128\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"128x128\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"256x256\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"256x256\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"512x512\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"512x512\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Trie/Trie/Trie/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"11134\" systemVersion=\"15F34\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" initialViewController=\"B8D-0N-5wS\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"11134\"/>\n    </dependencies>\n    <scenes>\n        <!--Application-->\n        <scene sceneID=\"JPo-4y-FX3\">\n            <objects>\n                <application id=\"hnw-xV-0zn\" sceneMemberID=\"viewController\">\n                    <menu key=\"mainMenu\" title=\"Main Menu\" systemMenu=\"main\" id=\"AYu-sK-qS6\">\n                        <items>\n                            <menuItem title=\"Trie\" id=\"1Xt-HY-uBw\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Trie\" systemMenu=\"apple\" id=\"uQy-DD-JDr\">\n                                    <items>\n                                        <menuItem title=\"About Trie\" id=\"5kV-Vb-QxS\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"orderFrontStandardAboutPanel:\" target=\"Ady-hI-5gd\" id=\"Exp-CZ-Vem\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"VOq-y0-SEH\"/>\n                                        <menuItem title=\"Preferences…\" keyEquivalent=\",\" id=\"BOF-NM-1cW\"/>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"wFC-TO-SCJ\"/>\n                                        <menuItem title=\"Services\" id=\"NMo-om-nkz\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Services\" systemMenu=\"services\" id=\"hz9-B4-Xy5\"/>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"4je-JR-u6R\"/>\n                                        <menuItem title=\"Hide Trie\" keyEquivalent=\"h\" id=\"Olw-nP-bQN\">\n                                            <connections>\n                                                <action selector=\"hide:\" target=\"Ady-hI-5gd\" id=\"PnN-Uc-m68\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Hide Others\" keyEquivalent=\"h\" id=\"Vdr-fp-XzO\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"hideOtherApplications:\" target=\"Ady-hI-5gd\" id=\"VT4-aY-XCT\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Show All\" id=\"Kd2-mp-pUS\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"unhideAllApplications:\" target=\"Ady-hI-5gd\" id=\"Dhg-Le-xox\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"kCx-OE-vgT\"/>\n                                        <menuItem title=\"Quit Trie\" keyEquivalent=\"q\" id=\"4sb-4s-VLi\">\n                                            <connections>\n                                                <action selector=\"terminate:\" target=\"Ady-hI-5gd\" id=\"Te7-pn-YzF\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"File\" id=\"dMs-cI-mzQ\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"File\" id=\"bib-Uj-vzu\">\n                                    <items>\n                                        <menuItem title=\"New\" keyEquivalent=\"n\" id=\"Was-JA-tGl\">\n                                            <connections>\n                                                <action selector=\"newDocument:\" target=\"Ady-hI-5gd\" id=\"4Si-XN-c54\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Open…\" keyEquivalent=\"o\" id=\"IAo-SY-fd9\">\n                                            <connections>\n                                                <action selector=\"openDocument:\" target=\"Ady-hI-5gd\" id=\"bVn-NM-KNZ\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Open Recent\" id=\"tXI-mr-wws\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Open Recent\" systemMenu=\"recentDocuments\" id=\"oas-Oc-fiZ\">\n                                                <items>\n                                                    <menuItem title=\"Clear Menu\" id=\"vNY-rz-j42\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"clearRecentDocuments:\" target=\"Ady-hI-5gd\" id=\"Daa-9d-B3U\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"m54-Is-iLE\"/>\n                                        <menuItem title=\"Close\" keyEquivalent=\"w\" id=\"DVo-aG-piG\">\n                                            <connections>\n                                                <action selector=\"performClose:\" target=\"Ady-hI-5gd\" id=\"HmO-Ls-i7Q\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Save…\" keyEquivalent=\"s\" id=\"pxx-59-PXV\">\n                                            <connections>\n                                                <action selector=\"saveDocument:\" target=\"Ady-hI-5gd\" id=\"teZ-XB-qJY\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Save As…\" keyEquivalent=\"S\" id=\"Bw7-FT-i3A\">\n                                            <connections>\n                                                <action selector=\"saveDocumentAs:\" target=\"Ady-hI-5gd\" id=\"mDf-zr-I0C\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Revert to Saved\" keyEquivalent=\"r\" id=\"KaW-ft-85H\">\n                                            <connections>\n                                                <action selector=\"revertDocumentToSaved:\" target=\"Ady-hI-5gd\" id=\"iJ3-Pv-kwq\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"aJh-i4-bef\"/>\n                                        <menuItem title=\"Page Setup…\" keyEquivalent=\"P\" id=\"qIS-W8-SiK\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" shift=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"runPageLayout:\" target=\"Ady-hI-5gd\" id=\"Din-rz-gC5\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Print…\" keyEquivalent=\"p\" id=\"aTl-1u-JFS\">\n                                            <connections>\n                                                <action selector=\"print:\" target=\"Ady-hI-5gd\" id=\"qaZ-4w-aoO\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Edit\" id=\"5QF-Oa-p0T\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Edit\" id=\"W48-6f-4Dl\">\n                                    <items>\n                                        <menuItem title=\"Undo\" keyEquivalent=\"z\" id=\"dRJ-4n-Yzg\">\n                                            <connections>\n                                                <action selector=\"undo:\" target=\"Ady-hI-5gd\" id=\"M6e-cu-g7V\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Redo\" keyEquivalent=\"Z\" id=\"6dh-zS-Vam\">\n                                            <connections>\n                                                <action selector=\"redo:\" target=\"Ady-hI-5gd\" id=\"oIA-Rs-6OD\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"WRV-NI-Exz\"/>\n                                        <menuItem title=\"Cut\" keyEquivalent=\"x\" id=\"uRl-iY-unG\">\n                                            <connections>\n                                                <action selector=\"cut:\" target=\"Ady-hI-5gd\" id=\"YJe-68-I9s\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Copy\" keyEquivalent=\"c\" id=\"x3v-GG-iWU\">\n                                            <connections>\n                                                <action selector=\"copy:\" target=\"Ady-hI-5gd\" id=\"G1f-GL-Joy\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Paste\" keyEquivalent=\"v\" id=\"gVA-U4-sdL\">\n                                            <connections>\n                                                <action selector=\"paste:\" target=\"Ady-hI-5gd\" id=\"UvS-8e-Qdg\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Paste and Match Style\" keyEquivalent=\"V\" id=\"WeT-3V-zwk\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"pasteAsPlainText:\" target=\"Ady-hI-5gd\" id=\"cEh-KX-wJQ\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Delete\" id=\"pa3-QI-u2k\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"delete:\" target=\"Ady-hI-5gd\" id=\"0Mk-Ml-PaM\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Select All\" keyEquivalent=\"a\" id=\"Ruw-6m-B2m\">\n                                            <connections>\n                                                <action selector=\"selectAll:\" target=\"Ady-hI-5gd\" id=\"VNm-Mi-diN\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"uyl-h8-XO2\"/>\n                                        <menuItem title=\"Find\" id=\"4EN-yA-p0u\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Find\" id=\"1b7-l0-nxx\">\n                                                <items>\n                                                    <menuItem title=\"Find…\" tag=\"1\" keyEquivalent=\"f\" id=\"Xz5-n4-O0W\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"cD7-Qs-BN4\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find and Replace…\" tag=\"12\" keyEquivalent=\"f\" id=\"YEy-JH-Tfz\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"WD3-Gg-5AJ\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find Next\" tag=\"2\" keyEquivalent=\"g\" id=\"q09-fT-Sye\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"NDo-RZ-v9R\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Find Previous\" tag=\"3\" keyEquivalent=\"G\" id=\"OwM-mh-QMV\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"HOh-sY-3ay\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Use Selection for Find\" tag=\"7\" keyEquivalent=\"e\" id=\"buJ-ug-pKt\">\n                                                        <connections>\n                                                            <action selector=\"performFindPanelAction:\" target=\"Ady-hI-5gd\" id=\"U76-nv-p5D\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Jump to Selection\" keyEquivalent=\"j\" id=\"S0p-oC-mLd\">\n                                                        <connections>\n                                                            <action selector=\"centerSelectionInVisibleArea:\" target=\"Ady-hI-5gd\" id=\"IOG-6D-g5B\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Spelling and Grammar\" id=\"Dv1-io-Yv7\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Spelling\" id=\"3IN-sU-3Bg\">\n                                                <items>\n                                                    <menuItem title=\"Show Spelling and Grammar\" keyEquivalent=\":\" id=\"HFo-cy-zxI\">\n                                                        <connections>\n                                                            <action selector=\"showGuessPanel:\" target=\"Ady-hI-5gd\" id=\"vFj-Ks-hy3\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Check Document Now\" keyEquivalent=\";\" id=\"hz2-CU-CR7\">\n                                                        <connections>\n                                                            <action selector=\"checkSpelling:\" target=\"Ady-hI-5gd\" id=\"fz7-VC-reM\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"bNw-od-mp5\"/>\n                                                    <menuItem title=\"Check Spelling While Typing\" id=\"rbD-Rh-wIN\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleContinuousSpellChecking:\" target=\"Ady-hI-5gd\" id=\"7w6-Qz-0kB\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Check Grammar With Spelling\" id=\"mK6-2p-4JG\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleGrammarChecking:\" target=\"Ady-hI-5gd\" id=\"muD-Qn-j4w\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Correct Spelling Automatically\" id=\"78Y-hA-62v\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticSpellingCorrection:\" target=\"Ady-hI-5gd\" id=\"2lM-Qi-WAP\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Substitutions\" id=\"9ic-FL-obx\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Substitutions\" id=\"FeM-D8-WVr\">\n                                                <items>\n                                                    <menuItem title=\"Show Substitutions\" id=\"z6F-FW-3nz\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"orderFrontSubstitutionsPanel:\" target=\"Ady-hI-5gd\" id=\"oku-mr-iSq\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"gPx-C9-uUO\"/>\n                                                    <menuItem title=\"Smart Copy/Paste\" id=\"9yt-4B-nSM\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleSmartInsertDelete:\" target=\"Ady-hI-5gd\" id=\"3IJ-Se-DZD\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Quotes\" id=\"hQb-2v-fYv\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticQuoteSubstitution:\" target=\"Ady-hI-5gd\" id=\"ptq-xd-QOA\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Dashes\" id=\"rgM-f4-ycn\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticDashSubstitution:\" target=\"Ady-hI-5gd\" id=\"oCt-pO-9gS\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Smart Links\" id=\"cwL-P1-jid\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticLinkDetection:\" target=\"Ady-hI-5gd\" id=\"Gip-E3-Fov\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Data Detectors\" id=\"tRr-pd-1PS\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticDataDetection:\" target=\"Ady-hI-5gd\" id=\"R1I-Nq-Kbl\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Text Replacement\" id=\"HFQ-gK-NFA\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleAutomaticTextReplacement:\" target=\"Ady-hI-5gd\" id=\"DvP-Fe-Py6\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Transformations\" id=\"2oI-Rn-ZJC\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Transformations\" id=\"c8a-y6-VQd\">\n                                                <items>\n                                                    <menuItem title=\"Make Upper Case\" id=\"vmV-6d-7jI\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"uppercaseWord:\" target=\"Ady-hI-5gd\" id=\"sPh-Tk-edu\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Make Lower Case\" id=\"d9M-CD-aMd\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"lowercaseWord:\" target=\"Ady-hI-5gd\" id=\"iUZ-b5-hil\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Capitalize\" id=\"UEZ-Bs-lqG\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"capitalizeWord:\" target=\"Ady-hI-5gd\" id=\"26H-TL-nsh\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Speech\" id=\"xrE-MZ-jX0\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Speech\" id=\"3rS-ZA-NoH\">\n                                                <items>\n                                                    <menuItem title=\"Start Speaking\" id=\"Ynk-f8-cLZ\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"startSpeaking:\" target=\"Ady-hI-5gd\" id=\"654-Ng-kyl\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Stop Speaking\" id=\"Oyz-dy-DGm\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"stopSpeaking:\" target=\"Ady-hI-5gd\" id=\"dX8-6p-jy9\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Format\" id=\"jxT-CU-nIS\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Format\" id=\"GEO-Iw-cKr\">\n                                    <items>\n                                        <menuItem title=\"Font\" id=\"Gi5-1S-RQB\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Font\" systemMenu=\"font\" id=\"aXa-aM-Jaq\">\n                                                <items>\n                                                    <menuItem title=\"Show Fonts\" keyEquivalent=\"t\" id=\"Q5e-8K-NDq\"/>\n                                                    <menuItem title=\"Bold\" tag=\"2\" keyEquivalent=\"b\" id=\"GB9-OM-e27\"/>\n                                                    <menuItem title=\"Italic\" tag=\"1\" keyEquivalent=\"i\" id=\"Vjx-xi-njq\"/>\n                                                    <menuItem title=\"Underline\" keyEquivalent=\"u\" id=\"WRG-CD-K1S\">\n                                                        <connections>\n                                                            <action selector=\"underline:\" target=\"Ady-hI-5gd\" id=\"FYS-2b-JAY\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"5gT-KC-WSO\"/>\n                                                    <menuItem title=\"Bigger\" tag=\"3\" keyEquivalent=\"+\" id=\"Ptp-SP-VEL\"/>\n                                                    <menuItem title=\"Smaller\" tag=\"4\" keyEquivalent=\"-\" id=\"i1d-Er-qST\"/>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"kx3-Dk-x3B\"/>\n                                                    <menuItem title=\"Kern\" id=\"jBQ-r6-VK2\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Kern\" id=\"tlD-Oa-oAM\">\n                                                            <items>\n                                                                <menuItem title=\"Use Default\" id=\"GUa-eO-cwY\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"useStandardKerning:\" target=\"Ady-hI-5gd\" id=\"6dk-9l-Ckg\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Use None\" id=\"cDB-IK-hbR\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"turnOffKerning:\" target=\"Ady-hI-5gd\" id=\"U8a-gz-Maa\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Tighten\" id=\"46P-cB-AYj\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"tightenKerning:\" target=\"Ady-hI-5gd\" id=\"hr7-Nz-8ro\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Loosen\" id=\"ogc-rX-tC1\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"loosenKerning:\" target=\"Ady-hI-5gd\" id=\"8i4-f9-FKE\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem title=\"Ligatures\" id=\"o6e-r0-MWq\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Ligatures\" id=\"w0m-vy-SC9\">\n                                                            <items>\n                                                                <menuItem title=\"Use Default\" id=\"agt-UL-0e3\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"useStandardLigatures:\" target=\"Ady-hI-5gd\" id=\"7uR-wd-Dx6\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Use None\" id=\"J7y-lM-qPV\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"turnOffLigatures:\" target=\"Ady-hI-5gd\" id=\"iX2-gA-Ilz\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Use All\" id=\"xQD-1f-W4t\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"useAllLigatures:\" target=\"Ady-hI-5gd\" id=\"KcB-kA-TuK\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem title=\"Baseline\" id=\"OaQ-X3-Vso\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Baseline\" id=\"ijk-EB-dga\">\n                                                            <items>\n                                                                <menuItem title=\"Use Default\" id=\"3Om-Ey-2VK\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"unscript:\" target=\"Ady-hI-5gd\" id=\"0vZ-95-Ywn\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Superscript\" id=\"Rqc-34-cIF\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"superscript:\" target=\"Ady-hI-5gd\" id=\"3qV-fo-wpU\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Subscript\" id=\"I0S-gh-46l\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"subscript:\" target=\"Ady-hI-5gd\" id=\"Q6W-4W-IGz\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Raise\" id=\"2h7-ER-AoG\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"raiseBaseline:\" target=\"Ady-hI-5gd\" id=\"4sk-31-7Q9\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem title=\"Lower\" id=\"1tx-W0-xDw\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"lowerBaseline:\" target=\"Ady-hI-5gd\" id=\"OF1-bc-KW4\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"Ndw-q3-faq\"/>\n                                                    <menuItem title=\"Show Colors\" keyEquivalent=\"C\" id=\"bgn-CT-cEk\">\n                                                        <connections>\n                                                            <action selector=\"orderFrontColorPanel:\" target=\"Ady-hI-5gd\" id=\"mSX-Xz-DV3\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"iMs-zA-UFJ\"/>\n                                                    <menuItem title=\"Copy Style\" keyEquivalent=\"c\" id=\"5Vv-lz-BsD\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"copyFont:\" target=\"Ady-hI-5gd\" id=\"GJO-xA-L4q\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Paste Style\" keyEquivalent=\"v\" id=\"vKC-jM-MkH\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"pasteFont:\" target=\"Ady-hI-5gd\" id=\"JfD-CL-leO\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                        <menuItem title=\"Text\" id=\"Fal-I4-PZk\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <menu key=\"submenu\" title=\"Text\" id=\"d9c-me-L2H\">\n                                                <items>\n                                                    <menuItem title=\"Align Left\" keyEquivalent=\"{\" id=\"ZM1-6Q-yy1\">\n                                                        <connections>\n                                                            <action selector=\"alignLeft:\" target=\"Ady-hI-5gd\" id=\"zUv-R1-uAa\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Center\" keyEquivalent=\"|\" id=\"VIY-Ag-zcb\">\n                                                        <connections>\n                                                            <action selector=\"alignCenter:\" target=\"Ady-hI-5gd\" id=\"spX-mk-kcS\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Justify\" id=\"J5U-5w-g23\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"alignJustified:\" target=\"Ady-hI-5gd\" id=\"ljL-7U-jND\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Align Right\" keyEquivalent=\"}\" id=\"wb2-vD-lq4\">\n                                                        <connections>\n                                                            <action selector=\"alignRight:\" target=\"Ady-hI-5gd\" id=\"r48-bG-YeY\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"4s2-GY-VfK\"/>\n                                                    <menuItem title=\"Writing Direction\" id=\"H1b-Si-o9J\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <menu key=\"submenu\" title=\"Writing Direction\" id=\"8mr-sm-Yjd\">\n                                                            <items>\n                                                                <menuItem title=\"Paragraph\" enabled=\"NO\" id=\"ZvO-Gk-QUH\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                </menuItem>\n                                                                <menuItem id=\"YGs-j5-SAR\">\n                                                                    <string key=\"title\">\tDefault</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeBaseWritingDirectionNatural:\" target=\"Ady-hI-5gd\" id=\"qtV-5e-UBP\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"Lbh-J2-qVU\">\n                                                                    <string key=\"title\">\tLeft to Right</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeBaseWritingDirectionLeftToRight:\" target=\"Ady-hI-5gd\" id=\"S0X-9S-QSf\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"jFq-tB-4Kx\">\n                                                                    <string key=\"title\">\tRight to Left</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeBaseWritingDirectionRightToLeft:\" target=\"Ady-hI-5gd\" id=\"5fk-qB-AqJ\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem isSeparatorItem=\"YES\" id=\"swp-gr-a21\"/>\n                                                                <menuItem title=\"Selection\" enabled=\"NO\" id=\"cqv-fj-IhA\">\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                </menuItem>\n                                                                <menuItem id=\"Nop-cj-93Q\">\n                                                                    <string key=\"title\">\tDefault</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeTextWritingDirectionNatural:\" target=\"Ady-hI-5gd\" id=\"lPI-Se-ZHp\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"BgM-ve-c93\">\n                                                                    <string key=\"title\">\tLeft to Right</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeTextWritingDirectionLeftToRight:\" target=\"Ady-hI-5gd\" id=\"caW-Bv-w94\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                                <menuItem id=\"RB4-Sm-HuC\">\n                                                                    <string key=\"title\">\tRight to Left</string>\n                                                                    <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                                    <connections>\n                                                                        <action selector=\"makeTextWritingDirectionRightToLeft:\" target=\"Ady-hI-5gd\" id=\"EXD-6r-ZUu\"/>\n                                                                    </connections>\n                                                                </menuItem>\n                                                            </items>\n                                                        </menu>\n                                                    </menuItem>\n                                                    <menuItem isSeparatorItem=\"YES\" id=\"fKy-g9-1gm\"/>\n                                                    <menuItem title=\"Show Ruler\" id=\"vLm-3I-IUL\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                                        <connections>\n                                                            <action selector=\"toggleRuler:\" target=\"Ady-hI-5gd\" id=\"FOx-HJ-KwY\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Copy Ruler\" keyEquivalent=\"c\" id=\"MkV-Pr-PK5\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"copyRuler:\" target=\"Ady-hI-5gd\" id=\"71i-fW-3W2\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                    <menuItem title=\"Paste Ruler\" keyEquivalent=\"v\" id=\"LVM-kO-fVI\">\n                                                        <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                                        <connections>\n                                                            <action selector=\"pasteRuler:\" target=\"Ady-hI-5gd\" id=\"cSh-wd-qM2\"/>\n                                                        </connections>\n                                                    </menuItem>\n                                                </items>\n                                            </menu>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"View\" id=\"H8h-7b-M4v\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"View\" id=\"HyV-fh-RgO\">\n                                    <items>\n                                        <menuItem title=\"Show Toolbar\" keyEquivalent=\"t\" id=\"snW-S8-Cw5\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"toggleToolbarShown:\" target=\"Ady-hI-5gd\" id=\"BXY-wc-z0C\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Customize Toolbar…\" id=\"1UK-8n-QPP\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"runToolbarCustomizationPalette:\" target=\"Ady-hI-5gd\" id=\"pQI-g3-MTW\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"hB3-LF-h0Y\"/>\n                                        <menuItem title=\"Show Sidebar\" keyEquivalent=\"s\" id=\"kIP-vf-haE\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"toggleSourceList:\" target=\"Ady-hI-5gd\" id=\"iwa-gc-5KM\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Enter Full Screen\" keyEquivalent=\"f\" id=\"4J7-dP-txa\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" control=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"toggleFullScreen:\" target=\"Ady-hI-5gd\" id=\"dU3-MA-1Rq\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Window\" id=\"aUF-d1-5bR\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Window\" systemMenu=\"window\" id=\"Td7-aD-5lo\">\n                                    <items>\n                                        <menuItem title=\"Minimize\" keyEquivalent=\"m\" id=\"OY7-WF-poV\">\n                                            <connections>\n                                                <action selector=\"performMiniaturize:\" target=\"Ady-hI-5gd\" id=\"VwT-WD-YPe\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Zoom\" id=\"R4o-n2-Eq4\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"performZoom:\" target=\"Ady-hI-5gd\" id=\"DIl-cC-cCs\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"eu3-7i-yIM\"/>\n                                        <menuItem title=\"Bring All to Front\" id=\"LE2-aR-0XJ\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"arrangeInFront:\" target=\"Ady-hI-5gd\" id=\"DRN-fu-gQh\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Help\" id=\"wpr-3q-Mcd\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Help\" systemMenu=\"help\" id=\"F2S-fz-NVQ\">\n                                    <items>\n                                        <menuItem title=\"Trie Help\" keyEquivalent=\"?\" id=\"FKE-Sm-Kum\">\n                                            <connections>\n                                                <action selector=\"showHelp:\" target=\"Ady-hI-5gd\" id=\"y7X-2Q-9no\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                        </items>\n                    </menu>\n                    <connections>\n                        <outlet property=\"delegate\" destination=\"Voe-Tx-rLC\" id=\"PrD-fu-P6m\"/>\n                    </connections>\n                </application>\n                <customObject id=\"Voe-Tx-rLC\" customClass=\"AppDelegate\" customModuleProvider=\"target\"/>\n                <customObject id=\"Ady-hI-5gd\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"75\" y=\"0.0\"/>\n        </scene>\n        <!--Window Controller-->\n        <scene sceneID=\"R2V-B0-nI4\">\n            <objects>\n                <windowController id=\"B8D-0N-5wS\" sceneMemberID=\"viewController\">\n                    <window key=\"window\" title=\"Window\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" oneShot=\"NO\" releasedWhenClosed=\"NO\" showsToolbarButton=\"NO\" visibleAtLaunch=\"NO\" animationBehavior=\"default\" id=\"IQv-IB-iLA\">\n                        <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\" miniaturizable=\"YES\" resizable=\"YES\"/>\n                        <windowPositionMask key=\"initialPositionMask\" leftStrut=\"YES\" rightStrut=\"YES\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n                        <rect key=\"contentRect\" x=\"196\" y=\"240\" width=\"480\" height=\"270\"/>\n                        <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"1680\" height=\"1027\"/>\n                    </window>\n                    <connections>\n                        <segue destination=\"XfG-lQ-9wD\" kind=\"relationship\" relationship=\"window.shadowedContentViewController\" id=\"cq2-FE-JQM\"/>\n                    </connections>\n                </windowController>\n                <customObject id=\"Oky-zY-oP4\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"75\" y=\"250\"/>\n        </scene>\n        <!--View Controller-->\n        <scene sceneID=\"hIz-AP-VOD\">\n            <objects>\n                <viewController id=\"XfG-lQ-9wD\" customClass=\"ViewController\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" wantsLayer=\"YES\" id=\"m2S-Jp-Qdl\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"270\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                    </view>\n                </viewController>\n                <customObject id=\"rPt-NT-nkU\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"75\" y=\"655\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "Trie/Trie/Trie/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIconFile</key>\n\t<string></string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSMinimumSystemVersion</key>\n\t<string>$(MACOSX_DEPLOYMENT_TARGET)</string>\n\t<key>NSHumanReadableCopyright</key>\n\t<string>Copyright © 2016 Rick Zaccone. All rights reserved.</string>\n\t<key>NSMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>NSPrincipalClass</key>\n\t<string>NSApplication</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Trie/Trie/Trie/ReadMe.md",
    "content": "# Changes\n\n- Corrected a spelling error in a comment.\n\n- Got rid of the `get` syntax for a read only property as the coding guidelines suggest.\n\n- Changed several tests so that they are more Swift-like.  That is, they now feel like they are using the features of the language better.\n\n- Fixed a problem in the test method `testRemovePerformance`.  The `measure` method runs the block of code 10 times.  Previously, all words would get removed after the first run and the next 9 runs were very fast because there was nothing to do!  That is corrected now.\n\n- Made the `Trie` class a subclass of `NSObject` and had it conform to `NSCoding`.  Added a test to verify that this works.\n\n---\n\nI wasn't able to figure out how to recursively archive the trie.  Instead, I tried Kelvin's suggestion to use the `words` property to create an array of words in the trie, then archiving the array.\n\nThere are a couple of nice aspects to this approach.\n\n- The `TrieNode` class can remain generic since it doesn't need to conform to `NSCoding`.\n\n- It doesn't require much new code.\n\nThere are several downsides though.\n\n- The size of the archived words is three times the size of the original file of words!  Did I do this right?  The tests pass, so it seems correct.  I question whether archiving is worth the effort if the resulting archive is so much larger than the original file.\n\n- I would expect that archiving the trie would result in a file that was smaller than the original since a trie doesn't repeat leading character sequences when they are the same.\n\n- This requires that the trie get reconstructed when it is unarchived.\n\n- My gut tells me that it would be faster to archive and unarchive the trie itself, but I don't have any hard data to support this.\n\nI would like to see code that recursively archives the trie so we can compare the performance.\n"
  },
  {
    "path": "Trie/Trie/Trie/Trie.swift",
    "content": "//\n//  Trie.swift\n//  Trie\n//\n//  Created by Rick Zaccone on 2016-12-12.\n//  Copyright © 2016 Rick Zaccone. All rights reserved.\n//\n\nimport Foundation\n\n/// A node in the trie\nclass TrieNode<T: Hashable> {\n  var value: T?\n  weak var parentNode: TrieNode?\n  var children: [T: TrieNode] = [:]\n  var isTerminating = false\n  var isLeaf: Bool {\n    return children.count == 0\n  }\n\n  /// Initializes a node.\n  ///\n  /// - Parameters:\n  ///   - value: The value that goes into the node\n  ///   - parentNode: A reference to this node's parent\n  init(value: T? = nil, parentNode: TrieNode? = nil) {\n    self.value = value\n    self.parentNode = parentNode\n  }\n\n  /// Adds a child node to self.  If the child is already present,\n  /// do nothing.\n  ///\n  /// - Parameter value: The item to be added to this node.\n  func add(value: T) {\n    guard children[value] == nil else {\n      return\n    }\n    children[value] = TrieNode(value: value, parentNode: self)\n  }\n}\n\n/// A trie data structure containing words.  Each node is a single\n/// character of a word.\nclass Trie: NSObject, NSCoding {\n  typealias Node = TrieNode<Character>\n  /// The number of words in the trie\n  public var count: Int {\n    return wordCount\n  }\n  /// Is the trie empty?\n  public var isEmpty: Bool {\n    return wordCount == 0\n  }\n  /// All words currently in the trie\n  public var words: [String] {\n    return wordsInSubtrie(rootNode: root, partialWord: \"\")\n  }\n  fileprivate let root: Node\n  fileprivate var wordCount: Int\n\n  /// Creates an empty trie.\n  override init() {\n    root = Node()\n    wordCount = 0\n    super.init()\n  }\n\n  // MARK: NSCoding\n\n  /// Initializes the trie with words from an archive\n  ///\n  /// - Parameter decoder: Decodes the archive\n  required convenience init?(coder decoder: NSCoder) {\n    self.init()\n    let words = decoder.decodeObject(forKey: \"words\") as? [String]\n    for word in words! {\n      self.insert(word: word)\n    }\n  }\n\n  /// Encodes the words in the trie by putting them in an array then encoding\n  /// the array.\n  ///\n  /// - Parameter coder: The object that will encode the array\n  func encode(with coder: NSCoder) {\n    coder.encode(self.words, forKey: \"words\")\n  }\n}\n\n// MARK: - Adds methods: insert, remove, contains\nextension Trie {\n  /// Inserts a word into the trie.  If the word is already present,\n  /// there is no change.\n  ///\n  /// - Parameter word: the word to be inserted.\n  func insert(word: String) {\n    guard !word.isEmpty else {\n      return\n    }\n    var currentNode = root\n    for character in word.lowercased() {\n      if let childNode = currentNode.children[character] {\n        currentNode = childNode\n      } else {\n        currentNode.add(value: character)\n        currentNode = currentNode.children[character]!\n      }\n    }\n    // Word already present?\n    guard !currentNode.isTerminating else {\n      return\n    }\n    wordCount += 1\n    currentNode.isTerminating = true\n  }\n\n  /// Determines whether a word is in the trie.\n  ///\n  /// - Parameters:\n  ///   - word: the word to check for\n  ///   - matchPrefix: whether the search word should match\n  ///   if it is only a prefix of other nodes in the trie\n  /// - Returns: true if the word is present, false otherwise.\n  func contains(word: String, matchPrefix: Bool = false) -> Bool {\n    guard !word.isEmpty else {\n      return false\n    }\n    var currentNode = root\n    for character in word.lowercased() {\n      guard let childNode = currentNode.children[character] else {\n        return false\n      }\n      currentNode = childNode\n    }\n    return matchPrefix || currentNode.isTerminating\n  }\n\n  /// Attempts to walk to the last node of a word.  The\n  /// search will fail if the word is not present. Doesn't\n  /// check if the node is terminating\n  ///\n  /// - Parameter word: the word in question\n  /// - Returns: the node where the search ended, nil if the\n  /// search failed.\n  private func findLastNodeOf(word: String) -> Node? {\n    var currentNode = root\n    for character in word.lowercased() {\n      guard let childNode = currentNode.children[character] else {\n        return nil\n      }\n      currentNode = childNode\n    }\n    return currentNode\n  }\n\n  /// Attempts to walk to the terminating node of a word.  The\n  /// search will fail if the word is not present.\n  ///\n  /// - Parameter word: the word in question\n  /// - Returns: the node where the search ended, nil if the\n  /// search failed.\n  private func findTerminalNodeOf(word: String) -> Node? {\n    if let lastNode = findLastNodeOf(word: word) {\n      return lastNode.isTerminating ? lastNode : nil\n    }\n    return nil\n  }\n\n  /// Deletes a word from the trie by starting with the last letter\n  /// and moving back, deleting nodes until either a non-leaf or a\n  /// terminating node is found.\n  ///\n  /// - Parameter terminalNode: the node representing the last node\n  /// of a word\n  private func deleteNodesForWordEndingWith(terminalNode: Node) {\n    var lastNode = terminalNode\n    var character = lastNode.value\n    while lastNode.isLeaf, let parentNode = lastNode.parentNode {\n      lastNode = parentNode\n      lastNode.children[character!] = nil\n      character = lastNode.value\n      if lastNode.isTerminating {\n        break\n      }\n    }\n  }\n\n  /// Removes a word from the trie.  If the word is not present or\n  /// it is empty, just ignore it.  If the last node is a leaf,\n  /// delete that node and higher nodes that are leaves until a\n  /// terminating node or non-leaf is found.  If the last node of\n  /// the word has more children, the word is part of other words.\n  /// Mark the last node as non-terminating.\n  ///\n  /// - Parameter word: the word to be removed\n  func remove(word: String) {\n    guard !word.isEmpty else {\n      return\n    }\n    guard let terminalNode = findTerminalNodeOf(word: word) else {\n      return\n    }\n    if terminalNode.isLeaf {\n      deleteNodesForWordEndingWith(terminalNode: terminalNode)\n    } else {\n      terminalNode.isTerminating = false\n    }\n    wordCount -= 1\n  }\n\n  /// Returns an array of words in a subtrie of the trie\n  ///\n  /// - Parameters:\n  ///   - rootNode: the root node of the subtrie\n  ///   - partialWord: the letters collected by traversing to this node\n  /// - Returns: the words in the subtrie\n  fileprivate func wordsInSubtrie(rootNode: Node, partialWord: String) -> [String] {\n    var subtrieWords = [String]()\n    var previousLetters = partialWord\n    if let value = rootNode.value {\n      previousLetters.append(value)\n    }\n    if rootNode.isTerminating {\n      subtrieWords.append(previousLetters)\n    }\n    for childNode in rootNode.children.values {\n      let childWords = wordsInSubtrie(rootNode: childNode, partialWord: previousLetters)\n      subtrieWords += childWords\n    }\n    return subtrieWords\n  }\n\n  /// Returns an array of words in a subtrie of the trie that start\n  /// with given prefix\n  ///\n  /// - Parameters:\n  ///   - prefix: the letters for word prefix\n  /// - Returns: the words in the subtrie that start with prefix\n  func findWordsWithPrefix(prefix: String) -> [String] {\n    var words = [String]()\n    let prefixLowerCased = prefix.lowercased()\n    if let lastNode = findLastNodeOf(word: prefixLowerCased) {\n      if lastNode.isTerminating {\n        words.append(prefixLowerCased)\n      }\n      for childNode in lastNode.children.values {\n        let childWords = wordsInSubtrie(rootNode: childNode, partialWord: prefixLowerCased)\n        words += childWords\n      }\n    }\n    return words\n  }\n}\n"
  },
  {
    "path": "Trie/Trie/Trie/ViewController.swift",
    "content": "//\n//  ViewController.swift\n//  Trie\n//\n//  Created by Rick Zaccone on 2016-12-12.\n//  Copyright © 2016 Rick Zaccone. All rights reserved.\n//\n\nimport Cocoa\n\nclass ViewController: NSViewController {\n\n  override func viewDidLoad() {\n    super.viewDidLoad()\n\n    // Do any additional setup after loading the view.\n  }\n\n  override var representedObject: Any? {\n    didSet {\n      // Update the view, if already loaded.\n    }\n  }\n\n}\n"
  },
  {
    "path": "Trie/Trie/Trie/dictionary.txt",
    "content": "10s\n10th\n11th\n12th\n13th\n14th\n15th\n16th\n17th\n1800s\n1890s\n18th\n1900s\n1910s\n1920s\n1930s\n1940s\n1950s\n1960s\n1970s\n1980s\n1990s\n19th\n1st\n20s\n20th\n21st\n22nd\n23rd\n24th\n25th\n26th\n27th\n28th\n29th\n2nd\n30s\n30th\n31st\n3rd\n40s\n4th\n50s\n5th\n60s\n6th\n70s\n7th\n80s\n8th\n90s\n9th\na\naachen\naah\naahed\naahing\naahs\naardvark\naardvarks\naardwolf\naardwolves\naaron\nab\naba\nababa\nabaca\nabaci\naback\nabacterial\nabacus\nabacuses\nabadan\nabaft\nabalone\nabalones\nabampere\nabamperes\nabandon\nabandoned\nabandonee\nabandonees\nabandoner\nabandoners\nabandoning\nabandonment\nabandonments\nabandons\nabapical\nabase\nabased\nabasement\nabasements\nabases\nabash\nabashed\nabashes\nabashing\nabashment\nabashments\nabasia\nabasing\nabatable\nabate\nabated\nabatement\nabatements\nabater\nabaters\nabates\nabating\nabatis\nabatises\nabattoir\nabattoirs\nabaxial\nabbacies\nabbacy\nabbatial\nabbess\nabbesses\nabbeville\nabbevillian\nabbey\nabbeys\nabbot\nabbots\nabbreviate\nabbreviated\nabbreviates\nabbreviating\nabbreviation\nabbreviations\nabbreviator\nabbreviators\nabbé\nabbés\nabc\nabcoulomb\nabdicable\nabdicate\nabdicated\nabdicates\nabdicating\nabdication\nabdications\nabdicator\nabdicators\nabdomen\nabdomens\nabdominal\nabdominally\nabdominous\nabducens\nabducent\nabducentes\nabduct\nabducted\nabducting\nabduction\nabductions\nabductor\nabductors\nabducts\nabeam\nabecedarian\nabecedarians\nabed\nabednego\nabel\nabelard\nabelia\nabelian\nabelmosk\nabelmosks\naberdare\naberdeen\naberdonian\naberdonians\naberrance\naberrancies\naberrancy\naberrant\naberrantly\naberrants\naberrated\naberration\naberrational\naberrations\nabet\nabetment\nabetments\nabets\nabetted\nabetter\nabetters\nabetting\nabettor\nabettors\nabeyance\nabeyant\nabfarad\nabfarads\nabhenries\nabhenry\nabhor\nabhorred\nabhorrence\nabhorrences\nabhorrent\nabhorrently\nabhorrer\nabhorrers\nabhorring\nabhors\nabidance\nabidances\nabide\nabided\nabider\nabiders\nabides\nabiding\nabidingly\nabidingness\nabigail\nabigails\nabilities\nability\nabiogeneses\nabiogenesis\nabiogenetic\nabiogenetical\nabiogenic\nabiogenically\nabiogenist\nabiological\nabiologically\nabiosis\nabiotic\nabiotically\nabject\nabjection\nabjections\nabjectly\nabjectness\nabjuration\nabjurations\nabjure\nabjured\nabjurer\nabjurers\nabjures\nabjuring\nablate\nablated\nablates\nablating\nablation\nablations\nablative\nablatively\nablatives\nablaut\nablaze\nable\nabler\nablest\nabloom\nabluted\nablution\nablutionary\nablutions\nably\nabnegate\nabnegated\nabnegates\nabnegating\nabnegation\nabnegations\nabnegator\nabnegators\nabnormal\nabnormalities\nabnormality\nabnormally\nabnormals\naboard\nabode\nabodes\nabohm\naboil\nabolish\nabolishable\nabolished\nabolisher\nabolishers\nabolishes\nabolishing\nabolishment\nabolishments\nabolition\nabolitionary\nabolitionism\nabolitionist\nabolitionists\nabomasa\nabomasal\nabomasum\nabominable\nabominably\nabominate\nabominated\nabominates\nabominating\nabomination\nabominations\nabominator\nabominators\naboral\naborally\naboriginal\naboriginally\naborigine\naborigines\naborning\nabort\naborted\naborter\naborters\nabortifacient\naborting\nabortion\nabortionist\nabortionists\nabortions\nabortive\nabortively\nabortiveness\naborts\nabos\nabound\nabounded\nabounding\nabounds\nabout\nabove\naboveboard\naboveground\nabracadabra\nabrachia\nabradable\nabradant\nabradants\nabrade\nabraded\nabrader\nabraders\nabrades\nabrading\nabraham\nabranchiate\nabrash\nabrasion\nabrasions\nabrasive\nabrasively\nabrasiveness\nabrasives\nabreact\nabreacted\nabreacting\nabreaction\nabreactions\nabreacts\nabreast\nabridge\nabridged\nabridgement\nabridgements\nabridger\nabridgers\nabridges\nabridging\nabridgment\nabridgments\nabrin\nabroach\nabroad\nabrogate\nabrogated\nabrogates\nabrogating\nabrogation\nabrogations\nabrupt\nabruption\nabruptly\nabruptness\nabruzzi\nabruzzo\nabsalom\nabscess\nabscessed\nabscesses\nabscessing\nabscise\nabscised\nabscises\nabscisin\nabscising\nabscisins\nabscissa\nabscissae\nabscissas\nabscission\nabscissions\nabscond\nabsconded\nabsconder\nabsconders\nabsconding\nabsconds\nabsence\nabsences\nabsent\nabsented\nabsentee\nabsenteeism\nabsentees\nabsentia\nabsenting\nabsently\nabsentminded\nabsentmindedly\nabsentmindedness\nabsents\nabsinth\nabsinthe\nabsinthes\nabsinths\nabsolute\nabsolutely\nabsoluteness\nabsolutes\nabsolution\nabsolutions\nabsolutism\nabsolutisms\nabsolutist\nabsolutistic\nabsolutists\nabsolutize\nabsolutized\nabsolutizes\nabsolutizing\nabsolvable\nabsolve\nabsolved\nabsolver\nabsolvers\nabsolves\nabsolving\nabsorb\nabsorbability\nabsorbable\nabsorbance\nabsorbancy\nabsorbant\nabsorbants\nabsorbed\nabsorbedly\nabsorbedness\nabsorbefacient\nabsorbencies\nabsorbency\nabsorbent\nabsorbents\nabsorber\nabsorbers\nabsorbing\nabsorbingly\nabsorbs\nabsorptance\nabsorption\nabsorptions\nabsorptive\nabsorptivity\nabsquatulate\nabsquatulated\nabsquatulates\nabsquatulating\nabstain\nabstained\nabstainer\nabstainers\nabstaining\nabstains\nabstemious\nabstemiously\nabstemiousness\nabstention\nabstentions\nabstentious\nabstinence\nabstinent\nabstinently\nabstract\nabstractable\nabstracted\nabstractedly\nabstractedness\nabstracter\nabstracters\nabstracting\nabstraction\nabstractional\nabstractionism\nabstractionist\nabstractionists\nabstractions\nabstractive\nabstractly\nabstractness\nabstractor\nabstractors\nabstracts\nabstruse\nabstrusely\nabstruseness\nabstrusities\nabstrusity\nabsurd\nabsurdism\nabsurdist\nabsurdities\nabsurdity\nabsurdly\nabsurdness\nabsurdum\nabu\nabubble\nabuilding\nabulia\nabulias\nabulic\nabundance\nabundances\nabundant\nabundantly\nabusable\nabuse\nabused\nabuser\nabusers\nabuses\nabusing\nabusive\nabusively\nabusiveness\nabut\nabutilon\nabutilons\nabutment\nabutments\nabuts\nabutted\nabutter\nabutters\nabutting\nabuzz\nabvolt\nabvolts\naby\nabydos\nabye\nabyes\nabying\nabys\nabysm\nabysmal\nabysmally\nabysms\nabyss\nabyssal\nabysses\nabyssinia\nabyssinian\nabyssinians\nacacia\nacacias\nacademe\nacademes\nacademia\nacademic\nacademical\nacademically\nacademician\nacademicians\nacademicism\nacademics\nacademies\nacademism\nacademy\nacantha\nacanthae\nacanthi\nacanthocephalan\nacanthoid\nacanthopterygian\nacanthus\nacanthuses\nacapnia\nacapulco\nacari\nacariasis\nacarid\nacaridae\nacarids\nacarologist\nacarology\nacarophobia\nacarpous\nacarus\nacatalectic\nacaudate\nacaulescent\naccede\nacceded\naccedence\nacceder\nacceders\naccedes\nacceding\naccelerando\naccelerant\naccelerate\naccelerated\naccelerates\naccelerating\nacceleratingly\nacceleration\naccelerations\naccelerative\naccelerator\naccelerators\naccelerograph\naccelerometer\naccelerometers\naccent\naccented\naccenting\naccentless\naccents\naccentual\naccentually\naccentuate\naccentuated\naccentuates\naccentuating\naccentuation\naccept\nacceptability\nacceptable\nacceptableness\nacceptably\nacceptance\nacceptances\nacceptant\nacceptation\naccepted\nacceptedly\naccepter\naccepters\naccepting\nacceptingly\nacceptingness\nacceptive\nacceptor\nacceptors\naccepts\naccess\naccessaries\naccessary\naccessed\naccesses\naccessibility\naccessible\naccessibleness\naccessibly\naccessing\naccession\naccessional\naccessioned\naccessioning\naccessions\naccessorial\naccessories\naccessorily\naccessoriness\naccessorize\naccessorized\naccessorizes\naccessorizing\naccessory\nacciaccatura\naccidence\naccident\naccidental\naccidentally\naccidentalness\naccidentals\naccidently\naccidents\naccidie\naccidies\naccipiter\naccipitrine\nacclaim\nacclaimed\nacclaimer\nacclaimers\nacclaiming\nacclaims\nacclamation\nacclamations\nacclamatory\nacclimate\nacclimated\nacclimates\nacclimating\nacclimation\nacclimatization\nacclimatize\nacclimatized\nacclimatizer\nacclimatizers\nacclimatizes\nacclimatizing\nacclivities\nacclivitous\nacclivity\naccolade\naccoladed\naccolades\naccolading\naccommodate\naccommodated\naccommodates\naccommodating\naccommodatingly\naccommodation\naccommodational\naccommodationist\naccommodations\naccommodative\naccommodativeness\naccommodator\naccommodators\naccompanied\naccompanies\naccompaniment\naccompaniments\naccompanist\naccompanists\naccompany\naccompanying\naccompli\naccomplice\naccomplices\naccomplis\naccomplish\naccomplishable\naccomplished\naccomplisher\naccomplishers\naccomplishes\naccomplishing\naccomplishment\naccomplishments\naccord\naccordance\naccordances\naccordant\naccordantly\naccorded\naccording\naccordingly\naccordion\naccordionist\naccordionists\naccordions\naccords\naccost\naccosted\naccosting\naccosts\naccouchement\naccouchements\naccount\naccountabilities\naccountability\naccountable\naccountableness\naccountably\naccountancies\naccountancy\naccountant\naccountants\naccountantship\naccounted\naccounting\naccountings\naccounts\naccouter\naccoutered\naccoutering\naccouterment\naccouterments\naccouters\naccoutre\naccoutred\naccoutrement\naccoutrements\naccoutres\naccoutring\naccra\naccredit\naccreditable\naccreditation\naccreditations\naccredited\naccrediting\naccredits\naccrescent\naccrete\naccreted\naccretes\naccreting\naccretion\naccretionary\naccretions\naccretive\naccruable\naccrual\naccruals\naccrue\naccrued\naccruement\naccruements\naccrues\naccruing\nacculturate\nacculturated\nacculturates\nacculturating\nacculturation\nacculturational\nacculturative\naccumbent\naccumulable\naccumulate\naccumulated\naccumulates\naccumulating\naccumulation\naccumulations\naccumulative\naccumulatively\naccumulativeness\naccumulator\naccumulators\naccuracies\naccuracy\naccurate\naccurately\naccurateness\naccurse\naccursed\naccursedly\naccursedness\naccurst\naccusable\naccusal\naccusals\naccusation\naccusations\naccusative\naccusatively\naccusatives\naccusatorial\naccusatorially\naccusatory\naccuse\naccused\naccuser\naccusers\naccuses\naccusing\naccusingly\naccustom\naccustomation\naccustomed\naccustomedness\naccustoming\naccustoms\nace\naced\nacedia\nacedias\naceldama\nacellular\nacentric\nacephalous\nacequia\nacequias\nacerate\nacerated\nacerb\nacerbate\nacerbated\nacerbates\nacerbating\nacerbic\nacerbically\nacerbities\nacerbity\nacerola\nacerolas\nacerose\nacervuli\nacervulus\naces\nacetabula\nacetabular\nacetabulum\nacetal\nacetaldehyde\nacetals\nacetamide\nacetaminophen\nacetanilide\nacetate\nacetates\nacetic\nacetification\nacetified\nacetifier\nacetifies\nacetify\nacetifying\nacetoaceticacetonic\nacetone\nacetones\nacetonic\nacetophenetidin\nacetous\nacetum\nacetyl\nacetylate\nacetylated\nacetylates\nacetylating\nacetylation\nacetylative\nacetylcholine\nacetylcholinesterase\nacetylene\nacetylenic\nacetylic\nacetyls\nacetylsalicylic\nachaea\nachaean\nachaeans\nachaemenid\nachaemenids\nachalasia\nachates\nache\nached\nachene\nachenes\nachenial\nacheron\naches\nacheulean\nacheuleans\nacheulian\nacheulians\nachier\nachiest\nachievable\nachieve\nachieved\nachievement\nachievements\nachiever\nachievers\nachieves\nachieving\nachillea\nachilles\nachiness\naching\nachingly\nachira\nachlamydeous\nachlorhydria\nachlorhydric\nachlorophyllous\nacholia\nachondrite\nachondritic\nachondroplasia\nachondroplastic\nachromat\nachromatic\nachromatically\nachromaticity\nachromatin\nachromatinic\nachromatism\nachromatize\nachromatized\nachromatizes\nachromatizing\nachromats\nachromic\nachy\nacicula\naciculae\nacicular\naciculas\naciculate\naciculated\nacid\nacidanthera\nacidemia\nacidhead\nacidheads\nacidic\nacidifiable\nacidification\nacidified\nacidifier\nacidifiers\nacidifies\nacidify\nacidifying\nacidimeter\nacidimeters\nacidimetric\nacidimetry\nacidities\nacidity\nacidly\nacidness\nacidophil\nacidophilic\nacidophilus\nacidosis\nacidotic\nacids\nacidulate\nacidulated\nacidulates\nacidulating\nacidulation\nacidulent\nacidulous\naciduria\nacidy\nacinar\nacing\nacini\nacinic\nacinous\nacinus\nackee\nackees\nackerman\nacknowledge\nacknowledgeable\nacknowledged\nacknowledgedly\nacknowledgement\nacknowledgements\nacknowledges\nacknowledging\nacknowledgment\nacknowledgments\nacme\nacmes\nacne\nacned\nacock\nacoelomate\nacoelous\nacold\nacolyte\nacolytes\naconite\naconites\nacorn\nacorns\nacoustic\nacoustical\nacoustically\nacoustician\nacoustics\nacoustoelectric\nacoustoelectrically\nacoustooptical\nacoustooptically\nacoustooptics\nacquaint\nacquaintance\nacquaintances\nacquaintanceship\nacquaintanceships\nacquainted\nacquainting\nacquaints\nacquiesce\nacquiesced\nacquiescence\nacquiescent\nacquiescently\nacquiesces\nacquiescing\nacquirable\nacquire\nacquired\nacquirement\nacquirements\nacquirer\nacquirers\nacquires\nacquiring\nacquisition\nacquisitional\nacquisitions\nacquisitive\nacquisitively\nacquisitiveness\nacquisitor\nacquit\nacquits\nacquittal\nacquittals\nacquittance\nacquitted\nacquitter\nacquitters\nacquitting\nacre\nacreage\nacreages\nacres\nacrid\nacridine\nacridines\nacridities\nacridity\nacridly\nacridness\nacriflavine\nacrimonious\nacrimoniously\nacrimoniousness\nacrimony\nacrobat\nacrobatic\nacrobatically\nacrobatics\nacrobats\nacrocentric\nacrocephalic\nacrocephaly\nacrodont\nacrodonts\nacrolect\nacrolein\nacroleins\nacromegalic\nacromegalies\nacromegaly\nacromelic\nacromion\nacronym\nacronymic\nacronymically\nacronymous\nacronyms\nacropetal\nacropetally\nacrophobia\nacropolis\nacropolises\nacrosomal\nacrosome\nacross\nacrostic\nacrostical\nacrostically\nacrostics\nacrylate\nacrylates\nacrylic\nacrylics\nacrylonitrile\nact\nacta\nactability\nactable\nactaeon\nacte\nacted\nactes\nactin\nactinal\nactinally\nacting\nactinia\nactiniae\nactinian\nactinians\nactinic\nactinically\nactinide\nactinides\nactinism\nactinium\nactinoid\nactinolite\nactinomere\nactinometer\nactinometers\nactinometric\nactinometrical\nactinometry\nactinomorphic\nactinomorphous\nactinomorphy\nactinomyces\nactinomycetal\nactinomycete\nactinomycetous\nactinomycin\nactinomycosis\nactinomycotic\nactinon\nactinons\nactinouranium\naction\nactionable\nactionably\nactionless\nactions\nactium\nactivate\nactivated\nactivates\nactivating\nactivation\nactivations\nactivator\nactivators\nactive\nactively\nactiveness\nactives\nactivism\nactivist\nactivistic\nactivists\nactivities\nactivity\nactomyosin\nactor\nactorish\nactors\nactress\nactresses\nacts\nactual\nactualities\nactuality\nactualization\nactualizations\nactualize\nactualized\nactualizes\nactualizing\nactually\nactuarial\nactuarially\nactuaries\nactuary\nactuate\nactuated\nactuates\nactuating\nactuation\nactuations\nactuator\nactuators\nacuity\naculeate\nacumen\nacuminate\nacuminated\nacuminates\nacuminating\nacumination\nacupressure\nacupuncture\nacupunctured\nacupunctures\nacupuncturing\nacupuncturist\nacupuncturists\nacute\nacutely\nacuteness\nacuter\nacutest\nacyclic\nacyclovir\nacyl\nacylate\nacylated\nacylates\nacylating\nacylation\nacylations\nacyls\nad\nada\nadage\nadages\nadagio\nadagios\nadam\nadamance\nadamances\nadamancies\nadamancy\nadamant\nadamantine\nadamantly\nadamants\nadapt\nadaptability\nadaptable\nadaptableness\nadaptation\nadaptational\nadaptationally\nadaptations\nadapted\nadaptedness\nadapter\nadapters\nadapting\nadaption\nadaptions\nadaptive\nadaptively\nadaptiveness\nadaptivity\nadaptor\nadaptors\nadapts\nadaxial\nadd\naddable\naddax\naddaxes\nadded\naddend\naddenda\naddends\naddendum\nadder\nadders\naddible\naddict\naddicted\naddicting\naddiction\naddictions\naddictive\naddicts\nadding\naddis\naddison\naddition\nadditional\nadditionally\nadditions\nadditive\nadditively\nadditives\nadditivity\naddle\naddlebrained\naddled\naddlepated\naddles\naddling\naddress\naddressability\naddressable\naddressed\naddressee\naddressees\naddresser\naddressers\naddresses\naddressing\nadds\nadduce\nadduceable\nadduced\nadducer\nadducers\nadduces\nadducing\nadduct\nadducted\nadducting\nadduction\nadductive\nadductor\nadductors\nadducts\nadelaide\nademption\naden\nadenectomy\nadenine\nadenines\nadenitis\nadenitises\nadenocarcinoma\nadenocarcinomatous\nadenohypophyseal\nadenohypophyses\nadenohypophysial\nadenohypophysis\nadenoid\nadenoidal\nadenoids\nadenoma\nadenomas\nadenomatoid\nadenomatous\nadenosine\nadenosis\nadenosyl\nadenoviral\nadenovirus\nadenoviruses\nadenyl\nadept\nadeptly\nadeptness\nadepts\nadequacies\nadequacy\nadequate\nadequately\nadequateness\nadhere\nadhered\nadherence\nadherent\nadherently\nadherents\nadheres\nadhering\nadhesion\nadhesional\nadhesions\nadhesiotomies\nadhesiotomy\nadhesive\nadhesively\nadhesiveness\nadhesives\nadiabatic\nadiabatically\nadieu\nadieus\nadieux\nadige\nadios\nadipic\nadipocere\nadipocyte\nadipose\nadiposeness\nadiposity\nadirondack\nadirondacks\nadit\nadits\nadjacencies\nadjacency\nadjacent\nadjacently\nadjectival\nadjectivally\nadjective\nadjectively\nadjectives\nadjoin\nadjoined\nadjoining\nadjoins\nadjoint\nadjoints\nadjourn\nadjourned\nadjourning\nadjournment\nadjournments\nadjourns\nadjudge\nadjudged\nadjudges\nadjudging\nadjudicate\nadjudicated\nadjudicates\nadjudicating\nadjudication\nadjudications\nadjudicative\nadjudicator\nadjudicators\nadjudicatory\nadjunct\nadjunction\nadjunctive\nadjunctly\nadjuncts\nadjuration\nadjurations\nadjuratory\nadjure\nadjured\nadjurer\nadjurers\nadjures\nadjuring\nadjust\nadjustability\nadjustable\nadjustably\nadjusted\nadjuster\nadjusters\nadjusting\nadjustive\nadjustment\nadjustmental\nadjustments\nadjustor\nadjustors\nadjusts\nadjutancy\nadjutant\nadjutants\nadjuvant\nadjuvants\nadlerian\nadlib\nadlibbed\nadlibs\nadman\nadmass\nadmeasure\nadmeasured\nadmeasurement\nadmeasurements\nadmeasurer\nadmeasures\nadmeasuring\nadmen\nadmin\nadminister\nadministered\nadministering\nadministers\nadministrable\nadministrant\nadministrants\nadministrate\nadministrated\nadministrates\nadministrating\nadministration\nadministrational\nadministrations\nadministrative\nadministratively\nadministrator\nadministrators\nadministratra\nadministratrices\nadministratrix\nadmirability\nadmirable\nadmirableness\nadmirably\nadmiral\nadmirals\nadmiralties\nadmiralty\nadmiration\nadmirations\nadmire\nadmired\nadmirer\nadmirers\nadmires\nadmiring\nadmiringly\nadmissibility\nadmissible\nadmissibleness\nadmissibly\nadmission\nadmissions\nadmissive\nadmit\nadmits\nadmittance\nadmittances\nadmitted\nadmittedly\nadmitting\nadmix\nadmixed\nadmixes\nadmixing\nadmixture\nadmixtures\nadmonish\nadmonished\nadmonisher\nadmonishes\nadmonishing\nadmonishingly\nadmonishment\nadmonishments\nadmonition\nadmonitions\nadmonitorily\nadmonitory\nadnate\nadnation\nadnations\nadnexa\nadnexal\nadnominal\nadnoun\nadnouns\nado\nadobe\nadobes\nadolescence\nadolescent\nadolescently\nadolescents\nadonais\nadonis\nadopt\nadoptability\nadoptable\nadopted\nadoptee\nadoptees\nadopter\nadopters\nadoptianism\nadoptianist\nadoptianists\nadopting\nadoption\nadoptionism\nadoptionist\nadoptionists\nadoptions\nadoptive\nadoptively\nadopts\nadorability\nadorable\nadorableness\nadorably\nadoral\nadoration\nadore\nadored\nadorer\nadorers\nadores\nadoring\nadoringly\nadorn\nadorned\nadorner\nadorners\nadorning\nadornment\nadornments\nadorns\nadrenal\nadrenalectomy\nadrenalin\nadrenaline\nadrenalize\nadrenalized\nadrenalizes\nadrenalizing\nadrenally\nadrenals\nadrenergic\nadrenergically\nadrenochrome\nadrenocortical\nadrenocorticosteroid\nadrenocorticotrophic\nadrenocorticotrophin\nadrenocorticotropic\nadrenocorticotropin\nadrenolytic\nadriatic\nadrift\nadroit\nadroitly\nadroitness\nads\nadscititious\nadsorb\nadsorbable\nadsorbate\nadsorbates\nadsorbed\nadsorbent\nadsorbents\nadsorbing\nadsorbs\nadsorption\nadsorptive\nadularia\nadularias\nadulate\nadulated\nadulates\nadulating\nadulation\nadulations\nadulator\nadulators\nadulatory\nadult\nadulterant\nadulterants\nadulterate\nadulterated\nadulterates\nadulterating\nadulteration\nadulterations\nadulterator\nadulterators\nadulterer\nadulterers\nadulteress\nadulteresses\nadulteries\nadulterine\nadulterous\nadulterously\nadultery\nadulthood\nadultlike\nadultly\nadultness\nadults\nadumbrate\nadumbrated\nadumbrates\nadumbrating\nadumbration\nadumbrations\nadumbrative\nadumbratively\nadust\nadvance\nadvanced\nadvancement\nadvancements\nadvancer\nadvancers\nadvances\nadvancing\nadvantage\nadvantaged\nadvantageous\nadvantageously\nadvantageousness\nadvantages\nadvantaging\nadvect\nadvected\nadvecting\nadvection\nadvections\nadvective\nadvects\nadvent\nadventism\nadventist\nadventists\nadventitia\nadventitial\nadventitious\nadventitiously\nadventitiousness\nadventive\nadventively\nadvents\nadventure\nadventured\nadventurer\nadventurers\nadventures\nadventuresome\nadventuresomely\nadventuresomeness\nadventuress\nadventuresses\nadventuring\nadventurism\nadventurist\nadventuristic\nadventurists\nadventurous\nadventurously\nadventurousness\nadverb\nadverbial\nadverbially\nadverbs\nadversarial\nadversaries\nadversary\nadversative\nadversatively\nadverse\nadversely\nadverseness\nadversities\nadversity\nadvert\nadverted\nadvertence\nadvertences\nadvertencies\nadvertency\nadvertent\nadvertently\nadverting\nadvertise\nadvertised\nadvertisement\nadvertisements\nadvertiser\nadvertisers\nadvertises\nadvertising\nadverts\nadvice\nadvices\nadvisability\nadvisable\nadvisableness\nadvisably\nadvise\nadvised\nadvisedly\nadvisee\nadvisees\nadvisement\nadvisements\nadviser\nadvisers\nadvises\nadvising\nadvisor\nadvisories\nadvisors\nadvisory\nadvocacy\nadvocate\nadvocated\nadvocates\nadvocating\nadvocation\nadvocative\nadvocator\nadvocators\nadvocatory\nadvowson\nadvowsons\nadynamia\nadynamias\nadynamic\nadyta\nadytum\nadz\nadze\nadzes\naechmea\naecia\naecial\naeciospore\naecium\naedes\naedilberct\naedile\naediles\naedine\naegean\naegeus\naegis\naeneas\naeneid\naeneous\naeolian\naeolians\naeolic\naeolus\naeon\naeonian\naeonic\naeons\naepyornis\naequorin\naerate\naerated\naerates\naerating\naeration\naerations\naerator\naerators\naerenchyma\naerial\naerialist\naerialists\naerially\naerials\naerie\naerier\naeries\naeriest\naerily\naero\naeroallergen\naeroballistic\naeroballistics\naerobat\naerobatic\naerobatics\naerobe\naerobes\naerobic\naerobically\naerobicize\naerobicized\naerobicizes\naerobicizing\naerobics\naerobiological\naerobiologically\naerobiology\naerobiosis\naerobiotic\naerobium\naeroculture\naerodrome\naerodromes\naerodynamic\naerodynamical\naerodynamically\naerodynamicist\naerodynamicists\naerodynamics\naerodyne\naerodynes\naeroembolism\naerofoil\naerofoils\naerogram\naerograms\naerographer\naerolite\naerolites\naerolith\naeroliths\naerolitic\naerologic\naerological\naerologist\naerologists\naerology\naeromagnetic\naeromagnetically\naeromagnetics\naeromechanical\naeromechanically\naeromechanics\naeromedical\naeromedicine\naerometeorograph\naerometer\naerometers\naeronaut\naeronautic\naeronautical\naeronautically\naeronautics\naeronauts\naeroneurosis\naeronomer\naeronomic\naeronomical\naeronomist\naeronomy\naeropause\naerophagia\naerophobia\naerophore\naerophyte\naeroplane\naeroplanes\naeroponics\naerosol\naerosolization\naerosolize\naerosolized\naerosolizes\naerosolizing\naerosols\naerospace\naerosphere\naerostat\naerostatic\naerostatical\naerostatics\naerostats\naerotactic\naerotaxis\naerothermodynamics\naery\naeschylus\naesculapian\naesculapius\naesop\naesopian\naesopic\naesthesia\naesthete\naesthetes\naesthetic\naesthetically\naesthetician\naestheticians\naestheticism\naestheticize\naestheticized\naestheticizes\naestheticizing\naesthetics\naestival\naestivate\naestivated\naestivates\naestivating\naestivation\naethelberht\naethelred\naether\naetheric\naethers\nafar\nafeard\nafeared\nafebrile\naffability\naffable\naffably\naffair\naffaire\naffaires\naffairs\naffect\naffectability\naffectable\naffectation\naffectations\naffected\naffectedly\naffectedness\naffecter\naffecters\naffecting\naffectingly\naffection\naffectional\naffectionally\naffectionate\naffectionately\naffectionateness\naffectioned\naffectionless\naffections\naffective\naffectively\naffectivity\naffectless\naffectlessness\naffects\naffenpinscher\nafferent\nafferently\naffiance\naffianced\naffiances\naffiancing\naffiant\naffiants\nafficionado\naffidavit\naffidavits\naffiliate\naffiliated\naffiliates\naffiliating\naffiliation\naffiliations\naffine\naffined\naffinely\naffinities\naffinity\naffirm\naffirmable\naffirmably\naffirmance\naffirmant\naffirmation\naffirmations\naffirmative\naffirmatively\naffirmatives\naffirmed\naffirmer\naffirmers\naffirming\naffirms\naffix\naffixable\naffixal\naffixation\naffixations\naffixed\naffixer\naffixers\naffixes\naffixial\naffixing\naffixment\nafflatus\nafflatuses\nafflict\nafflicted\nafflicter\nafflicting\naffliction\nafflictions\nafflictive\nafflictively\nafflicts\naffluence\naffluency\naffluent\naffluently\naffluents\nafflux\naffluxes\nafford\naffordability\naffordable\naffordably\nafforded\naffording\naffords\nafforest\nafforestation\nafforested\nafforesting\nafforests\naffray\naffrayed\naffraying\naffrays\naffricate\naffricates\naffricative\naffright\naffrighted\naffrighting\naffrightment\naffrights\naffront\naffronted\naffronting\naffronts\naffusion\naffusions\nafghan\nafghani\nafghanistan\nafghans\naficionada\naficionado\naficionados\nafield\nafire\naflame\naflatoxicosis\naflatoxin\nafloat\naflutter\nafoot\nafore\naforementioned\naforesaid\naforethought\naforetime\naforetimes\nafoul\nafraid\nafreet\nafreets\nafresh\nafrica\nafrican\nafricanism\nafricanist\nafricanization\nafricanize\nafricanized\nafricanizes\nafricanizing\nafricans\nafricanus\nafrikaans\nafrikaner\nafrikaners\nafrit\nafrits\nafro\nafros\naft\nafter\nafterbirth\nafterbirths\nafterburner\nafterburners\naftercare\nafterclap\nafterdamp\nafterdeck\nafterdecks\naftereffect\naftereffects\nafterglow\nafterimage\nafterimages\nafterlife\nafterlives\naftermarket\naftermarkets\naftermath\naftermost\nafternoon\nafternoons\nafterpains\nafterpiece\nafters\naftersensation\naftershave\naftershaves\naftershock\naftershocks\naftertaste\naftertastes\nafterthought\nafterthoughts\naftertime\naftertimes\nafterward\nafterwards\nafterword\nafterwork\nafterworld\nafterworlds\naftmost\nagadir\nagain\nagainst\nagalactia\nagama\nagamas\nagamemnon\nagamete\nagametes\nagamic\nagamically\nagammaglobulinemia\nagammaglobulinemic\nagamogenesis\nagamospermy\nagapanthus\nagape\nagar\nagaric\nagarics\nagars\nagassiz\nagate\nagates\nagave\nagaves\nagaze\nage\naged\nagedly\nagedness\nageing\nageism\nageist\nageists\nageless\nagelessly\nagelessness\nagelong\nagencies\nagency\nagenda\nagendaless\nagendas\nagendum\nagendums\nagenesis\nagent\nagential\nagentries\nagentry\nagents\nager\nageratum\nageratums\nagers\nages\naggie\naggies\naggiornamento\naggiornamentos\nagglomerate\nagglomerated\nagglomerates\nagglomerating\nagglomeration\nagglomerations\nagglomerative\nagglomerator\nagglutinability\nagglutinable\nagglutinant\nagglutinate\nagglutinated\nagglutinates\nagglutinating\nagglutination\nagglutinations\nagglutinative\nagglutinin\nagglutinins\nagglutinogen\nagglutinogenic\naggradation\naggradational\naggrade\naggraded\naggrades\naggrading\naggrandize\naggrandized\naggrandizement\naggrandizements\naggrandizer\naggrandizers\naggrandizes\naggrandizing\naggravate\naggravated\naggravates\naggravating\naggravatingly\naggravation\naggravations\naggravative\naggravator\naggravators\naggregate\naggregated\naggregately\naggregateness\naggregates\naggregating\naggregation\naggregational\naggregations\naggregative\naggregatively\naggregator\naggregators\naggress\naggressed\naggresses\naggressing\naggression\naggressions\naggressive\naggressively\naggressiveness\naggressivity\naggressor\naggressors\naggrieve\naggrieved\naggrievedly\naggrieves\naggrieving\nagha\naghas\naghast\nagile\nagilely\nagileness\nagility\nagin\nagincourt\naging\nagism\nagist\nagists\nagita\nagitate\nagitated\nagitatedly\nagitates\nagitating\nagitation\nagitational\nagitative\nagitato\nagitator\nagitators\nagitprop\nagitprops\naglaia\naglare\nagleam\naglet\naglets\nagley\naglitter\naglow\naglycon\naglycone\naglycones\naglycons\nagnail\nagnails\nagnate\nagnates\nagnathan\nagnatic\nagnatically\nagnation\nagnations\nagnes\nagnize\nagnized\nagnizes\nagnizing\nagnomen\nagnomens\nagnomina\nagnosia\nagnostic\nagnostically\nagnosticism\nagnostics\nagnus\nago\nagog\nagon\nagonal\nagone\nagones\nagonic\nagonies\nagonist\nagonistes\nagonistic\nagonistically\nagonists\nagonize\nagonized\nagonizes\nagonizing\nagonizingly\nagony\nagora\nagorae\nagoraphobia\nagoraphobiac\nagoraphobic\nagoras\nagorot\nagoroth\nagotis\nagouti\nagouties\nagoutis\nagra\nagrafe\nagrafes\nagraffe\nagraffes\nagranulocytosis\nagrapha\nagraphia\nagraphias\nagraphic\nagrarian\nagrarianism\nagrarianly\nagrarians\nagree\nagreeability\nagreeable\nagreeableness\nagreeably\nagreed\nagreeing\nagreement\nagreements\nagrees\nagribusiness\nagricide\nagricola\nagricultural\nagriculturalist\nagriculturalists\nagriculturally\nagriculture\nagricultures\nagriculturist\nagriculturists\nagrigento\nagrimation\nagrimonies\nagrimony\nagrippa\nagrippina\nagrobiologic\nagrobiological\nagrobiologically\nagrobiologist\nagrobiology\nagrochemical\nagroforester\nagroforesters\nagroforestry\nagroindustrial\nagrologic\nagrological\nagrologically\nagrologist\nagrology\nagronomic\nagronomical\nagronomically\nagronomist\nagronomists\nagronomy\nagrostologist\nagrostology\naground\naguacate\nague\naguecheek\nagues\naguish\naguishly\naguishness\nah\naha\nahab\nahead\nahem\nahems\nahimsa\nahimsas\nahistoric\nahistorical\nahmadabad\nahmedabad\nahold\naholds\nahoy\nahs\nai\naiblins\naid\naidan\naide\naided\naider\naiders\naides\naiding\naidman\naidmen\naids\naigret\naigrets\naigrette\naigrettes\naiguille\naiguilles\naiguillette\naikido\naikidos\nail\nailanthus\nailanthuses\nailed\naileron\nailerons\nailing\nailment\nailments\nails\nailurophile\nailurophobe\nailurophobia\naim\naimed\naiming\naimless\naimlessly\naimlessness\naims\nain\nain't\nainu\nainus\naioli\nair\nairbag\nairbags\nairbed\nairbeds\nairboat\nairboats\nairborne\nairbrake\nairbrakes\nairbrush\nairbrushed\nairbrushes\nairbrushing\nairburst\nairbursts\nairbus\nairbuses\naircraft\naircrew\naircrews\nairdate\nairdrome\nairdromes\nairdrop\nairdropped\nairdropping\nairdrops\naired\nairedale\nairedales\nairer\nairers\naires\nairfare\nairfares\nairfield\nairfields\nairflow\nairfoil\nairfoils\nairforce\nairforces\nairframe\nairframes\nairfreight\nairglow\nairglows\nairhead\nairheads\nairier\nairiest\nairily\nairiness\nairing\nairings\nairless\nairlessness\nairlift\nairlifted\nairlifting\nairlifts\nairline\nairliner\nairliners\nairlines\nairlock\nairlocks\nairmail\nairmailed\nairmailing\nairmails\nairman\nairmanship\nairmen\nairmobile\nairpark\nairparks\nairplane\nairplanes\nairplay\nairport\nairports\nairpost\nairpower\nairs\nairscrew\nairscrews\nairship\nairships\nairsick\nairsickness\nairside\nairspace\nairspeed\nairspeeds\nairstream\nairstreams\nairstrip\nairstrips\nairt\nairted\nairtight\nairtightness\nairtime\nairting\nairts\nairwave\nairwaves\nairway\nairways\nairwoman\nairwomen\nairworthier\nairworthiest\nairworthiness\nairworthy\nairy\naisle\naisles\nait\naitch\naitchbone\naitches\naits\naix\najar\najax\najuga\najugas\nakaryocyte\nakbar\nakee\nakees\nakhenaten\nakhenaton\nakimbo\nakin\nakinesia\nakinetic\nakkad\nakrotiri\nal\nala\nalabama\nalabaman\nalabamans\nalabamian\nalabamians\nalabaster\nalabastrine\nalack\nalacritous\nalacrity\naladdin\nalae\nalai\nalameda\nalamedas\nalamein\nalamo\nalamode\nalamodes\nalamogordo\nalamos\nalanine\nalanines\nalanyl\nalanyls\nalar\nalaric\nalarm\nalarmed\nalarming\nalarmingly\nalarmism\nalarmist\nalarmists\nalarms\nalarum\nalarums\nalary\nalas\nalaska\nalaskan\nalaskans\nalassio\nalastor\nalastors\nalate\nalb\nalbacore\nalbacores\nalban\nalbania\nalbanian\nalbanians\nalbany\nalbatross\nalbatrosses\nalbedo\nalbedos\nalbeit\nalbert\nalberta\nalbertus\nalbescent\nalbigenses\nalbigensian\nalbigensianism\nalbinism\nalbinistic\nalbino\nalbinos\nalbinotic\nalbion\nalbite\nalbites\nalbitic\nalbitical\nalbs\nalbum\nalbumen\nalbumin\nalbuminoid\nalbuminous\nalbuminuria\nalbuminuric\nalbumose\nalbumoses\nalbums\nalbuquerque\nalcaic\nalcaics\nalcaide\nalcaides\nalcalde\nalcaldes\nalcatraz\nalcayde\nalcaydes\nalcazar\nalcazars\nalcestis\nalchemic\nalchemical\nalchemically\nalchemist\nalchemistic\nalchemistical\nalchemists\nalchemize\nalchemized\nalchemizes\nalchemizing\nalchemy\nalcibiades\nalcohol\nalcoholic\nalcoholically\nalcoholicity\nalcoholics\nalcoholism\nalcoholometer\nalcoholometers\nalcoholometry\nalcohols\nalcott\nalcove\nalcoves\nalcuin\naldebaran\naldehyde\naldehydes\nalder\nalderman\naldermancy\naldermanic\naldermen\nalders\nalderwoman\nalderwomen\naldicarb\naldis\naldol\naldolase\naldolases\naldols\naldose\naldoses\naldosterone\naldosteronism\naldrin\naldrins\nale\naleatoric\naleatory\nalec\nalecithal\naleck\nalecks\nalecky\nalecs\nalee\nalegar\nalegars\nalehouse\nalehouses\nalembic\nalembics\nalençon\naleph\nalephs\naleppo\nalert\nalerted\nalerting\nalertly\nalertness\nalerts\nales\naleuron\naleurone\naleurones\naleuronic\naleurons\naleut\naleutian\naleutians\naleuts\nalevin\nalevins\nalewife\nalewives\nalex\nalexander\nalexandra\nalexandria\nalexandrian\nalexandrine\nalexandrines\nalexandrite\nalexandrites\nalexia\nalexin\nalfa\nalfalfa\nalfas\nalfilaria\nalfonso\nalforja\nalforjas\nalfred\nalfredo\nalfresco\nalga\nalgae\nalgaecide\nalgaecides\nalgal\nalgaroba\nalgarobas\nalgarroba\nalgarrobas\nalgarve\nalgas\nalgebra\nalgebraic\nalgebraically\nalgebraist\nalgebraists\nalgebras\nalgeciras\nalger\nalgeria\nalgerian\nalgerians\nalgicidal\nalgicide\nalgicides\nalgid\nalgidities\nalgidity\nalgiers\nalgin\nalginate\nalginates\nalgins\nalgoid\nalgol\nalgolagnia\nalgolagniac\nalgolagnic\nalgolagnist\nalgological\nalgologically\nalgologist\nalgologists\nalgology\nalgonquian\nalgonquians\nalgonquin\nalgonquins\nalgophobia\nalgorism\nalgorithm\nalgorithmic\nalgorithmically\nalgorithms\nalhambra\nali\nalia\nalias\naliases\nalibi\nalibied\nalibiing\nalibis\nalible\nalicante\nalice\nalicyclic\nalidad\nalidade\nalidades\nalidads\nalien\nalienability\nalienable\nalienage\nalienages\nalienate\nalienated\nalienates\nalienating\nalienation\nalienator\nalienators\naliened\nalienee\nalienees\naliening\nalienism\nalienisms\nalienist\nalienists\nalienly\nalienness\nalienor\nalienors\naliens\naliesterase\naliform\nalight\nalighted\nalighting\nalightment\nalights\nalign\naligned\naligner\naligners\naligning\nalignment\nalignments\naligns\nalike\nalikeness\naliment\nalimental\nalimentally\nalimentary\nalimentation\nalimentative\nalimented\nalimenting\naliments\nalimonies\nalimony\naline\nalined\nalinement\nalinements\nalines\nalining\naliphatic\naliquot\naliquots\nalit\naliter\nalive\naliveness\naliyah\naliyahs\nalizarin\nalizarine\nalizarines\nalizarins\nalkahest\nalkahestic\nalkahestical\nalkahests\nalkalescence\nalkalescent\nalkali\nalkalimeter\nalkalimeters\nalkalimetry\nalkaline\nalkalinity\nalkalinization\nalkalinize\nalkalinized\nalkalinizes\nalkalinizing\nalkalis\nalkalization\nalkalize\nalkalized\nalkalizes\nalkalizing\nalkaloid\nalkaloidal\nalkaloids\nalkaloses\nalkalosis\nalkalotic\nalkane\nalkanes\nalkanet\nalkanets\nalkene\nalkenes\nalkine\nalkines\nalkoxy\nalkyd\nalkyds\nalkyl\nalkylate\nalkylated\nalkylates\nalkylating\nalkylation\nalkyls\nalkyne\nalkynes\nall\nalla\nallah\nallahabad\nallamanda\nallan\nallantoic\nallantoid\nallantoides\nallantoin\nallantois\nallargando\nallay\nallayed\nallayer\nallayers\nallaying\nallayment\nallays\nallegation\nallegations\nallege\nallegeable\nalleged\nallegedly\nalleger\nallegers\nalleges\nalleghenies\nallegheny\nallegiance\nallegiances\nallegiant\nalleging\nallegoric\nallegorical\nallegorically\nallegoricalness\nallegories\nallegorist\nallegorists\nallegorization\nallegorize\nallegorized\nallegorizer\nallegorizes\nallegorizing\nallegory\nallegretto\nallegrettos\nallegro\nallegros\nallele\nalleles\nallelic\nallelism\nallelomorph\nallelomorphic\nallelomorphism\nallelomorphs\nallelopathic\nallelopathy\nalleluia\nalleluias\nallemande\nallemandes\nallen\nallenby\naller\nallergen\nallergenic\nallergenicity\nallergens\nallergic\nallergies\nallergist\nallergists\nallergy\nallers\nallethrin\nalleviate\nalleviated\nalleviates\nalleviating\nalleviation\nalleviations\nalleviative\nalleviator\nalleviators\nalleviatory\nalley\nalleyn\nalleyne\nalleys\nalleyway\nalleyways\nalliaceous\nalliance\nalliances\nallied\nallies\nalligator\nalligatoring\nalligators\nallison\nalliterate\nalliterated\nalliterates\nalliterating\nalliteration\nalliterations\nalliterative\nalliteratively\nalliterativeness\nallium\nalliums\nalloantibody\nalloantigen\nallocable\nallocatable\nallocate\nallocated\nallocates\nallocating\nallocation\nallocations\nallocator\nallocators\nallochthonous\nallocution\nallocutions\nallogamies\nallogamous\nallogamy\nallogeneic\nallogenic\nallograft\nallograph\nallographic\nallomerism\nallomerous\nallometric\nallometry\nallomorph\nallomorphic\nallomorphism\nallomorphs\nallonge\nallonges\nallonym\nallonymous\nallonymously\nallonyms\nallopath\nallopathic\nallopathically\nallopathies\nallopathist\nallopathists\nallopaths\nallopathy\nallopatric\nallopatrically\nallopatry\nallophane\nallophone\nallophones\nallophonic\nallopolyploid\nallopolyploidy\nallopurinol\nallosteric\nallosterically\nallostery\nallot\nallotetraploid\nallotetraploidy\nallotment\nallotments\nallotransplant\nallotransplantation\nallotransplanted\nallotransplanting\nallotransplants\nallotrope\nallotropes\nallotropic\nallotropical\nallotropically\nallotropy\nallots\nallotted\nallottee\nallottees\nallotter\nallotters\nallotting\nallotype\nallotypes\nallotypic\nallotypically\nallotypy\nallover\nallovers\nallow\nallowable\nallowably\nallowance\nallowanced\nallowances\nallowancing\nallowed\nallowedly\nallowing\nallows\nalloxan\nalloxans\nalloy\nalloyed\nalloying\nalloys\nallseed\nallseeds\nallspice\nallude\nalluded\nalludes\nalluding\nallure\nallured\nallurement\nallurements\nallurer\nallurers\nallures\nalluring\nalluringly\nallusion\nallusions\nallusive\nallusively\nallusiveness\nalluvia\nalluvial\nalluvion\nalluvium\nalluviums\nally\nallying\nallyl\nallylic\nallyls\nalma\nalmagest\nalmagests\nalmanac\nalmanacs\nalmandine\nalmandines\nalmandite\nalmandites\nalmeria\nalmightily\nalmightiness\nalmighty\nalmond\nalmonds\nalmoner\nalmoners\nalmost\nalms\nalmsgiver\nalmsgivers\nalmsgiving\nalmshouse\nalmshouses\nalmsman\nalmsmen\nalnico\nalocasia\naloe\naloes\naloetic\naloft\nalogical\nalogically\nalogicalness\naloha\naloin\naloins\nalone\naloneness\nalong\nalongshore\nalongside\naloof\naloofly\naloofness\nalopecia\nalopecias\nalopecic\naloud\nalow\nalp\nalpaca\nalpacas\nalpenglow\nalpenhorn\nalpenhorns\nalpenstock\nalpenstocks\nalpestrine\nalpha\nalphabet\nalphabetic\nalphabetical\nalphabetically\nalphabetization\nalphabetizations\nalphabetize\nalphabetized\nalphabetizer\nalphabetizers\nalphabetizes\nalphabetizing\nalphabets\nalphameric\nalphanumeric\nalphanumerical\nalphanumerically\nalphanumerics\nalphas\nalpheus\nalphorn\nalphorns\nalpine\nalpinism\nalpinist\nalpinists\nalps\nalready\nalright\nalsace\nalsatian\nalsatians\nalsike\nalso\nalstroemeria\nalt\naltai\naltaic\naltair\naltamira\naltar\naltarpiece\naltarpieces\naltars\naltazimuth\naltazimuths\nalter\nalterability\nalterable\nalterableness\nalterably\nalteration\nalterations\nalterative\naltercate\naltercated\naltercates\naltercating\naltercation\naltercations\naltered\nalterer\nalterers\naltering\nalternaria\nalternate\nalternated\nalternately\nalternateness\nalternates\nalternating\nalternation\nalternations\nalternative\nalternatively\nalternativeness\nalternatives\nalternator\nalternators\nalters\nalthea\naltho\nalthorn\nalthorns\nalthough\naltimeter\naltimeters\naltimetric\naltimetry\naltiplano\naltiplanos\naltitude\naltitudes\naltitudinal\naltitudinous\naltnaharra\nalto\naltocumuli\naltocumulus\naltogether\naltoona\naltos\naltostratus\naltricial\naltruism\naltruist\naltruistic\naltruistically\naltruists\nalts\nalula\nalulae\nalular\nalum\nalumina\naluminas\naluminate\naluminiferous\naluminium\naluminize\naluminized\naluminizes\naluminizing\naluminosilicate\naluminous\naluminum\naluminums\nalumna\nalumnae\nalumni\nalumnus\nalumroot\nalumroots\nalunite\nalunites\nalvarez\nalveolar\nalveolarly\nalveolars\nalveolate\nalveolation\nalveoli\nalveolus\nalway\nalways\nalyssum\nalyssums\nalzheimer\nalzheimer's\nam\nama\namah\namahs\namain\namalfi\namalgam\namalgamate\namalgamated\namalgamates\namalgamating\namalgamation\namalgamations\namalgamative\namalgamator\namalgamators\namalgams\namanda\namandine\namanita\namanitas\namantadine\namanuenses\namanuensis\namaranth\namaranthine\namaranths\namarelle\namarelles\namaretto\namarettos\namarillo\namarna\namaryllis\namaryllises\namas\namass\namassable\namassed\namasser\namassers\namasses\namassing\namassment\namassments\namateur\namateurish\namateurishly\namateurishness\namateurism\namateurs\namative\namatively\namativeness\namatol\namatols\namatory\namaurosis\namaurotic\namaze\namazed\namazedly\namazedness\namazement\namazes\namazing\namazingly\namazon\namazonia\namazonian\namazonite\namazons\nambage\nambages\nambagious\nambarella\nambassador\nambassadorial\nambassadors\nambassadorship\nambassadorships\nambassadress\nambassadresses\nambeer\nambeers\namber\nambergris\namberjack\nambiance\nambiances\nambidexterity\nambidextrous\nambidextrously\nambience\nambiences\nambient\nambiguities\nambiguity\nambiguous\nambiguously\nambiguousness\nambipolar\nambisexual\nambisexuality\nambit\nambition\nambitionless\nambitions\nambitious\nambitiously\nambitiousness\nambits\nambivalence\nambivalent\nambivalently\nambiversion\nambivert\nambiverts\namble\nambled\nambler\namblers\nambles\nambling\namblygonite\namblyopia\namblyopic\nambo\namboina\namboinas\nambos\namboyna\namboynas\nambries\nambrose\nambrosia\nambrosial\nambrosially\nambrosian\nambrosias\nambrotype\nambry\nambsace\nambsaces\nambulacra\nambulacral\nambulacrum\nambulance\nambulances\nambulant\nambulate\nambulated\nambulates\nambulating\nambulation\nambulations\nambulatories\nambulatorily\nambulatory\nambuscade\nambuscaded\nambuscader\nambuscades\nambuscading\nambush\nambushed\nambusher\nambushers\nambushes\nambushing\nambushment\nameba\namebas\namebiasis\namebic\nameboid\nameer\nameers\nameliorate\nameliorated\nameliorates\nameliorating\namelioration\nameliorations\nameliorative\nameliorator\nameliorators\namelioratory\namen\namenability\namenable\namenableness\namenably\namend\namendable\namendatory\namended\namender\namenders\namending\namendment\namendments\namends\namenhotep\namenities\namenity\namenophis\namenorrhea\namenorrheic\namensalism\nament\namentaceous\namentia\namentias\namentiferous\naments\namerasian\namerasians\namerce\namerceable\namerced\namercement\namercements\namerces\namerciable\namercing\namerica\namerican\namericana\namericanism\namericanisms\namericanist\namericanists\namericanization\namericanize\namericanized\namericanizes\namericanizing\namericanness\namericans\namericas\namericium\namerind\namerindian\namerindians\namerinds\names\nameslan\namethopterin\namethyst\namethystine\namethysts\nametropia\nametropic\namharic\namherst\nami\namiability\namiable\namiableness\namiably\namianthus\namicability\namicable\namicableness\namicably\namice\namices\namici\namicus\namid\namidase\namidases\namide\namides\namidic\namido\namidol\namidols\namidships\namidst\namiens\namigo\namigos\namine\namines\namino\naminoacidemia\naminoaciduria\naminobenzoic\naminobutyric\naminopeptidase\naminopeptidases\naminophenol\naminophylline\naminopterin\naminopyrine\naminopyrines\naminosalicylic\naminotransferase\namir\namirs\namish\namiss\namities\namitoses\namitosis\namitotic\namitotically\namitriptyline\namitrole\namitroles\namity\nammeter\nammeters\nammine\nammines\nammino\nammo\nammonia\nammoniac\nammoniacal\nammoniate\nammoniated\nammoniates\nammoniating\nammoniation\nammonification\nammonified\nammonifier\nammonifies\nammonify\nammonifying\nammonite\nammonites\nammonitic\nammonium\nammonoid\nammonoids\nammunition\nammunitions\namnesia\namnesiac\namnesiacs\namnesic\namnesics\namnestic\namnestied\namnesties\namnesty\namnestying\namnia\namniocenteses\namniocentesis\namniographies\namniography\namnion\namnions\namnioscope\namnioscopies\namnioscopy\namniote\namniotes\namniotic\namobarbital\namoeba\namoebae\namoebaean\namoebas\namoebiasis\namoebic\namoebocyte\namoeboid\namok\namoks\namole\namoles\namong\namongst\namontillado\namontillados\namor\namoral\namoralism\namorality\namorally\namore\namoretti\namoretto\namorettos\namorist\namoristic\namorists\namorous\namorously\namorousness\namorphism\namorphous\namorphously\namorphousness\namort\namortizable\namortization\namortizations\namortize\namortized\namortizes\namortizing\namos\namosite\namosites\namount\namounted\namounting\namounts\namour\namours\namoxicillin\namp\namperage\namperages\nampere\namperes\nampersand\nampersands\namphetamine\namphetamines\namphiarthroses\namphiarthrosis\namphibia\namphibian\namphibians\namphibiotic\namphibious\namphibiously\namphibiousness\namphibole\namphiboles\namphibolic\namphibolite\namphibolitic\namphibologies\namphibology\namphibolous\namphibrach\namphictyonic\namphictyonies\namphictyony\namphidiploid\namphidiploidy\namphimacer\namphimictic\namphimixes\namphimixis\namphion\namphioxus\namphipathic\namphiploid\namphiploids\namphiploidy\namphipod\namphipods\namphiprostyle\namphisbaena\namphisbaenic\namphistylar\namphitheater\namphitheaters\namphitheatric\namphitheatrical\namphitheatrically\namphithecia\namphithecium\namphitrite\namphitropous\namphitryon\namphora\namphorae\namphoral\namphoras\namphoteric\nampicillin\nample\nampleness\nampler\namplest\namplexicaul\namplexus\namplidyne\namplidynes\namplification\namplifications\namplified\namplifier\namplifiers\namplifies\namplify\namplifying\namplitude\namplitudes\namply\nampoule\nampoules\namps\nampul\nampule\nampules\nampulla\nampullae\nampullar\nampuls\namputate\namputated\namputates\namputating\namputation\namputations\namputator\namputators\namputee\namputees\nampère\namreeta\namreetas\namrita\namritas\namritsar\namsterdam\namtrac\namtrack\namtracks\namtracs\namtrak\namuck\namulet\namulets\namun\namundsen\namusable\namuse\namused\namusedly\namusement\namusements\namuser\namusers\namuses\namusing\namusingly\namusingness\namusive\namygdala\namygdalae\namygdale\namygdales\namygdalin\namygdaline\namygdaloid\namygdaloidal\namygdule\namygdules\namyl\namylaceous\namylase\namylases\namyloid\namyloidosis\namyloids\namylolysis\namylolytic\namylopsin\namylose\namyloses\namyls\namylum\namylums\namyotonia\nan\nana\nanabaena\nanabaenas\nanabaptism\nanabaptist\nanabaptists\nanabas\nanabases\nanabasis\nanabatic\nanabiosis\nanabiotic\nanabolic\nanabolism\nanachronic\nanachronism\nanachronisms\nanachronistic\nanachronistically\nanachronous\nanachronously\nanaclisis\nanaclitic\nanacolutha\nanacoluthic\nanacoluthically\nanacoluthon\nanacoluthons\nanaconda\nanacondas\nanacreon\nanacreontic\nanacruses\nanacrusis\nanadem\nanadems\nanadiploses\nanadiplosis\nanadromous\nanaemia\nanaemias\nanaerobe\nanaerobes\nanaerobic\nanaerobically\nanaerobiosis\nanaerobiotic\nanaesthesia\nanaesthesiology\nanaesthetic\nanaesthetics\nanaesthetist\nanaesthetists\nanaesthetization\nanaesthetizations\nanaesthetize\nanaesthetized\nanaesthetizes\nanaesthetizing\nanagenesis\nanaglyph\nanaglyphic\nanaglyphs\nanagoge\nanagoges\nanagogic\nanagogically\nanagogies\nanagogy\nanagram\nanagrammatic\nanagrammatical\nanagrammatically\nanagrammatization\nanagrammatize\nanagrammatized\nanagrammatizes\nanagrammatizing\nanagrams\nanaheim\nanal\nanalcime\nanalcimes\nanalcimic\nanalcite\nanalcites\nanalecta\nanalectic\nanalects\nanalemma\nanalemmas\nanaleptic\nanalgesia\nanalgesic\nanalgesics\nanalgetic\nanalities\nanality\nanally\nanalog\nanalogic\nanalogical\nanalogically\nanalogies\nanalogist\nanalogize\nanalogized\nanalogizes\nanalogizing\nanalogous\nanalogously\nanalogousness\nanalogs\nanalogue\nanalogues\nanalogy\nanalphabet\nanalphabetic\nanalphabetics\nanalphabetism\nanalphabets\nanalysand\nanalysands\nanalyses\nanalysis\nanalyst\nanalysts\nanalytic\nanalytical\nanalytically\nanalyticities\nanalyticity\nanalytics\nanalyzability\nanalyzable\nanalyzation\nanalyze\nanalyzed\nanalyzer\nanalyzers\nanalyzes\nanalyzing\nanamneses\nanamnesis\nanamnestic\nanamnestically\nanamorphic\nanamorphoses\nanamorphosis\nanapaest\nanapaests\nanapest\nanapestic\nanapests\nanaphase\nanaphases\nanaphasic\nanaphor\nanaphora\nanaphoras\nanaphoric\nanaphorically\nanaphors\nanaphrodisia\nanaphrodisiac\nanaphylactic\nanaphylactically\nanaphylactoid\nanaphylaxes\nanaphylaxis\nanaplasia\nanaplasmoses\nanaplasmosis\nanaplastic\nanapsid\nanapsids\nanarch\nanarchic\nanarchical\nanarchically\nanarchies\nanarchism\nanarchist\nanarchistic\nanarchists\nanarcho\nanarchs\nanarchy\nanarthria\nanarthric\nanarthrous\nanas\nanasarca\nanasarcas\nanasarcous\nanasazi\nanastasia\nanastigmat\nanastigmatic\nanastomose\nanastomosed\nanastomoses\nanastomosing\nanastomosis\nanastomotic\nanastrophe\nanatase\nanatases\nanathema\nanathemas\nanathematization\nanathematize\nanathematized\nanathematizes\nanathematizing\nanatolia\nanatolian\nanatolians\nanatomic\nanatomical\nanatomically\nanatomies\nanatomist\nanatomists\nanatomization\nanatomize\nanatomized\nanatomizes\nanatomizing\nanatomy\nanatropous\nanatto\nanattos\nanaxagoras\nanaximander\nancestor\nancestors\nancestral\nancestrally\nancestress\nancestresses\nancestries\nancestry\nanchor\nanchorage\nanchorages\nanchored\nanchoress\nanchoresses\nanchoret\nanchorets\nanchoring\nanchorite\nanchorites\nanchoritic\nanchoritically\nanchorless\nanchorman\nanchormen\nanchorperson\nanchorpersons\nanchors\nanchorwoman\nanchorwomen\nanchovies\nanchovy\nancien\nanciens\nancient\nanciently\nancientness\nancientry\nancients\nancilla\nancillae\nancillaries\nancillary\nancon\nancona\nancones\nancress\nancresses\nancylostomiasis\nand\nandalucía\nandalusia\nandalusian\nandalusians\nandalusite\nandaman\nandamanese\nandamans\nandante\nandantes\nandantino\nandantinos\nandean\nandes\nandesite\nandesites\nandesitic\nandhra\nandiron\nandirons\nandorra\nandorran\nandorrans\nandouille\nandradite\nandrew\nandrews\nandrocles\nandroecia\nandroecial\nandroecium\nandrogen\nandrogenic\nandrogenization\nandrogenize\nandrogenized\nandrogenizes\nandrogenizing\nandrogens\nandrogyne\nandrogynous\nandrogynously\nandrogyny\nandroid\nandroids\nandromache\nandromeda\nandronicus\nandrosterone\nandré\nands\nanecdota\nanecdotage\nanecdotal\nanecdotalist\nanecdotalists\nanecdotally\nanecdote\nanecdotes\nanecdotic\nanecdotical\nanecdotically\nanecdotist\nanecdotists\nanechoic\nanemia\nanemias\nanemic\nanemically\nanemics\nanemochory\nanemograph\nanemography\nanemometer\nanemometers\nanemometrical\nanemometry\nanemone\nanemones\nanemophilous\nanencephalic\nanencephalies\nanencephaly\nanent\naneroid\nanesthesia\nanesthesias\nanesthesiologist\nanesthesiologists\nanesthesiology\nanesthetic\nanesthetically\nanesthetics\nanesthetist\nanesthetists\nanesthetization\nanesthetize\nanesthetized\nanesthetizes\nanesthetizing\nanestrus\nanestruses\naneuploid\naneuploidy\naneurism\naneurisms\naneurysm\naneurysmal\naneurysms\nanew\nanfractuosities\nanfractuosity\nanfractuous\nanga\nangaria\nangarias\nangaries\nangary\nangel\nangela\nangeleno\nangelenos\nangeles\nangelfish\nangelfishes\nangelic\nangelica\nangelical\nangelically\nangelicas\nangelico\nangelina\nangelologist\nangelologists\nangelology\nangels\nangelus\nangeluses\nanger\nangered\nangering\nangerless\nangers\nangevin\nangevins\nangina\nanginal\nanginose\nangiocardiographic\nangiocardiography\nangiogenesis\nangiogram\nangiograms\nangiographic\nangiography\nangiology\nangioma\nangiomas\nangiomata\nangiomatous\nangiopathies\nangiopathy\nangioplasties\nangioplasty\nangiosarcoma\nangiosperm\nangiosperms\nangiotensin\nangkor\nangle\nangled\nangler\nanglerfish\nanglerfishes\nanglers\nangles\nanglesite\nangleworm\nangleworms\nanglia\nanglian\nanglians\nanglican\nanglicanism\nanglicans\nanglicanus\nanglice\nanglicism\nanglicisms\nanglicist\nanglicization\nanglicizations\nanglicize\nanglicized\nanglicizes\nanglicizing\nangling\nanglings\nanglo\nanglophil\nanglophile\nanglophiles\nanglophilia\nanglophiliac\nanglophilic\nanglophobe\nanglophobes\nanglophobia\nanglophobic\nanglophone\nanglophonic\nanglos\nangola\nangolan\nangolans\nangora\nangoras\nangostura\nangoulême\nangrier\nangriest\nangrily\nangriness\nangry\nangst\nangstrom\nangstroms\nanguilla\nanguillan\nanguillans\nanguish\nanguished\nanguishes\nanguishing\nangular\nangularities\nangularity\nangularly\nangularness\nangulate\nangulated\nangulately\nangulates\nangulating\nangulation\nangus\nanguses\nanhinga\nanhingas\nanhydride\nanhydrides\nanhydrite\nanhydrous\nanhydrously\nani\nanil\nanile\nanilin\naniline\nanilines\nanilingus\nanilins\nanility\nanils\nanima\nanimadversion\nanimadversions\nanimadvert\nanimadverted\nanimadverting\nanimadverts\nanimal\nanimalcula\nanimalcule\nanimalcules\nanimalculum\nanimalism\nanimalist\nanimalistic\nanimality\nanimalization\nanimalize\nanimalized\nanimalizes\nanimalizing\nanimallike\nanimally\nanimals\nanimas\nanimate\nanimated\nanimatedly\nanimately\nanimateness\nanimates\nanimatic\nanimating\nanimation\nanimations\nanimato\nanimator\nanimators\nanimis\nanimism\nanimist\nanimistic\nanimists\nanimo\nanimosities\nanimosity\nanimus\nanimé\nanion\nanionic\nanionically\nanions\naniracetam\nanis\nanise\naniseed\naniseeds\naniseikonia\naniseikonic\nanises\nanisette\nanisettes\nanisogamete\nanisogamic\nanisogamy\nanisometric\nanisometropia\nanisometropic\nanisotropic\nanisotropically\nanisotropism\nanisotropy\nanjou\nankara\nankerite\nankerites\nankh\nankhs\nankle\nanklebone\nanklebones\nankles\nanklet\nanklets\nankylose\nankylosed\nankyloses\nankylosing\nankylosis\nankylotic\nanlace\nanlaces\nanlage\nanlagen\nanlages\nann\nanna\nannalist\nannalistic\nannalists\nannals\nannan\nannapolis\nannapurna\nannates\nannatto\nannattos\nanne\nanneal\nannealed\nannealing\nanneals\nannelid\nannelidan\nannelidans\nannelids\nannex\nannexation\nannexational\nannexationism\nannexationist\nannexationists\nannexations\nannexed\nannexes\nannexing\nannie\nannihilability\nannihilable\nannihilate\nannihilated\nannihilates\nannihilating\nannihilation\nannihilations\nannihilative\nannihilator\nannihilators\nannihilatory\nanniversaries\nanniversary\nanno\nannotate\nannotated\nannotates\nannotating\nannotation\nannotations\nannotative\nannotator\nannotators\nannounce\nannounced\nannouncement\nannouncements\nannouncer\nannouncers\nannounces\nannouncing\nannoy\nannoyance\nannoyances\nannoyed\nannoyer\nannoyers\nannoying\nannoyingly\nannoys\nannual\nannualize\nannualized\nannualizes\nannualizing\nannually\nannuals\nannuitant\nannuitants\nannuities\nannuity\nannul\nannular\nannulate\nannulated\nannulation\nannulet\nannulets\nannuli\nannulled\nannulling\nannulment\nannulments\nannuls\nannulus\nannuluses\nannum\nannunciate\nannunciated\nannunciates\nannunciating\nannunciation\nannunciations\nannunciator\nannunciators\nannunciatory\nannus\nanoa\nanoas\nanodal\nanodally\nanode\nanodes\nanodic\nanodically\nanodization\nanodize\nanodized\nanodizes\nanodizing\nanodyne\nanodynes\nanoint\nanointed\nanointer\nanointers\nanointing\nanointment\nanointments\nanoints\nanole\nanoles\nanomalies\nanomalistic\nanomalistical\nanomalistically\nanomalous\nanomalously\nanomalousness\nanomaly\nanomic\nanomie\nanomy\nanon\nanonym\nanonymities\nanonymity\nanonymous\nanonymously\nanonymousness\nanonyms\nanopheles\nanopheline\nanorak\nanoraks\nanorectic\nanorectics\nanoretic\nanorexia\nanorexic\nanorexics\nanorexigenic\nanorthic\nanorthite\nanorthitic\nanorthosite\nanosmia\nanosmias\nanosmic\nanosognosia\nanosognosic\nanosognosics\nanother\nanouilh\nanovulant\nanovulation\nanovulatory\nanoxemia\nanoxemias\nanoxemic\nanoxia\nanoxic\nansate\nanschluss\nanselm\nanserine\nanson\nanswer\nanswerability\nanswerable\nanswerableness\nanswerably\nanswerback\nanswered\nanswerer\nanswerers\nanswering\nanswers\nant\nanta\nantacid\nantacids\nantae\nantaean\nantagonism\nantagonisms\nantagonist\nantagonistic\nantagonistically\nantagonists\nantagonize\nantagonized\nantagonizes\nantagonizing\nantarctic\nantarctica\nantares\nantas\nante\nanteater\nanteaters\nantebellum\nantecede\nanteceded\nantecedence\nantecedent\nantecedently\nantecedents\nantecedes\nanteceding\nantecessor\nantecessors\nantechamber\nantechambers\nantechoir\nantechoirs\nanted\nantedate\nantedated\nantedates\nantedating\nantediluvian\nantediluvians\nanteed\nantefix\nantefixa\nantefixal\nantefixes\nanteing\nantelope\nantelopes\nantemeridian\nantemortem\nantenatal\nantenatally\nantenna\nantennae\nantennal\nantennas\nantennule\nantependia\nantependium\nantepenult\nantepenultima\nantepenultimate\nantepenultimates\nantepenults\nanterior\nanteriorly\nanteroom\nanterooms\nantes\nanthelia\nanthelion\nanthelmintic\nanthelmintics\nanthem\nanthemia\nanthemion\nanthems\nanther\nantheridia\nantheridium\nantherozoid\nanthers\nanthesis\nanthill\nanthills\nanthocyanin\nanthological\nanthologies\nanthologist\nanthologists\nanthologize\nanthologized\nanthologizer\nanthologizers\nanthologizes\nanthologizing\nanthology\nanthony\nanthozoan\nanthozoic\nanthracene\nanthraces\nanthracis\nanthracite\nanthracites\nanthracitic\nanthracnose\nanthracosis\nanthrax\nanthropic\nanthropical\nanthropocentric\nanthropocentrically\nanthropocentricity\nanthropocentrism\nanthropogenesis\nanthropogenic\nanthropoid\nanthropoidal\nanthropoids\nanthropologic\nanthropological\nanthropologically\nanthropologist\nanthropologists\nanthropology\nanthropometric\nanthropometrical\nanthropometrically\nanthropometrist\nanthropometry\nanthropomorph\nanthropomorphic\nanthropomorphically\nanthropomorphism\nanthropomorphist\nanthropomorphists\nanthropomorphization\nanthropomorphize\nanthropomorphized\nanthropomorphizes\nanthropomorphizing\nanthropomorphous\nanthropomorphs\nanthropopathism\nanthropophagi\nanthropophagic\nanthropophagous\nanthropophagus\nanthropophagy\nanthroposophical\nanthroposophist\nanthroposophy\nanthurium\nanti\nantiabortion\nantiabortionist\nantiabortionists\nantiacademic\nantiadministration\nantiaggression\nantiaging\nantiaircraft\nantialcohol\nantialcoholism\nantialien\nantiallergenic\nantiallergic\nantianemia\nantianxiety\nantiapartheid\nantiaphrodisiac\nantiaristocratic\nantiarrhythmic\nantiarthritic\nantiarthritis\nantiassimilation\nantiasthma\nantiatom\nantiatoms\nantiauthoritarian\nantiauthoritarianism\nantiauthority\nantibacklash\nantibacterial\nantibaryon\nantibes\nantibias\nantibillboard\nantibioses\nantibiosis\nantibiotic\nantibiotically\nantibiotics\nantiblack\nantiblackism\nantibodies\nantibody\nantiboss\nantibourgeois\nantiboycott\nantibug\nantibureaucratic\nantiburglar\nantiburglary\nantibusiness\nantibusing\nantic\nanticaking\nantically\nanticancer\nanticancerous\nanticapitalism\nanticapitalist\nanticapitalists\nanticarcinogen\nanticarcinogenic\nanticaries\nanticatalyst\nanticathode\nanticellulite\nanticensorship\nantichlor\nantichloristic\nanticholesterol\nanticholinergic\nanticholinesterase\nantichrist\nantichrists\nantichurch\nanticigarette\nanticipant\nanticipants\nanticipatable\nanticipate\nanticipated\nanticipates\nanticipating\nanticipation\nanticipations\nanticipative\nanticipatively\nanticipator\nanticipators\nanticipatory\nanticity\nanticlassical\nanticlerical\nanticlericalism\nanticlimactic\nanticlimactical\nanticlimactically\nanticlimax\nanticlimaxes\nanticlinal\nanticline\nanticlines\nanticling\nanticlockwise\nanticlotting\nanticoagulant\nanticoagulants\nanticoagulation\nanticodon\nanticold\nanticollision\nanticolonial\nanticolonialism\nanticolonialist\nanticolonialists\nanticommercial\nanticommercialism\nanticommunism\nanticommunist\nanticommunists\nanticompetitive\nanticonglomerate\nanticonservation\nanticonservationist\nanticonservationists\nanticonsumer\nanticonventional\nanticonvulsant\nanticonvulsive\nanticorporate\nanticorrosion\nanticorrosive\nanticorrosives\nanticorruption\nanticounterfeiting\nanticrack\nanticreative\nanticrime\nanticruelty\nantics\nanticult\nanticultural\nanticyclone\nanticyclones\nanticyclonic\nantidandruff\nantidefamation\nantidemocratic\nantidepressant\nantidepressants\nantidepression\nantidepressive\nantiderivative\nantiderivatives\nantidesegregation\nantidesertification\nantidesiccant\nantideuteron\nantidevelopment\nantidiabetic\nantidiarrheal\nantidilution\nantidiscrimination\nantidisestablishmentarian\nantidisestablishmentarianism\nantidogmatic\nantidotal\nantidotally\nantidote\nantidotes\nantidraft\nantidumping\nantieconomic\nantieducational\nantiegalitarian\nantielectron\nantielectrons\nantielite\nantielitism\nantielitist\nantielitists\nantiemetic\nantientropic\nantienvironmental\nantienzymatic\nantienzyme\nantienzymic\nantiepilepsy\nantiepileptic\nantierotic\nantiestablishment\nantiestrogen\nantietam\nantievolution\nantievolutionary\nantievolutionism\nantievolutionist\nantievolutionists\nantifamily\nantifascism\nantifascist\nantifascists\nantifashion\nantifashionable\nantifatigue\nantifebrile\nantifederalism\nantifederalist\nantifemale\nantifeminine\nantifeminism\nantifeminist\nantifeminists\nantifertility\nantifilibuster\nantiflu\nantifluoridationist\nantifoam\nantifoaming\nantifogging\nantiforeclosure\nantiforeign\nantiforeigner\nantiformalist\nantiformalists\nantifouling\nantifraud\nantifreeze\nantifreezes\nantifriction\nantifundamentalist\nantifundamentalists\nantifungal\nantifur\nantigalaxy\nantigambling\nantigay\nantigen\nantigene\nantigenes\nantigenic\nantigenically\nantigenicity\nantigens\nantiglare\nantiglobulin\nantigone\nantigovernment\nantigravity\nantigreenmail\nantigrowth\nantigua\nantiguan\nantiguans\nantiguerrilla\nantigun\nantihelium\nantihemophilic\nantihero\nantiheroes\nantiheroic\nantiheroine\nantiheroism\nantiherpes\nantihierarchical\nantihijack\nantihistamine\nantihistamines\nantihistaminic\nantihistorical\nantihomosexual\nantihuman\nantihumanism\nantihumanistic\nantihumanitarian\nantihunter\nantihunting\nantihydrogen\nantihypertensive\nantihypertensives\nantihysteric\nantijam\nantijamming\nantikickback\nantiknock\nantiknocks\nantilabor\nantileak\nantileprosy\nantilepton\nantileukemic\nantiliberal\nantiliberalism\nantilibertarian\nantiliquor\nantiliterate\nantilitter\nantilittering\nantilles\nantilock\nantilog\nantilogarithm\nantilogarithmic\nantilogarithms\nantilogical\nantilogies\nantilogs\nantilogy\nantilynching\nantimacassar\nantimacassars\nantimacho\nantimagnetic\nantimalaria\nantimalarial\nantimalarials\nantimale\nantiman\nantimanagement\nantimarijuana\nantimarket\nantimaterialism\nantimaterialist\nantimaterialists\nantimatter\nantimechanist\nantimechanists\nantimere\nantimeres\nantimerger\nantimeric\nantimetabolic\nantimetabolite\nantimetaphysical\nantimicrobial\nantimilitarism\nantimilitarist\nantimilitarists\nantimilitary\nantimiscegenation\nantimissile\nantimitotic\nantimodern\nantimodernist\nantimodernists\nantimonarchical\nantimonarchist\nantimonarchists\nantimonial\nantimonopolist\nantimonopolists\nantimonopoly\nantimony\nantimosquito\nantimusical\nantinarrative\nantinational\nantinationalist\nantinationalists\nantinatural\nantinature\nantinausea\nantineoplastic\nantinepotism\nantineutrino\nantineutrinos\nantineutron\nantineutrons\nanting\nantings\nantinodal\nantinode\nantinodes\nantinoise\nantinome\nantinomian\nantinomianism\nantinomians\nantinomic\nantinomies\nantinomy\nantinovel\nantinovelist\nantinuclear\nantinucleon\nantinucleons\nantiobesity\nantiobscenity\nantioch\nantiochus\nantiorganization\nantioxidant\nantioxidants\nantipapal\nantiparasitic\nantiparticle\nantiparticles\nantiparty\nantipasti\nantipasto\nantipastos\nantipathetic\nantipathetical\nantipathetically\nantipathies\nantipathy\nantiperiodic\nantipersonnel\nantiperspirant\nantiperspirants\nantipesticide\nantiphlogistic\nantiphon\nantiphonal\nantiphonally\nantiphonaries\nantiphonary\nantiphonies\nantiphons\nantiphony\nantiphrases\nantiphrasis\nantipiracy\nantiplague\nantiplaque\nantipleasure\nantipneumococcal\nantipoaching\nantipodal\nantipode\nantipodean\nantipodeans\nantipodes\nantipoetic\nantipolice\nantipolitical\nantipolitics\nantipollution\nantipollutionist\nantipope\nantipopes\nantipopular\nantiporn\nantipornographic\nantipornography\nantipot\nantipoverty\nantipredator\nantipress\nantiprofiteering\nantiprogressive\nantiprostitution\nantiproton\nantiprotons\nantipruritic\nantipsychotic\nantipsychotics\nantipyresis\nantipyretic\nantipyretics\nantipyrine\nantiquarian\nantiquarianism\nantiquarians\nantiquaries\nantiquark\nantiquary\nantiquate\nantiquated\nantiquatedness\nantiquates\nantiquating\nantiquation\nantique\nantiqued\nantiquely\nantiqueness\nantiquer\nantiquers\nantiques\nantiquing\nantiquities\nantiquity\nantirabies\nantirachitic\nantiracism\nantiracist\nantiracists\nantiracketeering\nantiradar\nantiradical\nantiradicalism\nantirape\nantirational\nantirationalism\nantirationalist\nantirationalists\nantirationality\nantirealism\nantirealist\nantirealists\nantirecession\nantirecessionary\nantired\nantireductionism\nantireductionist\nantireductionists\nantireflection\nantireflective\nantireform\nantiregulatory\nantireligion\nantireligious\nantirevolutionary\nantirheumatic\nantirheumatics\nantiriot\nantiritualism\nantirock\nantiroll\nantiromantic\nantiromanticism\nantiroyalist\nantiroyalists\nantirrhinum\nantirrhinums\nantirust\nantis\nantisatellite\nantischizophrenia\nantischizophrenic\nantiscience\nantiscientific\nantiscorbutic\nantisecrecy\nantisecretory\nantisegregation\nantiseizure\nantisentimental\nantiseparatist\nantiseparatists\nantisepses\nantisepsis\nantiseptic\nantiseptically\nantiseptics\nantisera\nantiserum\nantiserums\nantisex\nantisexist\nantisexists\nantisexual\nantisexuality\nantishark\nantiship\nantishock\nantishoplifting\nantiskid\nantislavery\nantisleep\nantislip\nantismog\nantismoke\nantismoker\nantismoking\nantismuggling\nantismut\nantisnob\nantisocial\nantisocialist\nantisocialists\nantisocially\nantispasmodic\nantispasmodics\nantispeculation\nantispeculative\nantispending\nantistate\nantistatic\nantisthenes\nantistick\nantistory\nantistress\nantistrike\nantistrophe\nantistrophes\nantistrophic\nantistrophically\nantistudent\nantisubmarine\nantisubsidy\nantisubversion\nantisubversive\nantisuicide\nantisymmetric\nantisyphilitic\nantitakeover\nantitank\nantitarnish\nantitax\nantitechnological\nantitechnology\nantiterrorism\nantiterrorist\nantiterrorists\nantitheft\nantitheoretical\nantitheses\nantithesis\nantithetic\nantithetical\nantithetically\nantithyroid\nantitobacco\nantitotalitarian\nantitoxic\nantitoxin\nantitoxins\nantitrade\nantitrades\nantitraditional\nantitrust\nantitruster\nantitrusters\nantitubercular\nantituberculosis\nantituberculous\nantitumor\nantitumoral\nantitussive\nantitype\nantitypes\nantityphoid\nantitypical\nantiulcer\nantiunemployment\nantiunion\nantiuniversity\nantiurban\nantivenin\nantivenins\nantiviolence\nantiviral\nantivirus\nantivitamin\nantivivisection\nantivivisectionist\nantivivisectionists\nantiwar\nantiwear\nantiwelfare\nantiwhaling\nantiwoman\nantiwrinkle\nantler\nantlered\nantlers\nantoinette\nantonine\nantonines\nantoninus\nantonio\nantonomasia\nantony\nantonym\nantonymic\nantonymous\nantonyms\nantonymy\nantra\nantral\nantre\nantres\nantrim\nantrorse\nantrorsely\nantrum\nants\nantsier\nantsiest\nantsy\nantwerp\nanubis\nanuran\nanurans\nanuresis\nanuretic\nanuria\nanurias\nanuric\nanurous\nanus\nanuses\nanvil\nanvils\nanxieties\nanxiety\nanxious\nanxiously\nanxiousness\nany\nanybody\nanybody's\nanyhow\nanymore\nanyone\nanyone's\nanyplace\nanything\nanytime\nanyway\nanyways\nanywhere\nanywise\nanzio\naorist\naoristic\naoristically\naorists\naorta\naortae\naortal\naortas\naortic\naortographic\naortography\naosta\naoudad\naoudads\napace\napache\napachean\napaches\napanage\napanages\naparejo\naparejos\napart\napartheid\napartment\napartmental\napartments\napartness\napatetic\napathetic\napathetical\napathetically\napathy\napatite\napatites\nape\napeak\naped\napelike\napennine\napennines\naper\naperient\naperients\naperiodic\naperiodically\naperiodicity\naperitif\naperitifs\napertural\naperture\napertures\naperçu\naperçus\napes\napetalous\napetaly\napex\napexes\naphaereses\naphaeresis\naphaeretic\naphagia\naphagias\naphanite\naphanites\naphanitic\naphasia\naphasiac\naphasiacs\naphasias\naphasic\naphasics\naphelia\naphelion\napheresis\napheses\naphesis\naphetic\naphetically\naphid\naphides\naphidian\naphidians\naphids\naphis\naphonia\naphonias\naphonic\naphorism\naphorisms\naphorist\naphoristic\naphoristically\naphorists\naphorize\naphorized\naphorizes\naphorizing\naphotic\naphrodisiac\naphrodisiacal\naphrodisiacs\naphrodite\naphyllies\naphyllous\naphylly\napian\napiarian\napiaries\napiarist\napiarists\napiary\napical\napically\napices\napiculate\napicultural\napiculture\napiculturist\napiece\naping\napio\napios\napis\napish\napishly\napishness\napivorous\naplacental\naplanatic\naplasia\naplasias\naplastic\naplenty\naplite\naplites\naplitic\naplomb\napnea\napneas\napneic\napnoea\napnoeas\napocalypse\napocalypses\napocalyptic\napocalyptical\napocalyptically\napocalypticism\napocalyptism\napocalyptist\napocalyptists\napocarpies\napocarpous\napocarpy\napochromatic\napocope\napocopes\napocrine\napocrypha\napocryphal\napocryphally\napocryphalness\napodal\napodeictic\napodictic\napodictically\napodoses\napodosis\napodous\napoenzyme\napogamic\napogamies\napogamous\napogamy\napogean\napogee\napogees\napolitical\napolitically\napollinaris\napollo\napollonian\napollos\napollyon\napologetic\napologetically\napologetics\napologia\napologias\napologies\napologist\napologists\napologize\napologized\napologizer\napologizers\napologizes\napologizing\napologue\napologues\napology\napolune\napolunes\napomict\napomictic\napomictically\napomicts\napomixis\napomixises\napomorphine\naponeuroses\naponeurosis\naponeurotic\napophasis\napophthegm\napophthegms\napophyge\napophyges\napophyllite\napophysate\napophyseal\napophyses\napophysis\napoplectic\napoplectically\napoplexy\naport\naposematic\naposematically\naposiopeses\naposiopesis\naposiopetic\naposporous\napospory\napostasies\napostasy\napostate\napostates\napostatize\napostatized\napostatizes\napostatizing\napostle\napostlehood\napostles\napostleship\napostleships\napostolate\napostolic\napostolicity\napostrophe\napostrophes\napostrophic\napostrophize\napostrophized\napostrophizes\napostrophizing\napothecaries\napothecary\napothecia\napothecial\napothecium\napothegm\napothegmatic\napothegmatical\napothegmatically\napothegms\napothem\napothems\napotheoses\napotheosis\napotheosize\napotheosized\napotheosizes\napotheosizing\napotropaic\napotropaically\nappal\nappalachia\nappalachian\nappalachians\nappall\nappalled\nappalling\nappallingly\nappalls\nappaloosa\nappaloosas\nappals\nappanage\nappanages\napparat\napparatchik\napparatchiki\napparatchiks\napparats\napparatus\napparatuses\napparel\nappareled\nappareling\napparelled\napparelling\napparels\napparent\napparently\napparentness\napparition\napparitional\napparitions\napparitor\napparitors\nappeal\nappealability\nappealable\nappealed\nappealer\nappealers\nappealing\nappealingly\nappeals\nappear\nappearance\nappearances\nappeared\nappearing\nappears\nappeasable\nappeasably\nappease\nappeased\nappeasement\nappeasements\nappeaser\nappeasers\nappeases\nappeasing\nappel\nappellant\nappellants\nappellate\nappellation\nappellations\nappellative\nappellatively\nappellee\nappellees\nappels\nappend\nappendage\nappendages\nappendant\nappendectomies\nappendectomy\nappended\nappendices\nappendicitis\nappendicular\nappending\nappendix\nappendixes\nappends\napperceive\napperceived\napperceives\napperceiving\napperception\napperceptive\nappertain\nappertained\nappertaining\nappertains\nappestat\nappestats\nappetence\nappetencies\nappetency\nappetent\nappetite\nappetites\nappetitive\nappetizer\nappetizers\nappetizing\nappetizingly\nappian\napplaud\napplaudable\napplaudably\napplauded\napplauder\napplauders\napplauding\napplauds\napplause\napplauses\napple\napplejack\napplejacks\napples\napplesauce\nappliance\nappliances\napplicability\napplicable\napplicably\napplicant\napplicants\napplication\napplications\napplicative\napplicatively\napplicator\napplicators\napplicatory\napplied\napplier\nappliers\napplies\nappliqué\nappliquéd\nappliquéing\nappliqués\napply\napplying\nappoggiatura\nappoint\nappointed\nappointee\nappointees\nappointing\nappointive\nappointment\nappointments\nappointor\nappoints\nappomattox\napportion\napportioned\napportioning\napportionment\napportionments\napportions\nappose\napposed\napposes\napposing\napposite\nappositely\nappositeness\napposition\nappositional\nappositionally\nappositions\nappositive\nappositively\nappositives\nappraisable\nappraisal\nappraisals\nappraise\nappraised\nappraisement\nappraisements\nappraiser\nappraisers\nappraises\nappraising\nappraisingly\nappreciable\nappreciably\nappreciate\nappreciated\nappreciates\nappreciating\nappreciation\nappreciations\nappreciative\nappreciatively\nappreciativeness\nappreciator\nappreciators\nappreciatory\napprehend\napprehended\napprehending\napprehends\napprehensible\napprehensibly\napprehension\napprehensions\napprehensive\napprehensively\napprehensiveness\napprentice\napprenticed\napprentices\napprenticeship\napprenticeships\napprenticing\nappressed\napprise\napprised\napprises\napprising\napprize\napprized\napprizes\napprizing\napproach\napproachability\napproachable\napproached\napproaches\napproaching\napprobate\napprobated\napprobates\napprobating\napprobation\napprobations\napprobative\napprobatory\nappropriable\nappropriate\nappropriated\nappropriately\nappropriateness\nappropriates\nappropriating\nappropriation\nappropriations\nappropriative\nappropriator\nappropriators\napprovable\napprovably\napproval\napprovals\napprove\napproved\napprover\napprovers\napproves\napproving\napprovingly\napproximate\napproximated\napproximately\napproximates\napproximating\napproximation\napproximations\napproximative\napproximatively\nappurtenance\nappurtenances\nappurtenant\nappétit\napractic\napraxia\napraxias\napraxic\napricot\napricots\napril\naprils\napriority\napron\naproned\naproning\naprons\napropos\naprès\napse\napses\napsidal\napsides\napsis\napt\napteral\napterous\napteryx\napteryxes\naptitude\naptitudes\naptitudinal\naptitudinally\naptly\naptness\napulia\napyrase\napyrases\napéritif\napéritifs\naqua\naquacade\naquacades\naquacultural\naquaculture\naquaculturist\naquae\naquafortis\naqualung\naqualungs\naquamarine\naquamarines\naquanaut\naquanauts\naquaplane\naquaplaned\naquaplaner\naquaplaners\naquaplanes\naquaplaning\naquarelle\naquarellist\naquaria\naquarian\naquarians\naquarist\naquarists\naquarium\naquariums\naquarius\naquas\naquatic\naquatically\naquatics\naquatint\naquatinted\naquatinter\naquatinting\naquatintist\naquatints\naquavit\naqueduct\naqueducts\naqueous\naquiculture\naquifer\naquiferous\naquifers\naquila\naquilegia\naquiline\naquilinity\naquinas\naquitaine\naquiver\narab\narabesque\narabesques\narabia\narabian\narabians\narabic\narabicize\narabicized\narabicizes\narabicizing\narability\narabinose\narabist\narabists\narabization\narabize\narabized\narabizes\narabizing\narable\narables\narabs\naraby\narachne\narachnid\narachnidan\narachnidans\narachnids\narachnoid\narachnoids\narachnophobia\naragon\naragonese\naragonite\narak\naraks\naralia\naramaean\naramaic\narame\naramean\narapaho\narapahoe\narapahoes\narapahos\narapaima\narapaimas\nararat\naraucanian\naraucaria\narawak\narawakan\narawakans\narawaks\narbalest\narbalester\narbalests\narbalist\narbalists\narbiter\narbiters\narbitrable\narbitrage\narbitraged\narbitrager\narbitragers\narbitrages\narbitrageur\narbitrageurs\narbitraging\narbitral\narbitrament\narbitraments\narbitrarily\narbitrariness\narbitrary\narbitrate\narbitrated\narbitrates\narbitrating\narbitration\narbitrational\narbitrations\narbitrative\narbitrator\narbitrators\narbor\narboreal\narboreally\narboreous\narbores\narborescence\narborescent\narboreta\narboretum\narboretums\narboricultural\narboriculture\narboricultures\narborist\narborists\narborization\narborize\narborized\narborizes\narborizing\narbors\narborvitae\narboviral\narbovirology\narbovirus\narbutus\narbutuses\narc\narcade\narcaded\narcades\narcadia\narcadian\narcadians\narcadias\narcading\narcady\narcana\narcane\narcanum\narcanums\narccosine\narced\narch\narchaean\narchaeans\narchaeologic\narchaeological\narchaeologically\narchaeologist\narchaeologists\narchaeology\narchaeopteryx\narchaic\narchaically\narchaism\narchaisms\narchaist\narchaistic\narchaists\narchaize\narchaized\narchaizer\narchaizers\narchaizes\narchaizing\narchangel\narchangelic\narchangels\narchbishop\narchbishopric\narchbishoprics\narchbishops\narchconservative\narchconservatives\narchdeacon\narchdeaconate\narchdeaconries\narchdeaconry\narchdeacons\narchdeaconship\narchdiocesan\narchdiocese\narchdioceses\narchducal\narchduchess\narchduchesses\narchduchies\narchduchy\narchduke\narchdukes\narchean\narched\narchegonia\narchegonial\narchegoniate\narchegonium\narchencephalon\narchenemies\narchenemy\narchenteric\narchenteron\narcheological\narcheologically\narcheologist\narcheologists\narcheology\narcheozoic\narcher\narcherfish\narcherfishes\narcheries\narchers\narchery\narches\narchetypal\narchetypally\narchetype\narchetypes\narchetypical\narchetypically\narchfiend\narchfiends\narchidiaconal\narchidiaconate\narchidiaconates\narchiepiscopal\narchiepiscopality\narchiepiscopally\narchiepiscopate\narchiepiscopates\narchil\narchils\narchimandrite\narchimandrites\narchimedean\narchimedes\narchine\narchines\narching\narchipelagic\narchipelago\narchipelagoes\narchipelagos\narchitect\narchitectonic\narchitectonically\narchitectonics\narchitects\narchitectural\narchitecturally\narchitecture\narchitectures\narchitrave\narchitraves\narchival\narchive\narchived\narchives\narchiving\narchivist\narchivists\narchivolt\narchivolts\narchliberal\narchly\narchness\narchon\narchons\narchonship\narchonships\narchosaur\narchosaurs\narchpriest\narchrival\narchway\narchways\narciform\narcing\narcked\narcking\narco\narcs\narcsine\narctangent\narctic\narctically\narctics\narcturus\narcuate\narcuated\narcuately\narcuation\nardeb\nardebs\nardencies\nardency\nardennes\nardent\nardently\nardor\nardors\narduous\narduously\narduousness\nare\narea\nareal\nareally\nareas\nareaway\nareaways\nareca\narecas\naren\naren't\narena\narenaceous\narenas\narenicolous\nareola\nareolae\nareolar\nareolas\nareolate\nareolation\nareole\nareoles\nareopagite\nareopagites\nareopagitic\nareopagus\nares\narete\naretes\narethusa\narethusas\nargali\nargalis\nargent\nargentic\nargentiferous\nargentina\nargentine\nargentinean\nargentineans\nargentines\nargentinian\nargentinians\nargentite\nargentous\nargents\nargil\nargillaceous\nargillite\nargils\narginase\narginases\narginine\narginines\nargive\nargives\nargo\nargol\nargols\nargon\nargonaut\nargonauts\nargos\nargosies\nargosy\nargot\nargots\narguable\narguably\nargue\nargued\narguer\narguers\nargues\nargufied\nargufier\nargufiers\nargufies\nargufy\nargufying\narguing\nargument\nargumenta\nargumentation\nargumentative\nargumentatively\nargumentativeness\nargumentive\narguments\nargumentum\nargus\narguses\nargyle\nargyles\nargyll\nargylls\nargyrol\narhat\narhats\narhatship\naria\nariadne\narian\narianism\narians\narias\nariboflavinosis\narid\naridity\naridness\nariel\nariels\naries\narietta\nariettas\nariette\nariettes\naright\narikara\narikaras\naril\nariled\narillate\narils\narimathaea\narimathea\narioso\nariosos\nariosto\narise\narisen\narises\narising\narista\naristae\naristarchus\naristas\naristate\naristides\naristocracies\naristocracy\naristocrat\naristocratic\naristocratical\naristocratically\naristocrats\naristophanes\naristophanic\naristotelean\naristotelian\naristotelianism\naristotelians\naristotle\narithmetic\narithmetical\narithmetically\narithmetician\narithmeticians\narithmetics\narizona\narizonan\narizonans\narizonian\narizonians\nark\narkansan\narkansans\narkansas\narks\narkwright\narles\narm\narmada\narmadas\narmadillo\narmadillos\narmageddon\narmagh\narmament\narmamentaria\narmamentarium\narmamentariums\narmaments\narmature\narmatures\narmband\narmbands\narmchair\narmchairs\narmed\narmenia\narmenian\narmenians\narmentières\narmer\narmers\narmet\narmets\narmful\narmfuls\narmhole\narmholes\narmies\narmiger\narmigers\narming\narminian\narminianism\narminians\narminius\narmistice\narmistices\narmless\narmlet\narmlets\narmlike\narmload\narmloads\narmoire\narmoires\narmor\narmored\narmorer\narmorers\narmorial\narmorially\narmorials\narmories\narmoring\narmorless\narmors\narmory\narmpit\narmpits\narmrest\narmrests\narms\narmsful\narmstrong\narmy\narmyworm\narmyworms\narnatto\narnattos\narne\narnheim\narnhem\narnica\narnicas\narno\narnold\naroid\naroids\naroint\narointed\narointing\naroints\naroma\naromas\naromatherapies\naromatherapist\naromatherapists\naromatherapy\naromatic\naromatically\naromaticity\naromaticness\naromatics\naromatization\naromatize\naromatized\naromatizes\naromatizing\narose\naround\narousal\narousals\narouse\naroused\narouses\narousing\narpanet\narpeggio\narpeggios\narpent\narpents\narquebus\narquebuses\narracacha\narrack\narracks\narraign\narraigned\narraigner\narraigning\narraignment\narraignments\narraigns\narrange\narranged\narrangement\narrangements\narranger\narrangers\narranges\narranging\narrant\narrantly\narras\narray\narrayal\narrayals\narrayed\narrayer\narrayers\narraying\narrays\narrear\narrearage\narrears\narrest\narrestant\narrestants\narrested\narrestee\narrestees\narrester\narresters\narresting\narrestingly\narrestment\narrestments\narrestor\narrestors\narrests\narrhythmia\narrhythmias\narrhythmic\narrhythmically\narriba\narris\narrises\narrival\narrivals\narrive\narrived\narrivederci\narriver\narrivers\narrives\narriving\narriviste\narrière\narroba\narrobas\narrogance\narrogant\narrogantly\narrogate\narrogated\narrogates\narrogating\narrogation\narrogations\narrogative\narrogator\narrondissement\narrondissements\narrow\narrowed\narrowhead\narrowheads\narrowing\narrowroot\narrowroots\narrows\narrowwood\narrowworm\narrowworms\narrowy\narroyo\narroyos\narse\narsenal\narsenals\narsenate\narsenates\narsenic\narsenical\narsenide\narsenides\narsenious\narsenite\narsenites\narsenopyrite\narses\narshin\narshins\narsine\narsines\narsis\narson\narsonist\narsonists\narsonous\narsons\narsphenamine\nart\nartaxerxes\narte\nartel\nartels\nartemis\nartemisia\narterial\narterialization\narterialize\narterialized\narterializes\narterializing\narterially\narterials\narteries\narteriogram\narteriograms\narteriographic\narteriography\narteriolar\narteriole\narterioles\narterioloscleroses\narteriolosclerosis\narterioscleroses\narteriosclerosis\narteriosclerotic\narteriovenous\narteritis\nartery\nartesian\nartful\nartfully\nartfulness\narthralgia\narthralgic\narthritic\narthritically\narthritics\narthritides\narthritis\narthrodesis\narthrogram\narthrograms\narthrography\narthrogryposis\narthromere\narthromeric\narthropathy\narthropod\narthropodal\narthropodous\narthropods\narthroscope\narthroscopic\narthroscopically\narthroscopies\narthroscopy\narthroses\narthrosis\narthrospore\narthrotomy\narthur\narthurian\nartichoke\nartichokes\narticle\narticled\narticles\narticling\narticulable\narticulacy\narticular\narticularly\narticulate\narticulated\narticulately\narticulateness\narticulates\narticulating\narticulation\narticulations\narticulative\narticulator\narticulators\narticulatory\nartier\nartiest\nartifact\nartifacts\nartifactual\nartifice\nartificer\nartificers\nartifices\nartificial\nartificialities\nartificiality\nartificially\nartificialness\nartilleries\nartillerist\nartillerists\nartillery\nartilleryman\nartillerymen\nartily\nartiness\nartiodactyl\nartiodactylous\nartisan\nartisans\nartisanship\nartist\nartiste\nartistes\nartistic\nartistically\nartistry\nartists\nartless\nartlessly\nartlessness\nartois\narts\nartwork\nartworks\narty\naruba\narugula\narum\narums\narunachal\naryan\naryans\naryl\narytenoid\narytenoidal\narête\narêtes\nas\nasafetida\nasafetidas\nasafoetida\nasafoetidas\nasbestic\nasbestine\nasbestos\nasbestoses\nasbestosis\nasbestotic\nasbestus\nasbestuses\nascariasis\nascarid\nascarides\nascarids\nascaris\nascend\nascendable\nascendance\nascendancy\nascendant\nascendantly\nascendants\nascended\nascendence\nascendency\nascendent\nascendents\nascender\nascenders\nascendible\nascending\nascendingly\nascends\nascension\nascensional\nascensions\nascensive\nascent\nascents\nascertain\nascertainable\nascertainableness\nascertainably\nascertained\nascertaining\nascertainment\nascertainments\nascertains\nasceses\nascesis\nascetic\nascetical\nascetically\nasceticism\nascetics\nasci\nascidia\nascidian\nascidians\nascidiate\nascidiform\nascidium\nascii\nascites\nascitic\nascocarp\nascocarps\nascogonia\nascogonium\nascomycete\nascomycetes\nascomycetous\nascorbate\nascorbic\nascospore\nascosporic\nascosporous\nascot\nascots\nascribable\nascribe\nascribed\nascribes\nascribing\nascription\nascriptions\nascriptive\nascus\nasdic\nasdics\nasepalous\nasepses\nasepsis\naseptic\naseptically\nasepticism\nasexual\nasexuality\nasexualize\nasexualized\nasexualizes\nasexualizing\nasexually\nash\nashamed\nashamedly\nashanti\nashcan\nashcans\nashed\nashen\nasher\nashes\nasheville\nashier\nashiest\nashiness\nashing\nashlar\nashlars\nashless\nashore\nashram\nashrams\nashton\nashtoreth\nashtray\nashtrays\nashy\nasia\nasian\nasianization\nasians\nasiatic\nasiatics\naside\nasides\nasinine\nasininely\nasininity\nasinorum\nask\naskance\naskant\nasked\nasker\naskers\naskeses\naskesis\naskew\naskewness\nasking\nasks\naslant\nasleep\naslope\naslosh\nasmodeus\nasocial\nasp\nasparaginase\nasparagine\nasparagus\naspartame\naspartate\naspartic\naspartokinase\naspasia\naspect\naspects\naspectual\naspen\naspens\nasperate\nasperated\nasperates\nasperating\nasperges\naspergill\naspergilla\naspergilli\naspergillosis\naspergillum\naspergillums\naspergillus\nasperities\nasperity\nasperse\naspersed\nasperses\naspersing\naspersion\naspersions\nasphalt\nasphalted\nasphaltic\nasphalting\nasphaltite\nasphaltites\nasphalts\nasphaltum\naspheric\naspherical\nasphodel\nasphodels\nasphyxia\nasphyxiant\nasphyxiate\nasphyxiated\nasphyxiates\nasphyxiating\nasphyxiation\nasphyxiations\nasphyxiator\nasphyxiators\naspic\naspics\naspidistra\naspidistras\naspirant\naspirants\naspirate\naspirated\naspirates\naspirating\naspiration\naspirations\naspirator\naspirators\naspiratory\naspire\naspired\naspirer\naspirers\naspires\naspirin\naspiring\naspiringly\naspirins\nasps\nasquint\nass\nassagai\nassagais\nassai\nassail\nassailable\nassailableness\nassailant\nassailants\nassailed\nassailer\nassailers\nassailing\nassailment\nassails\nassais\nassam\nassassin\nassassinate\nassassinated\nassassinates\nassassinating\nassassination\nassassinations\nassassinative\nassassinator\nassassins\nassault\nassaulted\nassaulter\nassaulters\nassaulting\nassaultive\nassaultively\nassaultiveness\nassaults\nassay\nassayable\nassayed\nassayer\nassayers\nassaying\nassays\nassegai\nassegais\nassemblage\nassemblages\nassemblagist\nassemble\nassembled\nassembler\nassemblers\nassembles\nassemblies\nassembling\nassembly\nassemblyman\nassemblymen\nassemblywoman\nassemblywomen\nassent\nassentation\nassented\nassenter\nassenters\nassenting\nassentingly\nassentive\nassentiveness\nassentor\nassentors\nassents\nassert\nassertable\nasserted\nassertedly\nasserter\nasserters\nassertible\nasserting\nassertion\nassertional\nassertions\nassertive\nassertively\nassertiveness\nassertor\nassertors\nasserts\nasses\nassess\nassessable\nassessed\nassesses\nassessing\nassessment\nassessments\nassessor\nassessorial\nassessors\nasset\nassets\nasseverate\nasseverated\nasseverates\nasseverating\nasseveration\nasseverations\nasseverative\nasshole\nassholes\nassibilate\nassibilated\nassibilates\nassibilating\nassibilation\nassiduities\nassiduity\nassiduous\nassiduously\nassiduousness\nassign\nassignability\nassignable\nassignably\nassignat\nassignation\nassignational\nassignations\nassignats\nassigned\nassignee\nassignees\nassigner\nassigners\nassigning\nassignment\nassignments\nassignor\nassignors\nassigns\nassimilability\nassimilable\nassimilate\nassimilated\nassimilates\nassimilating\nassimilation\nassimilationism\nassimilationist\nassimilationists\nassimilations\nassimilative\nassimilator\nassimilators\nassimilatory\nassiniboin\nassiniboins\nassisi\nassist\nassistance\nassistant\nassistants\nassistantship\nassistantships\nassisted\nassister\nassisters\nassisting\nassists\nassize\nassizes\nassociability\nassociable\nassociableness\nassociate\nassociated\nassociates\nassociateship\nassociateships\nassociating\nassociation\nassociational\nassociationism\nassociationist\nassociationistic\nassociations\nassociative\nassociatively\nassociativity\nassoil\nassoiled\nassoiling\nassoilment\nassoils\nassonance\nassonances\nassonant\nassonantal\nassonants\nassort\nassortative\nassorted\nassorter\nassorters\nassorting\nassortment\nassortments\nassorts\nassuage\nassuaged\nassuagement\nassuagements\nassuages\nassuaging\nassuasive\nassumability\nassumable\nassumably\nassume\nassumed\nassumedly\nassumer\nassumers\nassumes\nassuming\nassumingly\nassumpsit\nassumption\nassumptions\nassumptive\nassumptively\nassurable\nassurance\nassurances\nassure\nassured\nassuredly\nassuredness\nassureds\nassurer\nassurers\nassures\nassurgency\nassurgent\nassuring\nassuror\nassurors\nassyria\nassyrian\nassyrians\nassyriological\nassyriologist\nassyriologists\nassyriology\nastarboard\nastarte\nastasia\nastasias\nastatic\nastatically\nastaticism\nastatine\nastatines\naster\nasteria\nasterias\nasteriated\nasterisk\nasterisked\nasterisking\nasteriskless\nasterisks\nasterism\nasterismal\nasterisms\nastern\nasternal\nasteroid\nasteroidal\nasteroids\nasters\nasthenia\nasthenic\nasthenics\nasthenopia\nasthenopic\nasthenosphere\nasthenospheric\nasthma\nasthmatic\nasthmatically\nasthmatics\nastigmatic\nastigmatically\nastigmatism\nastigmatisms\nastilbe\nastir\nastomatal\nastomatous\nastomous\nastonied\nastonish\nastonished\nastonishes\nastonishing\nastonishingly\nastonishment\nastonishments\nastor\nastoria\nastound\nastounded\nastounding\nastoundingly\nastounds\nastrachan\nastrachans\nastraddle\nastragal\nastragalar\nastragali\nastragals\nastragalus\nastrakhan\nastrakhans\nastral\nastrally\nastraphobia\nastray\nastrictive\nastride\nastringency\nastringent\nastringently\nastringents\nastrionics\nastrobiological\nastrobiologist\nastrobiologists\nastrobiology\nastrochemist\nastrochemistry\nastrocyte\nastrocytic\nastrocytoma\nastrocytomas\nastrocytomata\nastrodome\nastrodomes\nastrodynamic\nastrodynamics\nastrogate\nastrogated\nastrogates\nastrogating\nastrogation\nastrogator\nastrogeologist\nastrogeology\nastrolabe\nastrolabes\nastrologer\nastrologers\nastrologic\nastrological\nastrologically\nastrology\nastrometric\nastrometrical\nastrometry\nastronaut\nastronautic\nastronautical\nastronautically\nastronautics\nastronauts\nastronavigation\nastronavigator\nastronomer\nastronomers\nastronomic\nastronomical\nastronomically\nastronomy\nastrophotographer\nastrophotographers\nastrophotographic\nastrophotography\nastrophysical\nastrophysicist\nastrophysicists\nastrophysics\nastrosphere\nasturian\nasturians\nasturias\nastute\nastutely\nastuteness\nastyanax\nastylar\nasuncion\nasunción\nasunder\naswan\naswarm\naswirl\naswoon\nasylum\nasylums\nasymmetric\nasymmetrical\nasymmetrically\nasymmetries\nasymmetry\nasymptomatic\nasymptomatically\nasymptote\nasymptotes\nasymptotic\nasymptotical\nasymptotically\nasynapsis\nasynchronism\nasynchronous\nasynchronously\nasynchrony\nasyndetic\nasyndetically\nasyndeton\nasyntactic\nat\natalanta\nataman\natamans\natamasco\natapuerca\nataractic\nataraxia\nataraxias\nataraxic\nataraxics\nataturk\natavism\natavisms\natavist\natavistic\natavistically\natavists\nataxia\nataxias\nataxic\nataxics\nataxies\nataxy\nate\natelectasis\natelier\nateliers\natemoya\natemporal\nathabascan\nathabaskan\nathanasian\nathanasius\natheism\natheist\natheistic\natheistical\natheistically\natheists\natheling\nathelings\nathelstan\nathena\nathenaeum\nathenaeums\natheneum\natheneums\nathenian\nathenians\nathens\natheoretical\natherogenesis\natherogenic\natherogenicity\natheroma\natheromas\natheromata\natheromatosis\natheromatous\natheroscleroses\natherosclerosis\natherosclerotic\natherosclerotically\nathirst\nathlete\nathletes\nathletic\nathletically\nathleticism\nathletics\nathodyd\nathodyds\nathos\nathwart\nathwartship\natilt\natingle\nation\natlanta\natlantan\natlantes\natlantic\natlanticism\natlanticist\natlantis\natlas\natlases\natlatl\natlatls\natman\natmans\natmometer\natmometers\natmometric\natmometry\natmosphere\natmospheres\natmospheric\natmospherically\natmospherics\natmospherium\natoll\natolls\natom\natomic\natomically\natomicity\natomies\natomism\natomisms\natomist\natomistic\natomistical\natomistically\natomists\natomization\natomize\natomized\natomizer\natomizers\natomizes\natomizing\natoms\natomy\natonable\natonal\natonalism\natonalist\natonalistic\natonalities\natonality\natonally\natone\natoneable\natoned\natonement\natonements\natoner\natoners\natones\natonic\natonicity\natonics\natonies\natoning\natony\natop\natopic\natopies\natopy\natoxic\natrabilious\natrabiliousness\natrazine\natrazines\natremble\natresia\natresias\natresic\natreus\natria\natrial\natrioventricular\natrip\natrium\natriums\natrocious\natrociously\natrociousness\natrocities\natrocity\natrophic\natrophied\natrophies\natrophy\natrophying\natropine\natropines\natropins\nattaboy\nattach\nattachable\nattached\nattacher\nattachers\nattaches\nattaching\nattachment\nattachments\nattaché\nattachés\nattack\nattacked\nattacker\nattackers\nattacking\nattackman\nattackmen\nattacks\nattain\nattainability\nattainable\nattainableness\nattainably\nattainder\nattainders\nattained\nattaining\nattainment\nattainments\nattains\nattaint\nattainted\nattainting\nattaints\nattar\nattars\nattelet\nattempt\nattemptable\nattempted\nattempter\nattempters\nattempting\nattempts\nattend\nattendance\nattendances\nattendant\nattendantly\nattendants\nattended\nattendee\nattendees\nattender\nattenders\nattending\nattends\nattention\nattentional\nattentions\nattentive\nattentively\nattentiveness\nattenuate\nattenuated\nattenuates\nattenuating\nattenuation\nattenuations\nattenuator\nattenuators\nattest\nattestant\nattestation\nattestations\nattested\nattester\nattesters\nattesting\nattestor\nattestors\nattests\nattic\nattica\natticism\natticisms\nattics\natticus\nattila\nattire\nattired\nattires\nattiring\nattitude\nattitudes\nattitudinal\nattitudinize\nattitudinized\nattitudinizes\nattitudinizing\nattoampere\nattoamperes\nattobecquerel\nattobecquerels\nattocandela\nattocandelas\nattocoulomb\nattocoulombs\nattofarad\nattofarads\nattogram\nattograms\nattohenries\nattohenry\nattohenrys\nattohertz\nattojoule\nattojoules\nattokelvin\nattokelvins\nattolumen\nattolumens\nattolux\nattometer\nattometers\nattomole\nattomoles\nattonewton\nattonewtons\nattoohm\nattoohms\nattopascal\nattopascals\nattoradian\nattoradians\nattorn\nattorned\nattorney\nattorneys\nattorneyship\nattorning\nattornment\nattorns\nattosecond\nattoseconds\nattosiemens\nattosievert\nattosieverts\nattosteradian\nattosteradians\nattotesla\nattoteslas\nattovolt\nattovolts\nattowatt\nattowatts\nattoweber\nattowebers\nattract\nattractable\nattractant\nattractants\nattracted\nattracter\nattracting\nattraction\nattractions\nattractive\nattractively\nattractiveness\nattractor\nattractors\nattracts\nattributable\nattribute\nattributed\nattributer\nattributers\nattributes\nattributing\nattribution\nattributional\nattributions\nattributive\nattributively\nattributiveness\nattributives\nattributor\nattrit\nattrite\nattrited\nattrites\nattriting\nattrition\nattritional\nattrits\nattritted\nattritting\nattune\nattuned\nattunement\nattunements\nattunes\nattuning\natwitter\natypical\natypicality\natypically\nau\naubade\naubades\nauberge\nauberges\naubergine\naubergines\nauburn\nauburns\naubusson\nauckland\nauction\nauctioned\nauctioneer\nauctioneered\nauctioneering\nauctioneers\nauctioning\nauctions\nauctorial\naucuba\naudacious\naudaciously\naudaciousness\naudacities\naudacity\nauden\naudi\naudial\naudibility\naudible\naudibleness\naudibles\naudibly\naudience\naudiences\naudile\naudiles\nauding\naudings\naudio\naudiocassette\naudiogenic\naudiogram\naudiograms\naudiological\naudiologist\naudiologists\naudiology\naudiometer\naudiometers\naudiometric\naudiometry\naudiophile\naudiophiles\naudios\naudiotape\naudiotaped\naudiotapes\naudiotaping\naudiotyping\naudiotypist\naudiotypists\naudiovisual\naudiovisuals\naudit\nauditable\naudited\nauditing\naudition\nauditioned\nauditioning\nauditions\nauditive\nauditor\nauditoria\nauditorium\nauditoriums\nauditors\nauditory\naudits\naudubon\nauf\naufklarung\naufklärung\naugean\naugend\naugends\nauger\naugers\naught\naughts\naugite\naugites\naugitic\naugment\naugmentable\naugmentation\naugmentations\naugmentative\naugmented\naugmenter\naugmenters\naugmenting\naugmentor\naugmentors\naugments\naugsburg\naugur\naugural\naugured\nauguries\nauguring\naugurs\naugury\naugust\naugusta\naugustan\naugustans\naugustine\naugustinian\naugustinianism\naugustinians\naugustinism\naugustly\naugustness\naugusts\naugustus\nauk\nauklet\nauklets\nauks\nauld\naunt\naunthood\naunthoods\nauntie\naunties\nauntlike\nauntly\naunts\naura\naurae\naural\naurally\naurar\nauras\naureate\naureately\naureateness\naurei\naurelian\naurelius\naureola\naureolas\naureole\naureoles\naureomycin\naureus\nauric\nauricle\nauricled\nauricles\nauricula\nauriculae\nauricular\nauricularly\nauriculas\nauriculate\nauriculately\nauriferous\nauriform\nauriga\naurochs\naurora\nauroral\naurorally\nauroras\naurorean\naurous\naurum\nauschwitz\nauscultate\nauscultated\nauscultates\nauscultating\nauscultation\nauscultations\nauscultative\nauscultatory\nausform\nausformed\nausforming\nausforms\nauslander\nauspex\nauspicate\nauspicated\nauspicates\nauspicating\nauspice\nauspices\nauspicious\nauspiciously\nauspiciousness\naussie\naussies\nausten\naustenite\naustenitic\naustere\nausterely\naustereness\nausterer\nausterest\nausterities\nausterity\nausterlitz\naustin\naustral\naustralasia\naustralasian\naustrales\naustralia\naustralian\naustralians\naustralis\naustraloid\naustralopithecine\naustralopithecus\naustria\naustrian\naustrians\naustro\nautacoid\nautacoidal\nautacoids\nautarch\nautarchic\nautarchical\nautarchies\nautarchy\nautarkic\nautarkical\nautarkies\nautarky\nautecological\nautecology\nauteur\nauteurism\nauteurist\nauteurs\nauthentic\nauthentically\nauthenticate\nauthenticated\nauthenticates\nauthenticating\nauthentication\nauthentications\nauthenticator\nauthenticators\nauthenticity\nauthor\nauthored\nauthoress\nauthoresses\nauthorial\nauthoring\nauthoritarian\nauthoritarianism\nauthoritarians\nauthoritative\nauthoritatively\nauthoritativeness\nauthorities\nauthority\nauthorization\nauthorizations\nauthorize\nauthorized\nauthorizer\nauthorizers\nauthorizes\nauthorizing\nauthors\nauthorship\nautism\nautist\nautistic\nautistically\nauto\nautoantibody\nautobahn\nautobahns\nautobiographer\nautobiographers\nautobiographic\nautobiographical\nautobiographically\nautobiographies\nautobiography\nautobus\nautobuses\nautobusses\nautocatalyses\nautocatalysis\nautocatalytic\nautocatalytically\nautocephalous\nautochthon\nautochthones\nautochthonism\nautochthonous\nautochthonously\nautochthons\nautochthony\nautoclave\nautoclaved\nautoclaves\nautoclaving\nautocollimator\nautocollimators\nautocorrelation\nautocracies\nautocracy\nautocrat\nautocratic\nautocratical\nautocratically\nautocrats\nautocross\nautodidact\nautodidactic\nautodidacts\nautodyne\nautodynes\nautoecious\nautoeciously\nautoecism\nautoed\nautoerotic\nautoeroticism\nautoerotism\nautofocus\nautofocuses\nautogamic\nautogamies\nautogamous\nautogamy\nautogeneses\nautogenesis\nautogenetic\nautogenetically\nautogenic\nautogenies\nautogenous\nautogenously\nautogeny\nautogiro\nautogiros\nautograft\nautografted\nautografting\nautografts\nautograph\nautographed\nautographic\nautographical\nautographically\nautographing\nautographs\nautography\nautogyro\nautogyros\nautoharp\nautohypnosis\nautohypnotic\nautoimmune\nautoimmunities\nautoimmunity\nautoimmunization\nautoinfection\nautoinfections\nautoing\nautoinoculable\nautoinoculation\nautointoxication\nautoloader\nautoloaders\nautoloading\nautologous\nautolycus\nautolysate\nautolysin\nautolysis\nautolytic\nautolyze\nautolyzed\nautolyzes\nautolyzing\nautomaker\nautomakers\nautomat\nautomata\nautomatable\nautomate\nautomated\nautomates\nautomatic\nautomatically\nautomaticity\nautomatics\nautomating\nautomation\nautomations\nautomatism\nautomatist\nautomative\nautomatization\nautomatize\nautomatized\nautomatizes\nautomatizing\nautomaton\nautomatons\nautomatous\nautomats\nautomobile\nautomobiles\nautomobilist\nautomobilists\nautomorphism\nautomorphisms\nautomotive\nautonomic\nautonomically\nautonomies\nautonomist\nautonomists\nautonomous\nautonomously\nautonomy\nautopen\nautophagy\nautopiler\nautopilot\nautopilots\nautoplastic\nautoplastically\nautoplasty\nautopolyploid\nautopolyploidy\nautopsic\nautopsical\nautopsied\nautopsies\nautopsist\nautopsy\nautopsying\nautoradiogram\nautoradiograms\nautoradiograph\nautoradiographic\nautoradiography\nautorotate\nautorotated\nautorotates\nautorotating\nautorotation\nautoroute\nautos\nautosensor\nautosexing\nautosomal\nautosomally\nautosome\nautosomes\nautostrada\nautostradas\nautosuggest\nautosuggested\nautosuggestibility\nautosuggestible\nautosuggesting\nautosuggestion\nautosuggestive\nautosuggests\nautotelic\nautotetraploid\nautotetraploids\nautotetraploidy\nautotomic\nautotomies\nautotomize\nautotomized\nautotomizes\nautotomizing\nautotomous\nautotomy\nautotoxemia\nautotoxic\nautotoxin\nautotransformer\nautotroph\nautotrophic\nautotrophically\nautotrophy\nautoworker\nautre\nautumn\nautumnal\nautumnally\nautumns\nautunite\nautunites\nauvergne\naux\nauxesis\nauxetic\nauxetically\nauxiliaries\nauxiliary\nauxin\nauxinic\nauxinically\nauxins\nauxotroph\nauxotrophic\nauxotrophy\navail\navailability\navailable\navailableness\navailably\navailed\navailing\navailingly\navails\navalanche\navalanched\navalanches\navalanching\navalon\navant\navarice\navaricious\navariciously\navariciousness\navascular\navascularity\navast\navatar\navatars\navaunt\nave\navellan\navellane\navenge\navenged\navenger\navengers\navenges\navenging\navengingly\navens\naventail\naventails\naventine\naventurine\navenue\navenues\naver\naverage\naveraged\naveragely\naverageness\naverages\naveraging\naverment\naverments\navernus\naverrable\naverred\naverring\navers\naverse\naversely\naverseness\naversion\naversions\naversive\naversively\naversiveness\navert\navertable\naverted\navertible\naverting\naverts\naves\navesta\navgas\navgases\navgasses\navian\naviaries\naviarist\naviarists\naviary\naviate\naviated\naviates\naviating\naviation\naviator\naviators\naviatrices\naviatrix\naviatrixes\naviculture\naviculturist\navid\navidin\navidins\navidities\navidity\navidly\navidness\navifauna\navifaunal\navifaunas\navignon\navila\navion\navionic\navionics\navirulence\navirulent\navis\navises\navitaminoses\navitaminosis\navitaminotic\naviv\navo\navocado\navocadoes\navocados\navocation\navocational\navocationally\navocations\navocet\navocets\navogadro\navoid\navoidable\navoidably\navoidance\navoidances\navoided\navoider\navoiders\navoiding\navoids\navoirdupois\navon\navos\navouch\navouched\navouches\navouching\navouchment\navouchments\navow\navowable\navowably\navowal\navowals\navowed\navowedly\navower\navowers\navowing\navows\navulse\navulsed\navulses\navulsing\navulsion\navulsions\navuncular\naw\nawait\nawaited\nawaiting\nawaits\nawake\nawaked\nawaken\nawakened\nawakener\nawakeners\nawakening\nawakenings\nawakens\nawakes\nawaking\naward\nawardable\nawarded\nawardee\nawardees\nawarder\nawarders\nawarding\nawards\naware\nawareness\nawash\naway\nawayness\nawe\naweary\naweather\nawed\naweigh\naweless\nawes\nawesome\nawesomely\nawesomeness\nawestricken\nawestruck\nawful\nawfully\nawfulness\nawhile\nawhirl\nawing\nawkward\nawkwardly\nawkwardness\nawl\nawless\nawls\nawn\nawned\nawning\nawninged\nawnings\nawnless\nawns\nawoke\nawoken\nawry\nax\naxe\naxed\naxel\naxels\naxenic\naxenically\naxes\naxial\naxiality\naxially\naxil\naxile\naxilla\naxillae\naxillar\naxillaries\naxillars\naxillary\naxils\naxing\naxiological\naxiologically\naxiologist\naxiology\naxiom\naxiomatic\naxiomatically\naxiomatization\naxiomatizations\naxiomatize\naxiomatized\naxiomatizes\naxiomatizing\naxioms\naxis\naxisymmetric\naxisymmetrical\naxisymmetrically\naxisymmetry\naxle\naxles\naxletree\naxletrees\naxman\naxmen\naxminster\naxolotl\naxolotls\naxon\naxonal\naxone\naxonemal\naxoneme\naxones\naxonometric\naxons\naxoplasm\naxoplasmic\naxoplasms\nay\nayah\nayahs\nayatollah\nayatollahs\naye\nayers\nayes\nayin\nayins\nazalea\nazaleas\nazathioprine\nazeotrope\nazeotropic\nazeotropy\nazerbaijan\nazerbaijani\nazerbaijanis\nazide\nazides\nazido\nazidothymidine\nazimuth\nazimuthal\nazimuthally\nazimuths\nazine\nazines\nazo\nazoic\nazole\nazoles\nazonal\nazonic\nazorean\nazores\nazorian\nazotemia\nazotemias\nazotemic\nazoth\nazoths\nazotobacter\nazoturia\nazoturias\naztec\naztecan\naztecs\nazure\nazures\nazurite\nazurites\nazygos\nazygoses\nazygous\naîné\naînée\nañu\nb\nbaa\nbaaed\nbaaing\nbaal\nbaalbek\nbaalim\nbaalism\nbaals\nbaas\nbaba\nbabar\nbabas\nbabassu\nbabassus\nbabbage\nbabbitt\nbabbittry\nbabbitts\nbabble\nbabbled\nbabblement\nbabbler\nbabblers\nbabbles\nbabbling\nbabcock\nbabe\nbabel\nbabels\nbabes\nbabesbabel\nbabesia\nbabesias\nbabesiosis\nbabied\nbabier\nbabies\nbabiest\nbabirusa\nbabirusas\nbabka\nbabkas\nbaboo\nbaboon\nbaboonery\nbaboonish\nbaboons\nbaboos\nbabu\nbabul\nbabuls\nbabus\nbabushka\nbabushkas\nbaby\nbabyhood\nbabying\nbabyish\nbabylon\nbabylonia\nbabylonian\nbabylonians\nbabysat\nbabysitter\nbabysitters\nbabysitting\nbaccalaureate\nbaccalaureates\nbaccarat\nbaccate\nbacchanal\nbacchanalia\nbacchanalian\nbacchanalians\nbacchanalias\nbacchanals\nbacchant\nbacchante\nbacchantes\nbacchantic\nbacchants\nbacchic\nbacchus\nbach\nbached\nbachelor\nbachelor's\nbachelorhood\nbachelorhoods\nbachelors\nbachelorship\nbaches\nbaching\nbacillar\nbacillary\nbacilli\nbacillus\nbacitracin\nback\nbackache\nbackaches\nbackbeat\nbackbeats\nbackbencher\nbackbenchers\nbackbend\nbackbends\nbackbit\nbackbite\nbackbiter\nbackbiters\nbackbites\nbackbiting\nbackbitten\nbackboard\nbackboards\nbackbone\nbackboned\nbackbones\nbackbreaker\nbackbreakers\nbackbreaking\nbackcloth\nbackcountry\nbackcourt\nbackcourtman\nbackcourtmen\nbackcross\nbackcrossed\nbackcrosses\nbackcrossing\nbackdate\nbackdated\nbackdates\nbackdating\nbackdoor\nbackdoors\nbackdrop\nbackdrops\nbacked\nbackelordom\nbacker\nbackers\nbackfield\nbackfields\nbackfill\nbackfilled\nbackfilling\nbackfills\nbackfire\nbackfired\nbackfires\nbackfiring\nbackgammon\nbackground\nbackgrounder\nbackgrounders\nbackgrounds\nbackhand\nbackhanded\nbackhandedly\nbackhandedness\nbackhander\nbackhanders\nbackhanding\nbackhands\nbackhoe\nbackhoes\nbackhouse\nbackhouses\nbacking\nbackings\nbacklash\nbacklashed\nbacklasher\nbacklashers\nbacklashes\nbacklashing\nbackless\nbacklight\nbacklighted\nbacklighting\nbacklights\nbacklist\nbacklisted\nbacklisting\nbacklists\nbacklit\nbacklog\nbacklogged\nbacklogging\nbacklogs\nbackorder\nbackorders\nbackpack\nbackpacked\nbackpacker\nbackpackers\nbackpacking\nbackpacks\nbackpedal\nbackpedaled\nbackpedaling\nbackpedalled\nbackpedalling\nbackpedals\nbackpressure\nbackpressures\nbackquote\nbackquotes\nbackrest\nbackrests\nbackroom\nbackrooms\nbackrush\nbackrushes\nbacks\nbacksaw\nbacksaws\nbackscatter\nbackscattered\nbackscattering\nbackscatters\nbackseat\nbackseats\nbackset\nbacksets\nbackshore\nbackshores\nbackside\nbacksides\nbackslap\nbackslapped\nbackslapper\nbackslappers\nbackslapping\nbackslaps\nbackslash\nbackslashes\nbackslid\nbackslidden\nbackslide\nbackslider\nbacksliders\nbackslides\nbacksliding\nbackspace\nbackspaced\nbackspaces\nbackspacing\nbackspin\nbackspins\nbackstab\nbackstabbed\nbackstabber\nbackstabbers\nbackstabbing\nbackstabs\nbackstage\nbackstairs\nbackstay\nbackstays\nbackstitch\nbackstitched\nbackstitches\nbackstitching\nbackstop\nbackstopped\nbackstopping\nbackstops\nbackstretch\nbackstretches\nbackstroke\nbackstrokeer\nbackstrokeers\nbackstrokes\nbackstroking\nbackswept\nbackswimmer\nbackswimmers\nbackswing\nbackswings\nbacksword\nbackswords\nbacktrace\nbacktrack\nbacktracked\nbacktracking\nbacktracks\nbackup\nbackups\nbackward\nbackwardly\nbackwardness\nbackwards\nbackwash\nbackwashes\nbackwater\nbackwaters\nbackwoods\nbackwoodsman\nbackwoodsmen\nbackyard\nbackyards\nbacon\nbaconian\nbaconians\nbacons\nbacteremia\nbacteremic\nbacteremically\nbacteria\nbacterial\nbacterially\nbactericidal\nbactericidally\nbactericide\nbactericides\nbacterin\nbacterins\nbacteriocin\nbacteriocins\nbacteriogenic\nbacteriologic\nbacteriological\nbacteriologically\nbacteriologist\nbacteriologists\nbacteriology\nbacteriolyses\nbacteriolysis\nbacteriolytic\nbacteriophage\nbacteriophages\nbacteriophagic\nbacteriophagy\nbacteriorhodopsin\nbacteriorhodopsins\nbacterioscopy\nbacteriostases\nbacteriostasis\nbacteriostat\nbacteriostatic\nbacteriostats\nbacterium\nbacteriuria\nbacterization\nbacterizations\nbacterize\nbacterized\nbacterizes\nbacterizing\nbacteroid\nbactria\nbactrian\nbaculiform\nbad\nbadajoz\nbadass\nbadasses\nbaddie\nbaddies\nbaddy\nbade\nbaden\nbadge\nbadged\nbadger\nbadgered\nbadgering\nbadgers\nbadges\nbadging\nbadinage\nbadinages\nbadland\nbadlands\nbadly\nbadman\nbadmen\nbadminton\nbadmouth\nbadmouthed\nbadmouthing\nbadmouths\nbadness\nbaedeker\nbaedekers\nbael\nbaels\nbaffin\nbaffle\nbaffled\nbafflegabs\nbafflement\nbafflements\nbaffler\nbafflers\nbaffles\nbaffling\nbafflingly\nbag\nbagasse\nbagasses\nbagatelle\nbagatelles\nbagehot\nbagel\nbagels\nbagful\nbagfuls\nbaggage\nbagged\nbagger\nbaggers\nbaggier\nbaggiest\nbaggily\nbagginess\nbagging\nbaggings\nbaggy\nbaghdad\nbaglike\nbagman\nbagmen\nbagnio\nbagnios\nbagpipe\nbagpiper\nbagpipers\nbagpipes\nbags\nbagsful\nbaguette\nbaguettes\nbagwig\nbagwigs\nbagworm\nbagworms\nbah\nbahama\nbahaman\nbahamas\nbahamian\nbahamians\nbahawalpur\nbahrain\nbahraini\nbahrainis\nbaht\nbahts\nbail\nbailable\nbailed\nbailee\nbailees\nbailer\nbailers\nbailey\nbaileys\nbailie\nbailies\nbailiff\nbailiffs\nbailiffship\nbailing\nbailiwick\nbailiwicks\nbailment\nbailments\nbailor\nbailors\nbailout\nbailouts\nbails\nbailsman\nbailsmen\nbaird\nbairn\nbairns\nbait\nbaited\nbaiter\nbaiters\nbaiting\nbaits\nbaiza\nbaizas\nbaize\nbaizes\nbake\nbaked\nbakelite\nbaker\nbakeries\nbakers\nbakersfield\nbakery\nbakes\nbakeshop\nbakeshops\nbaking\nbaklava\nbaklavas\nbaksheesh\nbalaam\nbalaclava\nbalaclavas\nbalalaika\nbalalaikas\nbalance\nbalanced\nbalancer\nbalancers\nbalances\nbalancing\nbalas\nbalases\nbalata\nbalatas\nbalboa\nbalboas\nbalbriggan\nbalconies\nbalcony\nbald\nbaldachin\nbaldachins\nbalder\nbalderdash\nbaldest\nbaldhead\nbaldheaded\nbaldheads\nbalding\nbaldish\nbaldly\nbaldness\nbaldpate\nbaldpates\nbaldric\nbaldrics\nbaldwin\nbaldwins\nbale\nbalearic\nbalearics\nbaled\nbaleen\nbaleens\nbalefire\nbalefires\nbaleful\nbalefully\nbalefulness\nbaler\nbalers\nbales\nbalfour\nbali\nbalinese\nbaling\nbalk\nbalkan\nbalkanization\nbalkanize\nbalkanized\nbalkanizes\nbalkanizing\nbalkans\nbalked\nbalker\nbalkers\nbalkier\nbalkiest\nbalkiness\nbalking\nbalkline\nbalklines\nbalks\nbalky\nball\nballad\nballade\nballadeer\nballadeers\nballades\nballadic\nballadist\nballadists\nballadry\nballads\nballantyne\nballarat\nballast\nballasted\nballasting\nballasts\nballcarrier\nballcarriers\nballed\nballerina\nballerinas\nballet\nballetic\nballetomane\nballetomanes\nballetomania\nballets\nballflower\nballflowers\nballgame\nballgames\nballing\nballista\nballistae\nballistic\nballistically\nballistician\nballisticians\nballistics\nballistocardiogram\nballistocardiograms\nballistocardiograph\nballistocardiographs\nballistocardiography\nballon\nballonet\nballonets\nballons\nballoon\nballooned\nballooning\nballoonist\nballoonists\nballoons\nballot\nballoted\nballoter\nballoters\nballoting\nballots\nballottement\nballottements\nballpark\nballparks\nballplayer\nballplayers\nballpoint\nballpoints\nballroom\nballrooms\nballs\nballsier\nballsiest\nballsy\nbally\nballyhoo\nballyhooed\nballyhooing\nballyhoos\nballyrag\nballyragged\nballyragging\nballyrags\nbalm\nbalmacaan\nbalmacaans\nbalmier\nbalmiest\nbalmily\nbalminess\nbalmoral\nbalmorals\nbalms\nbalmy\nbalneal\nbalneology\nbaloney\nbaloneys\nbalsa\nbalsam\nbalsamic\nbalsamroot\nbalsamroots\nbalsams\nbalsas\nbalsasbalsa\nbalt\nbalthazar\nbaltic\nbaltimore\nbaltimorean\nbaltimoreans\nbalts\nbaluchi\nbaluchis\nbaluchistan\nbaluchithere\nbaluchitheres\nbaluster\nbalusters\nbalustrade\nbalustrades\nbalzac\nbam\nbamako\nbambara\nbambini\nbambino\nbambinos\nbamboo\nbamboos\nbamboozle\nbamboozled\nbamboozlement\nbamboozler\nbamboozlers\nbamboozles\nbamboozling\nban\nbanach\nbanal\nbanalities\nbanality\nbanalize\nbanalized\nbanalizes\nbanalizing\nbanally\nbanana\nbananas\nbanausic\nbanco\nbancos\nbancroft\nband\nbanda\nbandage\nbandaged\nbandager\nbandagers\nbandages\nbandaging\nbandana\nbandanas\nbandanna\nbandannas\nbandbox\nbandboxes\nbandeau\nbandeaus\nbandeaux\nbanded\nbander\nbanderilla\nbanderillas\nbanderillero\nbanderilleros\nbanderol\nbanderole\nbanderoles\nbanderols\nbanders\nbandicoot\nbandicoots\nbandied\nbandies\nbanding\nbandings\nbandit\nbanditry\nbandits\nbanditti\nbandjarmasin\nbandleader\nbandleaders\nbandmaster\nbandmasters\nbandog\nbandogs\nbandoleer\nbandoleers\nbandolier\nbandoliers\nbandoneon\nbandoneonist\nbandoneonists\nbandoneons\nbandora\nbandoras\nbandore\nbandores\nbands\nbandsman\nbandsmen\nbandstand\nbandstands\nbandwagon\nbandwagoning\nbandwagons\nbandwidth\nbandwidths\nbandy\nbandying\nbane\nbaneberries\nbaneberry\nbaneful\nbanefully\nbanes\nbang\nbangalore\nbanged\nbanger\nbangers\nbanging\nbangkok\nbangkoks\nbangladesh\nbangladeshi\nbangladeshis\nbangle\nbangles\nbangor\nbangs\nbangtail\nbangtails\nbangui\nbani\nbaning\nbanish\nbanished\nbanisher\nbanishers\nbanishes\nbanishing\nbanishment\nbanishments\nbanister\nbanisters\nbanjo\nbanjoes\nbanjoist\nbanjoists\nbanjos\nbank\nbankability\nbankable\nbankbook\nbankbooks\nbankcard\nbankcards\nbanked\nbanker\nbankerly\nbankers\nbanking\nbankings\nbanknote\nbanknotes\nbankroll\nbankrolled\nbankroller\nbankrollers\nbankrolling\nbankrolls\nbankrupt\nbankruptcies\nbankruptcy\nbankrupted\nbankrupting\nbankruptive\nbankrupts\nbanks\nbanksia\nbanksias\nbankside\nbanksides\nbanned\nbanner\nbannered\nbanneret\nbannerets\nbannerette\nbannerettes\nbannering\nbannerol\nbannerols\nbanners\nbanning\nbannister\nbannisters\nbannock\nbannocks\nbanns\nbanquet\nbanqueted\nbanqueter\nbanqueters\nbanqueting\nbanquets\nbanquette\nbanquettes\nbanquo\nbans\nbanshee\nbanshees\nbanshie\nbanshies\nbantam\nbantams\nbantamweight\nbantamweights\nbanter\nbantered\nbanterer\nbanterers\nbantering\nbanteringly\nbanters\nbantling\nbantlings\nbantu\nbantus\nbantustan\nbantustans\nbanyan\nbanyans\nbanzai\nbanzais\nbaobab\nbaobabs\nbaptisia\nbaptisias\nbaptism\nbaptismal\nbaptismally\nbaptisms\nbaptist\nbaptisteries\nbaptistery\nbaptistries\nbaptistry\nbaptists\nbaptize\nbaptized\nbaptizer\nbaptizers\nbaptizes\nbaptizing\nbar\nbarabbas\nbarathea\nbaratheas\nbarb\nbarbadian\nbarbadians\nbarbados\nbarbara\nbarbarian\nbarbarianism\nbarbarians\nbarbaric\nbarbarically\nbarbarism\nbarbarisms\nbarbarities\nbarbarity\nbarbarization\nbarbarize\nbarbarized\nbarbarizes\nbarbarizing\nbarbarossa\nbarbarous\nbarbarously\nbarbarousness\nbarbary\nbarbasco\nbarbascos\nbarbate\nbarbe\nbarbecue\nbarbecued\nbarbecuer\nbarbecuers\nbarbecues\nbarbecuing\nbarbed\nbarbedness\nbarbel\nbarbell\nbarbellate\nbarbells\nbarbels\nbarber\nbarbered\nbarbering\nbarberries\nbarberry\nbarbers\nbarbershop\nbarbershops\nbarbes\nbarbet\nbarbets\nbarbette\nbarbettes\nbarbican\nbarbicans\nbarbicel\nbarbicels\nbarbing\nbarbirolli\nbarbital\nbarbitals\nbarbitone\nbarbitones\nbarbiturate\nbarbiturates\nbarbituric\nbarbizon\nbarbs\nbarbuda\nbarbudan\nbarbudans\nbarbule\nbarbules\nbarbwire\nbarbwires\nbarca\nbarcarole\nbarcaroles\nbarcas\nbarcelona\nbarclay\nbarcode\nbarcodes\nbard\nbardacious\nbarde\nbarded\nbardes\nbardic\nbarding\nbardolino\nbardolinos\nbards\nbare\nbareback\nbarebacked\nbared\nbarefaced\nbarefacedly\nbarefacedness\nbarefoot\nbarefooted\nbarege\nbareges\nbarehanded\nbarehandedness\nbareheaded\nbarelegged\nbareleggedness\nbarely\nbareness\nbarents\nbarer\nbares\nbarest\nbarf\nbarfed\nbarfing\nbarflies\nbarfly\nbarfs\nbargain\nbargained\nbargainer\nbargainers\nbargaining\nbargains\nbarge\nbargeboard\nbargeboards\nbarged\nbargee\nbargees\nbargello\nbargellos\nbargeman\nbargemen\nbarges\nbarghest\nbarghests\nbarging\nbargirl\nbargirls\nbarhop\nbarhoping\nbarhopped\nbarhops\nbari\nbariatric\nbariatrician\nbariatricians\nbariatrics\nbaric\nbarilla\nbarillas\nbaring\nbarite\nbarites\nbaritonal\nbaritone\nbaritones\nbarium\nbark\nbarked\nbarkeep\nbarkeeper\nbarkeepers\nbarkeeps\nbarkentine\nbarkentines\nbarker\nbarkers\nbarkier\nbarkiest\nbarking\nbarkless\nbarks\nbarky\nbarley\nbarleycorn\nbarleycorns\nbarlow\nbarlows\nbarm\nbarmaid\nbarmaids\nbarman\nbarmecidal\nbarmecide\nbarmen\nbarmier\nbarmiest\nbarms\nbarmy\nbarn\nbarnabas\nbarnacle\nbarnacled\nbarnacles\nbarnardo\nbarnburner\nbarnburners\nbarns\nbarnstorm\nbarnstormed\nbarnstormer\nbarnstormers\nbarnstorming\nbarnstorms\nbarnum\nbarny\nbarnyard\nbarnyards\nbarogram\nbarograms\nbarograph\nbarographic\nbarographs\nbarolo\nbarolos\nbarometer\nbarometers\nbarometric\nbarometrical\nbarometrically\nbarometry\nbaron\nbaronage\nbaronages\nbaroness\nbaronesses\nbaronet\nbaronetage\nbaronetages\nbaronetcies\nbaronetcy\nbaronetess\nbaronets\nbarong\nbarongs\nbaronial\nbaronies\nbarons\nbarony\nbaroque\nbaroquely\nbaroques\nbaroreceptor\nbaroreceptors\nbarotseland\nbarouche\nbarouches\nbarque\nbarquentine\nbarquentines\nbarques\nbarrack\nbarracked\nbarracker\nbarrackers\nbarracking\nbarracks\nbarracoon\nbarracoons\nbarracuda\nbarracudas\nbarrage\nbarraged\nbarrages\nbarraging\nbarramunda\nbarramundas\nbarramundi\nbarramundis\nbarranca\nbarrancas\nbarranco\nbarrancos\nbarrater\nbarraters\nbarrator\nbarrators\nbarratries\nbarratrous\nbarratrously\nbarratry\nbarre\nbarred\nbarrel\nbarreled\nbarrelful\nbarrelfuls\nbarrelhead\nbarrelheads\nbarrelhouse\nbarrelhouses\nbarreling\nbarrelled\nbarrelling\nbarrels\nbarren\nbarrenly\nbarrenness\nbarrens\nbarres\nbarrette\nbarrettes\nbarricade\nbarricaded\nbarricader\nbarricaders\nbarricades\nbarricading\nbarrier\nbarriers\nbarring\nbarrio\nbarrios\nbarrister\nbarristers\nbarroom\nbarrooms\nbarrow\nbarrows\nbarry\nbarrymore\nbars\nbarstool\nbarstools\nbartend\nbartended\nbartender\nbartenders\nbartending\nbartends\nbarter\nbartered\nbarterer\nbarterers\nbartering\nbarters\nbartholomew\nbartizan\nbartizaned\nbartizans\nbartlett\nbartletts\nbartók\nbartókian\nbaruch\nbarware\nbarycenter\nbarycenters\nbaryon\nbaryonic\nbaryons\nbarysphere\nbaryspheres\nbaryta\nbarytas\nbaryte\nbarytes\nbarytone\nbarytones\nbas\nbasal\nbasally\nbasalt\nbasaltic\nbasalts\nbascule\nbascules\nbase\nbaseball\nbaseballs\nbaseboard\nbaseboards\nbaseborn\nbaseburner\nbaseburners\nbased\nbasel\nbaseless\nbaselessly\nbaseline\nbaselines\nbasely\nbaseman\nbasemen\nbasement\nbasementless\nbasements\nbaseness\nbasenji\nbasenjis\nbaser\nbaserunning\nbases\nbasest\nbash\nbashaw\nbashaws\nbashed\nbasher\nbashers\nbashes\nbashful\nbashfully\nbashfulness\nbashing\nbasic\nbasically\nbasichromatic\nbasicities\nbasicity\nbasics\nbasidia\nbasidial\nbasidiocarp\nbasidiocarps\nbasidiomycete\nbasidiomycetes\nbasidiomycetous\nbasidiospore\nbasidiospores\nbasidiosporous\nbasidium\nbasification\nbasified\nbasifier\nbasifiers\nbasifies\nbasifixed\nbasify\nbasifying\nbasil\nbasilar\nbasilica\nbasilican\nbasilicas\nbasilicata\nbasilisk\nbasilisks\nbasils\nbasin\nbasinal\nbasined\nbasinet\nbasinets\nbasing\nbasins\nbasipetal\nbasipetally\nbasis\nbask\nbasked\nbaskerville\nbasket\nbasketball\nbasketballs\nbasketful\nbasketfuls\nbasketlike\nbasketry\nbaskets\nbasketsful\nbasketwork\nbasking\nbasks\nbasle\nbasophil\nbasophile\nbasophiles\nbasophilia\nbasophilias\nbasophilic\nbasophils\nbasotho\nbasque\nbasques\nbasra\nbass\nbasses\nbasset\nbassets\nbassett\nbassi\nbassinet\nbassinets\nbassist\nbassists\nbasso\nbassoon\nbassoonist\nbassoonists\nbassoons\nbassos\nbasswood\nbasswoods\nbast\nbastard\nbastardies\nbastardization\nbastardizations\nbastardize\nbastardized\nbastardizes\nbastardizing\nbastardly\nbastards\nbastardy\nbaste\nbasted\nbaster\nbasters\nbastes\nbastille\nbastilles\nbastinado\nbastinadoed\nbastinadoes\nbastinadoing\nbasting\nbastings\nbastion\nbastioned\nbastions\nbastnaesite\nbastnaesites\nbasutoland\nbat\nbatavia\nbatavian\nbatavians\nbatboy\nbatboys\nbatch\nbatched\nbatcher\nbatchers\nbatches\nbatching\nbate\nbateau\nbateaux\nbated\nbates\nbatfish\nbatfishes\nbatfowl\nbatfowled\nbatfowling\nbatfowls\nbatgirl\nbatgirls\nbath\nbathe\nbathed\nbather\nbathers\nbathes\nbathetic\nbathetically\nbathhouse\nbathhouses\nbathing\nbathmat\nbathmats\nbatholith\nbatholithic\nbatholiths\nbathometer\nbathometers\nbathophobia\nbathophobias\nbathos\nbathoses\nbathrobe\nbathrobes\nbathroom\nbathrooms\nbaths\nbathsheba\nbathtub\nbathtubs\nbathurst\nbathwater\nbathyal\nbathymetric\nbathymetrical\nbathymetrically\nbathymetry\nbathypelagic\nbathyscaph\nbathyscaphe\nbathyscaphes\nbathyscaphs\nbathysphere\nbathyspheres\nbathythermograph\nbathythermographs\nbatik\nbatiks\nbating\nbatiste\nbatman\nbatmen\nbaton\nbatons\nbatophobia\nbatrachian\nbatrachians\nbatrachotoxin\nbatrachotoxins\nbats\nbatsman\nbatsmen\nbatswana\nbatswanas\nbatt\nbattailous\nbattalia\nbattalias\nbattalion\nbattalions\nbatteau\nbatted\nbattement\nbatten\nbattenbergs\nbattened\nbattening\nbattens\nbatter\nbattered\nbatterer\nbatterers\nbatterie\nbatteries\nbattering\nbatters\nbattery\nbattier\nbattiest\nbattiness\nbatting\nbattings\nbattle\nbattled\nbattledore\nbattledores\nbattlefield\nbattlefields\nbattlefront\nbattlefronts\nbattleground\nbattlegrounds\nbattlement\nbattlemented\nbattlements\nbattler\nbattlers\nbattles\nbattleship\nbattleships\nbattlewagon\nbattlewagons\nbattling\nbatts\nbattu\nbattue\nbattues\nbatty\nbatwing\nbatwings\nbauble\nbaubles\nbaucis\nbaud\nbaudelaire\nbauds\nbauhaus\nbauhinia\nbauhinias\nbaum\nbaumé\nbauxite\nbauxites\nbauxitic\nbavaria\nbavarian\nbavarians\nbawbee\nbawbees\nbawcock\nbawcocks\nbawd\nbawdier\nbawdiest\nbawdily\nbawdiness\nbawdries\nbawdry\nbawds\nbawdy\nbawdyhouse\nbawdyhouses\nbawl\nbawled\nbawler\nbawlers\nbawling\nbawls\nbay\nbayadere\nbayaderes\nbayberries\nbayberry\nbayed\nbayesian\nbayeux\nbaying\nbayonet\nbayoneted\nbayoneting\nbayonets\nbayonetted\nbayonetting\nbayonne\nbayou\nbayous\nbayreuth\nbays\nbayside\nbazaar\nbazaars\nbazooka\nbazookas\nbdellium\nbdelliums\nbe\nbeach\nbeachboy\nbeachboys\nbeachcomb\nbeachcombed\nbeachcomber\nbeachcombers\nbeachcombing\nbeachcombs\nbeached\nbeaches\nbeachfront\nbeachfronts\nbeachhead\nbeachheads\nbeaching\nbeachless\nbeachscape\nbeachscapes\nbeachside\nbeachwear\nbeachy\nbeacon\nbeaconed\nbeaconing\nbeacons\nbead\nbeaded\nbeadier\nbeadiest\nbeadily\nbeading\nbeadings\nbeadle\nbeadles\nbeadroll\nbeadrolls\nbeads\nbeadsman\nbeadsmen\nbeadwork\nbeady\nbeagle\nbeagles\nbeak\nbeaked\nbeaker\nbeakers\nbeaks\nbeaky\nbeam\nbeamed\nbeamier\nbeamiest\nbeaming\nbeamingly\nbeamish\nbeamishly\nbeams\nbeamy\nbean\nbeanbag\nbeanbags\nbeanball\nbeanballs\nbeaned\nbeaneries\nbeanery\nbeanie\nbeanies\nbeaning\nbeano\nbeanos\nbeanpole\nbeanpoles\nbeans\nbeanstalk\nbeanstalks\nbear\nbearability\nbearable\nbearably\nbearbaiting\nbearbaitings\nbearberries\nbearberry\nbearcat\nbearcats\nbeard\nbearded\nbeardedness\nbearding\nbeardless\nbeardlessness\nbeards\nbeardtongue\nbeardtongues\nbearer\nbearers\nbearing\nbearings\nbearish\nbearishly\nbearishness\nbearlike\nbears\nbearskin\nbearskins\nbeast\nbeastie\nbeasties\nbeastings\nbeastlier\nbeastliest\nbeastliness\nbeastly\nbeasts\nbeat\nbeatable\nbeaten\nbeater\nbeaters\nbeatific\nbeatifically\nbeatification\nbeatifications\nbeatified\nbeatifies\nbeatify\nbeatifying\nbeating\nbeatings\nbeatitude\nbeatitudes\nbeatles\nbeatless\nbeatnik\nbeatniks\nbeatrice\nbeats\nbeau\nbeaucoup\nbeaucoups\nbeaufort\nbeaujolais\nbeaumont\nbeaune\nbeaus\nbeaut\nbeauteous\nbeauteously\nbeauteousness\nbeautician\nbeauticians\nbeauties\nbeautification\nbeautifications\nbeautified\nbeautifier\nbeautifiers\nbeautifies\nbeautiful\nbeautifully\nbeautifulness\nbeautify\nbeautifying\nbeauts\nbeauty\nbeautyberries\nbeautyberry\nbeautybush\nbeautybushes\nbeaux\nbeaver\nbeaverboard\nbeaverbrook\nbeavered\nbeavering\nbeavers\nbeavertail\nbeavertails\nbebop\nbebopper\nbeboppers\nbecalm\nbecalmed\nbecalming\nbecalms\nbecame\nbecause\nbeccafico\nbeccaficos\nbechance\nbechanced\nbechances\nbechancing\nbechuana\nbechuanaland\nbechuanas\nbeck\nbecket\nbeckets\nbeckon\nbeckoned\nbeckoner\nbeckoners\nbeckoning\nbeckoningly\nbeckons\nbecks\nbecloud\nbeclouded\nbeclouding\nbeclouds\nbecome\nbecomes\nbecoming\nbecomingly\nbecomingness\nbecquerel\nbecquerels\nbed\nbedabble\nbedabbled\nbedabbles\nbedabbling\nbedaub\nbedaubed\nbedaubing\nbedaubs\nbedazzle\nbedazzled\nbedazzlement\nbedazzles\nbedazzling\nbedbug\nbedbugs\nbedchamber\nbedchambers\nbedclothes\nbedcover\nbedcovering\nbedcovers\nbedded\nbedder\nbedders\nbedding\nbede\nbedeck\nbedecked\nbedecking\nbedecks\nbedevil\nbedeviled\nbedeviling\nbedevilled\nbedevilling\nbedevilment\nbedevils\nbedew\nbedewed\nbedewing\nbedews\nbedfast\nbedfellow\nbedfellows\nbedford\nbedfordshire\nbedight\nbedighted\nbedighting\nbedights\nbedim\nbedimmed\nbedimming\nbedims\nbedizen\nbedizened\nbedizening\nbedizenment\nbedizens\nbedlam\nbedlamite\nbedlamites\nbedmate\nbedmates\nbedouin\nbedouins\nbedpan\nbedpans\nbedplate\nbedplates\nbedpost\nbedposts\nbedraggle\nbedraggled\nbedraggles\nbedraggling\nbedrid\nbedridden\nbedrock\nbedroll\nbedrolls\nbedroom\nbedrooms\nbeds\nbedside\nbedsides\nbedsonia\nbedsoniae\nbedsore\nbedsores\nbedspread\nbedspreads\nbedspring\nbedsprings\nbedstead\nbedsteads\nbedstraw\nbedstraws\nbedtime\nbedtimes\nbeduin\nbeduins\nbee\nbeebee\nbeebees\nbeebread\nbeech\nbeecham\nbeechdrops\nbeechen\nbeeches\nbeechnut\nbeechnuts\nbeef\nbeefalo\nbeefaloes\nbeefalos\nbeefcake\nbeefcakes\nbeefeater\nbeefeaters\nbeefed\nbeefier\nbeefiest\nbeefiness\nbeefing\nbeefs\nbeefsteak\nbeefsteaks\nbeefwood\nbeefwoods\nbeefy\nbeehive\nbeehives\nbeekeeper\nbeekeepers\nbeekeeping\nbeelike\nbeeline\nbeelines\nbeelzebub\nbeen\nbeep\nbeeped\nbeeper\nbeepers\nbeeping\nbeeps\nbeer\nbeerbohm\nbeerhouse\nbeerhouses\nbeerier\nbeeriest\nbeers\nbeersheba\nbeery\nbees\nbeestings\nbeeswax\nbeet\nbeethoven\nbeetle\nbeetled\nbeetles\nbeetleweed\nbeetleweeds\nbeetling\nbeetroot\nbeetroots\nbeets\nbeeves\nbefall\nbefallen\nbefalling\nbefalls\nbefell\nbefit\nbefits\nbefitted\nbefitting\nbefittingly\nbefog\nbefogged\nbefogging\nbefogs\nbefool\nbefooled\nbefooling\nbefools\nbefore\nbeforehand\nbeforetime\nbefoul\nbefouled\nbefouling\nbefouls\nbefriend\nbefriended\nbefriending\nbefriends\nbefuddle\nbefuddled\nbefuddlement\nbefuddlements\nbefuddles\nbefuddling\nbeg\nbegan\nbeget\nbegets\nbegetter\nbegetters\nbegetting\nbeggar\nbeggared\nbeggaries\nbeggaring\nbeggarliness\nbeggarly\nbeggars\nbeggary\nbegged\nbegging\nbegin\nbeginner\nbeginners\nbeginning\nbeginnings\nbegins\nbegird\nbegirded\nbegirding\nbegirds\nbegirt\nbegone\nbegonia\nbegonias\nbegorra\nbegot\nbegotten\nbegrime\nbegrimed\nbegrimes\nbegriming\nbegrudge\nbegrudged\nbegrudger\nbegrudgers\nbegrudges\nbegrudging\nbegrudgingly\nbegs\nbeguile\nbeguiled\nbeguilement\nbeguilements\nbeguiler\nbeguilers\nbeguiles\nbeguiling\nbeguilingly\nbeguine\nbeguines\nbegum\nbegums\nbegun\nbehalf\nbehalves\nbehave\nbehaved\nbehaver\nbehavers\nbehaves\nbehaving\nbehavior\nbehavioral\nbehaviorally\nbehaviorism\nbehaviorist\nbehavioristic\nbehaviorists\nbehaviors\nbehead\nbeheaded\nbeheading\nbeheadings\nbeheads\nbeheld\nbehemoth\nbehemoths\nbehest\nbehind\nbehindhand\nbehinds\nbehold\nbeholden\nbeholder\nbeholders\nbeholding\nbeholds\nbehoof\nbehoove\nbehooved\nbehooves\nbehooving\nbeige\nbeiges\nbeigy\nbeijing\nbeing\nbeings\nbeirut\nbejesus\nbejewel\nbejeweled\nbejeweling\nbejewelled\nbejewels\nbel\nbelabor\nbelabored\nbelaboring\nbelabors\nbelarus\nbelated\nbelatedly\nbelatedness\nbelaud\nbelauded\nbelauding\nbelauds\nbelay\nbelayed\nbelaying\nbelays\nbelch\nbelched\nbelches\nbelching\nbeldam\nbeldame\nbeldames\nbeldams\nbeleaguer\nbeleaguered\nbeleaguering\nbeleaguerment\nbeleaguers\nbelemnite\nbelemnites\nbelfast\nbelfried\nbelfries\nbelfry\nbelgae\nbelgian\nbelgians\nbelgic\nbelgium\nbelgrade\nbelgravia\nbelie\nbelied\nbelief\nbeliefs\nbelier\nbeliers\nbelies\nbelievability\nbelievable\nbelievably\nbelieve\nbelieved\nbeliever\nbelievers\nbelieves\nbelieving\nbelike\nbelittle\nbelittled\nbelittlement\nbelittler\nbelittlers\nbelittles\nbelittling\nbelittlingly\nbelive\nbelize\nbelizian\nbelizians\nbell\nbella\nbelladonna\nbellbird\nbellbirds\nbellboy\nbellboys\nbelle\nbelled\nbelleek\nbelleeks\nbelles\nbelletrism\nbelletrist\nbelletristic\nbelletrists\nbellflower\nbellflowers\nbellhop\nbellhops\nbelli\nbellicose\nbellicosely\nbellicoseness\nbellicosity\nbellied\nbellies\nbelligerence\nbelligerency\nbelligerent\nbelligerently\nbelligerents\nbelling\nbellini\nbellman\nbellmen\nbelloc\nbellona\nbellow\nbellowed\nbellower\nbellowers\nbellowing\nbellows\nbellpull\nbellpulls\nbells\nbellum\nbellwether\nbellwethers\nbellwort\nbellworts\nbelly\nbellyache\nbellyached\nbellyacher\nbellyachers\nbellyaches\nbellyaching\nbellyband\nbellybands\nbellybutton\nbellybuttons\nbellyful\nbellyfuls\nbellying\nbelmont\nbelmopan\nbeloit\nbelonephobia\nbelonephobias\nbelong\nbelonged\nbelonger\nbelongers\nbelonging\nbelongingness\nbelongings\nbelongs\nbelorussia\nbelorussian\nbelorussians\nbeloved\nbeloveds\nbelow\nbelowground\nbels\nbelsen\nbelshazzar\nbelt\nbeltane\nbelted\nbelting\nbeltings\nbeltless\nbelts\nbeltway\nbeltways\nbeluga\nbelukha\nbelvedere\nbelvederes\nbelying\nbema\nbemata\nbemedaled\nbemedalled\nbemire\nbemired\nbemires\nbemiring\nbemoan\nbemoaned\nbemoaning\nbemoans\nbemock\nbemocked\nbemocking\nbemocks\nbemuse\nbemused\nbemusedly\nbemusement\nbemuses\nbemusing\nben\nbenares\nbench\nbenched\nbencher\nbenchers\nbenches\nbenching\nbenchmark\nbenchmarked\nbenchmarking\nbenchmarks\nbenchwarmer\nbenchwarmers\nbend\nbendable\nbenday\nbendayed\nbendaying\nbendays\nbender\nbenders\nbending\nbends\nbendy\nbene\nbeneath\nbenedict\nbenedictine\nbenedictines\nbenediction\nbenedictions\nbenedictive\nbenedictory\nbenedicts\nbenedictus\nbenefaction\nbenefactions\nbenefactor\nbenefactors\nbenefactress\nbenefactresses\nbenefic\nbenefice\nbeneficed\nbeneficence\nbeneficences\nbeneficent\nbeneficently\nbenefices\nbeneficial\nbeneficially\nbeneficialness\nbeneficiaries\nbeneficiary\nbeneficiate\nbeneficiated\nbeneficiating\nbeneficiation\nbeneficing\nbenefit\nbenefited\nbenefiter\nbenefiters\nbenefiting\nbenefits\nbenefitted\nbenefitting\nbenelux\nbenevento\nbenevolence\nbenevolent\nbenevolently\nbenevolentness\nbengal\nbengalese\nbengali\nbengaline\nbengalines\nbengalis\nbenghazi\nbenidorm\nbenighted\nbenightedly\nbenightedness\nbenign\nbenignancies\nbenignancy\nbenignant\nbenignantly\nbenignities\nbenignity\nbenignly\nbenin\nbeninese\nbenison\nbenisons\nbenjamin\nbenne\nbennet\nbennets\nbennies\nbennington\nbenny\nbens\nbent\nbentham\nbenthamism\nbenthamite\nbenthamites\nbenthic\nbenthonic\nbenthos\nbenthoses\nbentonite\nbentonites\nbentonitic\nbents\nbentwood\nbentwoods\nbenumb\nbenumbed\nbenumbing\nbenumbment\nbenumbs\nbenz\nbenzaldehyde\nbenzaldehydes\nbenzalkonium\nbenzanthracene\nbenzedrine\nbenzene\nbenzenes\nbenzidine\nbenzidines\nbenzimidazole\nbenzimidazoles\nbenzin\nbenzine\nbenzines\nbenzins\nbenzoate\nbenzoates\nbenzocaine\nbenzocaines\nbenzocarbazole\nbenzocarbazoles\nbenzodiazepine\nbenzodiazepines\nbenzoic\nbenzoin\nbenzoins\nbenzol\nbenzols\nbenzophenone\nbenzophenones\nbenzopyrene\nbenzopyrenes\nbenzoyl\nbenzoyls\nbenzyl\nbenzylic\nbenzyls\nbeowulf\nbepaint\nbepainted\nbepainting\nbepaints\nbequeath\nbequeathal\nbequeathals\nbequeathed\nbequeather\nbequeathers\nbequeathing\nbequeathment\nbequeaths\nbequest\nbequests\nberate\nberated\nberates\nberating\nberber\nberberine\nberberines\nberbers\nberceuse\nberceuses\nberdache\nberdaches\nberdachism\nberea\nbereave\nbereaved\nbereavement\nbereavements\nbereaver\nbereavers\nbereaves\nbereaving\nbereft\nberenices\nberet\nberets\nberg\nbergamo\nbergamot\nbergamots\nbergen\nbergs\nbergsonian\nbergsonism\nberibboned\nberiberi\nbering\nberkeleian\nberkeleianism\nberkeley\nberkelium\nberkshire\nberkshires\nberlin\nberline\nberliner\nberliners\nberlioz\nberm\nberms\nbermuda\nbermudan\nbermudans\nbermudas\nbermudian\nbermudians\nbern\nbernadette\nbernadotte\nbernard\nbernardine\nberne\nbernese\nbernhardt\nbernini\nbernoulli\nbernstein\nberried\nberries\nberry\nberrying\nberrylike\nberseem\nberseems\nberserk\nberserker\nberserkers\nberserkly\nberserks\nberth\nbertha\nberthas\nberthed\nberthing\nberths\nberyl\nberylline\nberyllium\nberyls\nberzelius\nbes\nbesançon\nbeseech\nbeseeched\nbeseecher\nbeseechers\nbeseeches\nbeseeching\nbeseechingly\nbeseem\nbeseemed\nbeseeming\nbeseems\nbeset\nbesetment\nbesets\nbesetting\nbeshrew\nbeshrewed\nbeshrewing\nbeshrews\nbeside\nbesides\nbesiege\nbesieged\nbesiegement\nbesieger\nbesiegers\nbesieges\nbesieging\nbesmear\nbesmeared\nbesmearing\nbesmears\nbesmirch\nbesmirched\nbesmircher\nbesmirchers\nbesmirches\nbesmirching\nbesmirchment\nbesom\nbesoms\nbesot\nbesots\nbesotted\nbesotting\nbesought\nbespangle\nbespangled\nbespangles\nbespangling\nbespatter\nbespattered\nbespattering\nbespatters\nbespeak\nbespeaking\nbespeaks\nbespectacled\nbespoke\nbespoken\nbesprent\nbesprinkle\nbesprinkled\nbesprinkles\nbesprinkling\nbessarabia\nbessel\nbessemer\nbessie\nbessies\nbest\nbestead\nbesteaded\nbesteading\nbesteads\nbested\nbestial\nbestialities\nbestiality\nbestialize\nbestialized\nbestializes\nbestializing\nbestially\nbestiaries\nbestiary\nbesting\nbestir\nbestirred\nbestirring\nbestirs\nbestow\nbestowable\nbestowal\nbestowals\nbestowed\nbestowing\nbestowment\nbestows\nbestraddle\nbestraddled\nbestraddles\nbestraddling\nbestrew\nbestrewed\nbestrewing\nbestrewn\nbestrews\nbestridden\nbestride\nbestrides\nbestriding\nbestrode\nbests\nbestseller\nbestsellerdom\nbestsellers\nbestselling\nbet\nbeta\nbetaine\nbetaines\nbetake\nbetaken\nbetakes\nbetaking\nbetamethasone\nbetamethasones\nbetas\nbetatron\nbetatrons\nbetel\nbetelgeuse\nbetels\nbeth\nbethanechol\nbethanechols\nbethany\nbethel\nbethels\nbethesda\nbethink\nbethinking\nbethinks\nbethlehem\nbethought\nbetide\nbetided\nbetides\nbetiding\nbetimes\nbetjeman\nbetoken\nbetokened\nbetokening\nbetokens\nbetonies\nbetony\nbetook\nbetray\nbetrayal\nbetrayals\nbetrayed\nbetrayer\nbetrayers\nbetraying\nbetrays\nbetroth\nbetrothal\nbetrothals\nbetrothed\nbetrothing\nbetroths\nbets\nbetta\nbettas\nbetted\nbetter\nbettered\nbettering\nbetterment\nbetterments\nbetters\nbetterton\nbetting\nbettor\nbettors\nbetty\nbetween\nbetweenbrain\nbetweenness\nbetweentimes\nbetweenwhiles\nbetwixt\nbeulah\nbevel\nbeveled\nbeveling\nbevelled\nbevelling\nbevels\nbeverage\nbeverages\nbeverly\nbevies\nbevy\nbewail\nbewailed\nbewailer\nbewailers\nbewailing\nbewailment\nbewails\nbeware\nbewared\nbewares\nbewaring\nbewhiskered\nbewick\nbewigged\nbewilder\nbewildered\nbewilderedly\nbewilderedness\nbewildering\nbewilderingly\nbewilderment\nbewilders\nbewitch\nbewitched\nbewitcher\nbewitchers\nbewitchery\nbewitches\nbewitching\nbewitchingly\nbewitchment\nbewitchments\nbewray\nbewrayed\nbewraying\nbewrays\nbey\nbeyond\nbeys\nbezant\nbezants\nbezel\nbezels\nbezique\nbezoar\nbezoars\nbhakti\nbhaktis\nbhang\nbhangs\nbhutan\nbhutanese\nbi\nbiafra\nbiafran\nbiafrans\nbialy\nbialys\nbiannual\nbiannually\nbiarritz\nbias\nbiased\nbiases\nbiasing\nbiasness\nbiassed\nbiasses\nbiassing\nbiathlete\nbiathletes\nbiathlon\nbiathlons\nbiaxial\nbiaxiality\nbiaxially\nbib\nbibb\nbibbed\nbibber\nbibbers\nbibbery\nbibbing\nbibbs\nbibcock\nbibcocks\nbibelot\nbibelots\nbible\nbibles\nbibless\nbiblical\nbiblically\nbiblicism\nbiblicist\nbiblicists\nbibliofilm\nbibliofilms\nbibliographer\nbibliographers\nbibliographic\nbibliographical\nbibliographically\nbibliographies\nbibliography\nbibliolater\nbibliolaters\nbibliolatrous\nbibliolatry\nbibliology\nbibliomancies\nbibliomancy\nbibliomania\nbibliomaniac\nbibliomaniacal\nbibliomaniacs\nbibliopegic\nbibliopegist\nbibliopegists\nbibliopegy\nbibliophile\nbibliophiles\nbibliophilic\nbibliophilism\nbibliophilistic\nbibliophily\nbibliopole\nbibliopoles\nbibliopolic\nbibliopolical\nbibliopolist\nbibliopolists\nbibliotheca\nbibliothecal\nbibliothecas\nbibliotherapies\nbibliotherapy\nbibliotic\nbibliotics\nbibliotist\nbibliotists\nbibs\nbibulous\nbibulously\nbibulousness\nbicameral\nbicameralism\nbicarb\nbicarbonate\nbicarbonates\nbicarbs\nbicaudal\nbicellular\nbicentenaries\nbicentenary\nbicentennial\nbicentennials\nbicentric\nbicentricity\nbicephalous\nbiceps\nbicepses\nbichloride\nbichlorides\nbichromate\nbichromated\nbichromates\nbichrome\nbicipital\nbicker\nbickered\nbickerer\nbickerers\nbickering\nbickers\nbicoastal\nbicolor\nbicolored\nbicolors\nbicomponent\nbiconcave\nbiconcavity\nbiconditional\nbiconditionals\nbiconvex\nbiconvexity\nbicorne\nbicornes\nbicornuate\nbicultural\nbiculturalism\nbicuspid\nbicuspidate\nbicuspids\nbicycle\nbicycled\nbicycler\nbicyclers\nbicycles\nbicyclic\nbicycling\nbicyclist\nbicyclists\nbid\nbidarka\nbidarkas\nbiddability\nbiddable\nbiddably\nbidden\nbidder\nbidders\nbiddies\nbidding\nbiddings\nbiddy\nbide\nbided\nbidentate\nbider\nbiders\nbides\nbidet\nbidets\nbidialectal\nbidialectalism\nbidialectalist\nbidialectalists\nbiding\nbidirectional\nbidirectionally\nbidonville\nbidonvilles\nbids\nbiedermeier\nbien\nbiennia\nbiennial\nbiennially\nbiennials\nbiennium\nbienniums\nbier\nbiers\nbierstadt\nbifacial\nbiff\nbiffed\nbiffies\nbiffing\nbiffs\nbiffy\nbifid\nbifida\nbifidity\nbifidly\nbifilar\nbifilarly\nbiflagellate\nbifocal\nbifocaled\nbifocalism\nbifocals\nbifoliolate\nbiform\nbifunctional\nbifurcate\nbifurcated\nbifurcately\nbifurcates\nbifurcating\nbifurcation\nbifurcations\nbig\nbigamies\nbigamist\nbigamists\nbigamous\nbigamously\nbigamy\nbigarade\nbigarades\nbigeminal\nbigeminies\nbigeminy\nbigeneric\nbigeye\nbigeyes\nbigfoot\nbigger\nbiggest\nbiggety\nbiggie\nbiggies\nbiggin\nbigging\nbiggings\nbiggins\nbiggish\nbiggity\nbighead\nbigheaded\nbigheadedness\nbigheads\nbighearted\nbigheartedly\nbigheartedness\nbighorn\nbighorns\nbight\nbights\nbigly\nbigmouth\nbigmouthed\nbigmouths\nbigness\nbignonia\nbignonias\nbigos\nbigot\nbigoted\nbigotedly\nbigotedness\nbigotries\nbigotry\nbigots\nbigtime\nbigwig\nbigwigs\nbihar\nbijection\nbijections\nbijective\nbijou\nbijous\nbijouterie\nbijouteries\nbijoux\nbijugate\nbike\nbiked\nbiker\nbikers\nbikes\nbikeway\nbikeways\nbikie\nbikies\nbiking\nbikini\nbikinied\nbikinis\nbilabial\nbilabially\nbilabials\nbilabiate\nbilander\nbilanders\nbilateral\nbilateralism\nbilaterally\nbilateralness\nbilayer\nbilayers\nbilbao\nbilberries\nbilberry\nbilbo\nbilboa\nbilboas\nbilboes\nbildungsroman\nbildungsromans\nbile\nbiles\nbilge\nbilged\nbilges\nbilging\nbilgy\nbilharzia\nbilharzias\nbilharziasis\nbiliary\nbilimbi\nbilimbis\nbilinear\nbilingual\nbilingualism\nbilingually\nbilinguals\nbilious\nbiliously\nbiliousness\nbilirubin\nbilirubins\nbiliverdin\nbiliverdins\nbilk\nbilked\nbilker\nbilkers\nbilking\nbilks\nbill\nbillable\nbillabong\nbillabongs\nbillboard\nbillboarded\nbillboarding\nbillboards\nbillbug\nbillbugs\nbilled\nbiller\nbillers\nbillet\nbilleted\nbilleting\nbillets\nbillfish\nbillfishes\nbillfold\nbillfolds\nbillhead\nbillheads\nbillhook\nbillhooks\nbilliard\nbilliards\nbillies\nbilling\nbillings\nbillingsgate\nbillion\nbillionaire\nbillionaires\nbillionfold\nbillions\nbillionth\nbillionths\nbillon\nbillons\nbillow\nbillowed\nbillowiness\nbillowing\nbillows\nbillowy\nbillposter\nbillposters\nbillposting\nbills\nbilly\nbillycock\nbillycocks\nbilobate\nbilobed\nbilobular\nbilocation\nbilocations\nbilocular\nbiltong\nbiltongs\nbimanal\nbimanous\nbimanual\nbimanually\nbimaxillary\nbimbo\nbimbos\nbimestrial\nbimetal\nbimetallic\nbimetallism\nbimetallist\nbimetallistic\nbimetallists\nbimetals\nbimillenaries\nbimillenary\nbimillenial\nbimillenially\nbimillennia\nbimillennium\nbimillenniums\nbiminis\nbimodal\nbimodality\nbimolecular\nbimolecularly\nbimonthlies\nbimonthly\nbimorphemic\nbin\nbinal\nbinaries\nbinary\nbinate\nbinational\nbinaural\nbinaurally\nbind\nbinder\nbinderies\nbinders\nbindery\nbinding\nbindingly\nbindingness\nbindings\nbindle\nbindles\nbindlestiff\nbindlestiffs\nbinds\nbindweed\nbindweeds\nbine\nbines\nbinge\nbinged\nbingeing\nbinger\nbingers\nbinges\nbinging\nbingo\nbingoes\nbingos\nbinnacle\nbinnacles\nbinned\nbinning\nbinocular\nbinocularity\nbinocularly\nbinoculars\nbinomial\nbinomially\nbinomials\nbinominal\nbins\nbint\nbints\nbinturong\nbinturongs\nbinuclear\nbinucleate\nbinucleated\nbio\nbioaccumulation\nbioaccumulations\nbioaccumulative\nbioacoustics\nbioactive\nbioactivities\nbioactivity\nbioagent\nbioagents\nbioassay\nbioassays\nbioastronautical\nbioastronautics\nbioavailability\nbiocatalyst\nbiocatalysts\nbiocatalytic\nbiocenology\nbiocenose\nbiocenoses\nbiocenosis\nbiochemical\nbiochemically\nbiochemist\nbiochemistries\nbiochemistry\nbiochemists\nbiochip\nbiochips\nbiocidal\nbiocide\nbiocides\nbioclimatic\nbioclimatology\nbiocoenoses\nbiocoenosis\nbiocompatibility\nbiocompatible\nbioconversion\nbiodegradability\nbiodegradable\nbiodegradation\nbiodegrade\nbiodegraded\nbiodegrades\nbiodegrading\nbiodiversity\nbiodynamic\nbiodynamics\nbioelectric\nbioelectrical\nbioelectricity\nbioelectronic\nbioelectronics\nbioenergetic\nbioenergetics\nbioengineer\nbioengineered\nbioengineering\nbioengineers\nbioenvironmental\nbioethical\nbioethicist\nbioethicists\nbioethics\nbiofeedback\nbioflavonoid\nbioflavonoids\nbiogas\nbiogenesis\nbiogenetic\nbiogenetical\nbiogenetically\nbiogenetics\nbiogenic\nbiogenous\nbiogeochemical\nbiogeochemistry\nbiogeographer\nbiogeographers\nbiogeographic\nbiogeographical\nbiogeography\nbiogerontologist\nbiogerontologists\nbiogerontology\nbiographee\nbiographees\nbiographer\nbiographers\nbiographic\nbiographical\nbiographically\nbiographies\nbiography\nbiohazard\nbiohazards\nbioinorganic\nbioinstrumentation\nbioinstrumentations\nbiologic\nbiological\nbiologically\nbiologicals\nbiologics\nbiologism\nbiologist\nbiologistic\nbiologists\nbiology\nbioluminescence\nbioluminescent\nbiolysis\nbiolytic\nbiomarker\nbiomarkers\nbiomass\nbiomasses\nbiomaterial\nbiomaterials\nbiomathematical\nbiomathematician\nbiomathematicians\nbiomathematics\nbiome\nbiomechanical\nbiomechanically\nbiomechanics\nbiomedical\nbiomedicine\nbiomembrane\nbiomembranes\nbiomes\nbiometeorology\nbiometric\nbiometrical\nbiometrically\nbiometrics\nbiometry\nbiomimesis\nbiomineralogist\nbiomineralogists\nbiomolecular\nbiomolecule\nbiomolecules\nbionic\nbionics\nbionomic\nbionomical\nbionomically\nbionomics\nbioorganic\nbiophysical\nbiophysically\nbiophysicist\nbiophysicists\nbiophysics\nbiopic\nbiopics\nbiopolymer\nbiopolymers\nbioprocess\nbioprocessed\nbioprocesses\nbioprocessing\nbiopsic\nbiopsied\nbiopsies\nbiopsy\nbiopsychic\nbiopsychology\nbioptic\nbioreactor\nbioreactors\nbioregion\nbioregional\nbioregionalism\nbioregionalist\nbioregionalists\nbioregions\nbioresearch\nbiorhythm\nbiorhythmic\nbiorhythms\nbios\nbiosatellite\nbiosatellites\nbioscience\nbiosciences\nbioscientific\nbioscientist\nbioscientists\nbioscope\nbioscopes\nbioscopies\nbioscopy\nbiosensor\nbiosensors\nbiosocial\nbiosocially\nbiosphere\nbiospheres\nbiospheric\nbiostatistician\nbiostatisticians\nbiostatistics\nbiosyntheses\nbiosynthesis\nbiosynthesize\nbiosynthesized\nbiosynthesizes\nbiosynthesizing\nbiosynthetic\nbiosynthetically\nbiosystematic\nbiosystematics\nbiosystematist\nbiosystematists\nbiota\nbiotas\nbiotech\nbiotechnical\nbiotechnological\nbiotechnologist\nbiotechnologists\nbiotechnology\nbiotelemetric\nbiotelemetry\nbiotherapies\nbiotherapy\nbiotic\nbiotin\nbiotins\nbiotite\nbiotites\nbiotitic\nbiotope\nbiotopes\nbiotransformation\nbiotransformations\nbiotron\nbiotrons\nbiotype\nbiotypes\nbiotypic\nbioweapon\nbioweapons\nbiparental\nbiparentally\nbiparous\nbipartisan\nbipartisanism\nbipartisanship\nbipartite\nbipartitely\nbipartition\nbiped\nbipedal\nbipedalism\nbipedality\nbipeds\nbiphenyl\nbiphenyls\nbipinnate\nbipinnately\nbiplane\nbiplanes\nbipod\nbipods\nbipolar\nbipolarity\nbipolarization\nbipolarize\nbipolarized\nbipolarizes\nbipolarizing\nbipotentialities\nbipotentiality\nbipropellant\nbipropellants\nbiquadratic\nbiquadratics\nbiquarterly\nbiracial\nbiracialism\nbiradial\nbiramous\nbirch\nbirched\nbirchen\nbircher\nbirchers\nbirches\nbirching\nbirchism\nbirchist\nbirchists\nbird\nbirdbath\nbirdbaths\nbirdbrain\nbirdbrained\nbirdbrains\nbirdcage\nbirdcages\nbirdcall\nbirdcalls\nbirded\nbirder\nbirders\nbirdhouse\nbirdhouses\nbirdie\nbirdied\nbirdieing\nbirdies\nbirding\nbirdlike\nbirdlime\nbirdlimed\nbirdlimes\nbirdliming\nbirdman\nbirdmen\nbirds\nbirdseed\nbirdseeds\nbirdshot\nbirdwatcher\nbirdwatchers\nbirdying\nbirefringence\nbirefringent\nbireme\nbiremes\nbiretta\nbirettas\nbirk\nbirkbeck\nbirkie\nbirkies\nbirks\nbirl\nbirled\nbirler\nbirlers\nbirling\nbirls\nbirmingham\nbiro\nbiros\nbirr\nbirred\nbirring\nbirrs\nbirth\nbirthday\nbirthdays\nbirthed\nbirthing\nbirthings\nbirthmark\nbirthmarks\nbirthplace\nbirthplaces\nbirthrate\nbirthrates\nbirthright\nbirthrights\nbirthroot\nbirthroots\nbirths\nbirthstone\nbirthstones\nbirthwort\nbirthworts\nbiryani\nbiryanis\nbis\nbiscay\nbiscayne\nbiscotti\nbiscotto\nbiscuit\nbiscuits\nbise\nbisect\nbisected\nbisecting\nbisection\nbisectional\nbisectionally\nbisections\nbisector\nbisectors\nbisects\nbiseriate\nbiserrate\nbises\nbisexual\nbisexuality\nbisexually\nbisexuals\nbishop\nbishopric\nbishoprics\nbishops\nbislama\nbismarck\nbismarckian\nbismuth\nbismuthal\nbismuthic\nbison\nbisons\nbisque\nbisques\nbissau\nbissextile\nbissextiles\nbistate\nbister\nbistered\nbisters\nbistort\nbistorts\nbistouries\nbistoury\nbistre\nbistred\nbistres\nbistro\nbistroic\nbistros\nbisulcate\nbisulfate\nbisulfates\nbisulfide\nbisulfides\nbisulfite\nbisulfites\nbit\nbitable\nbitartrate\nbitartrates\nbitch\nbitched\nbitcheries\nbitchery\nbitches\nbitchier\nbitchiest\nbitchily\nbitchiness\nbitching\nbitchy\nbite\nbiteable\nbiteplate\nbiteplates\nbiter\nbiters\nbites\nbitewing\nbitewings\nbithynia\nbithynian\nbiting\nbitingly\nbitmap\nbitmapped\nbitmapping\nbitmaps\nbitok\nbitoks\nbits\nbitstock\nbitstocks\nbitsy\nbitt\nbitted\nbitten\nbitter\nbitterbrush\nbitterbrushes\nbittered\nbitterender\nbitterenders\nbitterer\nbitterest\nbittering\nbitterish\nbitterly\nbittern\nbitterness\nbitterns\nbitternut\nbitternuts\nbitterroot\nbitterroots\nbitters\nbittersweet\nbittersweetly\nbittersweetness\nbittersweets\nbitterweed\nbittier\nbittiest\nbittiness\nbitting\nbittock\nbittocks\nbitts\nbitty\nbitumen\nbitumens\nbituminization\nbituminize\nbituminized\nbituminizes\nbituminizing\nbituminoid\nbituminous\nbitwise\nbivalence\nbivalency\nbivalent\nbivalents\nbivalve\nbivalved\nbivalves\nbivariate\nbivouac\nbivouacked\nbivouacking\nbivouacks\nbivouacs\nbiweeklies\nbiweekly\nbiyearly\nbiz\nbizarre\nbizarrely\nbizarreness\nbizet\nbizonal\nbizone\nbizones\nblab\nblabbed\nblabber\nblabbered\nblabbering\nblabbermouth\nblabbermouths\nblabbers\nblabbing\nblabby\nblabs\nblack\nblackamoor\nblackamoors\nblackball\nblackballed\nblackballer\nblackballers\nblackballing\nblackballs\nblackbeard\nblackberries\nblackberry\nblackbird\nblackbirder\nblackbirders\nblackbirds\nblackboard\nblackboards\nblackbodies\nblackbody\nblackbuck\nblackbucks\nblackcap\nblackcaps\nblackcock\nblackcocks\nblackcurrant\nblackcurrants\nblackdamp\nblacked\nblacken\nblackened\nblackener\nblackeners\nblackening\nblackens\nblacker\nblackest\nblackface\nblackfaces\nblackfeet\nblackfish\nblackfishes\nblackflies\nblackfly\nblackfoot\nblackguard\nblackguarded\nblackguarding\nblackguardism\nblackguardly\nblackguards\nblackhander\nblackhanders\nblackhead\nblackheads\nblackheart\nblacking\nblackings\nblackish\nblackjack\nblackjacked\nblackjacking\nblackjacks\nblackland\nblackleg\nblacklegs\nblacklight\nblacklist\nblacklisted\nblacklister\nblacklisters\nblacklisting\nblacklists\nblackly\nblackmail\nblackmailed\nblackmailer\nblackmailers\nblackmailing\nblackmails\nblackness\nblackout\nblackouts\nblackpoll\nblackpolls\nblacks\nblacksburg\nblacksmith\nblacksmithing\nblacksmiths\nblacksnake\nblacksnakes\nblackstone\nblackstrap\nblackstraps\nblacktail\nblacktails\nblackthorn\nblackthorns\nblacktop\nblacktopped\nblacktopping\nblacktops\nblackwash\nblackwashed\nblackwashes\nblackwashing\nblackwater\nbladder\nbladderlike\nbladdernose\nbladdernoses\nbladdernut\nbladdernuts\nbladders\nbladderwort\nbladderworts\nbladdery\nblade\nbladed\nblades\nblaff\nblaffs\nblagging\nblagoveshchensk\nblah\nblahs\nblain\nblains\nblamable\nblamableness\nblamably\nblame\nblamed\nblameful\nblamefully\nblamefulness\nblameless\nblamelessly\nblamelessness\nblamer\nblamers\nblames\nblameworthier\nblameworthiest\nblameworthiness\nblameworthy\nblaming\nblanc\nblanch\nblanche\nblanched\nblancher\nblanchers\nblanches\nblanching\nblancmange\nblancmanges\nbland\nblander\nblandest\nblandification\nblandified\nblandifies\nblandify\nblandifying\nblandish\nblandished\nblandisher\nblandishers\nblandishes\nblandishing\nblandishment\nblandishments\nblandly\nblandness\nblank\nblanked\nblanker\nblankest\nblanket\nblanketed\nblanketflower\nblanketflowers\nblanketing\nblanketlike\nblankets\nblanking\nblankly\nblankness\nblanks\nblare\nblared\nblares\nblaring\nblarney\nblarneyed\nblarneying\nblarneys\nblaspheme\nblasphemed\nblasphemer\nblasphemers\nblasphemes\nblasphemies\nblaspheming\nblasphemous\nblasphemously\nblasphemousness\nblasphemy\nblast\nblasted\nblastema\nblastemal\nblastemas\nblastemata\nblastematic\nblastemic\nblaster\nblasters\nblastie\nblasties\nblasting\nblastment\nblastocoel\nblastocoelic\nblastocoels\nblastocyst\nblastocystic\nblastocysts\nblastoderm\nblastodermatic\nblastodermic\nblastoderms\nblastodisk\nblastodisks\nblastoff\nblastoffs\nblastogenesis\nblastogenetic\nblastogenic\nblastoma\nblastomas\nblastomata\nblastomere\nblastomeres\nblastomeric\nblastomycete\nblastomycetes\nblastomycin\nblastomycins\nblastomycosis\nblastoporal\nblastopore\nblastopores\nblastoporic\nblastosphere\nblastospheres\nblastospore\nblastospores\nblasts\nblastula\nblastulae\nblastular\nblastulas\nblastulation\nblasé\nblat\nblatancies\nblatancy\nblatant\nblatantly\nblate\nblather\nblathered\nblatherer\nblatherers\nblathering\nblathers\nblatherskite\nblatherskites\nblats\nblatted\nblatter\nblattered\nblattering\nblatters\nblatting\nblaw\nblawed\nblawing\nblawn\nblaws\nblaxploitation\nblaze\nblazed\nblazer\nblazers\nblazes\nblazing\nblazingly\nblazon\nblazoned\nblazoner\nblazoners\nblazoning\nblazonment\nblazonries\nblazonry\nblazons\nbleach\nbleachable\nbleached\nbleacher\nbleachers\nbleaches\nbleaching\nbleak\nbleaker\nbleakest\nbleakish\nbleakly\nbleakness\nblear\nbleared\nblearier\nbleariest\nblearily\nbleariness\nblearing\nblears\nbleary\nbleat\nbleated\nbleater\nbleaters\nbleating\nbleats\nbleb\nblebby\nblebs\nbled\nbleed\nbleeder\nbleeders\nbleeding\nbleedings\nbleeds\nbleep\nbleeped\nbleeper\nbleepers\nbleeping\nbleeps\nblemish\nblemished\nblemisher\nblemishers\nblemishes\nblemishing\nblench\nblenched\nblencher\nblenchers\nblenches\nblenching\nblend\nblende\nblended\nblender\nblenders\nblendes\nblending\nblends\nblenheim\nblennies\nblenny\nblent\nbleomycin\nbleomycins\nblepharitis\nblepharoplast\nblepharoplasts\nblepharoplasty\nblepharospasm\nblepharospasms\nblesbok\nblesboks\nbless\nblessed\nblessedly\nblessedness\nblesser\nblessers\nblesses\nblessing\nblessings\nblest\nblether\nblethered\nblethering\nblethers\nblew\nbligh\nblight\nblighted\nblighter\nblighters\nblighting\nblights\nblimp\nblimpish\nblimpishly\nblimpishness\nblimps\nblin\nblind\nblinded\nblinder\nblinders\nblindest\nblindfish\nblindfishes\nblindfold\nblindfolded\nblindfolding\nblindfolds\nblinding\nblindingly\nblindly\nblindman\nblindman's\nblindness\nblinds\nblindworm\nblindworms\nblini\nblinis\nblink\nblinked\nblinker\nblinkered\nblinkering\nblinkers\nblinking\nblinks\nblintz\nblintze\nblintzes\nblip\nblipped\nblipping\nblips\nbliss\nblissful\nblissfully\nblissfulness\nblister\nblistered\nblistering\nblisteringly\nblisters\nblistery\nblithe\nblithely\nblitheness\nblither\nblithered\nblithering\nblithers\nblithesome\nblithesomely\nblithest\nblithsomeness\nblitz\nblitzed\nblitzes\nblitzing\nblitzkrieg\nblitzkriegs\nblivit\nblivits\nblizzard\nblizzards\nblizzardy\nbloat\nbloated\nbloater\nbloaters\nbloating\nbloats\nblob\nblobbed\nblobbing\nblobs\nbloc\nblock\nblockade\nblockaded\nblockader\nblockaders\nblockades\nblockading\nblockage\nblockages\nblockbuster\nblockbusters\nblockbusting\nblocked\nblocker\nblockers\nblockhead\nblockheadedness\nblockheads\nblockhouse\nblockhouses\nblockier\nblockiest\nblocking\nblockish\nblockishly\nblockishness\nblocks\nblocky\nblocs\nbloemfontein\nblois\nbloke\nblokes\nblond\nblonde\nblonder\nblondes\nblondest\nblondish\nblondness\nblonds\nblood\nbloodbath\nbloodbaths\nbloodcurdling\nbloodcurdlingly\nblooded\nbloodedness\nbloodguilt\nbloodguiltiness\nbloodguilty\nbloodhound\nbloodhounds\nbloodied\nbloodier\nbloodies\nbloodiest\nbloodily\nbloodiness\nblooding\nbloodless\nbloodlessly\nbloodlessness\nbloodletter\nbloodletters\nbloodletting\nbloodlettings\nbloodline\nbloodlines\nbloodlust\nbloodmobile\nbloodmobiles\nbloodred\nbloodroot\nbloodroots\nbloods\nbloodshed\nbloodshot\nbloodstain\nbloodstained\nbloodstaining\nbloodstains\nbloodstock\nbloodstone\nbloodstones\nbloodstream\nbloodstreams\nbloodsucker\nbloodsuckers\nbloodsucking\nbloodthirstily\nbloodthirstiness\nbloodthirsty\nbloodworm\nbloodworms\nbloody\nbloodying\nbloom\nbloomed\nbloomer\nbloomers\nblooming\nblooms\nbloomy\nbloop\nblooped\nblooper\nbloopers\nblooping\nbloops\nblossom\nblossomed\nblossoming\nblossoms\nblossomy\nblot\nblotch\nblotched\nblotches\nblotchily\nblotchiness\nblotching\nblotchy\nblots\nblotted\nblotter\nblotters\nblotting\nblotto\nblouse\nbloused\nblouses\nblousing\nblouson\nblousons\nblousy\nblow\nblowback\nblowbacks\nblowby\nblowbys\nblower\nblowers\nblowfish\nblowfishes\nblowflies\nblowfly\nblowgun\nblowguns\nblowhard\nblowhards\nblowhole\nblowholes\nblowier\nblowiest\nblowing\nblowjob\nblowjobs\nblown\nblowoff\nblowoffs\nblowout\nblowouts\nblowpipe\nblowpipes\nblows\nblowsier\nblowsiest\nblowsy\nblowtorch\nblowtorches\nblowup\nblowups\nblowy\nblowzier\nblowziest\nblowzily\nblowziness\nblowzy\nblub\nblubbed\nblubber\nblubbered\nblubberer\nblubberers\nblubbering\nblubberingly\nblubbers\nblubbery\nblubbing\nblubs\nblucher\nbluchers\nbludgeon\nbludgeoned\nbludgeoneers\nbludgeoner\nbludgeoners\nbludgeoning\nbludgeons\nblue\nbluebeard\nbluebeards\nbluebell\nbluebells\nblueberries\nblueberry\nbluebill\nbluebills\nbluebird\nbluebirds\nbluebonnet\nbluebonnets\nbluebook\nbluebooks\nbluebottle\nbluebottles\nbluecoat\nbluecoated\nbluecoats\nbluecurls\nblued\nbluefin\nbluefish\nbluefishes\nbluegill\nbluegills\nbluegrass\nblueing\nblueings\nbluejacket\nbluejackets\nbluely\nblueness\nbluenose\nbluenosed\nbluenoses\nbluepoint\nbluepoints\nblueprint\nblueprinted\nblueprinting\nblueprints\nbluer\nblues\nblueshift\nbluesman\nbluesmen\nbluest\nbluestem\nbluestems\nbluestocking\nbluestockings\nbluestone\nbluestones\nbluesy\nbluet\nbluetongue\nbluetongues\nbluets\nblueweed\nblueweeds\nbluey\nblueys\nbluff\nbluffable\nbluffed\nbluffer\nbluffers\nbluffest\nbluffing\nbluffly\nbluffness\nbluffs\nbluing\nbluings\nbluish\nbluishness\nblunder\nblunderbuss\nblunderbusses\nblundered\nblunderer\nblunderers\nblundering\nblunderingly\nblunderings\nblunders\nblunt\nblunted\nblunter\nbluntest\nblunting\nbluntly\nbluntness\nblunts\nblur\nblurb\nblurbs\nblurred\nblurrier\nblurriest\nblurrily\nblurriness\nblurring\nblurringly\nblurry\nblurs\nblurt\nblurted\nblurter\nblurters\nblurting\nblurts\nblush\nblushed\nblusher\nblushers\nblushes\nblushful\nblushing\nblushingly\nbluster\nblustered\nblusterer\nblusterers\nblustering\nblusteringly\nblusterous\nblusters\nblustery\nblücher\nbo\nbo's'n\nbo's'ns\nbo'sun\nbo'suns\nboa\nboadicea\nboar\nboard\nboarded\nboarder\nboarders\nboarding\nboardinghouse\nboardinghouses\nboardlike\nboardman\nboardmen\nboardroom\nboardrooms\nboards\nboardsailing\nboardwalk\nboardwalks\nboarfish\nboarfishes\nboarhound\nboarhounds\nboarish\nboars\nboart\nboarts\nboas\nboast\nboasted\nboaster\nboasters\nboastful\nboastfully\nboastfulness\nboasting\nboastings\nboasts\nboat\nboatbill\nboatbills\nboatbuilder\nboatbuilders\nboated\nboatel\nboatels\nboater\nboaters\nboathouse\nboathouses\nboating\nboatlift\nboatlifts\nboatload\nboatloads\nboatman\nboatmanship\nboatmen\nboats\nboatsman\nboatsmen\nboatswain\nboatswains\nboatwright\nboatwrights\nboatyard\nboatyards\nbob\nbobbed\nbobber\nbobberies\nbobbers\nbobbery\nbobbie\nbobbies\nbobbin\nbobbinet\nbobbinets\nbobbing\nbobbins\nbobble\nbobbled\nbobbles\nbobbling\nbobby\nbobbysoxer\nbobbysoxers\nbobcat\nbobcats\nbobeche\nbobeches\nboboli\nbobolink\nbobolinks\nbobs\nbobsled\nbobsledded\nbobsledder\nbobsledders\nbobsledding\nbobsleded\nbobsleding\nbobsleds\nbobstay\nbobstays\nbobtail\nbobtailed\nbobtails\nbobwhite\nbobwhites\nbocaccio\nbocaccios\nboccaccio\nbocce\nbocces\nbocci\nboccie\nboccies\nboccis\nbock\nbocks\nbodacious\nbodaciously\nbode\nboded\nbodega\nbodegas\nbodement\nbodements\nbodensee\nbodes\nbodhisattva\nbodhisattvas\nbodice\nbodices\nbodied\nbodies\nbodiless\nbodily\nboding\nbodings\nbodkin\nbodkins\nbodleian\nbodley\nbody\nbodybuilder\nbodybuilders\nbodybuilding\nbodyguard\nbodyguards\nbodying\nbodysnatching\nbodysuit\nbodysuits\nbodysurf\nbodysurfed\nbodysurfer\nbodysurfers\nbodysurfing\nbodysurfs\nbodyweight\nbodywork\nboehmite\nboehmites\nboeing\nboeings\nboeotia\nboeotian\nboeotians\nboer\nboers\nboethius\nboff\nboffin\nboffins\nboffo\nboffola\nboffolas\nboffos\nboffs\nbofors\nbog\nbogey\nbogeyed\nbogeying\nbogeyman\nbogeymen\nbogeys\nbogged\nboggier\nboggiest\nbogginess\nbogging\nboggle\nboggled\nboggler\nbogglers\nboggles\nboggling\nboggy\nbogie\nbogies\nbogle\nbogles\nbogotá\nbogs\nbogsat\nbogtrotter\nbogtrotters\nbogus\nbogwood\nbogwoods\nbogy\nbogyman\nbogymen\nbohea\nboheas\nbohemia\nbohemian\nbohemianism\nbohemians\nbohemias\nbohr\nbohrium\nbohunk\nbohunks\nbohème\nboil\nboilable\nboiled\nboiler\nboilermaker\nboilermakers\nboilerplate\nboilerplates\nboilers\nboiling\nboiloff\nboiloffs\nboils\nbois\nboise\nboisterous\nboisterously\nboisterousness\nbokhara\nbokmål\nbola\nbolas\nbolases\nbold\nbolded\nbolder\nboldest\nboldface\nboldfaced\nboldfaces\nboldfacing\nbolding\nboldly\nboldness\nbole\nbolection\nbolections\nbolero\nboleros\nboles\nbolete\nboletes\nboleti\nboletus\nboletuses\nboleyn\nbolide\nbolides\nbolingbroke\nbolivar\nbolivars\nbolivia\nbolivian\nboliviano\nbolivianos\nbolivians\nboll\nbollard\nbollards\nbolled\nbolling\nbollinger\nbollix\nbollixed\nbollixes\nbollixing\nbolls\nbollworm\nbollworms\nbolo\nbologna\nbolognan\nbolognese\nbolometer\nbolometers\nbolometric\nbolometrically\nboloney\nbolos\nbolshevik\nbolsheviks\nbolshevism\nbolshevist\nbolshevists\nbolshevization\nbolshevize\nbolshevized\nbolshevizes\nbolshevizing\nbolshie\nbolshies\nbolshy\nbolster\nbolstered\nbolsterer\nbolsterers\nbolstering\nbolsters\nbolt\nbolted\nbolter\nbolters\nbolthole\nboltholes\nbolting\nboltonia\nboltonias\nboltrope\nboltropes\nbolts\nbolus\nboluses\nbolívar\nbomb\nbombard\nbombarded\nbombarder\nbombardier\nbombardiers\nbombarding\nbombardment\nbombardments\nbombardon\nbombardons\nbombards\nbombast\nbombaster\nbombasters\nbombastic\nbombastically\nbombasts\nbombay\nbombazine\nbombazines\nbombe\nbombed\nbomber\nbombers\nbombes\nbombinate\nbombinated\nbombinates\nbombinating\nbombination\nbombing\nbombings\nbomblet\nbomblets\nbombproof\nbombs\nbombshell\nbombshells\nbombsight\nbombsights\nbombycid\nbombycids\nbon\nbona\nbonanza\nbonanzas\nbonaparte\nbonapartism\nbonapartist\nbonapartists\nbonaventure\nbonbon\nbonbonnière\nbonbonnières\nbonbons\nbond\nbondable\nbondage\nbonded\nbonder\nbonders\nbondholder\nbondholders\nbondi\nbonding\nbondings\nbondmaid\nbondmaids\nbondman\nbondmen\nbonds\nbondservant\nbondservants\nbondsman\nbondsmen\nbondstone\nbondstones\nbondwoman\nbondwomen\nbone\nboneblack\nboned\nbonefish\nbonefishes\nbonehead\nboneheaded\nboneheadedness\nboneheads\nboneless\nboner\nboners\nbones\nboneset\nbonesets\nbonesetter\nbonesetters\nboney\nboneyard\nboneyards\nbonfire\nbonfires\nbong\nbonged\nbonging\nbongo\nbongoes\nbongoist\nbongoists\nbongos\nbongs\nbonhomie\nbonhomies\nbonier\nboniest\nboniface\nbonifaces\nboniness\nboning\nbonito\nbonitos\nbonjour\nbonkers\nbonn\nbonne\nbonnes\nbonnet\nbonneted\nbonneting\nbonnets\nbonneville\nbonnie\nbonnier\nbonniest\nbonnily\nbonniness\nbonny\nbonnyclabber\nbonnyclabbers\nbono\nbons\nbonsai\nbonsoir\nbonspiel\nbonspiels\nbontebok\nbonteboks\nbonum\nbonus\nbonuses\nbony\nbonze\nbonzes\nboo\nboob\nboobies\nbooboisie\nbooboisies\nbooboo\nbooboos\nboobs\nbooby\nboodle\nboodles\nbooed\nbooger\nboogerman\nboogermen\nboogers\nboogeyman\nboogeymen\nboogie\nboogied\nboogies\nboogying\nboohoo\nboohooed\nboohooing\nboohoos\nbooing\nbook\nbookbinder\nbookbinderies\nbookbinders\nbookbindery\nbookbinding\nbookbindings\nbookcase\nbookcases\nbooked\nbookend\nbookends\nbooker\nbookers\nbookful\nbookie\nbookies\nbooking\nbookings\nbookish\nbookishly\nbookishness\nbookkeeper\nbookkeepers\nbookkeeping\nbooklet\nbooklets\nbooklists\nbooklore\nbooklores\nbooklouse\nbooklouses\nbookmaker\nbookmakers\nbookmaking\nbookman\nbookmark\nbookmarker\nbookmarkers\nbookmarks\nbookmen\nbookmobile\nbookmobiles\nbookplate\nbookplates\nbookrack\nbookracks\nbookroom\nbookrooms\nbooks\nbookseller\nbooksellers\nbookselling\nbookshelf\nbookshelves\nbookshop\nbookshops\nbookstall\nbookstalls\nbookstand\nbookstands\nbookstore\nbookstores\nbookwork\nbookworm\nbookworms\nboolean\nboom\nboomed\nboomer\nboomerang\nboomeranged\nboomeranging\nboomerangs\nboomers\nboomier\nboomiest\nbooming\nboomlet\nboomlets\nbooms\nboomtown\nboomtowns\nboomy\nboon\nboondocks\nboondoggle\nboondoggled\nboondoggler\nboondogglers\nboondoggles\nboondoggling\nboonies\nboons\nboor\nboorish\nboorishly\nboorishness\nboors\nboos\nboost\nboosted\nbooster\nboosterish\nboosterism\nboosters\nboosting\nboosts\nboot\nbootblack\nbootblacks\nbooted\nbootee\nbootees\nbootes\nbooth\nbooths\nbootie\nbooties\nbooting\nbootjack\nbootjacks\nbootlace\nbootlaces\nbootle\nbootleg\nbootlegged\nbootlegger\nbootleggers\nbootlegging\nbootlegs\nbootless\nbootlessly\nbootlessness\nbootlick\nbootlicked\nbootlicker\nbootlickers\nbootlicking\nbootlicks\nboots\nbootstrap\nbootstrapped\nbootstrapping\nbootstraps\nbooty\nbooze\nboozed\nboozehound\nboozehounds\nboozer\nboozers\nboozes\nboozier\nbooziest\nboozily\nboozing\nboozy\nbop\nbophuthatswana\nbopped\nbopper\nboppers\nbopping\nboppish\nbops\nbora\nboracic\nborage\nborages\nborane\nboranes\nboras\nborate\nborated\nborates\nborax\nboraxes\nborazon\nborborygmi\nborborygmus\nbordeaux\nbordello\nbordellos\nborder\nbordereau\nbordereaux\nbordered\nborderer\nborderers\nbordering\nborderland\nborderlands\nborderline\nborderlines\nborders\nbordetella\nbordetellas\nbordure\nbordures\nbore\nboreal\nborealis\nboreas\nborecole\nborecoles\nbored\nboredom\nborehole\nboreholes\nborer\nborers\nbores\nborghese\nborgia\nboric\nboride\nborides\nboring\nboringly\nboringness\nborings\nborn\nborne\nbornean\nborneo\nborneol\nborneols\nbornholm\nbornite\nbornites\nborodin\nboron\nboronic\nborons\nborosilicate\nborosilicates\nborough\nboroughs\nborrelia\nborrelias\nborrow\nborrowed\nborrower\nborrowers\nborrowing\nborrowings\nborrows\nborsch\nborsches\nborscht\nborschts\nborsht\nborshts\nborstal\nborstals\nbort\nborts\nborty\nborzoi\nborzois\nbos'n\nbosc\nboscage\nboscages\nbosch\nbosh\nbosk\nboskage\nboskages\nboskier\nboskiest\nboskiness\nbosks\nbosky\nbosnia\nbosnian\nbosnians\nbosom\nbosomed\nbosoms\nbosomy\nboson\nbosons\nbosphorus\nbosporus\nbosque\nbosques\nbosquet\nbosquets\nboss\nbossa\nbossdom\nbossdoms\nbossed\nbosses\nbossier\nbossies\nbossiest\nbossily\nbossiness\nbossing\nbossism\nbossisms\nbossy\nboston\nbostonian\nbostonians\nbosun\nbosuns\nboswell\nboswellian\nboswellize\nboswellized\nboswellizes\nboswellizing\nboswells\nbosworth\nbot\nbotanic\nbotanical\nbotanically\nbotanicals\nbotanies\nbotanist\nbotanists\nbotanize\nbotanized\nbotanizer\nbotanizers\nbotanizes\nbotanizing\nbotany\nbotch\nbotched\nbotcher\nbotchers\nbotches\nbotching\nbotchy\nbotfly\nboth\nbother\nbotheration\nbotherations\nbothered\nbothering\nbothers\nbothersome\nbothnia\nbotonee\nbotonnee\nbotryoidal\nbotryoidally\nbotrytis\nbots\nbotswana\nbotswanan\nbott\nbotticelli\nbottle\nbottlebrush\nbottlebrushes\nbottlecap\nbottlecaps\nbottled\nbottleful\nbottleneck\nbottlenecked\nbottlenecking\nbottlenecks\nbottlenose\nbottlenoses\nbottler\nbottlers\nbottles\nbottling\nbottom\nbottomed\nbottomer\nbottomers\nbottoming\nbottomland\nbottomless\nbottomlessly\nbottomlessness\nbottommost\nbottoms\nbotts\nbotulin\nbotulinal\nbotulins\nbotulinum\nbotulinums\nbotulinus\nbotulism\nboucicault\nboucle\nbouclé\nboudicca\nboudin\nboudins\nboudoir\nboudoirs\nbouffant\nbouffe\nbouffes\nbougainvillaea\nbougainvillaeas\nbougainville\nbougainvillea\nbougainvilleas\nbough\nboughed\nboughs\nbought\nbougie\nbougies\nbouillabaisse\nbouillon\nboulder\nbouldered\nboulderer\nboulderers\nbouldering\nboulders\nbouldery\nboule\nboules\nboulevard\nboulevardier\nboulevardiers\nboulevards\nbouleversement\nbouleversements\nboulle\nboulles\nboulogne\nbounce\nbounced\nbouncer\nbouncers\nbounces\nbouncier\nbounciest\nbouncily\nbouncing\nbouncingly\nbouncy\nbound\nboundaries\nboundary\nbounded\nboundedness\nbounden\nbounder\nbounderish\nbounders\nbounding\nboundless\nboundlessly\nboundlessness\nbounds\nbounteous\nbounteously\nbounteousness\nbountied\nbounties\nbountiful\nbountifully\nbountifulness\nbounty\nbouquet\nbouquetier\nbouquetiers\nbouquets\nbourbon\nbourbonism\nbourbons\nbourdon\nbourdons\nbourg\nbourgeois\nbourgeoise\nbourgeoises\nbourgeoisie\nbourgeoisification\nbourgeoisified\nbourgeoisifies\nbourgeoisify\nbourgeoisifying\nbourgeon\nbourgeoned\nbourgeoning\nbourgeons\nbourget\nbourgogne\nbourgs\nbourguignon\nbourn\nbourne\nbournes\nbourns\nbourrée\nbourrées\nbourse\nbourses\nbouse\nboused\nbouses\nbousing\nboustrophedon\nboustrophedonic\nbout\nboutique\nboutiques\nbouton\nboutonniere\nboutonnieres\nboutonnière\nboutonnières\nboutons\nbouts\nbouvardia\nbouvardias\nbouvier\nbouzouki\nbouzoukis\nbovid\nbovids\nbovine\nbovinely\nbovines\nbovinity\nbovril\nbow\nbowdlerism\nbowdlerization\nbowdlerizations\nbowdlerize\nbowdlerized\nbowdlerizer\nbowdlerizers\nbowdlerizes\nbowdlerizing\nbowed\nbowel\nbowelless\nbowels\nbower\nbowerbird\nbowerbirds\nbowered\nbowering\nbowers\nbowery\nbowfin\nbowfins\nbowfront\nbowhead\nbowheads\nbowie\nbowing\nbowings\nbowknot\nbowknots\nbowl\nbowlder\nbowlders\nbowled\nbowleg\nbowlegged\nbowlegs\nbowler\nbowlers\nbowlful\nbowlfuls\nbowline\nbowlines\nbowling\nbowls\nbowman\nbowmen\nbows\nbowse\nbowsed\nbowses\nbowshot\nbowshots\nbowsing\nbowsprit\nbowsprits\nbowstring\nbowstrings\nbowwow\nbowwows\nbowyer\nbowyers\nbox\nboxboard\nboxboards\nboxcar\nboxcars\nboxed\nboxer\nboxers\nboxes\nboxfish\nboxfishes\nboxful\nboxfuls\nboxhaul\nboxhauled\nboxhauling\nboxhauls\nboxier\nboxiest\nboxiness\nboxing\nboxings\nboxlike\nboxthorn\nboxthorns\nboxwood\nboxwoods\nboxy\nboy\nboyar\nboyard\nboyards\nboyars\nboycott\nboycotted\nboycotter\nboycotters\nboycotting\nboycotts\nboyfriend\nboyfriends\nboyhood\nboyish\nboyishly\nboyishness\nboyle\nboyo\nboyos\nboys\nboysenberries\nboysenberry\nbozcaada\nbozeman\nbozo\nbozos\nboîte\nboîtes\nboötes\nbra\nbrabant\nbrabble\nbrabbled\nbrabbler\nbrabblers\nbrabbles\nbrabbling\nbrace\nbraced\nbracelet\nbracelets\nbracer\nbracero\nbraceros\nbracers\nbraces\nbrachia\nbrachial\nbrachiate\nbrachiated\nbrachiates\nbrachiating\nbrachiation\nbrachiator\nbrachiators\nbrachiocephalic\nbrachiopod\nbrachiopods\nbrachiosaurus\nbrachium\nbrachycephalic\nbrachycephalism\nbrachycephaly\nbrachydactylia\nbrachydactylic\nbrachydactyly\nbrachylogies\nbrachylogy\nbrachypterism\nbrachypterous\nbrachyuran\nbracing\nbracingly\nbracings\nbraciola\nbracken\nbrackens\nbracket\nbracketed\nbracketing\nbrackets\nbrackish\nbrackishness\nbraconid\nbraconids\nbract\nbracteal\nbracteate\nbracted\nbracteolate\nbracteole\nbracteoles\nbracts\nbrad\nbradawl\nbradawls\nbradded\nbradding\nbrads\nbradshaw\nbradycardia\nbradycardias\nbradycardic\nbradykinin\nbradykinins\nbradylogia\nbradylogias\nbrae\nbraes\nbrag\nbraganza\nbragg\nbraggadocio\nbraggadocios\nbraggart\nbraggarts\nbragged\nbragger\nbraggers\nbraggest\nbragging\nbraggy\nbrags\nbrahe\nbrahma\nbrahman\nbrahmanic\nbrahmanical\nbrahmanism\nbrahmanist\nbrahmanists\nbrahmans\nbrahmaputra\nbrahmas\nbrahmin\nbrahminism\nbrahmins\nbrahms\nbrahmsian\nbraid\nbraided\nbraider\nbraiders\nbraiding\nbraidings\nbraids\nbrail\nbrailed\nbrailing\nbraille\nbrailled\nbrailler\nbraillers\nbrailles\nbraillewriter\nbraillewriters\nbrailling\nbrails\nbrain\nbraincase\nbraincases\nbrainchild\nbrainchildren\nbrained\nbrainier\nbrainiest\nbrainily\nbraininess\nbraining\nbrainish\nbrainless\nbrainlessly\nbrainlessness\nbrainpan\nbrainpans\nbrainpower\nbrains\nbrainsick\nbrainsickly\nbrainsickness\nbrainstem\nbrainstems\nbrainstorm\nbrainstormed\nbrainstormer\nbrainstormers\nbrainstorming\nbrainstorms\nbrainteaser\nbrainteasers\nbrainwash\nbrainwashed\nbrainwasher\nbrainwashers\nbrainwashes\nbrainwashing\nbrainwave\nbrainwaves\nbrainwork\nbrainworker\nbrainworkers\nbrainworks\nbrainy\nbraise\nbraised\nbraises\nbraising\nbrake\nbraked\nbrakeless\nbrakeman\nbrakemen\nbrakes\nbraking\nbraky\nbraless\nbralessness\nbramble\nbrambleberries\nbrambleberry\nbrambles\nbrambling\nbramblings\nbrambly\nbran\nbranch\nbranched\nbranches\nbranchia\nbranchiae\nbranchial\nbranching\nbranchiopadous\nbranchiopod\nbranchiopodan\nbranchiopods\nbranchless\nbranchlet\nbranchlets\nbranchy\nbrand\nbrandade\nbrandades\nbranded\nbrandenburg\nbrander\nbranders\nbrandied\nbrandies\nbranding\nbrandish\nbrandished\nbrandisher\nbrandishers\nbrandishes\nbrandishing\nbrandling\nbrandlings\nbrands\nbrandy\nbrandying\nbrandywine\nbrank\nbranks\nbrannigan\nbrannigans\nbranny\nbrant\nbrants\nbraque\nbras\nbrash\nbrasher\nbrashes\nbrashest\nbrashly\nbrashness\nbrass\nbrassard\nbrassards\nbrassbound\nbrasserie\nbrasseries\nbrasses\nbrassica\nbrassicas\nbrassie\nbrassier\nbrassiere\nbrassieres\nbrassies\nbrassiest\nbrassily\nbrassiness\nbrassware\nbrasswares\nbrassy\nbrasília\nbrat\nbratislava\nbrats\nbrattice\nbratticed\nbrattices\nbratticing\nbrattier\nbrattiest\nbrattiness\nbrattish\nbrattishness\nbrattle\nbrattleboro\nbrattled\nbrattles\nbrattling\nbratty\nbratwurst\nbratwursts\nbraunschweiger\nbraunschweigers\nbrava\nbravado\nbravadoes\nbravados\nbravas\nbrave\nbraved\nbravely\nbraveness\nbraver\nbraveries\nbravers\nbravery\nbraves\nbravest\nbraving\nbravissimo\nbravo\nbravoed\nbravoes\nbravoing\nbravos\nbravura\nbravuras\nbraw\nbrawer\nbrawest\nbrawl\nbrawled\nbrawler\nbrawlers\nbrawlier\nbrawliest\nbrawling\nbrawlingly\nbrawls\nbrawly\nbrawn\nbrawnier\nbrawniest\nbrawnily\nbrawniness\nbrawny\nbray\nbrayed\nbrayer\nbrayers\nbraying\nbrays\nbraze\nbrazed\nbrazen\nbrazened\nbrazenfaced\nbrazening\nbrazenly\nbrazenness\nbrazens\nbrazer\nbrazers\nbrazes\nbrazier\nbraziers\nbrazil\nbrazilian\nbrazilians\nbrazils\nbrazilwood\nbrazilwoods\nbrazing\nbrazzaville\nbreach\nbreached\nbreaches\nbreaching\nbread\nbreadbasket\nbreadbaskets\nbreadboard\nbreadboarded\nbreadboarding\nbreadboards\nbreadbox\nbreadboxes\nbreadcrumb\nbreadcrumbs\nbreaded\nbreadfruit\nbreadfruits\nbreading\nbreadline\nbreadlines\nbreadnut\nbreadnuts\nbreadroot\nbreadroots\nbreads\nbreadstuff\nbreadstuffs\nbreadth\nbreadths\nbreadthways\nbreadthwise\nbreadwinner\nbreadwinners\nbreadwinning\nbreak\nbreakable\nbreakableness\nbreakables\nbreakage\nbreakages\nbreakaway\nbreakaways\nbreakdown\nbreakdowns\nbreaker\nbreakers\nbreakfast\nbreakfasted\nbreakfaster\nbreakfasters\nbreakfasting\nbreakfasts\nbreakfront\nbreakfronts\nbreaking\nbreakings\nbreakneck\nbreakoff\nbreakoffs\nbreakout\nbreakouts\nbreakpoint\nbreakpoints\nbreaks\nbreakthrough\nbreakthroughs\nbreakup\nbreakups\nbreakwater\nbreakwaters\nbream\nbreamed\nbreaming\nbreams\nbreast\nbreastbone\nbreastbones\nbreasted\nbreastfed\nbreastfeed\nbreastfeeding\nbreastfeeds\nbreasting\nbreastplate\nbreastplates\nbreasts\nbreaststroke\nbreaststroker\nbreaststrokers\nbreaststrokes\nbreastwork\nbreastworks\nbreath\nbreathability\nbreathable\nbreathalyzer\nbreathalyzers\nbreathe\nbreathed\nbreather\nbreathers\nbreathes\nbreathier\nbreathiest\nbreathily\nbreathiness\nbreathing\nbreathings\nbreathless\nbreathlessly\nbreathlessness\nbreaths\nbreathtaking\nbreathtakingly\nbreathy\nbreccia\nbreccias\nbrecciate\nbrecciated\nbrecciates\nbrecciating\nbrecciation\nbrecht\nbrechtian\nbreckinridge\nbred\nbreda\nbrede\nbredes\nbreech\nbreechblock\nbreechblocks\nbreechcloth\nbreechcloths\nbreechclout\nbreechclouts\nbreeches\nbreeching\nbreechings\nbreechloader\nbreechloaders\nbreechloading\nbreed\nbreeder\nbreeders\nbreeding\nbreeds\nbreeks\nbreeze\nbreezed\nbreezeless\nbreezes\nbreezeway\nbreezeways\nbreezier\nbreeziest\nbreezily\nbreeziness\nbreezing\nbreezy\nbregma\nbregmata\nbregmatic\nbremen\nbremsstrahlung\nbremsstrahlungs\nbren\nbrenner\nbrent\nbresaola\nbresaolas\nbrest\nbretagne\nbrethren\nbreton\nbretons\nbreughel\nbreve\nbreves\nbrevet\nbrevetcy\nbreveted\nbreveting\nbrevets\nbrevetted\nbrevetting\nbreviaries\nbreviary\nbrevity\nbrew\nbrewage\nbrewages\nbrewed\nbrewer\nbreweries\nbrewers\nbrewery\nbrewing\nbrewpub\nbrewpubs\nbrews\nbriand\nbriar\nbriard\nbriards\nbriarroot\nbriarroots\nbriars\nbriarwood\nbriarwoods\nbribable\nbribe\nbribed\nbribee\nbribees\nbriber\nbriberies\nbribers\nbribery\nbribes\nbribing\nbrick\nbrickbat\nbrickbats\nbricked\nbricking\nbricklayer\nbricklayers\nbricklaying\nbrickle\nbricks\nbrickwork\nbricky\nbrickyard\nbrickyards\nbricolage\nbricolages\nbridal\nbridals\nbride\nbridegroom\nbridegrooms\nbrides\nbrideshead\nbridesmaid\nbridesmaids\nbridewell\nbridewells\nbridge\nbridgeable\nbridgeboard\nbridgeboards\nbridged\nbridgehead\nbridgeheads\nbridgeless\nbridgeport\nbridges\nbridgetown\nbridgework\nbridging\nbridie\nbridle\nbridled\nbridler\nbridlers\nbridles\nbridling\nbrie\nbrief\nbriefcase\nbriefcases\nbriefed\nbriefer\nbriefers\nbriefest\nbriefing\nbriefings\nbriefless\nbriefly\nbriefness\nbriefs\nbrier\nbriers\nbriery\nbries\nbrig\nbrigade\nbrigaded\nbrigades\nbrigadier\nbrigadiers\nbrigading\nbrigadoon\nbrigand\nbrigandage\nbrigandine\nbrigandines\nbrigandism\nbrigands\nbrigantine\nbrigantines\nbright\nbrighten\nbrightened\nbrightener\nbrighteners\nbrightening\nbrightens\nbrighter\nbrightest\nbrightly\nbrightness\nbrightwork\nbrightworks\nbrigs\nbrill\nbrilliance\nbrilliancy\nbrilliant\nbrilliantine\nbrilliantly\nbrilliantness\nbrilliants\nbrills\nbrim\nbrimful\nbrimless\nbrimmed\nbrimmer\nbrimmers\nbrimming\nbrims\nbrimstone\nbrimstones\nbrinded\nbrindisi\nbrindle\nbrindled\nbrindles\nbrine\nbrined\nbrinell\nbriner\nbriners\nbrines\nbring\nbringdown\nbringdowns\nbringer\nbringers\nbringing\nbrings\nbrinier\nbriniest\nbrininess\nbrining\nbrink\nbrinkmanship\nbrinksmanship\nbriny\nbrio\nbrioche\nbrioches\nbriolette\nbriolettes\nbriquet\nbriquets\nbriquette\nbriquetted\nbriquettes\nbriquetting\nbrisance\nbrisances\nbrisant\nbrisbane\nbrisk\nbrisker\nbriskest\nbrisket\nbriskets\nbriskly\nbriskness\nbrisling\nbrislings\nbristle\nbristlecone\nbristled\nbristlelike\nbristles\nbristletail\nbristletails\nbristlier\nbristliest\nbristling\nbristly\nbristol\nbristols\nbrit\nbritain\nbritannia\nbritannic\nbritannica\nbritches\nbriticism\nbriticisms\nbritish\nbritisher\nbritishers\nbritishness\nbriton\nbritons\nbrits\nbritt\nbrittany\nbritten\nbrittle\nbrittlebush\nbrittlebushes\nbrittlely\nbrittleness\nbrittler\nbrittlest\nbrittonic\nbritts\nbrno\nbro\nbroach\nbroached\nbroacher\nbroachers\nbroaches\nbroaching\nbroad\nbroadax\nbroadaxe\nbroadaxes\nbroadband\nbroadcast\nbroadcasted\nbroadcaster\nbroadcasters\nbroadcasting\nbroadcastings\nbroadcasts\nbroadcloth\nbroaden\nbroadened\nbroadener\nbroadeners\nbroadening\nbroadens\nbroader\nbroadest\nbroadleaf\nbroadloom\nbroadlooms\nbroadly\nbroadminded\nbroadmindedly\nbroadmindedness\nbroadness\nbroads\nbroadsheet\nbroadsheets\nbroadside\nbroadsided\nbroadsides\nbroadsiding\nbroadsword\nbroadswords\nbroadtail\nbroadtails\nbroadway\nbrobdingnag\nbrobdingnagian\nbrobdingnagians\nbrocade\nbrocaded\nbrocades\nbrocatel\nbrocatelle\nbrocatelles\nbrocatels\nbroccoli\nbrochette\nbrochettes\nbrochure\nbrochures\nbrock\nbrockage\nbrockages\nbrocket\nbrockets\nbrocks\nbrogan\nbrogans\nbrogue\nbrogues\nbroider\nbroidered\nbroidering\nbroiders\nbroidery\nbroil\nbroiled\nbroiler\nbroilers\nbroiling\nbroils\nbroke\nbroken\nbrokenhearted\nbrokenheartedly\nbrokenly\nbrokenness\nbroker\nbrokerage\nbrokerages\nbrokered\nbrokering\nbrokers\nbrollies\nbrolly\nbromate\nbromated\nbromates\nbromating\nbrome\nbromegrass\nbromegrasses\nbromelain\nbromelains\nbromeliad\nbromeliads\nbromelin\nbromelins\nbromes\nbromic\nbromide\nbromides\nbromidic\nbrominate\nbrominated\nbrominates\nbrominating\nbromination\nbromine\nbromism\nbromo\nbromos\nbronc\nbronchi\nbronchia\nbronchial\nbronchially\nbronchiectasis\nbronchiolar\nbronchiole\nbronchioles\nbronchitic\nbronchitis\nbronchium\nbroncho\nbronchodilator\nbronchodilators\nbronchopneumonia\nbronchos\nbronchoscope\nbronchoscopes\nbronchoscopic\nbronchoscopically\nbronchoscopist\nbronchoscopists\nbronchoscopy\nbronchus\nbronco\nbroncobuster\nbroncobusters\nbroncos\nbroncs\nbrontosaur\nbrontosaurs\nbrontosaurus\nbrontosauruses\nbrontë\nbrontës\nbronx\nbronze\nbronzed\nbronzer\nbronzers\nbronzes\nbronzing\nbronzy\nbrooch\nbrooches\nbrood\nbrooded\nbrooder\nbrooders\nbroodier\nbroodiest\nbroodiness\nbrooding\nbroodingly\nbroods\nbroody\nbrook\nbrooked\nbrookie\nbrookies\nbrooking\nbrookite\nbrookites\nbrooklet\nbrooklets\nbrooklime\nbrooklimes\nbrooklyn\nbrooklynese\nbrooks\nbroom\nbroomball\nbroomballer\nbroomballers\nbroomcorn\nbroomcorns\nbroomed\nbrooming\nbroomrape\nbroomrapes\nbrooms\nbroomstick\nbroomsticks\nbroomtail\nbroomtails\nbroomy\nbros\nbrose\nbroses\nbroth\nbrothel\nbrothels\nbrother\nbrotherhood\nbrotherhoods\nbrotherliness\nbrotherly\nbrothers\nbroths\nbrougham\nbroughams\nbrought\nbrouhaha\nbrouhahas\nbrow\nbrowallia\nbrowallias\nbrowbeat\nbrowbeaten\nbrowbeater\nbrowbeaters\nbrowbeating\nbrowbeats\nbrown\nbrowne\nbrowned\nbrowner\nbrownest\nbrownian\nbrownie\nbrownies\nbrowning\nbrownings\nbrownish\nbrownness\nbrownnose\nbrownnosed\nbrownnoser\nbrownnosers\nbrownnoses\nbrownnosing\nbrownout\nbrownouts\nbrowns\nbrownshirt\nbrownshirts\nbrownstone\nbrownstones\nbrowny\nbrowridge\nbrows\nbrowse\nbrowsed\nbrowser\nbrowsers\nbrowses\nbrowsing\nbruce\nbrucella\nbrucellae\nbrucellas\nbrucellosis\nbrucine\nbrucines\nbruckner\nbrueghel\nbruges\nbruin\nbruins\nbruise\nbruised\nbruiser\nbruisers\nbruises\nbruising\nbruit\nbruited\nbruiting\nbruits\nbrulee\nbrulé\nbrulés\nbrumal\nbrumbies\nbrumby\nbrume\nbrumes\nbrummagem\nbrummell\nbrumous\nbrunch\nbrunched\nbrunches\nbrunching\nbrunei\nbruneian\nbruneians\nbrunel\nbrunelleschi\nbrunet\nbrunets\nbrunette\nbrunettes\nbrunhild\nbrunizem\nbrunswick\nbrunt\nbrush\nbrushability\nbrushback\nbrushed\nbrusher\nbrushers\nbrushes\nbrushfire\nbrushfires\nbrushier\nbrushing\nbrushings\nbrushland\nbrushoff\nbrushstroke\nbrushstrokes\nbrushup\nbrushups\nbrushwood\nbrushwork\nbrushy\nbrusk\nbrusque\nbrusquely\nbrusqueness\nbrusquer\nbrusquerie\nbrusqueries\nbrusquest\nbrussels\nbrut\nbrutal\nbrutalism\nbrutalist\nbrutalists\nbrutalities\nbrutality\nbrutalization\nbrutalize\nbrutalized\nbrutalizes\nbrutalizing\nbrutally\nbrute\nbrutes\nbrutish\nbrutishly\nbrutishness\nbrutism\nbrutum\nbrutus\nbruxelles\nbruxism\nbruxisms\nbrynhild\nbryological\nbryologist\nbryologists\nbryology\nbryonies\nbryony\nbryophyllum\nbryophyta\nbryophyte\nbryophytes\nbryophytic\nbryozoa\nbryozoan\nbryozoans\nbrython\nbrythonic\nbrythons\nbrzezinski\nbrûlée\nbrûlées\nbub\nbubbies\nbubble\nbubbled\nbubblegum\nbubblehead\nbubbleheaded\nbubbleheads\nbubbler\nbubblers\nbubbles\nbubblier\nbubblies\nbubbliest\nbubbling\nbubbly\nbubby\nbubo\nbuboes\nbubonic\nbubonocele\nbubonoceles\nbuccal\nbuccally\nbuccaneer\nbuccaneering\nbuccaneerish\nbuccaneers\nbuccinator\nbucco\nbucephalus\nbucer\nbucharest\nbuchenwald\nbuchu\nbuchus\nbuck\nbuckaroo\nbuckaroos\nbuckbean\nbuckbeans\nbuckboard\nbuckboards\nbucked\nbucker\nbuckeroo\nbuckers\nbucket\nbucketed\nbucketful\nbucketfuls\nbucketing\nbuckets\nbucketsful\nbuckeye\nbuckeyes\nbuckhorn\nbuckhorns\nbuckhound\nbuckhounds\nbucking\nbuckinghamshire\nbuckjump\nbuckjumped\nbuckjumper\nbuckjumpers\nbuckjumping\nbuckjumps\nbuckle\nbuckled\nbuckler\nbucklered\nbucklering\nbucklers\nbuckles\nbuckley's\nbuckling\nbuckminsterfullerene\nbuckminsterfullerenes\nbucko\nbuckoes\nbuckram\nbuckramed\nbuckraming\nbuckrams\nbucks\nbucksaw\nbucksaws\nbuckshee\nbuckshees\nbuckshot\nbuckskin\nbuckskinned\nbuckskins\nbucktail\nbucktails\nbuckteeth\nbuckthorn\nbuckthorns\nbucktooth\nbucktoothed\nbuckwheat\nbuckyball\nbuckyballs\nbuco\nbucolic\nbucolically\nbucolics\nbud\nbudapest\nbudded\nbudder\nbudders\nbuddha\nbuddhahood\nbuddhas\nbuddhism\nbuddhist\nbuddhistic\nbuddhistical\nbuddhists\nbuddied\nbuddies\nbudding\nbuddle\nbuddleia\nbuddleias\nbuddles\nbuddy\nbuddying\nbudge\nbudged\nbudgerigar\nbudgerigars\nbudges\nbudget\nbudgetary\nbudgeted\nbudgeteer\nbudgeteers\nbudgeter\nbudgeters\nbudgeting\nbudgets\nbudgie\nbudgies\nbudging\nbuds\nbudworm\nbudworms\nbuenos\nbuff\nbuffa\nbuffalo\nbuffaloberry\nbuffaloed\nbuffaloes\nbuffaloing\nbuffed\nbuffer\nbuffered\nbuffering\nbuffers\nbuffet\nbuffeted\nbuffeter\nbuffeters\nbuffeting\nbuffetings\nbuffets\nbuffi\nbuffing\nbufflehead\nbuffleheads\nbuffo\nbuffoon\nbuffoonery\nbuffoonish\nbuffoons\nbuffos\nbuffs\nbug\nbugaboo\nbugaboos\nbugbane\nbugbanes\nbugbear\nbugbears\nbugeye\nbugeyes\nbugged\nbugger\nbuggered\nbuggering\nbuggers\nbuggery\nbuggier\nbuggies\nbuggiest\nbugginess\nbugging\nbuggy\nbughouse\nbughouses\nbugle\nbugled\nbugler\nbuglers\nbugles\nbugleweed\nbugleweeds\nbugling\nbugloss\nbuglosses\nbugs\nbuhl\nbuhls\nbuhrstone\nbuhrstones\nbuick\nbuicks\nbuild\nbuildable\nbuilddown\nbuilddowns\nbuilded\nbuilder\nbuilderer\nbuilderers\nbuildering\nbuilders\nbuilding\nbuildings\nbuilds\nbuildup\nbuildups\nbuilt\nbuirdly\nbujumbura\nbukhara\nbulawayo\nbulb\nbulbar\nbulbed\nbulbel\nbulbels\nbulbiferous\nbulbil\nbulbils\nbulblet\nbulblets\nbulbourethral\nbulbous\nbulbously\nbulbs\nbulbul\nbulbuls\nbulgar\nbulgaria\nbulgarian\nbulgarians\nbulgars\nbulge\nbulged\nbulges\nbulgier\nbulgiest\nbulginess\nbulging\nbulgur\nbulgy\nbulimarexia\nbulimarexias\nbulimia\nbulimic\nbulk\nbulked\nbulkhead\nbulkheads\nbulkier\nbulkiest\nbulkily\nbulkiness\nbulking\nbulks\nbulky\nbull\nbulla\nbullace\nbullaces\nbullae\nbullate\nbullbaiting\nbullbat\nbullbats\nbullboat\nbullboats\nbulldog\nbulldogged\nbulldogger\nbulldoggers\nbulldogging\nbulldogs\nbulldoze\nbulldozed\nbulldozer\nbulldozers\nbulldozes\nbulldozing\nbulled\nbullet\nbulleted\nbulletin\nbulletined\nbulleting\nbulletining\nbulletins\nbulletproof\nbulletproofed\nbulletproofing\nbulletproofs\nbullets\nbullfight\nbullfighter\nbullfighters\nbullfighting\nbullfights\nbullfinch\nbullfinches\nbullfrog\nbullfrogs\nbullhead\nbullheaded\nbullheadedly\nbullheadedness\nbullheads\nbullhorn\nbullhorns\nbullied\nbullies\nbulling\nbullion\nbullish\nbullishly\nbullishness\nbullism\nbullmastiff\nbullmastiffs\nbullnecked\nbullock\nbullocks\nbullocky\nbullous\nbullpen\nbullpens\nbullring\nbullrings\nbullroarer\nbullroarers\nbullrush\nbullrushes\nbulls\nbullshat\nbullshit\nbullshits\nbullshitted\nbullshitter\nbullshitters\nbullshitting\nbullshot\nbullterrier\nbullterriers\nbullwhacker\nbullwhackers\nbullwhip\nbullwhipped\nbullwhipping\nbullwhips\nbully\nbullyboy\nbullyboys\nbullying\nbullyrag\nbullyragged\nbullyragging\nbullyrags\nbulrush\nbulrushes\nbulwark\nbulwarked\nbulwarking\nbulwarks\nbulwer\nbum\nbumbershoot\nbumbershoots\nbumble\nbumblebee\nbumblebees\nbumbled\nbumbler\nbumblers\nbumbles\nbumbling\nbumblingly\nbumboat\nbumboats\nbumf\nbumkin\nbumkins\nbummalo\nbummalos\nbummed\nbummer\nbummers\nbumming\nbump\nbumped\nbumper\nbumpers\nbumph\nbumpier\nbumpiest\nbumpily\nbumpiness\nbumping\nbumpkin\nbumpkinish\nbumpkinly\nbumpkins\nbumps\nbumptious\nbumptiously\nbumptiousness\nbumpy\nbums\nbun\nbuna\nbunas\nbunch\nbunchberries\nbunchberry\nbunched\nbunches\nbunchflower\nbunchflowers\nbunchgrass\nbunchgrasses\nbunchily\nbunchiness\nbunching\nbunchy\nbunco\nbuncoed\nbuncoing\nbuncombe\nbuncos\nbund\nbundist\nbundists\nbundle\nbundled\nbundler\nbundlers\nbundles\nbundling\nbunds\nbung\nbungalow\nbungalows\nbunged\nbungee\nbunghole\nbungholes\nbunging\nbungle\nbungled\nbungler\nbunglers\nbungles\nbunglesome\nbungling\nbunglingly\nbungs\nbunion\nbunions\nbunk\nbunked\nbunker\nbunkered\nbunkering\nbunkerings\nbunkers\nbunkhouse\nbunkhouses\nbunking\nbunkmate\nbunkmates\nbunko\nbunkos\nbunkroom\nbunkrooms\nbunks\nbunkum\nbunnies\nbunny\nbunraku\nbuns\nbunsen\nbunt\nbunted\nbunter\nbunters\nbunting\nbuntings\nbuntline\nbuntlines\nbunts\nbunyan\nbunyanesque\nbunyip\nbunyips\nbuoy\nbuoyance\nbuoyances\nbuoyancy\nbuoyant\nbuoyantly\nbuoyed\nbuoying\nbuoys\nbuppie\nbuppies\nbuprestid\nbuprestids\nbur\nburan\nburans\nburbage\nburberry\nburble\nburbled\nburbler\nburblers\nburbles\nburbling\nburbly\nburbot\nburbots\nburbs\nburden\nburdened\nburdening\nburdens\nburdensome\nburdensomely\nburdensomeness\nburdock\nburdocks\nbureau\nbureaucracies\nbureaucracy\nbureaucrat\nbureaucratese\nbureaucrateses\nbureaucratic\nbureaucratically\nbureaucratism\nbureaucratization\nbureaucratize\nbureaucratized\nbureaucratizes\nbureaucratizing\nbureaucrats\nbureaus\nbureaux\nburet\nburets\nburette\nburettes\nburg\nburgage\nburgages\nburgee\nburgees\nburgeon\nburgeoned\nburgeoning\nburgeons\nburger\nburgers\nburgess\nburgesses\nburgh\nburghal\nburgher\nburghers\nburghley\nburghs\nburglar\nburglaries\nburglarious\nburglariously\nburglarize\nburglarized\nburglarizes\nburglarizing\nburglarproof\nburglarproofed\nburglarproofing\nburglarproofs\nburglars\nburglary\nburgle\nburgled\nburgles\nburgling\nburgomaster\nburgomasters\nburgonet\nburgonets\nburgoo\nburgoos\nburgos\nburgs\nburgundian\nburgundians\nburgundies\nburgundy\nburial\nburials\nburied\nburier\nburiers\nburies\nburin\nburins\nburke\nburked\nburkes\nburkina\nburkinese\nburking\nburkitt\nburl\nburladero\nburladeros\nburlap\nburlaps\nburled\nburleigh\nburler\nburlers\nburlesque\nburlesqued\nburlesquely\nburlesquer\nburlesquers\nburlesques\nburlesquing\nburley\nburleys\nburlier\nburlies\nburliest\nburlily\nburliness\nburling\nburls\nburly\nburma\nburman\nburmans\nburmese\nburn\nburnable\nburned\nburner\nburners\nburnet\nburnets\nburning\nburningly\nburnings\nburnish\nburnished\nburnisher\nburnishers\nburnishes\nburnishing\nburnoose\nburnoosed\nburnooses\nburnous\nburnouses\nburnout\nburnouts\nburns\nburnsides\nburnt\nburp\nburped\nburping\nburps\nburr\nburred\nburrer\nburrers\nburrier\nburriest\nburring\nburrito\nburritos\nburro\nburros\nburrow\nburrowed\nburrower\nburrowers\nburrowing\nburrows\nburrs\nburrstone\nburrstones\nburry\nburs\nbursa\nbursae\nbursal\nbursar\nbursarial\nbursaries\nbursars\nbursary\nbursas\nburse\nburses\nbursitis\nburst\nbursted\nburster\nbursters\nbursting\nbursts\nburthen\nburthens\nburton\nburtons\nburundi\nburundian\nburundians\nburweed\nburweeds\nbury\nburying\nbus\nbusbies\nbusboy\nbusboys\nbusby\nbused\nbuses\nbush\nbushbuck\nbushbucks\nbushed\nbushel\nbusheled\nbusheler\nbushelers\nbusheling\nbushelman\nbushels\nbushes\nbushfire\nbushfires\nbushido\nbushidos\nbushier\nbushiest\nbushily\nbushiness\nbushing\nbushings\nbushland\nbushlands\nbushman\nbushmaster\nbushmasters\nbushmen\nbushmills\nbushnell\nbushpig\nbushpigs\nbushranger\nbushrangers\nbushranging\nbushtit\nbushtits\nbushwhack\nbushwhacked\nbushwhacker\nbushwhackers\nbushwhacking\nbushwhacks\nbushy\nbusied\nbusier\nbusies\nbusiest\nbusily\nbusiness\nbusinesses\nbusinesslike\nbusinessman\nbusinessmen\nbusinesspeople\nbusinessperson\nbusinesspersons\nbusinesswoman\nbusinesswomen\nbusing\nbusk\nbusked\nbusker\nbuskers\nbuskin\nbusking\nbuskins\nbusks\nbusload\nbusloads\nbusman\nbusman's\nbusmen\nbuss\nbussed\nbusses\nbussing\nbust\nbustard\nbustards\nbusted\nbuster\nbusters\nbusticate\nbusticated\nbusticates\nbusticating\nbustier\nbustiers\nbustiest\nbusting\nbustle\nbustled\nbustles\nbustline\nbustling\nbustlingly\nbusts\nbusty\nbusulfan\nbusulfans\nbusy\nbusybodies\nbusybody\nbusying\nbusyness\nbusywork\nbut\nbutadiene\nbutane\nbutanes\nbutanol\nbutanols\nbutanone\nbutanones\nbutazolidin\nbutch\nbutcher\nbutcherbird\nbutcherbirds\nbutchered\nbutcherer\nbutcherers\nbutcheries\nbutchering\nbutcherly\nbutchers\nbutchery\nbutches\nbute\nbutene\nbutenes\nbuteo\nbuteos\nbutler\nbutlers\nbutoxide\nbuts\nbutt\nbutte\nbutted\nbutter\nbutterball\nbutterballs\nbutterbur\nbutterburs\nbuttercup\nbuttercups\nbuttered\nbutterfat\nbutterfingered\nbutterfingers\nbutterfish\nbutterfishes\nbutterflied\nbutterflies\nbutterfly\nbutterflyer\nbutterflyers\nbutterflying\nbutteries\nbutteriness\nbuttering\nbutterless\nbuttermilk\nbuttermilks\nbutternut\nbutternuts\nbutters\nbutterscotch\nbutterweed\nbutterweeds\nbutterwort\nbutterworts\nbuttery\nbuttes\nbutties\nbutting\nbuttinski\nbuttinskies\nbuttinsky\nbuttock\nbuttocks\nbutton\nbuttonball\nbuttonballs\nbuttonbush\nbuttonbushes\nbuttoned\nbuttoner\nbuttoners\nbuttonhole\nbuttonholed\nbuttonholer\nbuttonholers\nbuttonholes\nbuttonholing\nbuttonhook\nbuttonhooks\nbuttoning\nbuttonless\nbuttonmold\nbuttonmolds\nbuttonquail\nbuttonquails\nbuttons\nbuttonwood\nbuttonwoods\nbuttony\nbuttress\nbuttressed\nbuttresses\nbuttressing\nbutts\nbuttstock\nbuttstocks\nbutty\nbutut\nbututs\nbutyl\nbutylate\nbutylated\nbutylates\nbutylating\nbutylation\nbutylene\nbutylenes\nbutyls\nbutyraceous\nbutyraldehyde\nbutyraldehydes\nbutyrate\nbutyrates\nbutyric\nbutyrin\nbutyrins\nbutyrophenone\nbutyrophenones\nbutyrophenoness\nbuxom\nbuxomly\nbuxomness\nbuxtehude\nbuy\nbuyable\nbuyback\nbuybacks\nbuyer\nbuyers\nbuying\nbuyout\nbuyouts\nbuys\nbuzz\nbuzzard\nbuzzards\nbuzzed\nbuzzer\nbuzzers\nbuzzes\nbuzzing\nbuzzword\nbuzzwords\nbwana\nbwanas\nby\nbye\nbyelaw\nbyelaws\nbyelorussia\nbyelorussian\nbyelorussians\nbyes\nbygone\nbygones\nbylaw\nbylaws\nbyline\nbylined\nbyliner\nbyliners\nbylines\nbylining\nbyname\nbynames\nbypass\nbypassed\nbypasses\nbypassing\nbypast\nbypath\nbypaths\nbyplay\nbyplays\nbyproduct\nbyproducts\nbyre\nbyres\nbyroad\nbyroads\nbyron\nbyronic\nbyssi\nbyssinosis\nbyssus\nbyssuses\nbystander\nbystanders\nbystreet\nbystreets\nbyte\nbytes\nbyway\nbyways\nbyword\nbywords\nbyzantine\nbyzantines\nbyzantium\nbéarn\nbéarnaise\nbéchamel\nbéchamels\nbêche\nbêches\nbête\nbêtes\nbêtise\nbêtises\nc\nc'mon\ncab\ncabal\ncabala\ncabalas\ncabaletta\ncabalettas\ncabalette\ncabalism\ncabalist\ncabalistic\ncabalistically\ncabalists\ncaballed\ncaballero\ncaballeros\ncaballing\ncabals\ncabana\ncabanas\ncabaret\ncabarets\ncabaña\ncabañas\ncabbage\ncabbages\ncabbageworm\ncabbageworms\ncabbagy\ncabbed\ncabbie\ncabbies\ncabbing\ncabby\ncabdriver\ncabdrivers\ncaber\ncabernet\ncabernets\ncabers\ncabin\ncabined\ncabinet\ncabinetful\ncabinetmaker\ncabinetmakers\ncabinetmaking\ncabinetry\ncabinets\ncabinetwork\ncabining\ncabins\ncable\ncablecast\ncablecaster\ncablecasters\ncablecasts\ncabled\ncablegram\ncablegrams\ncabler\ncablers\ncables\ncablet\ncablets\ncablevision\ncableway\ncableways\ncabling\ncabman\ncabmen\ncabochon\ncabochons\ncaboclo\ncaboclos\ncabomba\ncabombas\ncaboodle\ncaboose\ncabooses\ncabot\ncabotage\ncabotages\ncabretta\ncabrettas\ncabrilla\ncabrillas\ncabriole\ncabrioles\ncabriolet\ncabriolets\ncabs\ncabstand\ncabstands\ncacao\ncacaos\ncachaca\ncachalot\ncachalots\ncachaça\ncache\ncachectic\ncached\ncachepot\ncachepots\ncaches\ncachet\ncachets\ncachexia\ncachexias\ncaching\ncachinnate\ncachinnated\ncachinnates\ncachinnating\ncachinnation\ncachinnator\ncachinnators\ncachou\ncachous\ncachucha\ncachuchas\ncacique\ncaciques\ncackle\ncackled\ncackler\ncacklers\ncackles\ncackling\ncacodemon\ncacodemons\ncacodyl\ncacodylic\ncacodyls\ncacography\ncacomistle\ncacomistles\ncaconym\ncaconyms\ncaconymy\ncacophonic\ncacophonies\ncacophonous\ncacophonously\ncacophony\ncacoëthes\ncacti\ncactus\ncactuses\ncacuminal\ncad\ncadastral\ncadastre\ncadaver\ncadaveric\ncadaverine\ncadaverines\ncadaverous\ncadaverously\ncadaverousness\ncadavers\ncaddie\ncaddied\ncaddies\ncaddis\ncaddish\ncaddishly\ncaddishness\ncaddo\ncaddoan\ncaddoans\ncaddos\ncaddy\ncaddying\ncade\ncadelle\ncadelles\ncadence\ncadenced\ncadences\ncadencies\ncadency\ncadent\ncadential\ncadenza\ncadenzas\ncadet\ncadets\ncadetship\ncadge\ncadged\ncadger\ncadgers\ncadges\ncadging\ncadillac\ncadillacs\ncadiz\ncadmic\ncadmium\ncadmus\ncadre\ncadres\ncads\ncaducean\ncaducei\ncaduceus\ncaducity\ncaducous\ncaecilian\ncaecilians\ncaelian\ncaelum\ncaerphillies\ncaerphilly\ncaesar\ncaesarea\ncaesarean\ncaesareans\ncaesarian\ncaesarians\ncaesarism\ncaesarist\ncaesaristic\ncaesarists\ncaesars\ncaesura\ncaesurae\ncaesural\ncaesuras\ncaesuric\ncafe\ncafes\ncafeteria\ncafeterias\ncafetoria\ncafetorium\ncafetoriums\ncaffeinated\ncaffeine\ncaffeinism\ncaftan\ncaftans\ncafé\ncafés\ncage\ncaged\ncagelike\ncageling\ncagelings\ncages\ncagey\ncageyness\ncagier\ncagiest\ncagily\ncaginess\ncaging\ncagliari\ncahier\ncahiers\ncahoots\ncahow\ncahows\ncahuilla\ncahuillas\ncaicos\ncaiman\ncaimans\ncain\ncainotophobia\ncainotophobias\ncaird\ncairds\ncairn\ncairned\ncairngorm\ncairns\ncairo\ncaisson\ncaissons\ncaitiff\ncaitiffs\ncajan\ncajans\ncajole\ncajoled\ncajoler\ncajolers\ncajolery\ncajoles\ncajoling\ncajolingly\ncajun\ncajuns\ncake\ncaked\ncakes\ncakewalk\ncakewalked\ncakewalker\ncakewalkers\ncakewalking\ncakewalks\ncaking\ncalabash\ncalabashes\ncalaboose\ncalabooses\ncalabrese\ncalabreses\ncalabria\ncalabrian\ncalabrians\ncaladium\ncalais\ncalamanco\ncalamancoes\ncalamander\ncalamanders\ncalamari\ncalamaries\ncalamary\ncalami\ncalamine\ncalamint\ncalamints\ncalamite\ncalamites\ncalamities\ncalamitous\ncalamitously\ncalamitousness\ncalamity\ncalamondin\ncalamondins\ncalamus\ncalando\ncalash\ncalashes\ncalathea\ncalatheas\ncalathi\ncalathus\ncalcanea\ncalcaneal\ncalcanei\ncalcaneocuboid\ncalcaneum\ncalcaneus\ncalcar\ncalcareous\ncalcareously\ncalcaria\ncalceolaria\ncalceolarias\ncalceolate\ncalcic\ncalcicole\ncalcicoles\ncalcicolous\ncalciferol\ncalciferols\ncalciferous\ncalcific\ncalcification\ncalcifications\ncalcified\ncalcifies\ncalcifugal\ncalcifuge\ncalcifugous\ncalcify\ncalcifying\ncalcimine\ncalcimined\ncalciminer\ncalciminers\ncalcimines\ncalcimining\ncalcination\ncalcine\ncalcined\ncalcines\ncalcining\ncalcinosis\ncalcite\ncalcitic\ncalcitonin\ncalcitonins\ncalcium\ncalcspar\ncalcspars\ncalculability\ncalculable\ncalculably\ncalculate\ncalculated\ncalculatedly\ncalculates\ncalculating\ncalculatingly\ncalculation\ncalculations\ncalculative\ncalculator\ncalculators\ncalculi\ncalculous\ncalculus\ncalculuses\ncalcutta\ncaldera\ncalderas\ncaldron\ncaldrons\ncaledonia\ncaledonian\ncaledonians\ncalendal\ncalendar\ncalendared\ncalendaring\ncalendars\ncalender\ncalendered\ncalenderer\ncalenderers\ncalendering\ncalenders\ncalendric\ncalendrical\ncalends\ncalendula\ncalendulas\ncalenture\ncalentures\ncalf\ncalfskin\ncalgarian\ncalgarians\ncalgary\ncaliban\ncaliber\ncalibers\ncalibrate\ncalibrated\ncalibrates\ncalibrating\ncalibration\ncalibrations\ncalibrator\ncalibrators\ncalices\ncaliche\ncaliches\ncalico\ncalicoback\ncalicobacks\ncalicoes\ncalicos\ncalicut\ncalifornia\ncalifornian\ncalifornians\ncalifornite\ncalifornites\ncalifornium\ncaliginous\ncaligula\ncalinago\ncalinagos\ncalipash\ncalipashes\ncalipee\ncalipees\ncaliper\ncalipered\ncalipering\ncalipers\ncaliph\ncaliphate\ncaliphates\ncaliphs\ncalisthenic\ncalisthenics\ncalix\ncalk\ncalked\ncalking\ncalks\ncall\ncalla\ncallable\ncallback\ncallbacks\ncallboard\ncallboards\ncallboy\ncallboys\ncalled\ncaller\ncallers\ncalligrapher\ncalligraphers\ncalligraphic\ncalligraphist\ncalligraphy\ncalling\ncallings\ncalliope\ncalliopes\ncalliopsis\ncallipygian\ncallisthenes\ncallisto\ncallose\ncalloses\ncallosities\ncallosity\ncallous\ncalloused\ncallouses\ncallousing\ncallously\ncallousness\ncallow\ncallowness\ncalls\ncallus\ncallused\ncalluses\ncallusing\ncalm\ncalmative\ncalmed\ncalmer\ncalmest\ncalming\ncalmly\ncalmness\ncalms\ncalomel\ncaloreceptor\ncaloreceptors\ncaloric\ncalorically\ncalorie\ncalories\ncalorific\ncalorifically\ncalorimeter\ncalorimeters\ncalorimetric\ncalorimetrically\ncalorimetry\ncalotte\ncalottes\ncalpac\ncalpacs\ncalque\ncalques\ncaltrop\ncaltrops\ncalumet\ncalumets\ncalumniate\ncalumniated\ncalumniates\ncalumniating\ncalumniation\ncalumniations\ncalumniator\ncalumniators\ncalumniatory\ncalumnies\ncalumnious\ncalumniously\ncalumny\ncalvados\ncalvarium\ncalvariums\ncalvary\ncalve\ncalved\ncalves\ncalvin\ncalving\ncalvinism\ncalvinist\ncalvinistic\ncalvinistical\ncalvinistically\ncalvinists\ncalx\ncalxes\ncalyces\ncalycine\ncalycular\ncalyculate\ncalyculi\ncalyculus\ncalypso\ncalypsos\ncalyptra\ncalyptrate\ncalyx\ncalyxes\ncalèche\ncam\ncamaraderie\ncamargue\ncamarilla\ncamarillas\ncamas\ncamber\ncambered\ncambering\ncambers\ncambia\ncambial\ncambium\ncambiums\ncambodia\ncambodian\ncambodians\ncambrai\ncambria\ncambrian\ncambric\ncambrics\ncambridge\ncambridgeshire\ncamcorder\ncamcorders\ncame\ncamel\ncamelback\ncamelbacks\ncameleer\ncameleers\ncamellia\ncamellias\ncamelopard\ncamelopardalis\ncamelot\ncamels\ncamembert\ncameo\ncameoed\ncameoing\ncameos\ncamera\ncamerae\ncameral\ncameraman\ncameramen\ncameraperson\ncamerapersons\ncameras\ncamerawoman\ncamerawomen\ncamerawork\ncamerlingo\ncamerlingos\ncameron\ncameroon\ncameroonian\ncameroonians\ncameroons\ncameroun\ncami\ncamion\ncamions\ncamis\ncamise\ncamises\ncamisole\ncamisoles\ncamorra\ncamouflage\ncamouflaged\ncamouflager\ncamouflagers\ncamouflages\ncamouflaging\ncamp\ncampaign\ncampaigned\ncampaigner\ncampaigners\ncampaigning\ncampaigns\ncampania\ncampanile\ncampaniles\ncampanologist\ncampanologists\ncampanology\ncampanula\ncampanulas\ncampanulate\ncamped\ncampeggio\ncamper\ncampers\ncampesino\ncampesinos\ncampestral\ncampfire\ncampfires\ncampground\ncampgrounds\ncamphene\ncamphenes\ncamphor\ncamphoraceous\ncamphorate\ncamphorated\ncamphorates\ncamphorating\ncamphoric\ncamphorweed\ncamphorweeds\ncamping\ncampion\ncampions\ncampo\ncamporee\ncamporees\ncampos\ncamps\ncampsite\ncampsites\ncampstool\ncampstools\ncampus\ncampuses\ncampy\ncampylobacterosis\ncampylotropous\ncams\ncamshaft\ncamshafts\ncan\ncan't\ncanaan\ncanaanite\ncanaanites\ncanada\ncanadian\ncanadians\ncanaigre\ncanaigres\ncanaille\ncanal\ncanaletto\ncanalicular\ncanaliculate\ncanaliculi\ncanaliculus\ncanalization\ncanalize\ncanalized\ncanalizes\ncanalizing\ncanalled\ncanalling\ncanals\ncanapé\ncanapés\ncanard\ncanards\ncanaries\ncanary\ncanasta\ncanaveral\ncanberra\ncancan\ncancans\ncancel\ncancelable\ncanceled\ncanceler\ncancelers\ncanceling\ncancellate\ncancellation\ncancellations\ncancelled\ncancelling\ncancellous\ncancels\ncancer\ncancerian\ncancerians\ncancerous\ncancers\ncancroid\ncancroids\ncancún\ncandela\ncandelabra\ncandelabras\ncandelabrum\ncandelabrums\ncandelas\ncandelilla\ncandelillas\ncandent\ncandescence\ncandescent\ncandescently\ncandia\ncandid\ncandida\ncandidacies\ncandidacy\ncandidas\ncandidate\ncandidates\ncandidature\ncandidatures\ncandidiasis\ncandidly\ncandidness\ncandids\ncandied\ncandies\ncandle\ncandleberries\ncandleberry\ncandled\ncandlefish\ncandleholder\ncandleholders\ncandlelight\ncandlelit\ncandlemas\ncandlemases\ncandlenut\ncandlenuts\ncandlepin\ncandlepins\ncandlepower\ncandler\ncandlers\ncandles\ncandlesnuffer\ncandlesnuffers\ncandlestick\ncandlesticks\ncandlewick\ncandlewicks\ncandlewood\ncandlewoods\ncandling\ncandor\ncandy\ncandying\ncandytuft\ncandytufts\ncane\ncanebrake\ncanebrakes\ncaned\ncaner\ncaners\ncanes\ncanescence\ncanescent\ncanfield\ncangue\ncangues\ncanicular\ncanid\ncanids\ncanine\ncanines\ncaning\ncanistel\ncanistels\ncanister\ncanisters\ncanker\ncankered\ncankering\ncankerous\ncankerroot\ncankerroots\ncankers\ncankerworm\ncankerworms\ncanna\ncannabic\ncannabidiol\ncannabidiols\ncannabin\ncannabins\ncannabis\ncanned\ncannel\ncannelloni\ncannelure\ncannelures\ncanner\ncanneries\ncanners\ncannery\ncannes\ncannibal\ncannibalism\ncannibalistic\ncannibalization\ncannibalizations\ncannibalize\ncannibalized\ncannibalizes\ncannibalizing\ncannibals\ncannier\ncanniest\ncannikin\ncannikins\ncannily\ncanniness\ncanning\ncannoli\ncannon\ncannonade\ncannonaded\ncannonades\ncannonading\ncannonball\ncannonballed\ncannonballing\ncannonballs\ncannoned\ncannoneer\ncannoneers\ncannoning\ncannonries\ncannonry\ncannons\ncannot\ncannula\ncannular\ncannulas\ncannulate\ncannulated\ncannulates\ncannulating\ncannulation\ncanny\ncanoe\ncanoed\ncanoeing\ncanoeist\ncanoeists\ncanoes\ncanola\ncanolas\ncanon\ncanoness\ncanonesses\ncanonic\ncanonical\ncanonically\ncanonicals\ncanonicate\ncanonicates\ncanonicity\ncanonist\ncanonistic\ncanonistical\ncanonists\ncanonization\ncanonizations\ncanonize\ncanonized\ncanonizer\ncanonizers\ncanonizes\ncanonizing\ncanonries\ncanonry\ncanons\ncanoodle\ncanoodled\ncanoodles\ncanoodling\ncanopic\ncanopied\ncanopies\ncanopus\ncanopy\ncanopying\ncanorous\ncanorously\ncanorousness\ncans\ncant\ncantabile\ncantabiles\ncantabrigian\ncantabrigians\ncantala\ncantalas\ncantaloupe\ncantaloupes\ncantankerous\ncantankerously\ncantankerousness\ncantata\ncantatas\ncanted\ncanteen\ncanteens\ncanter\ncanterbury\ncantered\ncantering\ncanters\ncantharides\ncantharis\ncanthi\ncanthitis\ncanthus\ncanticle\ncanticles\ncantilated\ncantilates\ncantilating\ncantilena\ncantilenas\ncantilever\ncantilevered\ncantilevering\ncantilevers\ncantillate\ncantillation\ncantina\ncantinas\ncanting\ncantingly\ncantingness\ncantle\ncantles\ncanto\ncanton\ncantonal\ncantonese\ncantonment\ncantonments\ncantons\ncantor\ncantorial\ncantors\ncantos\ncants\ncanuck\ncanucks\ncanute\ncanvas\ncanvasback\ncanvasbacks\ncanvases\ncanvass\ncanvassed\ncanvasser\ncanvassers\ncanvasses\ncanvassing\ncanyon\ncanyons\ncanzone\ncanzones\ncanzonet\ncanzonets\ncaoutchouc\ncaoutchoucs\ncap\ncapabilities\ncapability\ncapable\ncapableness\ncapably\ncapacious\ncapaciously\ncapaciousness\ncapacitance\ncapacitances\ncapacitate\ncapacitated\ncapacitates\ncapacitating\ncapacitation\ncapacities\ncapacitive\ncapacitively\ncapacitor\ncapacitors\ncapacity\ncaparison\ncaparisoned\ncaparisoning\ncaparisons\ncape\ncaped\ncapelin\ncapelins\ncapella\ncaper\ncapercaillie\ncapercaillies\ncapered\ncapering\ncapers\ncapes\ncapeskin\ncapeskins\ncapet\ncapetian\ncapetians\ncapful\ncapfuls\ncapias\ncapiases\ncapillaries\ncapillarities\ncapillarity\ncapillary\ncapita\ncapital\ncapitalism\ncapitalist\ncapitalistic\ncapitalistically\ncapitalists\ncapitalizable\ncapitalization\ncapitalizations\ncapitalize\ncapitalized\ncapitalizes\ncapitalizing\ncapitally\ncapitals\ncapitate\ncapitation\ncapitations\ncapitative\ncapitella\ncapitellum\ncapitol\ncapitoline\ncapitols\ncapitula\ncapitulant\ncapitular\ncapitularies\ncapitularly\ncapitulary\ncapitulate\ncapitulated\ncapitulates\ncapitulating\ncapitulation\ncapitulations\ncapitulator\ncapitulators\ncapitulatory\ncapitulum\ncaplet\ncaplets\ncapo\ncapon\ncaponata\ncaponatas\ncaponize\ncaponized\ncaponizes\ncaponizing\ncapons\ncaporal\ncaporals\ncapos\ncapote\ncapotes\ncappadocia\ncappadocian\ncappadocians\ncapped\ncappella\ncapper\ncappers\ncapping\ncappuccino\ncappuccinos\ncapreomycin\ncapreomycins\ncapri\ncapriccio\ncapriccios\ncapriccioso\ncaprice\ncaprices\ncapricious\ncapriciously\ncapriciousness\ncapricorn\ncapricornian\ncapricornians\ncapricorns\ncaprification\ncaprifications\ncaprifig\ncaprifigs\ncapriole\ncaprioled\ncaprioles\ncaprioling\ncapris\ncaps\ncapsaicin\ncapsaicins\ncapsian\ncapsicum\ncapsicums\ncapsid\ncapsids\ncapsize\ncapsized\ncapsizes\ncapsizing\ncapsomere\ncapsomeres\ncapstan\ncapstans\ncapstone\ncapstones\ncapsular\ncapsulate\ncapsulated\ncapsulation\ncapsule\ncapsuled\ncapsules\ncapsuling\ncapsulize\ncapsulized\ncapsulizes\ncapsulizing\ncapsulotomies\ncapsulotomy\ncaptain\ncaptaincies\ncaptaincy\ncaptained\ncaptaining\ncaptains\ncaptainship\ncaptan\ncaptans\ncaption\ncaptioned\ncaptioning\ncaptions\ncaptious\ncaptiously\ncaptiousness\ncaptivate\ncaptivated\ncaptivates\ncaptivating\ncaptivatingly\ncaptivation\ncaptivator\ncaptivators\ncaptive\ncaptives\ncaptivities\ncaptivity\ncaptopril\ncaptoprils\ncaptor\ncaptors\ncapture\ncaptured\ncaptures\ncapturing\ncapuche\ncapuches\ncapuchin\ncapuchins\ncapulet\ncapulets\ncapybara\ncapybaras\ncar\ncarabao\ncarabaos\ncarabid\ncarabids\ncarabineer\ncarabineers\ncarabiner\ncarabiners\ncarabiniere\ncarabinieri\ncaracal\ncaracalla\ncaracals\ncaracara\ncaracaras\ncaracas\ncaracole\ncaracoled\ncaracoles\ncaracoling\ncaractacus\ncaradoc\ncarafe\ncarafes\ncarambola\ncarambolas\ncaramel\ncaramelization\ncaramelize\ncaramelized\ncaramelizes\ncaramelizing\ncaramels\ncarangid\ncarangids\ncarapace\ncarapaces\ncarat\ncaratacus\ncarats\ncaravaggio\ncaravan\ncaravans\ncaravansaries\ncaravansary\ncaravel\ncaravels\ncaraway\ncaraways\ncarbamate\ncarbamates\ncarbamazepine\ncarbamazepines\ncarbamide\ncarbamides\ncarbamoyl\ncarbamoyls\ncarbanion\ncarbanions\ncarbaryl\ncarbaryls\ncarbenicillin\ncarbenicillins\ncarbide\ncarbides\ncarbine\ncarbines\ncarbinol\ncarbinols\ncarbocyclic\ncarbohydrase\ncarbohydrases\ncarbohydrate\ncarbohydrates\ncarbolated\ncarbolic\ncarbon\ncarbonaceous\ncarbonado\ncarbonadoed\ncarbonadoes\ncarbonadoing\ncarbonados\ncarbonara\ncarbonaras\ncarbonate\ncarbonated\ncarbonates\ncarbonating\ncarbonation\ncarbonator\ncarbonators\ncarbonic\ncarboniferous\ncarbonium\ncarboniums\ncarbonization\ncarbonize\ncarbonized\ncarbonizer\ncarbonizers\ncarbonizes\ncarbonizing\ncarbonous\ncarbons\ncarbonyl\ncarbonylic\ncarbonyls\ncarborane\ncarboranes\ncarborundum\ncarboxyhemoglobin\ncarboxyhemoglobins\ncarboxyl\ncarboxylase\ncarboxylases\ncarboxylation\ncarboxylations\ncarboxylic\ncarboxymethylcellulose\ncarboxymethylcelluloses\ncarboxypeptidase\ncarboxypeptidases\ncarboy\ncarboys\ncarbuncle\ncarbuncled\ncarbuncles\ncarbuncular\ncarburet\ncarbureted\ncarbureting\ncarburetion\ncarburetor\ncarburetors\ncarburets\ncarburization\ncarburize\ncarburized\ncarburizes\ncarburizing\ncarcajou\ncarcajous\ncarcanet\ncarcanets\ncarcass\ncarcasses\ncarcassonne\ncarcinogen\ncarcinogenesis\ncarcinogenic\ncarcinogenicity\ncarcinogens\ncarcinoid\ncarcinoids\ncarcinoma\ncarcinomas\ncarcinomatoid\ncarcinomatosis\ncarcinomatous\ncard\ncardamom\ncardamoms\ncardboard\ncarded\ncardholder\ncardholders\ncardholding\ncardia\ncardiac\ncardiacs\ncardiae\ncardialgia\ncardialgias\ncardiff\ncardigan\ncardigans\ncardinal\ncardinalate\ncardinalates\ncardinalities\ncardinality\ncardinals\ncardinalship\ncarding\ncardioacceleration\ncardioaccelerator\ncardioaccelerators\ncardiogenic\ncardiogram\ncardiograms\ncardiograph\ncardiographs\ncardiography\ncardioid\ncardioids\ncardiological\ncardiologist\ncardiologists\ncardiology\ncardiomegaly\ncardiomyopathies\ncardiomyopathy\ncardiopathies\ncardiopathy\ncardiopulmonary\ncardiorespiratory\ncardiothoracic\ncardiovascular\ncarditis\ncarditises\ncardoon\ncardoons\ncards\ncardsharp\ncardsharper\ncardsharpers\ncardsharping\ncardsharps\ncardstock\ncare\ncared\ncareen\ncareened\ncareener\ncareeners\ncareening\ncareens\ncareer\ncareered\ncareering\ncareerism\ncareerist\ncareerists\ncareers\ncarefree\ncareful\ncarefully\ncarefulness\ncaregiver\ncaregivers\ncaregiving\ncareless\ncarelessly\ncarelessness\ncares\ncaress\ncaressed\ncaresser\ncaressers\ncaresses\ncaressing\ncaressingly\ncaressive\ncaret\ncaretaker\ncaretakers\ncaretaking\ncarets\ncareworn\ncarfare\ncargo\ncargoes\ncarhop\ncarhops\ncarib\ncariban\ncaribbean\ncaribbeans\ncaribe\ncaribes\ncaribou\ncaribous\ncaribs\ncaricature\ncaricatured\ncaricatures\ncaricaturing\ncaricaturist\ncaricaturists\ncaries\ncarillon\ncarillonned\ncarillonneur\ncarillonneurs\ncarillonning\ncarillons\ncarina\ncarinae\ncarinate\ncaring\ncarinthia\ncarioca\ncariocan\ncariocas\ncariole\ncarioles\ncariosity\ncarious\ncariousness\ncark\ncarked\ncarking\ncarks\ncarl\ncarling\ncarlings\ncarlisle\ncarlist\ncarlists\ncarlo\ncarload\ncarloads\ncarlos\ncarls\ncarlsbad\ncarlyle\ncarmaker\ncarmakers\ncarmel\ncarmelite\ncarmelites\ncarmen\ncarminative\ncarminatives\ncarmine\ncarnac\ncarnage\ncarnal\ncarnality\ncarnallite\ncarnallites\ncarnally\ncarnassial\ncarnassials\ncarnation\ncarnations\ncarnauba\ncarne\ncarnegie\ncarnelian\ncarnelians\ncarnet\ncarnets\ncarnies\ncarniola\ncarniolan\ncarniolans\ncarnitine\ncarnitines\ncarnival\ncarnivals\ncarnivore\ncarnivores\ncarnivorous\ncarnivorously\ncarnivorousness\ncarnotite\ncarnotites\ncarny\ncarob\ncarobs\ncaroche\ncaroches\ncarol\ncarolean\ncaroled\ncaroler\ncarolers\ncarolina\ncarolinas\ncaroline\ncaroling\ncarolingian\ncarolingians\ncarolinian\ncarolinians\ncarols\ncarom\ncaromed\ncaroming\ncaroms\ncarotene\ncarotenemia\ncarotenemias\ncarotenoid\ncarotenoids\ncarotid\ncarotids\ncarousal\ncarousals\ncarouse\ncaroused\ncarousel\ncarousels\ncarouser\ncarousers\ncarouses\ncarousing\ncarp\ncarpaccio\ncarpaccios\ncarpal\ncarpals\ncarpathian\ncarpathians\ncarpe\ncarped\ncarpel\ncarpellary\ncarpellate\ncarpels\ncarpentaria\ncarpenter\ncarpentered\ncarpentering\ncarpenters\ncarpentry\ncarper\ncarpers\ncarpet\ncarpetbag\ncarpetbagger\ncarpetbaggers\ncarpetbaggery\ncarpetbags\ncarpeted\ncarpeting\ncarpetings\ncarpets\ncarpetweed\ncarpetweeds\ncarpi\ncarping\ncarpingly\ncarpool\ncarpooling\ncarpools\ncarpophagous\ncarpophore\ncarpophores\ncarport\ncarports\ncarps\ncarpus\ncarrack\ncarracks\ncarrageen\ncarrageenan\ncarrantuohill\ncarrara\ncarrefour\ncarrefours\ncarrel\ncarrels\ncarreras\ncarriage\ncarriages\ncarried\ncarrier\ncarriers\ncarries\ncarrion\ncarroll\ncarrot\ncarrots\ncarroty\ncarrousel\ncarrousels\ncarry\ncarryall\ncarryalls\ncarrying\ncarryings\ncarryon\ncarryons\ncarryout\ncarryouts\ncarryover\ncarryovers\ncars\ncarsick\ncarsickness\ncart\ncarta\ncartable\ncartage\ncartagena\ncarte\ncarted\ncartel\ncartelize\ncartelized\ncartelizes\ncartelizing\ncartels\ncarter\ncarters\ncartesian\ncartesianism\ncartesians\ncarthage\ncarthaginian\ncarthaginians\ncarthorse\ncarthorses\ncarthusian\ncarthusians\ncartilage\ncartilaginous\ncarting\ncartload\ncartloads\ncartogram\ncartograms\ncartographer\ncartographers\ncartographic\ncartographical\ncartography\ncarton\ncartoned\ncartoning\ncartons\ncartoon\ncartooned\ncartooning\ncartoonish\ncartoonist\ncartoonists\ncartoons\ncartop\ncartouche\ncartouches\ncartridge\ncartridges\ncarts\ncartularies\ncartulary\ncartwheel\ncartwheels\ncaruncle\ncaruncles\ncaruncular\ncarunculate\ncarunculated\ncaruso\ncarvacrol\ncarvacrols\ncarve\ncarved\ncarver\ncarvers\ncarves\ncarving\ncarvings\ncaryatid\ncaryatidal\ncaryatidean\ncaryatides\ncaryatidic\ncaryatids\ncaryopses\ncaryopsis\ncasaba\ncasabas\ncasablanca\ncasanova\ncasanovas\ncasaubon\ncasbah\ncascade\ncascaded\ncascades\ncascading\ncascara\ncascaras\ncascarilla\ncascarillas\ncase\ncaseate\ncaseated\ncaseates\ncaseating\ncaseation\ncaseations\ncasebook\ncasebooks\ncased\ncaseharden\ncasehardened\ncasehardening\ncasehardens\ncasein\ncaseload\ncaseloads\ncasemate\ncasemated\ncasemates\ncasement\ncasemented\ncasements\ncaseous\ncasern\ncaserne\ncasernes\ncaserns\ncaserta\ncases\ncasework\ncaseworker\ncaseworkers\ncash\ncashable\ncashbook\ncashbooks\ncashed\ncasher\ncashers\ncashes\ncashew\ncashews\ncashier\ncashiered\ncashiering\ncashiers\ncashing\ncashless\ncashmere\ncashmeres\ncasing\ncasings\ncasino\ncasinos\ncask\ncasket\ncasketed\ncasketing\ncaskets\ncasks\ncaspian\ncasque\ncasqued\ncasques\ncassandra\ncassandras\ncassation\ncassations\ncassava\ncassavas\ncasserole\ncasseroles\ncassette\ncassettes\ncassia\ncassias\ncassimere\ncassina\ncassiopeia\ncassis\ncassiterite\ncassius\ncassock\ncassocked\ncassocks\ncassoulet\ncassoulets\ncassowaries\ncassowary\ncast\ncastanet\ncastanets\ncastaway\ncastaways\ncaste\ncastellan\ncastellans\ncastellated\ncastellation\ncaster\ncasters\ncastes\ncastigate\ncastigated\ncastigates\ncastigating\ncastigation\ncastigations\ncastigator\ncastigators\ncastigatory\ncastile\ncastilian\ncastilians\ncasting\ncastings\ncastle\ncastled\ncastlereagh\ncastles\ncastling\ncastoff\ncastoffs\ncastor\ncastors\ncastrate\ncastrated\ncastrater\ncastraters\ncastrates\ncastrati\ncastrating\ncastration\ncastrations\ncastrato\ncastrator\ncastrators\ncastroism\ncastroist\ncastroists\ncasts\ncasual\ncasually\ncasualness\ncasuals\ncasualties\ncasualty\ncasuarina\ncasuarinas\ncasuist\ncasuistic\ncasuistically\ncasuistries\ncasuistry\ncasuists\ncasus\ncat\ncatabolic\ncatabolically\ncatabolism\ncatabolite\ncatabolites\ncatabolize\ncatabolized\ncatabolizes\ncatabolizing\ncatachreses\ncatachresis\ncatachrestic\ncatachrestical\ncatachrestically\ncataclysm\ncataclysmal\ncataclysmic\ncataclysms\ncatacomb\ncatacombs\ncatadromous\ncatafalque\ncatafalques\ncatalan\ncatalans\ncatalase\ncatalases\ncatalatic\ncatalectic\ncatalepsies\ncatalepsy\ncataleptic\ncataleptics\ncatalexis\ncatalog\ncataloged\ncataloger\ncatalogers\ncataloging\ncatalogs\ncatalogue\ncatalogued\ncataloguer\ncataloguers\ncatalogues\ncataloguing\ncatalonia\ncatalonian\ncatalonians\ncatalpa\ncatalpas\ncatalyses\ncatalysis\ncatalyst\ncatalysts\ncatalytic\ncatalytically\ncatalyze\ncatalyzed\ncatalyzer\ncatalyzers\ncatalyzes\ncatalyzing\ncatamaran\ncatamarans\ncatamenia\ncatamenial\ncatamenias\ncatamite\ncatamites\ncatamount\ncatamountain\ncatamountains\ncatamounts\ncatania\ncatanzaro\ncataphoresis\ncataphoretic\ncataphoretically\ncataplasia\ncataplasias\ncataplasm\ncataplasms\ncataplastic\ncataplectic\ncataplexies\ncataplexy\ncatapult\ncatapulted\ncatapulting\ncatapults\ncataract\ncataracts\ncatarrh\ncatarrhal\ncatarrhally\ncatarrhous\ncatarrhs\ncatastases\ncatastasis\ncatastrophe\ncatastrophes\ncatastrophic\ncatastrophically\ncatastrophism\ncatastrophist\ncatastrophists\ncatatonia\ncatatonic\ncatatonically\ncatatonics\ncatawba\ncatawbas\ncatbird\ncatbirds\ncatboat\ncatboats\ncatbrier\ncatbriers\ncatcall\ncatcalled\ncatcalling\ncatcalls\ncatch\ncatchable\ncatchall\ncatchalls\ncatcher\ncatchers\ncatches\ncatchflies\ncatchfly\ncatchier\ncatchiest\ncatchily\ncatchiness\ncatching\ncatchment\ncatchments\ncatchpenny\ncatchphrase\ncatchphrases\ncatchpole\ncatchpoles\ncatchword\ncatchwords\ncatchy\ncatecheses\ncatechesis\ncatechetical\ncatechin\ncatechins\ncatechism\ncatechisms\ncatechist\ncatechistic\ncatechistical\ncatechists\ncatechization\ncatechize\ncatechized\ncatechizer\ncatechizers\ncatechizes\ncatechizing\ncatechol\ncatecholamine\ncatecholamines\ncatechols\ncatechu\ncatechumen\ncatechumens\ncatechus\ncategoric\ncategorical\ncategorically\ncategoricalness\ncategories\ncategorizable\ncategorization\ncategorizations\ncategorize\ncategorized\ncategorizes\ncategorizing\ncategory\ncatena\ncatenae\ncatenaries\ncatenary\ncatenate\ncatenated\ncatenates\ncatenating\ncatenation\ncater\ncatercorner\ncatercornered\ncatered\ncaterer\ncaterers\ncatering\ncaterpillar\ncaterpillars\ncaters\ncaterwaul\ncaterwauled\ncaterwauling\ncaterwauls\ncatfight\ncatfights\ncatfish\ncatfishes\ncatgut\ncathar\ncathari\ncatharism\ncatharist\ncatharists\ncathars\ncatharses\ncatharsis\ncathartic\ncathartics\ncathay\ncathead\ncatheads\ncathect\ncathected\ncathectic\ncathecting\ncathects\ncathedra\ncathedrae\ncathedral\ncathedrals\ncathepsin\ncathepsins\ncatherine\ncatheter\ncatheterization\ncatheterize\ncatheterized\ncatheterizes\ncatheterizing\ncatheters\ncathexes\ncathexis\ncathode\ncathodes\ncathodic\ncathodically\ncatholic\ncatholically\ncatholicism\ncatholicity\ncatholicize\ncatholicized\ncatholicizes\ncatholicizing\ncatholicon\ncatholicons\ncatholics\ncathouse\ncathouses\ncatiline\ncation\ncationic\ncations\ncatjang\ncatjangs\ncatkin\ncatkins\ncatlike\ncatmint\ncatmints\ncatnap\ncatnapped\ncatnapping\ncatnaps\ncatnip\ncatnips\ncato\ncatoptric\ncatoptrics\ncats\ncatskill\ncatskills\ncatsup\ncatsups\ncattail\ncattails\ncattalo\ncattaloes\ncattalos\ncatted\ncattier\ncattiest\ncattily\ncattiness\ncatting\ncattle\ncattleman\ncattlemen\ncattleya\ncattleyas\ncatty\ncatullus\ncatwalk\ncatwalks\ncaucasian\ncaucasians\ncaucasus\ncaucus\ncaucused\ncaucuses\ncaucusing\ncaudad\ncaudal\ncaudally\ncaudate\ncaudation\ncaudex\ncaudexes\ncaudices\ncaudillismo\ncaudillo\ncaudillos\ncaudle\ncaudles\ncaught\ncaul\ncauldron\ncauldrons\ncaulescent\ncauliflorous\ncauliflory\ncauliflower\ncauliflowers\ncauline\ncaulk\ncaulked\ncaulking\ncaulkings\ncaulks\ncauls\ncausable\ncausal\ncausalities\ncausality\ncausally\ncausals\ncausation\ncausations\ncausative\ncausatively\ncause\ncaused\ncauseless\ncauser\ncauserie\ncauseries\ncausers\ncauses\ncauseway\ncauseways\ncausing\ncaustic\ncaustically\ncausticity\ncaustics\ncauteries\ncauterization\ncauterizations\ncauterize\ncauterized\ncauterizes\ncauterizing\ncautery\ncaution\ncautionary\ncautioned\ncautioner\ncautioners\ncautioning\ncautions\ncautious\ncautiously\ncautiousness\ncava\ncavae\ncavalas\ncavalcade\ncavalcades\ncavalier\ncavalierly\ncavaliers\ncavalla\ncavalries\ncavalry\ncavalryman\ncavalrymen\ncavatelli\ncave\ncaveat\ncaveated\ncaveating\ncaveats\ncaved\ncavefish\ncavefishes\ncaveman\ncavemen\ncaver\ncavern\ncaverned\ncavernicolous\ncaverning\ncavernous\ncavernously\ncaverns\ncavers\ncaves\ncavetti\ncavetto\ncavettos\ncaviar\ncavies\ncavil\ncaviled\ncaviler\ncavilers\ncaviling\ncavils\ncaving\ncavitate\ncavitated\ncavitates\ncavitating\ncavitation\ncavitations\ncavities\ncavity\ncavort\ncavorted\ncavorting\ncavorts\ncavour\ncavy\ncaw\ncawdor\ncawed\ncawing\ncaws\ncaxton\ncay\ncayenne\ncayman\ncaymans\ncays\ncayuga\ncayugas\ncayuse\ncayuses\ncaïque\ncaïques\nceanothus\ncease\nceased\nceaseless\nceaselessly\nceaselessness\nceases\nceasing\nceca\ncecal\ncecally\ncecil\ncecropia\ncecum\ncedar\ncedarbird\ncedarbirds\ncedars\ncede\nceded\ncedes\ncedi\ncedilla\ncedillas\nceding\ncedis\ncee\ncees\nceiba\nceibas\nceil\nceiled\nceilidh\nceilidhs\nceiling\nceilinged\nceilings\nceilometer\nceilometers\nceils\nceladon\nceladonite\nceladonites\nceladons\ncelaeno\ncelandine\ncelandines\nceleb\ncelebes\ncelebrant\ncelebrants\ncelebrate\ncelebrated\ncelebrates\ncelebrating\ncelebration\ncelebrations\ncelebrator\ncelebrators\ncelebratory\ncelebrities\ncelebrity\ncelebrityhood\ncelebs\nceleriac\nceleriacs\nceleries\ncelerity\ncelery\ncelesta\ncelestas\ncelestial\ncelestially\ncelestials\ncelestine\ncelestines\ncelestite\ncelestites\nceliac\ncelibacy\ncelibate\ncelibates\ncell\ncella\ncellae\ncellar\ncellarage\ncellarages\ncellared\ncellarer\ncellarers\ncellarette\ncellarettes\ncellaring\ncellars\ncellblock\ncellblocks\ncelled\ncelling\ncellini\ncellist\ncellists\ncellmate\ncellmates\ncello\ncellobiose\ncellobioses\ncelloidin\ncelloidins\ncellophane\ncellos\ncells\ncellular\ncellularity\ncellularly\ncellulase\ncellulases\ncellule\ncellules\ncellulite\ncellulitis\ncelluloid\ncelluloids\ncellulolytic\ncellulose\ncellulosic\ncelosia\ncelosias\ncelotex\ncelsius\ncelt\nceltiberian\nceltiberians\nceltic\ncelticism\ncelticisms\ncelticist\ncelticists\nceltics\ncelts\ncembalist\ncembalists\ncembalo\ncembalos\ncement\ncementation\ncementations\ncemented\ncementer\ncementers\ncementing\ncementite\ncementites\ncementitious\ncements\ncementum\ncemeteries\ncemetery\ncenacle\ncenacles\ncenobite\ncenobites\ncenobitic\ncenobitical\ncenospecies\ncenotaph\ncenotaphic\ncenotaphs\ncenozoic\ncense\ncensed\ncenser\ncensers\ncenses\ncensing\ncensor\ncensorable\ncensored\ncensorial\ncensoring\ncensorious\ncensoriously\ncensoriousness\ncensors\ncensorship\ncensurability\ncensurable\ncensurableness\ncensurably\ncensure\ncensured\ncensurer\ncensurers\ncensures\ncensuring\ncensus\ncensuses\ncent\ncental\ncentals\ncentaur\ncentauries\ncentaurs\ncentaurus\ncentaury\ncentavo\ncentavos\ncentenarian\ncentenarians\ncentenaries\ncentenary\ncentennial\ncentennially\ncentennials\ncenter\ncenterboard\ncenterboards\ncentered\ncenteredly\ncenteredness\ncenterfold\ncenterfolds\ncentering\ncenterline\ncenterlines\ncentermost\ncenterpiece\ncenterpieces\ncenters\ncentesimal\ncentesimally\ncentesimi\ncentesimo\ncentesimos\ncentiampere\ncentiamperes\ncentibecquerel\ncentibecquerels\ncenticandela\ncenticandelas\ncenticoulomb\ncenticoulombs\ncentifarad\ncentifarads\ncentigrade\ncentigram\ncentigrams\ncentihenries\ncentihenry\ncentihenrys\ncentihertz\ncentijoule\ncentijoules\ncentikelvin\ncentikelvins\ncentiliter\ncentiliters\ncentilumen\ncentilumens\ncentilux\ncentime\ncentimes\ncentimeter\ncentimeters\ncentimo\ncentimole\ncentimoles\ncentimos\ncentinewton\ncentinewtons\ncentiohm\ncentiohms\ncentipascal\ncentipascals\ncentipede\ncentipedes\ncentipoise\ncentipoises\ncentiradian\ncentiradians\ncentisecond\ncentiseconds\ncentisiemens\ncentisievert\ncentisieverts\ncentisteradian\ncentisteradians\ncentitesla\ncentiteslas\ncentivolt\ncentivolts\ncentiwatt\ncentiwatts\ncentiweber\ncentiwebers\ncentner\ncentners\ncento\ncentos\ncentra\ncentral\ncentralism\ncentralist\ncentralistic\ncentralists\ncentrality\ncentralization\ncentralize\ncentralized\ncentralizer\ncentralizers\ncentralizes\ncentralizing\ncentrally\ncentrals\ncentric\ncentrically\ncentricity\ncentrifugal\ncentrifugalism\ncentrifugally\ncentrifugation\ncentrifuge\ncentrifuged\ncentrifuges\ncentrifuging\ncentriole\ncentrioles\ncentripetal\ncentripetally\ncentrism\ncentrist\ncentrists\ncentrobaric\ncentroid\ncentroids\ncentrolecithal\ncentrolineal\ncentromere\ncentromeres\ncentromeric\ncentrosome\ncentrosomes\ncentrosomic\ncentrosphere\ncentrospheres\ncentrum\ncentrums\ncents\ncentuple\ncenturial\ncenturies\ncenturion\ncenturions\ncentury\ncenturylong\nceorl\nceorls\ncep\ncephalad\ncephalalgia\ncephalalgias\ncephalexin\ncephalexins\ncephalic\ncephalically\ncephalin\ncephalins\ncephalization\ncephalizations\ncephalochordate\ncephalochordates\ncephalometer\ncephalometers\ncephalometric\ncephalometry\ncephalonia\ncephalopod\ncephalopodan\ncephalopodans\ncephalopods\ncephalosporin\ncephalosporins\ncephalothin\ncephalothins\ncephalothorax\ncephalothoraxes\ncepheid\ncepheids\ncepheus\nceps\nceraceous\nceram\nceramal\nceramals\nceramic\nceramics\nceramist\nceramists\ncerastes\ncerate\ncerated\ncerates\nceratodus\nceratoduses\nceratoid\ncerberean\ncerberus\ncercaria\ncercariae\ncercarial\ncercarias\ncerci\ncercus\ncere\ncereal\ncereals\ncerebella\ncerebellar\ncerebellum\ncerebellums\ncerebra\ncerebral\ncerebrally\ncerebrate\ncerebrated\ncerebrates\ncerebrating\ncerebration\ncerebrations\ncerebroside\ncerebrosides\ncerebrospinal\ncerebrovascular\ncerebrum\ncerebrums\ncerecloth\ncered\ncerement\ncerements\nceremonial\nceremonialism\nceremonialist\nceremonialists\nceremonially\nceremonials\nceremonies\nceremonious\nceremoniously\nceremoniousness\nceremony\nceres\ncereus\ncereuses\nceric\ncerise\ncerium\ncermet\ncermets\ncernuous\ncero\nceros\ncerotype\ncerotypes\ncerous\ncertain\ncertainly\ncertainties\ncertainty\ncertes\ncertifiable\ncertifiably\ncertificate\ncertificated\ncertificates\ncertificating\ncertification\ncertifications\ncertificatory\ncertified\ncertifier\ncertifiers\ncertifies\ncertify\ncertifying\ncertiorari\ncertioraris\ncertitude\ncertitudes\ncerulean\nceruloplasmin\nceruloplasmins\ncerumen\nceruminous\nceruse\nceruses\ncerussite\ncerussites\ncervantes\ncervical\ncervices\ncervicitis\ncervine\ncervix\ncervixes\ncesarean\ncesareans\ncesium\ncespitose\ncespitosely\ncessation\ncessations\ncession\ncessions\ncessna\ncesspit\ncesspits\ncesspool\ncesspools\ncesta\ncestas\ncesti\ncestode\ncestodes\ncestus\ncestuses\ncetacean\ncetaceans\ncetaceous\ncetane\ncetanes\ncete\ncetera\nceteris\ncetes\ncetological\ncetologist\ncetologists\ncetology\ncevennes\nceviche\nceviches\nceylon\nceylonese\nchablis\nchachka\nchachkas\nchacma\nchacmas\nchaconne\nchaconnes\nchacun\nchad\nchadian\nchadians\nchadless\nchador\nchadors\nchaeronea\nchaeta\nchaetae\nchaetognath\nchaetognathous\nchaetognaths\nchafe\nchafed\nchafer\nchafers\nchafes\nchaff\nchaffed\nchaffer\nchaffered\nchafferer\nchafferers\nchaffering\nchaffers\nchaffinch\nchaffinches\nchaffing\nchaffs\nchafing\nchagall\nchagrin\nchagrined\nchagrining\nchagrins\nchain\nchained\nchaining\nchainlike\nchainlink\nchainman\nchainmen\nchains\nchainsaw\nchainsaws\nchair\nchaired\nchairing\nchairlady\nchairman\nchairmanned\nchairmanning\nchairmans\nchairmanship\nchairmanships\nchairmen\nchairperson\nchairpersons\nchairs\nchairwoman\nchairwomen\nchaise\nchaises\nchakra\nchakras\nchalaza\nchalazae\nchalazal\nchalazas\nchalazia\nchalazion\nchalcedon\nchalcedonic\nchalcedonies\nchalcedony\nchalcid\nchalcidian\nchalcidians\nchalcidice\nchalcids\nchalcocite\nchalcocites\nchalcopyrite\nchalcopyrites\nchaldaic\nchaldaics\nchaldea\nchaldean\nchaldeans\nchaldee\nchaldees\nchaldron\nchaldrons\nchalet\nchalets\nchaliapin\nchalice\nchalices\nchalicothere\nchalicotheres\nchalk\nchalkboard\nchalkboards\nchalked\nchalkier\nchalkiest\nchalkiness\nchalking\nchalks\nchalkstone\nchalkstones\nchalky\nchallah\nchallahs\nchallenge\nchallengeable\nchallenged\nchallenger\nchallengers\nchallenges\nchallenging\nchallengingly\nchallis\nchalone\nchalones\nchalybeate\nchalybeates\ncham\nchamaeleon\nchamaephyte\nchamaephytes\nchamber\nchambered\nchambering\nchamberlain\nchamberlains\nchambermaid\nchambermaids\nchambers\nchambray\nchameleon\nchameleonic\nchameleons\nchamfer\nchamfered\nchamfering\nchamfers\nchamfron\nchamfrons\nchamise\nchamises\nchamizal\nchamois\nchamomile\nchamomiles\nchamonix\nchamp\nchampagne\nchampagnes\nchampaign\nchampaigns\nchampak\nchampaks\nchamped\nchamperties\nchampertous\nchamperty\nchampignon\nchampignons\nchamping\nchampion\nchampioned\nchampioning\nchampions\nchampionship\nchampionships\nchamplain\nchamplevé\nchamps\nchampêtre\nchampêtres\nchams\nchance\nchanced\nchanceful\nchancel\nchancelleries\nchancellery\nchancellor\nchancellors\nchancellorship\nchancels\nchanceries\nchancery\nchances\nchancier\nchanciest\nchanciness\nchancing\nchancre\nchancres\nchancroid\nchancroidal\nchancroids\nchancrous\nchancy\nchandelier\nchandeliers\nchandelle\nchandelles\nchandigarh\nchandler\nchandlers\nchandlery\nchandos\nchandragupta\nchange\nchangeability\nchangeable\nchangeableness\nchangeably\nchanged\nchangeful\nchangefully\nchangefulness\nchangeless\nchangeling\nchangelings\nchangeover\nchangeovers\nchanger\nchangers\nchanges\nchangeup\nchangeups\nchanging\nchannel\nchanneled\nchanneler\nchannelers\nchanneling\nchannelings\nchannelization\nchannelizations\nchannelize\nchannelized\nchannelizes\nchannelizing\nchannels\nchanoyu\nchanoyus\nchanson\nchansons\nchant\nchanted\nchanter\nchanterelle\nchanterelles\nchanters\nchanteuse\nchanteuses\nchantey\nchanteys\nchanticleer\nchanticleers\nchantilly\nchanting\nchantingly\nchantries\nchantry\nchants\nchanukah\nchaos\nchaotic\nchaotically\nchap\nchaparral\nchaparrals\nchapati\nchapatis\nchapbook\nchapbooks\nchape\nchapeau\nchapeaus\nchapeaux\nchapel\nchapels\nchaperon\nchaperonage\nchaperone\nchaperoned\nchaperones\nchaperoning\nchaperons\nchapes\nchapfallen\nchapiter\nchapiters\nchaplain\nchaplaincies\nchaplaincy\nchaplains\nchaplainship\nchaplet\nchapleted\nchaplets\nchaplin\nchapman\nchapmen\nchapped\nchapping\nchaps\nchapter\nchapters\nchapultepec\nchar\ncharabanc\ncharabancs\ncharacin\ncharacins\ncharacter\ncharactered\ncharacterful\ncharacteries\ncharactering\ncharacteristic\ncharacteristically\ncharacteristics\ncharacterization\ncharacterizations\ncharacterize\ncharacterized\ncharacterizer\ncharacterizers\ncharacterizes\ncharacterizing\ncharacterless\ncharacters\ncharactery\ncharade\ncharades\ncharbroil\ncharbroiled\ncharbroiling\ncharbroils\ncharcoal\ncharcoaled\ncharcoaling\ncharcoals\ncharcuterie\ncharcuteries\nchard\nchardonnay\nchardonnays\nchare\nchares\ncharge\nchargeable\nchargeableness\ncharged\ncharger\nchargers\ncharges\ncharging\nchargé\nchargés\ncharier\nchariest\ncharily\nchariness\nchariot\ncharioted\ncharioteer\ncharioteers\ncharioting\nchariots\ncharism\ncharisma\ncharismata\ncharismatic\ncharismatics\ncharitable\ncharitableness\ncharitably\ncharities\ncharity\ncharivari\ncharivaris\ncharkha\ncharkhas\ncharlatan\ncharlatanic\ncharlatanical\ncharlatanism\ncharlatanry\ncharlatans\ncharlemagne\ncharleroi\ncharles\ncharleston\ncharlestons\ncharley\ncharlie\ncharlock\ncharlocks\ncharlotte\ncharlottes\ncharlottesville\ncharm\ncharmed\ncharmer\ncharmers\ncharmeuse\ncharmeuses\ncharming\ncharmingly\ncharmless\ncharmonium\ncharmoniums\ncharms\ncharnel\ncharnels\ncharolais\ncharon\ncharqui\ncharred\ncharring\nchars\nchart\ncharted\ncharter\nchartered\ncharterer\ncharterers\ncharterhouse\ncharterhouses\nchartering\ncharters\ncharting\nchartings\nchartism\nchartist\nchartists\nchartres\nchartreuse\nchartroom\nchartrooms\ncharts\ncharwoman\ncharwomen\nchary\ncharybdis\nchase\nchased\nchaser\nchasers\nchases\nchasing\nchasm\nchasmal\nchasmogamous\nchasms\nchassepots\nchasseur\nchasseurs\nchassis\nchassises\nchassé\nchasséd\nchasséing\nchassés\nchaste\nchastely\nchasten\nchastened\nchastener\nchasteners\nchasteness\nchastening\nchastens\nchaster\nchastest\nchastisable\nchastise\nchastised\nchastisement\nchastisements\nchastiser\nchastisers\nchastises\nchastising\nchastity\nchasuble\nchasubles\nchat\nchateau\nchateaubriand\nchateaubriands\nchateaus\nchateaux\nchatelain\nchatelaine\nchatelaines\nchatelains\nchatoyancy\nchatoyant\nchatoyants\nchats\nchattahoochee\nchattanooga\nchatted\nchattel\nchattels\nchatter\nchatterbox\nchatterboxes\nchattered\nchatterer\nchatterers\nchattering\nchatters\nchatterton\nchattier\nchattiest\nchattily\nchattiness\nchatting\nchatty\nchaucer\nchaucerian\nchaucerians\nchauffeur\nchauffeured\nchauffeuring\nchauffeurs\nchaulmoogra\nchaulmoogras\nchautauqua\nchauvinism\nchauvinist\nchauvinistic\nchauvinistically\nchauvinists\nchaw\nchawed\nchawing\nchaws\nchayote\nchayotes\nchazan\nchazans\ncheap\ncheapen\ncheapened\ncheapener\ncheapeners\ncheapening\ncheapens\ncheaper\ncheapest\ncheapie\ncheapies\ncheapjack\ncheapjacks\ncheaply\ncheapness\ncheapskate\ncheapskates\ncheat\ncheated\ncheater\ncheaters\ncheating\ncheatingly\ncheats\nchebec\nchebecs\nchebyshev\ncheck\ncheckable\ncheckbook\ncheckbooks\ncheckbox\ncheckboxes\nchecked\nchecker\ncheckerberries\ncheckerberry\ncheckerbloom\ncheckerblooms\ncheckerboard\ncheckerboards\ncheckered\ncheckering\ncheckers\nchecking\nchecklist\nchecklists\ncheckmark\ncheckmarks\ncheckmate\ncheckmated\ncheckmates\ncheckmating\ncheckoff\ncheckout\ncheckouts\ncheckpoint\ncheckpoints\ncheckrein\ncheckreins\ncheckroom\ncheckrooms\nchecks\nchecksum\nchecksums\ncheckup\ncheckups\ncheddar\ncheddars\ncheek\ncheekbone\ncheekbones\ncheeked\ncheekier\ncheekiest\ncheekily\ncheekiness\ncheeking\ncheeks\ncheeky\ncheep\ncheeped\ncheeper\ncheepers\ncheeping\ncheeps\ncheer\ncheered\ncheerer\ncheerers\ncheerful\ncheerfully\ncheerfulness\ncheerier\ncheeriest\ncheerily\ncheeriness\ncheering\ncheeringly\ncheerio\ncheerios\ncheerlead\ncheerleader\ncheerleaders\ncheerleading\ncheerleads\ncheerled\ncheerless\ncheerlessly\ncheerlessness\ncheers\ncheery\ncheese\ncheeseburger\ncheeseburgers\ncheesecake\ncheesecakes\ncheesecloth\ncheesed\ncheeseparer\ncheeseparers\ncheeseparing\ncheeses\ncheesier\ncheesiest\ncheesiness\ncheesing\ncheesy\ncheetah\ncheetahs\nchef\nchefs\nchekhov\nchekhovian\nchela\nchelae\nchelatable\nchelate\nchelated\nchelates\nchelating\nchelation\nchelator\nchelators\nchelicera\nchelicerae\ncheliform\nchellian\nchelonian\nchelonians\nchelsea\nchemic\nchemical\nchemically\nchemicals\nchemiluminescence\nchemiluminescent\nchemin\nchemins\nchemise\nchemises\nchemisette\nchemisettes\nchemisorb\nchemisorbed\nchemisorbing\nchemisorbs\nchemisorption\nchemist\nchemistries\nchemistry\nchemists\nchemoautotroph\nchemoautotrophic\nchemoautotrophically\nchemoautotrophs\nchemoautotrophy\nchemoprevention\nchemopreventions\nchemopreventive\nchemoprophylactic\nchemoprophylaxis\nchemoreception\nchemoreceptive\nchemoreceptivity\nchemoreceptor\nchemoreceptors\nchemosensory\nchemosphere\nchemospheres\nchemosurgery\nchemosurgical\nchemosynthesis\nchemosynthetic\nchemosynthetically\nchemosystematics\nchemotactic\nchemotactically\nchemotaxis\nchemotaxonomic\nchemotaxonomically\nchemotaxonomist\nchemotaxonomists\nchemotaxonomy\nchemotherapeutic\nchemotherapeutically\nchemotherapist\nchemotherapists\nchemotherapy\nchemotropic\nchemotropism\nchemotropisms\nchemurgic\nchemurgical\nchemurgy\nchenille\nchenilles\nchenopod\nchenopods\ncheops\ncheque\nchequer\nchequers\ncheques\ncherbourg\ncherimoya\ncherimoyas\ncherish\ncherishable\ncherished\ncherisher\ncherishers\ncherishes\ncherishing\ncherishingly\nchernobyl\nchernozem\nchernozemic\nchernozems\ncherokee\ncherokees\ncheroot\ncheroots\ncherries\ncherry\ncherrystone\ncherrystones\nchersonese\nchersoneses\nchert\ncherty\ncherub\ncherubic\ncherubically\ncherubim\ncherubs\nchervil\nchesapeake\ncheshire\nchess\nchessboard\nchessboards\nchesses\nchessman\nchessmen\nchessylite\nchessylites\nchest\nchested\nchesterfield\nchesterfields\nchestier\nchestiest\nchestiness\nchestnut\nchestnuts\nchests\nchesty\nchetrum\ncheval\nchevalet\nchevalets\nchevalier\nchevaliers\nchevaux\nchevelure\nchevelures\ncheviot\ncheviots\nchevrolet\nchevrolets\nchevron\nchevrons\nchevrotain\nchevrotains\nchew\nchewable\nchewed\nchewer\nchewers\nchewier\nchewiest\nchewiness\nchewing\nchewink\nchewinks\nchews\nchewy\ncheyenne\ncheyennes\nchez\nchi\nchia\nchianti\nchiantis\nchiaroscurist\nchiaroscurists\nchiaroscuro\nchiaroscuros\nchias\nchiasma\nchiasmal\nchiasmas\nchiasmata\nchiasmatic\nchiasmatypies\nchiasmatypy\nchiasmi\nchiasmic\nchiasmus\nchiastolite\nchiastolites\nchiaus\nchibcha\nchibchan\nchibchans\nchibchas\nchibouk\nchibouks\nchic\nchicago\nchicagoan\nchicagoans\nchicana\nchicane\nchicaned\nchicaner\nchicaneries\nchicaners\nchicanery\nchicanes\nchicaning\nchicano\nchicanos\nchicer\nchicest\nchichagof\nchichi\nchichier\nchichiest\nchick\nchickadee\nchickadees\nchickaree\nchickarees\nchickasaw\nchickasaws\nchicken\nchickened\nchickenfeed\nchickenhearted\nchickening\nchickenpox\nchickens\nchickpea\nchickpeas\nchicks\nchickweed\nchickweeds\nchicle\nchiclets\nchicly\nchicness\nchicories\nchicory\nchid\nchidden\nchide\nchided\nchider\nchiders\nchides\nchiding\nchidingly\nchief\nchiefdom\nchiefdoms\nchiefly\nchiefs\nchiefship\nchieftain\nchieftaincy\nchieftains\nchieftainship\nchiffchaff\nchiffchaffs\nchiffon\nchiffonier\nchiffoniers\nchiffonnier\nchiffonniers\nchifforobe\nchifforobes\nchigger\nchiggers\nchignon\nchignons\nchigoe\nchihuahua\nchihuahuas\nchilblain\nchilblained\nchilblains\nchild\nchildbearing\nchildbed\nchildbirth\nchildbirths\nchildermas\nchildermases\nchildfree\nchildhood\nchildish\nchildishly\nchildishness\nchildless\nchildlessness\nchildlike\nchildproof\nchildproofed\nchildproofing\nchildproofs\nchildren\nchile\nchilean\nchileans\nchili\nchiliad\nchiliads\nchiliasm\nchiliast\nchiliastic\nchiliburger\nchiliburgers\nchilidog\nchilidogs\nchilies\nchill\nchilled\nchiller\nchillers\nchillier\nchilliest\nchillily\nchilliness\nchilling\nchillingly\nchillness\nchills\nchilly\nchiloe\nchilopod\nchilopods\nchiloé\nchimaera\nchimaeras\nchimborazo\nchime\nchimed\nchimer\nchimera\nchimeras\nchimeric\nchimerical\nchimerically\nchimerism\nchimerisms\nchimers\nchimes\nchimichanga\nchimichangas\nchiming\nchimney\nchimneypiece\nchimneypieces\nchimneys\nchimneysweep\nchimneysweeper\nchimneysweepers\nchimneysweeps\nchimp\nchimpanzee\nchimpanzees\nchimps\nchin\nchina\nchinaberries\nchinaberry\nchinaman\nchinamen\nchinatown\nchinatowns\nchinaware\nchinch\nchincherinchee\nchincherinchees\nchinches\nchinchilla\nchinchillas\nchincoteague\nchindit\nchindits\nchindwin\nchine\nchines\nchinese\nchink\nchinked\nchinking\nchinks\nchinky\nchinless\nchinned\nchinning\nchino\nchinoiserie\nchinoiseries\nchinook\nchinookan\nchinooks\nchinos\nchinquapin\nchinquapins\nchins\nchintz\nchintzes\nchintzier\nchintziest\nchintzy\nchip\nchipboard\nchipboards\nchipewyan\nchipewyans\nchipmaker\nchipmakers\nchipmunk\nchipmunks\nchipped\nchippendale\nchipper\nchippered\nchippering\nchippers\nchippewa\nchippewas\nchippier\nchippies\nchippiest\nchipping\nchippy\nchips\nchiral\nchirality\nchiricahua\nchiricahuas\nchirk\nchirked\nchirking\nchirks\nchirographer\nchirographers\nchirographic\nchirographical\nchirography\nchiromancer\nchiromancers\nchiromancy\nchiron\nchiropodist\nchiropodists\nchiropody\nchiropractic\nchiropractor\nchiropractors\nchiropteran\nchiropterans\nchirp\nchirped\nchirpier\nchirpiest\nchirpily\nchirping\nchirps\nchirpy\nchirr\nchirred\nchirring\nchirrs\nchirrup\nchirruped\nchirruping\nchirrups\nchisel\nchiseled\nchiseler\nchiselers\nchiseling\nchisels\nchit\nchitchat\nchitchats\nchitchatted\nchitchatting\nchitin\nchitinous\nchitlins\nchiton\nchits\nchittagong\nchitter\nchittered\nchittering\nchitterlings\nchitters\nchivalric\nchivalries\nchivalrous\nchivalrously\nchivalrousness\nchivalry\nchive\nchives\nchivied\nchivies\nchivvied\nchivvies\nchivvy\nchivvying\nchivy\nchivying\nchlamydate\nchlamydeous\nchlamydes\nchlamydia\nchlamydiae\nchlamydial\nchlamydospore\nchlamydospores\nchlamys\nchlamyses\nchloasma\nchloasmata\nchloe\nchloracne\nchloracnes\nchloral\nchloramine\nchloramines\nchloramphenicol\nchlorate\nchlorates\nchlordane\nchlordiazepoxide\nchlorella\nchlorenchyma\nchloric\nchloride\nchlorides\nchloridic\nchlorinate\nchlorinated\nchlorinates\nchlorinating\nchlorination\nchlorinations\nchlorinator\nchlorinators\nchlorine\nchlorite\nchlorites\nchlorobenzene\nchlorocarbon\nchlorocarbons\nchlorofluorocarbon\nchloroform\nchloroformed\nchloroforming\nchloroforms\nchlorohydrin\nchloromycetin\nchlorophyll\nchloropicrin\nchloroplast\nchloroplasts\nchloroprene\nchloroquine\nchlorosis\nchlorothiazide\nchlorothiazides\nchlorotic\nchlorotically\nchlorpromazine\nchlortetracycline\nchoanocyte\nchoanocytes\nchock\nchockablock\nchocked\nchockfull\nchocking\nchocks\nchocoholic\nchocoholics\nchocolate\nchocolates\nchoctaw\nchoctawhatchee\nchoctaws\nchoice\nchoicely\nchoiceness\nchoicer\nchoices\nchoicest\nchoir\nchoirboy\nchoirboys\nchoired\nchoirgirl\nchoirgirls\nchoiring\nchoirmaster\nchoirmasters\nchoirs\nchoiseul\nchoke\nchokeberries\nchokeberry\nchokebore\nchokebores\nchokecherries\nchokecherry\nchoked\nchokedamp\nchokehold\nchokeholds\nchokepoint\nchokepoints\nchoker\nchokers\nchokes\nchokier\nchokiest\nchoking\nchokingly\nchoky\ncholangiographic\ncholangiography\ncholecalciferol\ncholecyst\ncholecystectomies\ncholecystectomy\ncholecystitis\ncholecystokinin\ncholecysts\ncholelithiasis\ncholer\ncholera\ncholeraic\ncholeric\ncholerically\ncholeroid\ncholestasis\ncholesterin\ncholesterol\ncholestyramine\ncholine\ncholinergic\ncholinesterase\ncholla\nchomp\nchomped\nchomping\nchomps\nchomsky\nchomskyan\nchondrification\nchondrified\nchondrifies\nchondrify\nchondrifying\nchondriosome\nchondriosomes\nchondrite\nchondrites\nchondritic\nchondrocrania\nchondrocranium\nchondrocraniums\nchondroma\nchondromalacia\nchondromas\nchondromata\nchondrule\nchondrules\nchoose\nchooser\nchoosers\nchooses\nchoosier\nchoosiest\nchoosiness\nchoosing\nchoosy\nchop\nchophouse\nchophouses\nchopin\nchopine\nchopines\nchoplogic\nchopped\nchopper\nchoppered\nchoppering\nchoppers\nchoppier\nchoppiest\nchoppily\nchoppiness\nchopping\nchoppy\nchops\nchopstick\nchopsticks\nchoragi\nchoragic\nchoragus\nchoral\nchorale\nchorales\nchorally\nchord\nchordal\nchordate\nchordates\nchorded\nchording\nchords\nchore\nchorea\nchoreograph\nchoreographed\nchoreographer\nchoreographers\nchoreographic\nchoreographically\nchoreographies\nchoreographing\nchoreographs\nchoreography\nchores\nchoriamb\nchoriambic\nchoriambs\nchoric\nchorine\nchorines\nchorioallantoic\nchorioallantois\nchorion\nchorionic\nchorions\nchoripetalous\nchorister\nchoristers\nchorizo\nchorizos\nchorographer\nchorographers\nchorographic\nchorographical\nchorographically\nchorography\nchoroid\nchoroids\nchortle\nchortled\nchortler\nchortlers\nchortles\nchortling\nchorus\nchorused\nchoruses\nchorusing\nchose\nchosen\nchott\nchotts\nchoucroute\nchoucroutes\nchough\nchoughs\nchouse\nchoused\nchouses\nchousing\nchow\nchowchow\nchowchows\nchowder\nchowders\nchowed\nchowhound\nchowhounds\nchowing\nchows\nchresard\nchresards\nchrestomathic\nchrestomathies\nchrestomathy\nchris\nchrism\nchrismal\nchrisms\nchrisom\nchrisoms\nchrist\nchristchurch\nchristen\nchristendom\nchristened\nchristening\nchristenings\nchristens\nchristi\nchristian\nchristiania\nchristianities\nchristianity\nchristianization\nchristianize\nchristianized\nchristianizer\nchristianizers\nchristianizes\nchristianizing\nchristianly\nchristians\nchristie\nchristies\nchristina\nchristine\nchristlike\nchristlikeness\nchristliness\nchristly\nchristmas\nchristmases\nchristmassy\nchristmastide\nchristmastime\nchristmastimes\nchristogram\nchristograms\nchristological\nchristologies\nchristology\nchristopher\nchroma\nchromaffin\nchromate\nchromatic\nchromatically\nchromaticism\nchromaticity\nchromatics\nchromatid\nchromatids\nchromatin\nchromatinic\nchromatist\nchromatists\nchromatogram\nchromatograms\nchromatograph\nchromatographed\nchromatographer\nchromatographers\nchromatographic\nchromatographically\nchromatographing\nchromatographs\nchromatography\nchromatolysis\nchromatolytic\nchromatophilic\nchromatophore\nchromatophores\nchromatophoric\nchrome\nchromed\nchromes\nchromic\nchroming\nchromite\nchromium\nchromodynamics\nchromogen\nchromogenic\nchromogens\nchromolithograph\nchromolithographer\nchromolithographers\nchromolithographic\nchromolithographs\nchromolithography\nchromomere\nchromomeres\nchromomeric\nchromonema\nchromonemal\nchromonemata\nchromonemic\nchromophil\nchromophore\nchromophores\nchromophoric\nchromoplast\nchromoprotein\nchromoproteins\nchromosomal\nchromosomally\nchromosome\nchromosomes\nchromosomic\nchromosphere\nchromospheres\nchromospheric\nchromous\nchronaxie\nchronaxies\nchronic\nchronically\nchronicity\nchronicle\nchronicled\nchronicler\nchroniclers\nchronicles\nchronicling\nchronobiology\nchronogram\nchronogrammatic\nchronogrammatically\nchronograms\nchronograph\nchronographic\nchronographically\nchronographs\nchronological\nchronologically\nchronologies\nchronologist\nchronologists\nchronologize\nchronologized\nchronologizes\nchronologizing\nchronology\nchronometer\nchronometers\nchronometric\nchronometrical\nchronometrically\nchronometry\nchronoscope\nchronoscopes\nchronoscopic\nchrysalid\nchrysalides\nchrysalids\nchrysalis\nchrysalises\nchrysanthemum\nchrysanthemums\nchryselephantine\nchrysler\nchryslers\nchrysoberyl\nchrysolite\nchrysolites\nchrysomelid\nchrysomelids\nchrysoprase\nchrysoprases\nchrysotherapy\nchrysotile\nchrysotiles\nchthonic\nchub\nchubbier\nchubbiest\nchubbily\nchubbiness\nchubby\nchubs\nchuck\nchucked\nchuckhole\nchuckholes\nchucking\nchuckle\nchuckled\nchucklehead\nchuckleheaded\nchuckleheads\nchuckler\nchucklers\nchuckles\nchucklesome\nchuckling\nchucklingly\nchucks\nchuckwalla\nchuckwallas\nchuddar\nchuddars\nchufa\nchufas\nchuff\nchuffed\nchuffing\nchuffs\nchuffy\nchug\nchugalug\nchugalugged\nchugalugging\nchugalugs\nchugged\nchugger\nchuggers\nchugging\nchugs\nchukar\nchukars\nchukka\nchukkas\nchukker\nchukkers\nchum\nchummed\nchummier\nchummiest\nchummily\nchumminess\nchumming\nchummy\nchump\nchumped\nchumping\nchumps\nchums\nchungking\nchunk\nchunked\nchunkier\nchunkiest\nchunkily\nchunkiness\nchunking\nchunks\nchunky\nchunnel\nchunnels\nchunter\nchuntered\nchuntering\nchunters\nchurch\nchurched\nchurches\nchurchgoer\nchurchgoers\nchurchgoing\nchurchier\nchurchiest\nchurchill\nchurchillian\nchurching\nchurchliness\nchurchly\nchurchman\nchurchmanly\nchurchmanship\nchurchmen\nchurchwarden\nchurchwardens\nchurchwoman\nchurchwomen\nchurchy\nchurchyard\nchurchyards\nchurl\nchurlish\nchurlishly\nchurlishness\nchurls\nchurn\nchurned\nchurner\nchurners\nchurning\nchurns\nchurr\nchurred\nchurrigueresque\nchurring\nchurro\nchurros\nchurrs\nchute\nchuted\nchutes\nchuting\nchutist\nchutists\nchutney\nchutneys\nchutzpa\nchutzpah\nchutzpas\nchuvash\nchuvashes\nchylaceous\nchyle\nchyles\nchylomicron\nchylomicrons\nchylous\nchyme\nchymes\nchymopapain\nchymopapains\nchymosin\nchymosins\nchymotrypsin\nchymotrypsins\nchymotryptic\nchymous\nchâlons\nchâteau\nchâteaux\nchâtelherault\nchèvre\nciao\ncibber\nciboria\nciborium\ncicada\ncicadae\ncicadas\ncicala\ncicalas\ncicatrices\ncicatricial\ncicatricose\ncicatrix\ncicatrization\ncicatrize\ncicatrized\ncicatrizes\ncicatrizing\ncicero\ncicerone\ncicerones\nciceroni\nciceronian\ncichlid\ncichlids\ncider\nciders\ncigar\ncigarette\ncigarettes\ncigarillo\ncigarillos\ncigars\ncilantro\ncilia\nciliary\nciliate\nciliated\nciliately\nciliates\nciliation\ncilice\ncilices\ncilicia\ncilician\ncilicians\nciliolate\ncilium\ncimarron\ncimetidine\ncimex\ncimices\ncimmerian\ncinch\ncinched\ncincher\ncinchers\ncinches\ncinching\ncinchona\ncinchonas\ncinchonic\ncinchonine\ncinchonism\ncincinnati\ncincture\ncinctured\ncinctures\ncincturing\ncinder\ncindered\ncinderella\ncindering\ncinders\ncindery\ncindy\ncine\ncineaste\ncineastes\ncinema\ncinemagoer\ncinemagoers\ncinemas\ncinematheque\ncinematheques\ncinematic\ncinematically\ncinematization\ncinematizations\ncinematize\ncinematized\ncinematizes\ncinematizing\ncinematograph\ncinematographer\ncinematographers\ncinematographically\ncinematographs\ncinematography\ncineole\ncineoles\ncinephile\ncinephiles\ncineradiography\ncinerama\ncineraria\ncinerarium\ncinerary\ncinereous\ncinerin\ncinerins\ncines\ncingalese\ncingula\ncingulate\ncingulated\ncingulum\ncinnabar\ncinnamic\ncinnamon\ncinquain\ncinquains\ncinque\ncinquecentist\ncinquecentists\ncinquecento\ncinquefoil\ncinquefoils\ncinques\ncinéma\ncipher\nciphered\nciphering\nciphers\ncirca\ncircadian\ncircadianly\ncircassia\ncircassian\ncircassians\ncirce\ncircean\ncircinate\ncircinately\ncircinus\ncircle\ncircled\ncircler\ncirclers\ncircles\ncirclet\ncirclets\ncircling\ncircuit\ncircuited\ncircuiting\ncircuitous\ncircuitously\ncircuitousness\ncircuitries\ncircuitry\ncircuits\ncircuity\ncircular\ncircularities\ncircularity\ncircularization\ncircularize\ncircularized\ncircularizer\ncircularizers\ncircularizes\ncircularizing\ncircularly\ncirculars\ncirculate\ncirculated\ncirculates\ncirculating\ncirculation\ncirculations\ncirculative\ncirculator\ncirculators\ncirculatory\ncircumambience\ncircumambiency\ncircumambient\ncircumambiently\ncircumambulate\ncircumambulated\ncircumambulates\ncircumambulating\ncircumambulation\ncircumambulations\ncircumboreal\ncircumcise\ncircumcised\ncircumciser\ncircumcisers\ncircumcises\ncircumcising\ncircumcision\ncircumcisions\ncircumduction\ncircumductions\ncircumference\ncircumferences\ncircumferential\ncircumflex\ncircumflexes\ncircumfluent\ncircumfuse\ncircumfused\ncircumfuses\ncircumfusing\ncircumfusion\ncircumlocution\ncircumlocutions\ncircumlocutorily\ncircumlocutory\ncircumlunar\ncircumnavigate\ncircumnavigated\ncircumnavigates\ncircumnavigating\ncircumnavigation\ncircumnavigations\ncircumnavigator\ncircumnavigators\ncircumpolar\ncircumrotate\ncircumrotated\ncircumrotates\ncircumrotating\ncircumrotation\ncircumrotations\ncircumrotatory\ncircumscissile\ncircumscribable\ncircumscribe\ncircumscribed\ncircumscriber\ncircumscribers\ncircumscribes\ncircumscribing\ncircumscription\ncircumscriptions\ncircumscriptive\ncircumscriptively\ncircumsolar\ncircumspect\ncircumspection\ncircumspectly\ncircumstance\ncircumstanced\ncircumstances\ncircumstancing\ncircumstantial\ncircumstantialities\ncircumstantiality\ncircumstantially\ncircumstantiate\ncircumstantiated\ncircumstantiates\ncircumstantiating\ncircumstantiation\ncircumstantiations\ncircumterrestrial\ncircumvallate\ncircumvallated\ncircumvallates\ncircumvallating\ncircumvallation\ncircumvallations\ncircumvent\ncircumvented\ncircumventer\ncircumventers\ncircumventing\ncircumvention\ncircumventions\ncircumventive\ncircumvents\ncircumvolution\ncircumvolutions\ncircumvolve\ncircumvolved\ncircumvolves\ncircumvolving\ncircus\ncircuses\ncircusy\ncirque\ncirques\ncirrate\ncirrhoses\ncirrhosis\ncirrhotic\ncirri\ncirriped\ncirripeds\ncirrocumuli\ncirrocumulus\ncirrostrati\ncirrostratus\ncirrus\nciré\ncisalpine\ncisatlantic\nciscaucasia\ncisco\nciscoes\ncislunar\ncismontane\ncist\ncistercian\ncistercians\ncistern\ncisterna\ncisternae\ncisternal\ncisterns\ncistron\ncistronic\ncistrons\ncists\ncit\ncitable\ncitadel\ncitadels\ncitation\ncitational\ncitations\ncitatory\ncite\ncited\ncites\ncithaeron\ncithara\ncitharas\ncither\ncithers\ncitied\ncities\ncitification\ncitified\ncitifies\ncitify\ncitifying\nciting\ncitizen\ncitizeness\ncitizenesses\ncitizenly\ncitizenries\ncitizenry\ncitizens\ncitizenship\ncitlaltépetl\ncitral\ncitrals\ncitrate\ncitrates\ncitric\ncitriculture\ncitricultures\ncitriculturist\ncitriculturists\ncitrine\ncitrines\ncitroen\ncitron\ncitronella\ncitronellal\ncitronellals\ncitronellas\ncitronellol\ncitronellols\ncitrons\ncitrulline\ncitrullines\ncitrus\ncitruses\ncittern\ncitterns\ncity\ncityscape\ncityscapes\ncitywide\ncivet\ncivets\ncivic\ncivics\ncivil\ncivilian\ncivilianization\ncivilianize\ncivilianized\ncivilianizes\ncivilianizing\ncivilians\ncivilities\ncivility\ncivilizable\ncivilization\ncivilizations\ncivilize\ncivilized\ncivilizer\ncivilizers\ncivilizes\ncivilizing\ncivilly\ncivism\ncivisms\ncivitavecchia\ncivvies\nclabber\nclabbered\nclabbering\nclabbers\nclack\nclacked\nclacker\nclackers\nclacking\nclacks\nclactonian\nclad\ncladding\ncladdings\nclade\nclades\ncladist\ncladistic\ncladistically\ncladistics\ncladists\ncladoceran\ncladocerans\ncladode\ncladodes\ncladodial\ncladogenesis\ncladogenetic\ncladogenetically\ncladogram\ncladograms\ncladophyll\ncladophylls\nclads\nclafouti\nclaim\nclaimable\nclaimant\nclaimants\nclaimed\nclaimer\nclaimers\nclaiming\nclaims\nclair\nclairaudience\nclairaudiences\nclairaudient\nclaire\nclairvaux\nclairvoyance\nclairvoyant\nclairvoyants\nclam\nclamant\nclamantly\nclambake\nclambakes\nclamber\nclambered\nclamberer\nclamberers\nclambering\nclambers\nclammed\nclammer\nclammers\nclammier\nclammiest\nclammily\nclamminess\nclamming\nclammy\nclamor\nclamored\nclamorer\nclamorers\nclamoring\nclamorous\nclamorously\nclamorousness\nclamors\nclamp\nclampdown\nclampdowns\nclamped\nclamper\nclampers\nclamping\nclamps\nclams\nclamshell\nclamshells\nclamworm\nclamworms\nclan\nclandestine\nclandestinely\nclandestineness\nclandestinity\nclang\nclanged\nclanging\nclangor\nclangored\nclangoring\nclangorous\nclangorously\nclangors\nclangs\nclank\nclanked\nclanking\nclanks\nclanky\nclannish\nclannishly\nclannishness\nclans\nclansman\nclansmen\nclanswoman\nclanswomen\nclap\nclapboard\nclapboarded\nclapboarding\nclapboards\nclapped\nclapper\nclappers\nclapping\nclaps\nclaptrap\nclaque\nclaques\nclarence\nclarences\nclaret\nclarets\nclaries\nclarification\nclarifications\nclarificatory\nclarified\nclarifier\nclarifiers\nclarifies\nclarify\nclarifying\nclarinet\nclarinetist\nclarinetists\nclarinets\nclarion\nclarions\nclarity\nclarkia\nclarkias\nclary\nclash\nclashed\nclashes\nclashing\nclasp\nclasped\nclasper\nclaspers\nclasping\nclasps\nclass\nclassed\nclasses\nclassic\nclassical\nclassicality\nclassically\nclassicalness\nclassicism\nclassicist\nclassicists\nclassicize\nclassicized\nclassicizes\nclassicizing\nclassics\nclassier\nclassiest\nclassifiable\nclassification\nclassifications\nclassificatorily\nclassificatory\nclassified\nclassifieds\nclassifier\nclassifiers\nclassifies\nclassify\nclassifying\nclassiness\nclassing\nclassis\nclassism\nclassisms\nclassist\nclassless\nclassman\nclassmate\nclassmates\nclassmen\nclasson\nclassons\nclassroom\nclassrooms\nclassy\nclast\nclastic\nclasts\nclathrate\nclathrates\nclatter\nclattered\nclatterer\nclatterers\nclattering\nclatters\nclattery\nclaude\nclaudication\nclaudications\nclaudius\nclaus\nclausal\nclause\nclauses\nclausewitz\nclaustrophobe\nclaustrophobia\nclaustrophobic\nclaustrophobically\nclavate\nclavately\nclavichord\nclavichordist\nclavichordists\nclavichords\nclavicle\nclavicles\nclavicular\nclaviculate\nclavier\nclaviers\nclavus\nclaw\nclawed\nclawing\nclaws\nclay\nclayey\nclayish\nclaylike\nclaymation\nclaymore\nclaymores\nclays\nclayware\nclean\ncleanable\ncleaned\ncleaner\ncleaners\ncleanest\ncleaning\ncleanlier\ncleanliest\ncleanliness\ncleanly\ncleanness\ncleans\ncleanse\ncleansed\ncleanser\ncleansers\ncleanses\ncleansing\ncleanthes\ncleanup\ncleanups\nclear\nclearable\nclearance\nclearances\nclearchus\ncleared\nclearer\nclearers\nclearest\nclearheaded\nclearheadedly\nclearing\nclearinghouse\nclearinghouses\nclearings\nclearly\nclearness\nclears\nclearweed\nclearweeds\nclearwing\nclearwings\ncleat\ncleated\ncleating\ncleats\ncleavable\ncleavage\ncleavages\ncleave\ncleaved\ncleaver\ncleavers\ncleaves\ncleaving\nclef\nclefs\ncleft\nclefts\ncleisthenes\ncleistogamous\ncleistogamously\ncleistogamy\ncleistothecia\ncleistothecium\nclematis\nclematises\nclemenceau\nclemencies\nclemency\nclement\nclementine\nclementines\nclemently\nclench\nclenched\nclenches\nclenching\ncleome\ncleomes\ncleopatra\nclepsydra\nclepsydrae\nclepsydras\nclerestories\nclerestory\nclergies\nclergy\nclergyman\nclergymen\nclergywoman\nclergywomen\ncleric\nclerical\nclericalism\nclericalist\nclericalists\nclerically\nclericals\nclerics\nclerihew\nclerihews\nclerisies\nclerisy\nclerk\nclerkdom\nclerkdoms\nclerked\nclerking\nclerklier\nclerkliest\nclerkliness\nclerkly\nclerks\nclerkship\nclerkships\ncleveland\nclever\ncleverer\ncleverest\ncleverly\ncleverness\ncleves\nclevis\nclevises\nclew\nclewed\nclewing\nclews\ncliché\nclichéd\nclichés\nclick\nclicked\nclicker\nclickers\nclicking\nclicks\nclient\nclientage\ncliental\nclientele\nclienteles\nclients\ncliff\ncliffhanger\ncliffhangers\ncliffhanging\nclifford\ncliffs\ncliffy\nclimacteric\nclimacterics\nclimactic\nclimactically\nclimate\nclimates\nclimatic\nclimatically\nclimatologic\nclimatological\nclimatologically\nclimatologist\nclimatologists\nclimatology\nclimax\nclimaxed\nclimaxes\nclimaxing\nclimb\nclimbable\nclimbed\nclimber\nclimbers\nclimbing\nclimbs\nclime\nclimes\nclinandria\nclinandrium\nclinch\nclinched\nclincher\nclinchers\nclinches\nclinching\ncline\nclines\ncling\nclinger\nclingers\nclingfish\nclingfishes\nclinging\nclings\nclingstone\nclingstones\nclingy\nclinic\nclinical\nclinically\nclinician\nclinicians\nclinics\nclink\nclinked\nclinker\nclinkered\nclinkering\nclinkers\nclinking\nclinks\nclinometer\nclinometers\nclinometric\nclinometrical\nclinometry\nclinquant\nclinquants\nclinton\nclintonia\nclintonias\nclio\ncliometric\ncliometrician\ncliometricians\ncliometrics\nclios\nclip\nclipboard\nclipboards\nclipped\nclipper\nclippers\nclipping\nclippings\nclips\nclipsheet\nclipsheets\nclique\ncliqued\ncliques\ncliquey\ncliquing\ncliquish\ncliquishly\ncliquishness\nclisthenes\nclitella\nclitellum\nclitoral\nclitoris\nclitorises\nclive\ncloaca\ncloacae\ncloacal\ncloak\ncloaked\ncloaking\ncloakroom\ncloakrooms\ncloaks\nclobber\nclobbered\nclobbering\nclobbers\nclochard\nclochards\ncloche\ncloches\nclock\nclocked\nclocker\nclockers\nclocking\nclockmaker\nclockmakers\nclocks\nclockwise\nclockwork\nclockworks\nclod\ncloddish\ncloddishly\ncloddishness\nclodhopper\nclodhoppers\nclodhopping\nclods\nclofibrate\nclofibrates\nclog\nclogged\nclogging\nclogs\ncloisonné\ncloister\ncloistered\ncloistering\ncloisters\ncloistral\nclomiphene\nclomiphenes\nclomp\nclomped\nclomping\nclomps\nclonal\nclonally\nclone\ncloned\ncloner\ncloners\nclones\nclonic\nclonicity\nclonidine\nclonidines\ncloning\nclonism\nclonus\nclonuses\nclop\nclopped\nclopping\nclops\ncloque\ncloques\nclose\nclosed\nclosedown\nclosedowns\nclosefisted\nclosely\nclosemouthed\ncloseness\ncloseout\ncloseouts\ncloser\nclosers\ncloses\nclosest\ncloset\ncloseted\nclosetful\ncloseting\nclosets\nclosing\nclosings\nclostridia\nclostridial\nclostridium\nclosure\nclosured\nclosures\nclosuring\nclot\ncloth\nclothbound\nclothe\nclothed\nclothes\nclothesbasket\nclothesbaskets\nclotheshorse\nclotheshorses\nclothesline\nclotheslined\nclotheslines\nclotheslining\nclothespin\nclothespins\nclothespress\nclothespresses\nclothier\nclothiers\nclothing\nclotho\ncloths\nclots\nclotted\nclotting\ncloture\nclotured\nclotures\ncloturing\ncloud\ncloudberries\ncloudberry\ncloudburst\ncloudbursts\nclouded\ncloudier\ncloudiest\ncloudily\ncloudiness\nclouding\ncloudland\ncloudlands\ncloudless\ncloudlessness\ncloudlet\ncloudlets\nclouds\ncloudscape\ncloudscapes\ncloudy\nclout\nclouted\nclouting\nclouts\nclove\ncloven\nclover\ncloverleaf\ncloverleaves\nclovers\ncloves\nclovis\nclown\nclowned\nclowning\nclownish\nclownishly\nclownishness\nclowns\ncloxacillin\ncloxacillins\ncloy\ncloyed\ncloying\ncloyingly\ncloyingness\ncloys\ncloze\nclub\nclubbable\nclubbed\nclubber\nclubbers\nclubbier\nclubbiest\nclubbiness\nclubbing\nclubby\nclubface\nclubfaces\nclubfeet\nclubfoot\nclubfooted\nclubfoots\nclubhouse\nclubhouses\nclubman\nclubmate\nclubmates\nclubmen\nclubroom\nclubrooms\nclubs\nclubwoman\nclubwomen\ncluck\nclucked\nclucking\nclucks\nclue\nclued\nclueing\nclueless\nclues\nclump\nclumped\nclumping\nclumpings\nclumps\nclumpy\nclumsier\nclumsiest\nclumsily\nclumsiness\nclumsy\nclung\ncluniac\nclunk\nclunked\nclunker\nclunkers\nclunkier\nclunkiest\nclunking\nclunks\nclunky\ncluny\nclupeid\nclupeids\ncluster\nclustered\nclustering\nclusters\nclutch\nclutched\nclutches\nclutching\nclutter\ncluttered\ncluttering\nclutters\nclwyd\nclydesdale\nclydesdales\nclypeal\nclypeate\nclypeated\nclypei\nclypeus\nclyster\nclysters\nclytemnestra\ncnidoblast\ncnidoblasts\ncnut\ncoacervate\ncoacervated\ncoacervates\ncoacervating\ncoacervation\ncoach\ncoachable\ncoached\ncoacher\ncoachers\ncoaches\ncoaching\ncoachman\ncoachmen\ncoachwork\ncoact\ncoacted\ncoacting\ncoaction\ncoactions\ncoactive\ncoactively\ncoactor\ncoactors\ncoacts\ncoadaptation\ncoadapted\ncoadjutant\ncoadjutants\ncoadjutor\ncoadjutors\ncoadministration\ncoadunate\ncoadunation\ncoadunative\ncoagula\ncoagulability\ncoagulable\ncoagulant\ncoagulants\ncoagulase\ncoagulases\ncoagulate\ncoagulated\ncoagulates\ncoagulating\ncoagulation\ncoagulations\ncoagulative\ncoagulator\ncoagulators\ncoagulum\ncoal\ncoaled\ncoaler\ncoalers\ncoalesce\ncoalesced\ncoalescence\ncoalescent\ncoalesces\ncoalescing\ncoalfield\ncoalfields\ncoalfish\ncoalfishes\ncoalification\ncoalifications\ncoaling\ncoalition\ncoalitionist\ncoalitionists\ncoalitions\ncoals\ncoalsack\ncoalsacks\ncoaming\ncoamings\ncoanchor\ncoanchors\ncoarctate\ncoarctation\ncoarctations\ncoarse\ncoarsely\ncoarsen\ncoarsened\ncoarseness\ncoarsening\ncoarsens\ncoarser\ncoarsest\ncoassignee\ncoassignees\ncoast\ncoastal\ncoasted\ncoaster\ncoasters\ncoastguard\ncoastguards\ncoastguardsman\ncoastguardsmen\ncoasting\ncoastland\ncoastlands\ncoastline\ncoastlines\ncoasts\ncoastward\ncoastwards\ncoastwise\ncoat\ncoatdress\ncoatdresses\ncoated\ncoati\ncoatimundi\ncoating\ncoatings\ncoatis\ncoatroom\ncoatrooms\ncoats\ncoattail\ncoattails\ncoatzacoalcos\ncoauthor\ncoauthored\ncoauthoring\ncoauthors\ncoauthorship\ncoax\ncoaxed\ncoaxer\ncoaxers\ncoaxes\ncoaxial\ncoaxing\ncoaxingly\ncob\ncobalamin\ncobalamins\ncobalt\ncobaltic\ncobaltite\ncobaltites\ncobaltous\ncobber\ncobbers\ncobbett\ncobble\ncobbled\ncobbler\ncobblers\ncobbles\ncobblestone\ncobblestones\ncobbling\ncobden\ncobelligerent\ncobelligerents\ncobia\ncobias\ncoble\ncobles\ncobnut\ncobnuts\ncobourg\ncobra\ncobras\ncobs\ncoburg\ncobweb\ncobwebbed\ncobwebbing\ncobwebby\ncobwebs\ncoca\ncocaine\ncocainism\ncocainisms\ncocainization\ncocainize\ncocainized\ncocainizes\ncocainizing\ncocaptain\ncocaptains\ncocarcinogen\ncocarcinogenic\ncocarcinogens\ncocas\ncocatalyst\ncocatalysts\ncocci\ncoccid\ncoccidia\ncoccidioidomycosis\ncoccidiosis\ncoccidium\ncoccids\ncoccobacilli\ncoccobacillus\ncoccoid\ncoccoids\ncoccolith\ncoccoliths\ncoccus\ncoccygeal\ncoccyges\ncoccyx\ncochair\ncochairman\ncochairmen\ncochairperson\ncochairpersons\ncochairs\ncochairwoman\ncochairwomen\ncochampion\ncochampions\ncochere\ncochineal\ncochlea\ncochleae\ncochlear\ncochleate\ncock\ncockade\ncockaded\ncockades\ncockaigne\ncockalorum\ncockalorums\ncockamamie\ncockatiel\ncockatiels\ncockatoo\ncockatoos\ncockatrice\ncockatrices\ncockboat\ncockboats\ncockchafer\ncockchafers\ncockcrow\ncocked\ncocker\ncockered\ncockerel\ncockerels\ncockering\ncockers\ncockeye\ncockeyed\ncockeyes\ncockfight\ncockfighting\ncockfights\ncockhorse\ncockhorses\ncockier\ncockiest\ncockily\ncockiness\ncocking\ncockle\ncockleboat\ncockleboats\ncocklebur\ncockleburs\ncockled\ncockles\ncockleshell\ncockleshells\ncockling\ncockloft\ncocklofts\ncockney\ncockneys\ncockpit\ncockpits\ncockroach\ncockroaches\ncocks\ncockscomb\ncockscombs\ncocksfoot\ncocksfoots\ncockshies\ncockshy\ncocksucker\ncocksuckers\ncocksure\ncocksurely\ncocksureness\ncocktail\ncocktails\ncocky\ncoco\ncocoa\ncocoas\ncocobolo\ncocobolos\ncocomposer\ncocomposers\ncoconspirator\ncoconspirators\ncoconut\ncoconuts\ncocoon\ncocooned\ncocooning\ncocoonings\ncocoons\ncocos\ncocotte\ncocottes\ncocounsel\ncocoyam\ncocoyams\ncocreate\ncocreated\ncocreates\ncocreating\ncocreator\ncocreators\ncocteau\ncocultivate\ncocultivated\ncocultivates\ncocultivating\ncocultivation\ncoculture\ncocurator\ncocurators\ncocurricular\ncocytus\ncod\ncoda\ncodas\ncoddle\ncoddled\ncoddler\ncoddlers\ncoddles\ncoddling\ncode\ncodebook\ncodebooks\ncodebreaker\ncodebreakers\ncodeclination\ncodeclinations\ncoded\ncodefendant\ncodefendants\ncodeine\ncodeines\ncodemaker\ncodemakers\ncoder\ncoders\ncodes\ncodesign\ncodesigned\ncodesigning\ncodesigns\ncodetermination\ncodeterminations\ncodetermine\ncodetermined\ncodetermines\ncodetermining\ncodevelop\ncodeveloped\ncodeveloper\ncodevelopers\ncodeveloping\ncodevelops\ncodex\ncodfish\ncodfishes\ncodger\ncodgers\ncodices\ncodicil\ncodicillary\ncodicils\ncodification\ncodifications\ncodified\ncodifier\ncodifiers\ncodifies\ncodify\ncodifying\ncoding\ncodirect\ncodirected\ncodirecting\ncodirection\ncodirector\ncodirectors\ncodirects\ncodiscover\ncodiscovered\ncodiscoverer\ncodiscoverers\ncodiscovering\ncodiscovers\ncodling\ncodlings\ncodominance\ncodominances\ncodominant\ncodominants\ncodon\ncodons\ncodpiece\ncodpieces\ncodrive\ncodriven\ncodriver\ncodrivers\ncodrives\ncodriving\ncodrove\ncods\ncodswallop\ncodswallops\ncoed\ncoedit\ncoedited\ncoediting\ncoeditor\ncoeditors\ncoedits\ncoeds\ncoeducation\ncoeducational\ncoeducationally\ncoefficient\ncoefficients\ncoelacanth\ncoelacanthine\ncoelacanthous\ncoelacanths\ncoelentera\ncoelenterate\ncoelenterates\ncoelenteric\ncoelenteron\ncoelom\ncoelomate\ncoelomic\ncoeloms\ncoenocyte\ncoenocytes\ncoenocytic\ncoenuri\ncoenurus\ncoenzymatic\ncoenzymatically\ncoenzyme\ncoenzymes\ncoequal\ncoequality\ncoequally\ncoequals\ncoerce\ncoerced\ncoercer\ncoercers\ncoerces\ncoercible\ncoercing\ncoercion\ncoercionary\ncoercive\ncoercively\ncoerciveness\ncoessential\ncoessentiality\ncoessentially\ncoessentialness\ncoetaneous\ncoetaneously\ncoetaneousness\ncoeternal\ncoeternally\ncoeternity\ncoeur\ncoeval\ncoevally\ncoevals\ncoevolution\ncoevolutionary\ncoevolve\ncoevolved\ncoevolves\ncoevolving\ncoexecutor\ncoexecutors\ncoexist\ncoexisted\ncoexistence\ncoexistent\ncoexisting\ncoexists\ncoextend\ncoextended\ncoextending\ncoextends\ncoextension\ncoextensive\ncoextensively\ncofactor\ncofactors\ncofavorite\ncofavorites\ncofeature\ncofeatures\ncoffee\ncoffeecake\ncoffeecakes\ncoffeehouse\ncoffeehouses\ncoffeemaker\ncoffeemakers\ncoffeepot\ncoffeepots\ncoffees\ncoffer\ncofferdam\ncofferdams\ncoffered\ncoffering\ncoffers\ncoffin\ncoffined\ncoffining\ncoffins\ncoffle\ncoffled\ncoffles\ncoffling\ncofinance\ncofound\ncofounded\ncofounder\ncofounders\ncofounding\ncofounds\ncofunction\ncofunctions\ncog\ncogency\ncogeneration\ncogent\ncogently\ncogged\ncogging\ncogitable\ncogitate\ncogitated\ncogitates\ncogitating\ncogitation\ncogitations\ncogitative\ncogitatively\ncogitativeness\ncogitator\ncogitators\ncognac\ncognacs\ncognate\ncognates\ncognation\ncognition\ncognitional\ncognitive\ncognitively\ncognizable\ncognizably\ncognizance\ncognizant\ncognize\ncognized\ncognizes\ncognizing\ncognomen\ncognomens\ncognomina\ncognominal\ncognoscente\ncognoscenti\ncogon\ncogons\ncogs\ncogwheel\ncogwheels\ncohabit\ncohabitant\ncohabitants\ncohabitate\ncohabitation\ncohabitational\ncohabited\ncohabiter\ncohabiters\ncohabiting\ncohabits\ncohead\ncoheads\ncoheir\ncoheiress\ncoheiresses\ncoheirs\ncohere\ncohered\ncoherence\ncoherencies\ncoherency\ncoherent\ncoherently\ncoheres\ncohering\ncohesion\ncohesionless\ncohesive\ncohesively\ncohesiveness\ncoho\ncoholder\ncoholders\ncohort\ncohorts\ncohos\ncohosh\ncohoshes\ncohost\ncohosted\ncohostess\ncohostesses\ncohosting\ncohosts\ncohune\ncohunes\ncoif\ncoifed\ncoiffeur\ncoiffeurs\ncoiffeuse\ncoiffeuses\ncoiffure\ncoiffured\ncoiffures\ncoiffuring\ncoifing\ncoifs\ncoign\ncoigns\ncoil\ncoiled\ncoiler\ncoilers\ncoiling\ncoils\ncoin\ncoinable\ncoinage\ncoinages\ncoincide\ncoincided\ncoincidence\ncoincidences\ncoincident\ncoincidental\ncoincidentally\ncoincides\ncoinciding\ncoined\ncoiner\ncoiners\ncoining\ncoins\ncoinsurance\ncoinsurances\ncoinsure\ncoinsured\ncoinsures\ncoinsuring\ncoinvent\ncoinvented\ncoinventing\ncoinventor\ncoinventors\ncoinvents\ncoinvestigator\ncoinvestigators\ncoinvestor\ncoinvestors\ncoir\ncoirs\ncoital\ncoitally\ncoition\ncoitus\ncojoin\ncojoined\ncojoining\ncojoins\ncoke\ncoked\ncokehead\ncokeheads\ncokes\ncoking\ncol\ncola\ncolada\ncolander\ncolanders\ncolas\ncolcannon\ncolcannons\ncolchicine\ncolchicines\ncolchicum\ncolcothar\ncolcothars\ncold\ncoldcock\ncoldcocked\ncoldcocking\ncoldcocks\ncolder\ncoldest\ncoldhearted\ncoldheartedly\ncoldheartedness\ncoldly\ncoldness\ncolds\ncoldshoulder\ncoldshouldered\ncoldshouldering\ncoldshoulders\ncole\ncolead\ncoleader\ncoleaders\ncoleading\ncoleads\ncolectomies\ncolectomy\ncoled\ncolemanite\ncolemanites\ncoleopteran\ncoleopterous\ncoleoptile\ncoleoptiles\ncoleorhiza\ncoleorhizae\ncoleridge\ncoles\ncoleslaw\ncoleus\ncoleuses\ncolewort\ncoleworts\ncoli\ncolic\ncolicin\ncolicins\ncolicky\ncolicroot\ncolicroots\ncoliform\ncolinear\ncolinearity\ncoliseum\ncoliseums\ncolistin\ncolistins\ncolitis\ncollaborate\ncollaborated\ncollaborates\ncollaborating\ncollaboration\ncollaborationism\ncollaborationist\ncollaborationists\ncollaborations\ncollaborative\ncollaboratively\ncollaborator\ncollaborators\ncollage\ncollaged\ncollagen\ncollagenase\ncollagenases\ncollagenic\ncollagenous\ncollages\ncollaging\ncollagist\ncollagists\ncollapse\ncollapsed\ncollapses\ncollapsibility\ncollapsible\ncollapsing\ncollar\ncollarbone\ncollarbones\ncollard\ncollards\ncollared\ncollaring\ncollars\ncollate\ncollated\ncollateral\ncollateralize\ncollateralized\ncollateralizes\ncollateralizing\ncollaterally\ncollates\ncollating\ncollation\ncollations\ncollator\ncollators\ncolleague\ncolleagues\ncolleagueship\ncollect\ncollectable\ncollectables\ncollectanea\ncollected\ncollectedly\ncollectedness\ncollectible\ncollectibles\ncollecting\ncollection\ncollections\ncollective\ncollectively\ncollectiveness\ncollectives\ncollectivism\ncollectivist\ncollectivistic\ncollectivistically\ncollectivists\ncollectivities\ncollectivity\ncollectivization\ncollectivize\ncollectivized\ncollectivizes\ncollectivizing\ncollector\ncollectors\ncollectorship\ncollects\ncolleen\ncolleens\ncollege\ncolleges\ncollegia\ncollegial\ncollegiality\ncollegially\ncollegian\ncollegians\ncollegiate\ncollegium\ncollegiums\ncollembolan\ncollembolans\ncollenchyma\ncollenchymas\ncollenchymatous\ncollenchyme\ncollenchymes\ncollet\ncollets\ncollide\ncollided\ncollider\ncolliders\ncollides\ncolliding\ncollie\ncollier\ncollieries\ncolliers\ncolliery\ncollies\ncolligate\ncolligated\ncolligates\ncolligating\ncolligation\ncolligative\ncollimate\ncollimated\ncollimates\ncollimating\ncollimation\ncollimator\ncollimators\ncollinear\ncollinearity\ncollingwood\ncollins\ncollinsia\ncollision\ncollisional\ncollisions\ncollocate\ncollocated\ncollocates\ncollocating\ncollocation\ncollocational\ncollocations\ncollodion\ncollogue\ncollogued\ncollogues\ncolloguing\ncolloid\ncolloidal\ncolloidally\ncolloids\ncollop\ncollops\ncolloquia\ncolloquial\ncolloquialism\ncolloquialisms\ncolloquially\ncolloquialness\ncolloquies\ncolloquium\ncolloquiums\ncolloquy\ncollotype\ncollotypes\ncollude\ncolluded\ncolluder\ncolluders\ncolludes\ncolluding\ncollusion\ncollusive\ncollusively\ncollusiveness\ncolluvia\ncolluvial\ncolluvium\ncolluviums\ncollyria\ncollyrium\ncollyriums\ncollywobbles\ncoloboma\ncolobomata\ncolobomatous\ncolocynth\ncolocynths\ncologne\ncolognes\ncolombia\ncolombian\ncolombians\ncolombo\ncolon\ncolonel\ncolonelcy\ncolonels\ncolonelship\ncolonial\ncolonialism\ncolonialist\ncolonialists\ncolonially\ncolonials\ncolonic\ncolonies\ncolonist\ncolonists\ncolonitis\ncolonization\ncolonizations\ncolonize\ncolonized\ncolonizer\ncolonizers\ncolonizes\ncolonizing\ncolonnade\ncolonnaded\ncolonnades\ncolonoscope\ncolonoscopes\ncolonoscopies\ncolonoscopy\ncolons\ncolony\ncolophon\ncolophons\ncolor\ncolorability\ncolorable\ncolorableness\ncolorably\ncolorado\ncolorant\ncolorants\ncoloration\ncoloratura\ncoloraturas\ncolorblind\ncolorblindness\ncolorbred\ncolorbreed\ncolorbreeding\ncolorbreeds\ncolorcast\ncolorcasted\ncolorcasting\ncolorcasts\ncolorectal\ncolored\ncoloreds\ncolorer\ncolorers\ncolorfast\ncolorfastness\ncolorful\ncolorfully\ncolorfulness\ncolorific\ncolorimeter\ncolorimeters\ncolorimetric\ncolorimetrically\ncolorimetry\ncoloring\ncolorings\ncolorist\ncoloristic\ncolorists\ncolorization\ncolorizations\ncolorize\ncolorized\ncolorizer\ncolorizers\ncolorizes\ncolorizing\ncolorless\ncolorlessly\ncolorlessness\ncolors\ncoloscope\ncoloscopes\ncoloscopies\ncoloscopy\ncolossal\ncolossally\ncolosseum\ncolossi\ncolossians\ncolossus\ncolossuses\ncolostomies\ncolostomy\ncolostral\ncolostrum\ncolpitis\ncolportage\ncolportages\ncolporteur\ncolporteurs\ncolposcope\ncolposcopes\ncolposcopic\ncolposcopies\ncolposcopy\ncols\ncolt\ncoltish\ncoltishly\ncoltishness\ncolts\ncoltsfoot\ncoltsfoots\ncolubrid\ncolubrids\ncolubrine\ncolugo\ncolugos\ncolumba\ncolumbaria\ncolumbarium\ncolumbia\ncolumbian\ncolumbine\ncolumbines\ncolumbite\ncolumbites\ncolumbium\ncolumbus\ncolumella\ncolumellae\ncolumellar\ncolumellate\ncolumn\ncolumnar\ncolumnea\ncolumned\ncolumniation\ncolumniations\ncolumnist\ncolumnists\ncolumns\ncolza\ncolzas\ncoma\ncomae\ncomal\ncomanage\ncomanaged\ncomanagement\ncomanager\ncomanagers\ncomanages\ncomanaging\ncomanche\ncomanches\ncomas\ncomate\ncomates\ncomatose\ncomatosely\ncomatulid\ncomatulids\ncomb\ncombat\ncombatant\ncombatants\ncombated\ncombating\ncombative\ncombatively\ncombativeness\ncombats\ncombed\ncomber\ncombers\ncombinable\ncombination\ncombinational\ncombinations\ncombinative\ncombinatorial\ncombinatorics\ncombinatory\ncombine\ncombined\ncombiner\ncombiners\ncombines\ncombing\ncombings\ncombining\ncombinings\ncombo\ncombos\ncombs\ncombust\ncombusted\ncombustibility\ncombustible\ncombustibles\ncombustibly\ncombusting\ncombustion\ncombustive\ncombustor\ncombustors\ncombusts\ncome\ncomeback\ncomebacks\ncomecon\ncomedian\ncomedians\ncomedic\ncomedically\ncomedienne\ncomediennes\ncomedies\ncomedo\ncomedogenic\ncomedones\ncomedos\ncomedown\ncomedowns\ncomedy\ncomelier\ncomeliest\ncomeliness\ncomely\ncomember\ncomembers\ncomer\ncomers\ncomes\ncomestible\ncomestibles\ncomet\ncometary\ncometic\ncomets\ncomeuppance\ncomfier\ncomfiest\ncomfit\ncomfits\ncomfort\ncomfortable\ncomfortableness\ncomfortably\ncomforted\ncomforter\ncomforters\ncomforting\ncomfortingly\ncomfortless\ncomfortlessly\ncomforts\ncomfrey\ncomfreys\ncomfy\ncomic\ncomical\ncomicality\ncomically\ncomicalness\ncomice\ncomices\ncomics\ncoming\ncomings\ncomintern\ncomique\ncomitia\ncomitial\ncomities\ncomity\ncomix\ncomma\ncommand\ncommandant\ncommandants\ncommanded\ncommandeer\ncommandeered\ncommandeering\ncommandeers\ncommander\ncommanders\ncommanding\ncommandingly\ncommandingness\ncommandment\ncommandments\ncommando\ncommandos\ncommands\ncommas\ncomme\ncommedia\ncommemorate\ncommemorated\ncommemorates\ncommemorating\ncommemoration\ncommemorations\ncommemorative\ncommemoratives\ncommemorator\ncommemorators\ncommemoratory\ncommence\ncommenced\ncommencement\ncommencements\ncommencer\ncommencers\ncommences\ncommencing\ncommend\ncommendable\ncommendableness\ncommendably\ncommendation\ncommendations\ncommendatory\ncommended\ncommending\ncommends\ncommensal\ncommensalism\ncommensally\ncommensals\ncommensurability\ncommensurable\ncommensurably\ncommensurate\ncommensurately\ncommensuration\ncomment\ncommentarial\ncommentaries\ncommentary\ncommentate\ncommentated\ncommentates\ncommentating\ncommentator\ncommentators\ncommented\ncommenting\ncomments\ncommerce\ncommercial\ncommercialism\ncommercialist\ncommercialistic\ncommercialists\ncommercialization\ncommercialize\ncommercialized\ncommercializes\ncommercializing\ncommercially\ncommercials\ncommie\ncommies\ncommination\ncomminations\ncomminatory\ncommingle\ncommingled\ncommingles\ncommingling\ncomminute\ncomminuted\ncomminutes\ncomminuting\ncomminution\ncomminutions\ncommiserate\ncommiserated\ncommiserates\ncommiserating\ncommiseration\ncommiserations\ncommiserative\ncommiseratively\ncommiserator\ncommiserators\ncommissar\ncommissariat\ncommissariats\ncommissaries\ncommissars\ncommissary\ncommission\ncommissionaire\ncommissionaires\ncommissional\ncommissioned\ncommissioner\ncommissioners\ncommissionership\ncommissioning\ncommissions\ncommissural\ncommissure\ncommissures\ncommissurotomies\ncommissurotomy\ncommit\ncommitment\ncommitments\ncommits\ncommittable\ncommittal\ncommittals\ncommitted\ncommittee\ncommitteeman\ncommitteemen\ncommittees\ncommitteewoman\ncommitteewomen\ncommitting\ncommix\ncommixed\ncommixes\ncommixing\ncommixture\ncommixtures\ncommode\ncommodes\ncommodious\ncommodiously\ncommodiousness\ncommodities\ncommodity\ncommodore\ncommodores\ncommon\ncommonage\ncommonages\ncommonalities\ncommonality\ncommonalties\ncommonalty\ncommoner\ncommoners\ncommonest\ncommonly\ncommonness\ncommonplace\ncommonplaceness\ncommonplaces\ncommons\ncommonsense\ncommonsensible\ncommonsensibly\ncommonsensical\ncommonweal\ncommonwealth\ncommonwealths\ncommotion\ncommove\ncommoved\ncommoves\ncommoving\ncommunal\ncommunalism\ncommunalist\ncommunalistic\ncommunalists\ncommunality\ncommunalize\ncommunalized\ncommunalizes\ncommunalizing\ncommunally\ncommunard\ncommunards\ncommune\ncommuned\ncommunes\ncommunicability\ncommunicable\ncommunicableness\ncommunicably\ncommunicant\ncommunicants\ncommunicate\ncommunicated\ncommunicates\ncommunicating\ncommunication\ncommunicational\ncommunications\ncommunicative\ncommunicatively\ncommunicativeness\ncommunicator\ncommunicators\ncommunicatory\ncommuning\ncommunion\ncommunions\ncommuniqué\ncommuniqués\ncommunism\ncommunist\ncommunistic\ncommunistically\ncommunists\ncommunitarian\ncommunitarians\ncommunities\ncommunity\ncommunization\ncommunize\ncommunized\ncommunizes\ncommunizing\ncommutability\ncommutable\ncommutate\ncommutated\ncommutates\ncommutating\ncommutation\ncommutations\ncommutative\ncommutativity\ncommutator\ncommutators\ncommute\ncommuted\ncommuter\ncommuters\ncommutes\ncommuting\ncomo\ncomonomer\ncomonomers\ncomoran\ncomorans\ncomoros\ncomose\ncomp\ncompact\ncompacted\ncompacting\ncompaction\ncompactions\ncompactly\ncompactness\ncompactor\ncompactors\ncompacts\ncompanied\ncompanies\ncompanion\ncompanionable\ncompanionableness\ncompanionably\ncompanionate\ncompanioned\ncompanioning\ncompanionless\ncompanions\ncompanionship\ncompanionships\ncompanionway\ncompanionways\ncompany\ncompanying\ncomparability\ncomparable\ncomparableness\ncomparably\ncomparatist\ncomparatists\ncomparative\ncomparatively\ncomparatives\ncomparator\ncomparators\ncompare\ncompared\ncomparer\ncomparers\ncompares\ncomparing\ncomparison\ncomparisons\ncomparitor\ncompart\ncomparted\ncomparting\ncompartment\ncompartmental\ncompartmentalization\ncompartmentalize\ncompartmentalized\ncompartmentalizes\ncompartmentalizing\ncompartmentation\ncompartmented\ncompartmenting\ncompartments\ncomparts\ncompass\ncompassable\ncompassed\ncompasses\ncompassing\ncompassion\ncompassionate\ncompassionated\ncompassionately\ncompassionateness\ncompassionates\ncompassionating\ncompassionless\ncompatibility\ncompatible\ncompatibleness\ncompatibles\ncompatibly\ncompatriot\ncompatriotic\ncompatriots\ncomped\ncompeer\ncompeers\ncompel\ncompellable\ncompellably\ncompellation\ncompellations\ncompelled\ncompeller\ncompellers\ncompelling\ncompellingly\ncompels\ncompend\ncompendia\ncompendious\ncompendiously\ncompendiousness\ncompendium\ncompendiums\ncompends\ncompensable\ncompensate\ncompensated\ncompensates\ncompensating\ncompensation\ncompensational\ncompensations\ncompensative\ncompensator\ncompensators\ncompensatory\ncompere\ncompered\ncomperes\ncompering\ncompete\ncompeted\ncompetence\ncompetencies\ncompetency\ncompetent\ncompetently\ncompetes\ncompeting\ncompetition\ncompetitions\ncompetitive\ncompetitively\ncompetitiveness\ncompetitor\ncompetitors\ncompilation\ncompilations\ncompile\ncompiled\ncompiler\ncompilers\ncompiles\ncompiling\ncomping\ncomplacence\ncomplacency\ncomplacent\ncomplacently\ncomplain\ncomplainant\ncomplainants\ncomplained\ncomplainer\ncomplainers\ncomplaining\ncomplains\ncomplaint\ncomplaints\ncomplaisance\ncomplaisant\ncomplaisantly\ncompleat\ncomplect\ncomplected\ncomplecting\ncomplects\ncomplement\ncomplemental\ncomplementally\ncomplementarily\ncomplementariness\ncomplementarity\ncomplementary\ncomplementation\ncomplementations\ncomplemented\ncomplementing\ncomplements\ncomplete\ncompleted\ncompletely\ncompleteness\ncompleter\ncompletes\ncompletest\ncompleting\ncompletion\ncompletions\ncompletive\ncomplex\ncomplexes\ncomplexion\ncomplexional\ncomplexioned\ncomplexions\ncomplexities\ncomplexity\ncomplexly\ncomplexness\ncompliance\ncompliancy\ncompliant\ncompliantly\ncomplicacies\ncomplicacy\ncomplicate\ncomplicated\ncomplicatedly\ncomplicatedness\ncomplicates\ncomplicating\ncomplication\ncomplications\ncomplicit\ncomplicities\ncomplicity\ncomplied\ncomplier\ncompliers\ncomplies\ncompliment\ncomplimentarily\ncomplimentary\ncomplimented\ncomplimenting\ncompliments\ncomplin\ncompline\ncomplins\ncomplot\ncomplots\ncomply\ncomplying\ncompo\ncomponent\ncomponential\ncomponents\ncomponentwise\ncomport\ncomported\ncomporting\ncomportment\ncomports\ncompos\ncompose\ncomposed\ncomposedly\ncomposedness\ncomposer\ncomposers\ncomposes\ncomposing\ncomposite\ncompositely\ncompositeness\ncomposites\ncomposition\ncompositional\ncompositionally\ncompositions\ncompositive\ncompositor\ncompositorial\ncompositors\ncompost\ncomposted\ncompostela\ncomposting\ncomposts\ncomposure\ncompote\ncompotes\ncompound\ncompoundable\ncompounded\ncompounder\ncompounding\ncompounds\ncomprador\ncompradors\ncomprehend\ncomprehended\ncomprehendible\ncomprehending\ncomprehendingly\ncomprehends\ncomprehensibility\ncomprehensible\ncomprehensibleness\ncomprehensibly\ncomprehension\ncomprehensions\ncomprehensive\ncomprehensively\ncomprehensiveness\ncomprehensives\ncompress\ncompressed\ncompresses\ncompressibility\ncompressible\ncompressibleness\ncompressing\ncompression\ncompressional\ncompressions\ncompressive\ncompressively\ncompressor\ncompressors\ncomprisable\ncomprise\ncomprised\ncomprises\ncomprising\ncompromise\ncompromised\ncompromiser\ncompromisers\ncompromises\ncompromising\ncomps\ncomptroller\ncomptrollers\ncompulsion\ncompulsions\ncompulsive\ncompulsively\ncompulsiveness\ncompulsives\ncompulsivity\ncompulsories\ncompulsorily\ncompulsoriness\ncompulsory\ncompunction\ncompunctions\ncompunctious\ncompunctiously\ncompurgation\ncompurgations\ncompurgator\ncompurgators\ncomputability\ncomputable\ncomputably\ncomputation\ncomputational\ncomputationally\ncomputations\ncompute\ncomputed\ncomputer\ncomputerate\ncomputerdom\ncomputerdoms\ncomputerese\ncomputerist\ncomputerists\ncomputerizable\ncomputerization\ncomputerize\ncomputerized\ncomputerizes\ncomputerizing\ncomputers\ncomputes\ncomputing\ncompôte\ncompôtes\ncomrade\ncomradely\ncomrades\ncomradeship\ncomsat\ncomsymp\ncomsymps\ncomus\ncomédie\ncon\nconakry\nconan\nconation\nconational\nconations\nconative\nconcatenate\nconcatenated\nconcatenates\nconcatenating\nconcatenation\nconcatenations\nconcave\nconcaved\nconcavely\nconcaveness\nconcaves\nconcaving\nconcavities\nconcavity\nconceal\nconcealable\nconcealed\nconcealer\nconcealers\nconcealing\nconcealment\nconceals\nconcede\nconceded\nconcededly\nconceder\nconceders\nconcedes\nconceding\nconceit\nconceited\nconceitedly\nconceitedness\nconceiting\nconceits\nconceivability\nconceivable\nconceivableness\nconceivably\nconceive\nconceived\nconceiver\nconceivers\nconceives\nconceiving\nconcelebrant\nconcelebrants\nconcelebrate\nconcelebrated\nconcelebrates\nconcelebrating\nconcelebration\nconcelebrations\nconcenter\nconcentered\nconcentering\nconcenters\nconcentrate\nconcentrated\nconcentrates\nconcentrating\nconcentration\nconcentrations\nconcentrative\nconcentratively\nconcentrator\nconcentrators\nconcentric\nconcentrically\nconcentricity\nconcept\nconceptacle\nconceptacles\nconception\nconceptional\nconceptions\nconceptive\nconceptively\nconcepts\nconceptual\nconceptualism\nconceptualist\nconceptualistic\nconceptualistically\nconceptualists\nconceptuality\nconceptualization\nconceptualizations\nconceptualize\nconceptualized\nconceptualizer\nconceptualizers\nconceptualizes\nconceptualizing\nconceptually\nconceptus\nconcern\nconcerned\nconcernedly\nconcerning\nconcernment\nconcernments\nconcerns\nconcert\nconcerted\nconcertedly\nconcertgoer\nconcertgoers\nconcertgoing\nconcerti\nconcertina\nconcertinas\nconcerting\nconcertino\nconcertinos\nconcertize\nconcertized\nconcertizes\nconcertizing\nconcertmaster\nconcertmasters\nconcertmistress\nconcertmistresses\nconcerto\nconcertos\nconcerts\nconcession\nconcessionaire\nconcessionaires\nconcessional\nconcessionary\nconcessioner\nconcessioners\nconcessions\nconcessive\nconcessively\nconch\nconcha\nconchae\nconchal\nconches\nconchiferous\nconchiolin\nconchiolins\nconchoidal\nconchoidally\nconchological\nconchologist\nconchologists\nconchology\nconchs\nconcierge\nconcierges\nconciliable\nconciliar\nconciliate\nconciliated\nconciliates\nconciliating\nconciliation\nconciliations\nconciliator\nconciliators\nconciliatory\nconcinnities\nconcinnity\nconcise\nconcisely\nconciseness\nconcision\nconcisions\nconclave\nconclaves\nconclude\nconcluded\nconcluder\nconcluders\nconcludes\nconcluding\nconclusion\nconclusions\nconclusive\nconclusively\nconclusiveness\nconclusory\nconcoct\nconcocted\nconcocter\nconcocters\nconcocting\nconcoction\nconcoctions\nconcocts\nconcomitance\nconcomitant\nconcomitantly\nconcomitants\nconcord\nconcordance\nconcordances\nconcordant\nconcordantly\nconcordat\nconcordats\nconcords\nconcours\nconcourse\nconcourses\nconcrescence\nconcrescent\nconcrete\nconcreted\nconcretely\nconcreteness\nconcretes\nconcreting\nconcretion\nconcretionary\nconcretions\nconcretism\nconcretisms\nconcretist\nconcretists\nconcretization\nconcretize\nconcretized\nconcretizes\nconcretizing\nconcrète\nconcubinage\nconcubinages\nconcubine\nconcubines\nconcupiscence\nconcupiscent\nconcur\nconcurred\nconcurrence\nconcurrencies\nconcurrency\nconcurrent\nconcurrently\nconcurring\nconcurs\nconcuss\nconcussed\nconcusses\nconcussing\nconcussion\nconcussions\nconcussive\nconcussively\ncondemn\ncondemnable\ncondemnation\ncondemnations\ncondemnatory\ncondemned\ncondemner\ncondemners\ncondemning\ncondemns\ncondensability\ncondensable\ncondensate\ncondensates\ncondensation\ncondensational\ncondensations\ncondense\ncondensed\ncondenser\ncondensers\ncondenses\ncondensing\ncondescend\ncondescended\ncondescendence\ncondescendences\ncondescender\ncondescenders\ncondescending\ncondescendingly\ncondescends\ncondescension\ncondign\ncondignly\ncondiment\ncondimental\ncondiments\ncondition\nconditional\nconditionally\nconditionals\nconditioned\nconditioner\nconditioners\nconditioning\nconditionings\nconditions\ncondo\ncondolatory\ncondole\ncondoled\ncondolence\ncondolences\ncondolent\ncondoler\ncondolers\ncondoles\ncondoling\ncondom\ncondominial\ncondominium\ncondominiums\ncondoms\ncondonable\ncondonation\ncondonations\ncondone\ncondoned\ncondoner\ncondoners\ncondones\ncondoning\ncondor\ncondors\ncondos\ncondottiere\ncondottieri\nconduce\nconduced\nconducer\nconducers\nconduces\nconducing\nconducingly\nconducive\nconduciveness\nconduct\nconductance\nconducted\nconductibility\nconductible\nconductimetry\nconducting\nconduction\nconductive\nconductivities\nconductivity\nconductor\nconductorial\nconductors\nconductorship\nconductress\nconductresses\nconducts\nconduit\nconduits\nconduplicate\nconduplication\ncondylar\ncondyle\ncondyles\ncondyloid\ncondyloma\ncondylomas\ncondylomata\ncondylomatous\ncone\nconed\nconeflower\nconeflowers\nconenose\ncones\nconestoga\nconestogas\nconey\nconeys\nconfab\nconfabbed\nconfabbing\nconfabs\nconfabulate\nconfabulated\nconfabulates\nconfabulating\nconfabulation\nconfabulations\nconfabulator\nconfabulators\nconfabulatory\nconfect\nconfected\nconfecting\nconfection\nconfectionaries\nconfectionary\nconfectioned\nconfectioner\nconfectioneries\nconfectioners\nconfectionery\nconfectioning\nconfections\nconfects\nconfederacies\nconfederacy\nconfederal\nconfederalist\nconfederalists\nconfederate\nconfederated\nconfederates\nconfederating\nconfederation\nconfederationism\nconfederationist\nconfederationists\nconfederations\nconfederative\nconfer\nconferee\nconferees\nconference\nconferences\nconferencing\nconferential\nconferment\nconferrable\nconferral\nconferrals\nconferred\nconferrer\nconferrers\nconferring\nconfers\nconfess\nconfessable\nconfessed\nconfessedly\nconfesses\nconfessing\nconfession\nconfessional\nconfessionals\nconfessions\nconfessor\nconfessors\nconfetti\nconfidant\nconfidante\nconfidantes\nconfidants\nconfide\nconfided\nconfidence\nconfidences\nconfident\nconfidential\nconfidentiality\nconfidentially\nconfidentialness\nconfidently\nconfider\nconfiders\nconfides\nconfiding\nconfidingly\nconfidingness\nconfigurable\nconfiguration\nconfigurational\nconfigurationally\nconfigurationism\nconfigurations\nconfigurative\nconfigure\nconfigured\nconfigures\nconfiguring\nconfinable\nconfine\nconfined\nconfinement\nconfinements\nconfiner\nconfiners\nconfines\nconfining\nconfirm\nconfirmability\nconfirmable\nconfirmand\nconfirmands\nconfirmation\nconfirmations\nconfirmatory\nconfirmed\nconfirmedly\nconfirmer\nconfirmers\nconfirming\nconfirms\nconfiscable\nconfiscate\nconfiscated\nconfiscates\nconfiscating\nconfiscation\nconfiscations\nconfiscator\nconfiscators\nconfiscatory\nconfiteor\nconfiteors\nconfiture\nconfitures\nconflagrant\nconflagration\nconflagrations\nconflate\nconflated\nconflates\nconflating\nconflation\nconflations\nconflict\nconflicted\nconflicting\nconfliction\nconflictive\nconflicts\nconflictual\nconfluence\nconfluences\nconfluent\nconfluents\nconflux\nconfluxes\nconfocal\nconfocally\nconform\nconformability\nconformable\nconformableness\nconformably\nconformal\nconformance\nconformant\nconformation\nconformational\nconformationally\nconformations\nconformed\nconformer\nconformers\nconforming\nconformist\nconformists\nconformities\nconformity\nconforms\nconfound\nconfounded\nconfoundedly\nconfoundedness\nconfounder\nconfounders\nconfounding\nconfounds\nconfraternities\nconfraternity\nconfrere\nconfreres\nconfront\nconfrontation\nconfrontational\nconfrontationist\nconfrontationists\nconfrontations\nconfrontative\nconfronted\nconfronter\nconfronters\nconfronting\nconfrontment\nconfronts\nconfucian\nconfucianism\nconfucianist\nconfucianists\nconfucians\nconfucius\nconfusable\nconfuse\nconfused\nconfusedly\nconfusedness\nconfuser\nconfusers\nconfuses\nconfusing\nconfusingly\nconfusion\nconfusional\nconfusions\nconfutable\nconfutation\nconfutative\nconfute\nconfuted\nconfuter\nconfuters\nconfutes\nconfuting\nconga\ncongaed\ncongaing\ncongas\ncongeal\ncongealable\ncongealed\ncongealer\ncongealers\ncongealing\ncongealment\ncongeals\ncongelation\ncongelations\ncongener\ncongeneric\ncongenerous\ncongeners\ncongenial\ncongeniality\ncongenially\ncongenialness\ncongenital\ncongenitally\nconger\ncongeries\ncongers\ncongest\ncongested\ncongesting\ncongestion\ncongestive\ncongests\ncongii\ncongius\nconglobate\nconglobated\nconglobates\nconglobating\nconglobation\nconglobe\nconglobed\nconglobes\nconglobing\nconglomerate\nconglomerated\nconglomerates\nconglomeratic\nconglomerating\nconglomeration\nconglomerations\nconglomerator\nconglomerators\nconglutinate\nconglutinated\nconglutinates\nconglutinating\nconglutination\ncongo\ncongolese\ncongou\ncongous\ncongratulate\ncongratulated\ncongratulates\ncongratulating\ncongratulation\ncongratulations\ncongratulator\ncongratulators\ncongratulatory\ncongregant\ncongregants\ncongregate\ncongregated\ncongregates\ncongregating\ncongregation\ncongregational\ncongregationalism\ncongregationalist\ncongregationalists\ncongregations\ncongregative\ncongregativeness\ncongregator\ncongregators\ncongress\ncongresses\ncongressional\ncongressionally\ncongressman\ncongressmen\ncongresspeople\ncongressperson\ncongresspersons\ncongresswoman\ncongresswomen\ncongreve\ncongruence\ncongruences\ncongruencies\ncongruency\ncongruent\ncongruently\ncongruities\ncongruity\ncongruous\ncongruously\ncongruousness\ncongé\nconic\nconical\nconics\nconidia\nconidial\nconidiophore\nconidiophores\nconidiophorous\nconidium\nconies\nconifer\nconiferous\nconifers\nconiine\nconiines\nconing\nconium\nconiums\nconjecturable\nconjecturably\nconjectural\nconjecturally\nconjecture\nconjectured\nconjecturer\nconjecturers\nconjectures\nconjecturing\nconjoin\nconjoined\nconjoiner\nconjoiners\nconjoining\nconjoins\nconjoint\nconjointly\nconjugal\nconjugality\nconjugally\nconjugant\nconjugants\nconjugate\nconjugated\nconjugately\nconjugates\nconjugating\nconjugation\nconjugational\nconjugationally\nconjugations\nconjugative\nconjugator\nconjugators\nconjunct\nconjunction\nconjunctional\nconjunctionally\nconjunctions\nconjunctiva\nconjunctivae\nconjunctival\nconjunctivas\nconjunctive\nconjunctively\nconjunctives\nconjunctivitis\nconjunctly\nconjuncts\nconjuncture\nconjunctures\nconjunto\nconjuntos\nconjuration\nconjure\nconjured\nconjurer\nconjurers\nconjures\nconjuring\nconjuror\nconjurors\nconk\nconked\nconker\nconkers\nconking\nconks\nconky\nconnate\nconnately\nconnateness\nconnatural\nconnaturality\nconnaturally\nconnaturalness\nconnect\nconnectable\nconnected\nconnectedly\nconnectedness\nconnectible\nconnecticut\nconnecting\nconnection\nconnectional\nconnectionless\nconnections\nconnective\nconnectively\nconnectives\nconnectivity\nconnector\nconnectors\nconnects\nconned\nconner\nconners\nconning\nconniption\nconniptions\nconnivance\nconnive\nconnived\nconnivent\nconniver\nconnivers\nconnivery\nconnives\nconniving\nconnoisseur\nconnoisseurs\nconnoisseurship\nconnotation\nconnotations\nconnotative\nconnotatively\nconnote\nconnoted\nconnotes\nconnoting\nconnubial\nconnubialism\nconnubiality\nconnubially\nconodont\nconodonts\nconoid\nconoids\nconominee\nconominees\nconquer\nconquerable\nconquered\nconquering\nconqueror\nconquerors\nconquers\nconquest\nconquests\nconquian\nconquians\nconquistador\nconquistadors\nconrad\ncons\nconsanguine\nconsanguineous\nconsanguineously\nconsanguinities\nconsanguinity\nconscience\nconscienceless\nconsciences\nconscientious\nconscientiously\nconscientiousness\nconscionable\nconscious\nconsciously\nconsciousness\nconscript\nconscripted\nconscripting\nconscription\nconscripts\nconsecrate\nconsecrated\nconsecrates\nconsecrating\nconsecration\nconsecrations\nconsecrative\nconsecrator\nconsecrators\nconsecratory\nconsecution\nconsecutive\nconsecutively\nconsecutiveness\nconsensual\nconsensually\nconsensus\nconsensuses\nconsent\nconsentaneity\nconsentaneous\nconsentaneously\nconsentaneousness\nconsented\nconsenter\nconsenters\nconsenting\nconsents\nconsequence\nconsequences\nconsequent\nconsequential\nconsequentialities\nconsequentiality\nconsequentially\nconsequentialness\nconsequently\nconsequents\nconservable\nconservancies\nconservancy\nconservation\nconservational\nconservationist\nconservationists\nconservations\nconservatism\nconservative\nconservatively\nconservativeness\nconservatives\nconservatize\nconservatized\nconservatizes\nconservatizing\nconservatoire\nconservatoires\nconservator\nconservatorial\nconservatories\nconservators\nconservatorship\nconservatory\nconserve\nconserved\nconserver\nconservers\nconserves\nconserving\nconsider\nconsiderable\nconsiderably\nconsiderate\nconsiderately\nconsiderateness\nconsideration\nconsiderations\nconsidered\nconsiderer\nconsiderers\nconsidering\nconsiders\nconsigliere\nconsiglieri\nconsign\nconsignable\nconsignation\nconsigned\nconsignee\nconsignees\nconsigning\nconsignment\nconsignments\nconsignor\nconsignors\nconsigns\nconsist\nconsisted\nconsistence\nconsistencies\nconsistency\nconsistent\nconsistently\nconsisting\nconsistorial\nconsistories\nconsistory\nconsists\nconsociate\nconsociated\nconsociates\nconsociating\nconsociation\nconsociational\nconsociations\nconsolable\nconsolably\nconsolation\nconsolations\nconsolatory\nconsole\nconsoled\nconsoler\nconsolers\nconsoles\nconsolidate\nconsolidated\nconsolidates\nconsolidating\nconsolidation\nconsolidations\nconsolidator\nconsolidators\nconsoling\nconsolingly\nconsolute\nconsommé\nconsommés\nconsonance\nconsonant\nconsonantal\nconsonantally\nconsonantly\nconsonants\nconsort\nconsorted\nconsortia\nconsortial\nconsorting\nconsortium\nconsortiums\nconsorts\nconspecific\nconspecifics\nconspectus\nconspectuses\nconspicuity\nconspicuous\nconspicuously\nconspicuousness\nconspiracies\nconspiracist\nconspiracists\nconspiracy\nconspirator\nconspiratorial\nconspiratorialist\nconspiratorialists\nconspiratorially\nconspirators\nconspire\nconspired\nconspirer\nconspirers\nconspires\nconspiring\nconspiringly\nconstable\nconstables\nconstableship\nconstabular\nconstabularies\nconstabulary\nconstance\nconstancy\nconstant\nconstantan\nconstantans\nconstantine\nconstantinople\nconstantly\nconstants\nconstellate\nconstellated\nconstellates\nconstellating\nconstellation\nconstellational\nconstellations\nconstellatory\nconsternate\nconsternated\nconsternates\nconsternating\nconsternation\nconstipate\nconstipated\nconstipates\nconstipating\nconstipation\nconstituencies\nconstituency\nconstituent\nconstituently\nconstituents\nconstitute\nconstituted\nconstituter\nconstituters\nconstitutes\nconstituting\nconstitution\nconstitutional\nconstitutionalism\nconstitutionalist\nconstitutionalists\nconstitutionality\nconstitutionalization\nconstitutionalize\nconstitutionalized\nconstitutionalizes\nconstitutionalizing\nconstitutionally\nconstitutionals\nconstitutions\nconstitutive\nconstitutively\nconstrain\nconstrainable\nconstrained\nconstrainedly\nconstrainer\nconstrainers\nconstraining\nconstrains\nconstraint\nconstraints\nconstrict\nconstricted\nconstricting\nconstriction\nconstrictions\nconstrictive\nconstrictively\nconstrictor\nconstrictors\nconstricts\nconstringe\nconstringed\nconstringency\nconstringent\nconstringes\nconstringing\nconstrual\nconstruct\nconstructed\nconstructible\nconstructing\nconstruction\nconstructional\nconstructionally\nconstructionist\nconstructionists\nconstructions\nconstructive\nconstructively\nconstructiveness\nconstructivism\nconstructivisms\nconstructivist\nconstructivists\nconstructor\nconstructors\nconstructs\nconstrue\nconstrued\nconstrues\nconstruing\nconsubstantial\nconsubstantiate\nconsubstantiated\nconsubstantiates\nconsubstantiating\nconsubstantiation\nconsubstantiations\nconsuetude\nconsuetudinary\nconsul\nconsular\nconsulate\nconsulates\nconsuls\nconsulship\nconsult\nconsultancies\nconsultancy\nconsultant\nconsultants\nconsultantship\nconsultation\nconsultations\nconsultative\nconsulted\nconsulter\nconsulters\nconsulting\nconsultor\nconsultors\nconsults\nconsumable\nconsumables\nconsume\nconsumed\nconsumedly\nconsumer\nconsumerism\nconsumerist\nconsumeristic\nconsumerists\nconsumers\nconsumership\nconsumes\nconsuming\nconsummate\nconsummated\nconsummately\nconsummates\nconsummating\nconsummation\nconsummations\nconsummative\nconsummator\nconsummators\nconsummatory\nconsumption\nconsumptive\nconsumptively\nconsumptives\ncontact\ncontacted\ncontacting\ncontacts\ncontactual\ncontactually\ncontagia\ncontagion\ncontagious\ncontagiously\ncontagiousness\ncontagium\ncontain\ncontainable\ncontained\ncontainer\ncontainerboard\ncontainerboards\ncontainerization\ncontainerize\ncontainerized\ncontainerizes\ncontainerizing\ncontainerport\ncontainerports\ncontainers\ncontainership\ncontaining\ncontainment\ncontainments\ncontains\ncontaminant\ncontaminants\ncontaminate\ncontaminated\ncontaminates\ncontaminating\ncontamination\ncontaminations\ncontaminative\ncontaminator\ncontaminators\nconte\ncontemn\ncontemned\ncontemner\ncontemners\ncontemning\ncontemns\ncontemplate\ncontemplated\ncontemplates\ncontemplating\ncontemplation\ncontemplations\ncontemplative\ncontemplatively\ncontemplativeness\ncontemplatives\ncontemplator\ncontemplators\ncontemporaneity\ncontemporaneous\ncontemporaneously\ncontemporaneousness\ncontemporaries\ncontemporarily\ncontemporary\ncontemporization\ncontemporize\ncontemporized\ncontemporizes\ncontemporizing\ncontempt\ncontemptibility\ncontemptible\ncontemptibleness\ncontemptibly\ncontempts\ncontemptuous\ncontemptuously\ncontemptuousness\ncontend\ncontended\ncontender\ncontenders\ncontending\ncontends\ncontent\ncontented\ncontentedly\ncontentedness\ncontenting\ncontention\ncontentions\ncontentious\ncontentiously\ncontentiousness\ncontentment\ncontents\nconterminous\nconterminously\nconterminousness\ncontes\ncontessa\ncontessas\ncontest\ncontestable\ncontestant\ncontestants\ncontestation\ncontested\ncontester\ncontesters\ncontesting\ncontests\ncontext\ncontexts\ncontextual\ncontextualization\ncontextualize\ncontextualized\ncontextualizes\ncontextualizing\ncontextually\ncontextural\ncontexture\ncontextures\ncontiguities\ncontiguity\ncontiguous\ncontiguously\ncontiguousness\ncontinence\ncontinent\ncontinental\ncontinentalism\ncontinentalist\ncontinentalists\ncontinentality\ncontinentally\ncontinentals\ncontinently\ncontinents\ncontingence\ncontingencies\ncontingency\ncontingent\ncontingently\ncontingents\ncontinua\ncontinuable\ncontinual\ncontinually\ncontinuance\ncontinuances\ncontinuant\ncontinuants\ncontinuation\ncontinuations\ncontinuative\ncontinuatively\ncontinuatives\ncontinuator\ncontinuators\ncontinue\ncontinued\ncontinuer\ncontinuers\ncontinues\ncontinuing\ncontinuities\ncontinuity\ncontinuo\ncontinuos\ncontinuous\ncontinuously\ncontinuousness\ncontinuum\ncontinuums\ncontort\ncontorted\ncontortedly\ncontortedness\ncontorting\ncontortion\ncontortionist\ncontortionistic\ncontortionists\ncontortions\ncontortive\ncontorts\ncontour\ncontoured\ncontouring\ncontours\ncontra\ncontraband\ncontrabandage\ncontrabandist\ncontrabandists\ncontrabands\ncontrabass\ncontrabasses\ncontrabassist\ncontrabassists\ncontrabassoon\ncontrabassoons\ncontraception\ncontraceptive\ncontraceptives\ncontract\ncontracted\ncontractibility\ncontractible\ncontractibleness\ncontractile\ncontractility\ncontracting\ncontraction\ncontractions\ncontractor\ncontractors\ncontracts\ncontractual\ncontractually\ncontracture\ncontractures\ncontracyclical\ncontradance\ncontradances\ncontradict\ncontradictable\ncontradicted\ncontradicter\ncontradicters\ncontradicting\ncontradiction\ncontradictions\ncontradictor\ncontradictories\ncontradictorily\ncontradictoriness\ncontradictors\ncontradictory\ncontradicts\ncontradistinction\ncontradistinctions\ncontradistinctive\ncontradistinctively\ncontradistinguish\ncontradistinguished\ncontradistinguishes\ncontradistinguishing\ncontragestation\ncontragestive\ncontragestives\ncontrail\ncontrails\ncontraindicate\ncontraindicated\ncontraindicates\ncontraindicating\ncontraindication\ncontraindications\ncontraindicative\ncontraire\ncontralateral\ncontralto\ncontraltos\ncontraposition\ncontrapositions\ncontrapositive\ncontrapositives\ncontrapposto\ncontrappostos\ncontraption\ncontraptions\ncontrapuntal\ncontrapuntally\ncontrapuntist\ncontrapuntists\ncontrarian\ncontrarians\ncontraries\ncontrarieties\ncontrariety\ncontrarily\ncontrariness\ncontrarious\ncontrariously\ncontrariwise\ncontrary\ncontras\ncontrast\ncontrasted\ncontrasting\ncontrastive\ncontrastively\ncontrasts\ncontrasty\ncontrate\ncontravariance\ncontravene\ncontravened\ncontravener\ncontraveners\ncontravenes\ncontravening\ncontravention\ncontretemps\ncontribute\ncontributed\ncontributes\ncontributing\ncontribution\ncontributions\ncontributive\ncontributively\ncontributiveness\ncontributor\ncontributories\ncontributors\ncontributory\ncontrite\ncontritely\ncontriteness\ncontrition\ncontrivance\ncontrivances\ncontrive\ncontrived\ncontrivedly\ncontriver\ncontrivers\ncontrives\ncontriving\ncontrol\ncontrollability\ncontrollable\ncontrollably\ncontrolled\ncontroller\ncontrollers\ncontrollership\ncontrolling\ncontrols\ncontroversial\ncontroversialist\ncontroversialists\ncontroversiality\ncontroversially\ncontroversies\ncontroversy\ncontrovert\ncontroverted\ncontrovertibility\ncontrovertible\ncontrovertibly\ncontroverting\ncontroverts\ncontumacies\ncontumacious\ncontumaciously\ncontumaciousness\ncontumacy\ncontumelies\ncontumelious\ncontumeliously\ncontumely\ncontuse\ncontused\ncontuses\ncontusing\ncontusion\ncontusions\nconundrum\nconundrums\nconurbation\nconvalesce\nconvalesced\nconvalescence\nconvalescent\nconvalescents\nconvalesces\nconvalescing\nconvect\nconvected\nconvecting\nconvection\nconvectional\nconvective\nconvectively\nconvector\nconvectors\nconvects\nconvenable\nconvene\nconvened\nconvener\nconveners\nconvenes\nconvenience\nconveniences\nconveniencies\nconveniency\nconvenient\nconveniently\nconvening\nconvent\nconventicle\nconventicler\nconventiclers\nconventicles\nconvention\nconventional\nconventionalism\nconventionalist\nconventionalists\nconventionalities\nconventionality\nconventionalization\nconventionalize\nconventionalized\nconventionalizes\nconventionalizing\nconventionally\nconventioneer\nconventioneers\nconventions\nconvents\nconventual\nconventuals\nconverge\nconverged\nconvergence\nconvergencies\nconvergency\nconvergent\nconverges\nconverging\nconversance\nconversances\nconversancies\nconversancy\nconversant\nconversantly\nconversation\nconversational\nconversationalist\nconversationalists\nconversationally\nconversations\nconversazione\nconversaziones\nconverse\nconversed\nconversely\nconverses\nconversing\nconversion\nconversional\nconversionary\nconversions\nconvert\nconverted\nconverter\nconverters\nconvertibility\nconvertible\nconvertibleness\nconvertibles\nconvertibly\nconverting\nconvertiplane\nconvertiplanes\nconverts\nconvex\nconvexities\nconvexity\nconvexly\nconvey\nconveyable\nconveyance\nconveyancer\nconveyancers\nconveyances\nconveyancing\nconveyancings\nconveyed\nconveyer\nconveyers\nconveying\nconveyor\nconveyors\nconveys\nconvict\nconvicted\nconvicting\nconviction\nconvictional\nconvictions\nconvictive\nconvictively\nconvicts\nconvince\nconvinced\nconvincement\nconvincer\nconvincers\nconvinces\nconvincible\nconvincing\nconvincingly\nconvincingness\nconvivial\nconviviality\nconvivially\nconvocation\nconvocational\nconvocations\nconvoke\nconvoked\nconvoker\nconvokers\nconvokes\nconvoking\nconvolute\nconvoluted\nconvolutely\nconvolutes\nconvoluting\nconvolution\nconvolutional\nconvolutions\nconvolve\nconvolved\nconvolves\nconvolving\nconvolvuli\nconvolvulus\nconvolvuluses\nconvoy\nconvoyed\nconvoying\nconvoys\nconvulsant\nconvulsants\nconvulse\nconvulsed\nconvulses\nconvulsing\nconvulsion\nconvulsions\nconvulsive\nconvulsively\nconvulsiveness\ncony\ncoo\ncooed\ncooer\ncooers\ncooing\ncook\ncookbook\ncookbooks\ncooked\ncooker\ncookeries\ncookers\ncookery\ncookhouse\ncookhouses\ncookie\ncookies\ncooking\ncookout\ncookouts\ncooks\ncooktown\ncookware\ncool\ncoolant\ncoolants\ncooled\ncooler\ncoolers\ncoolest\ncoolgardie\ncoolheaded\ncoolie\ncoolies\ncooling\ncoolish\ncoolly\ncoolness\ncools\ncoon\ncooncan\ncooncans\ncoonhound\ncoonhounds\ncoons\ncoonskin\ncoonskins\ncoontie\ncoonties\ncoop\ncooped\ncooper\ncooperage\ncooperate\ncooperated\ncooperates\ncooperating\ncooperation\ncooperationist\ncooperationists\ncooperative\ncooperatively\ncooperativeness\ncooperatives\ncooperator\ncooperators\ncoopers\ncooping\ncoops\ncoordinate\ncoordinated\ncoordinately\ncoordinateness\ncoordinates\ncoordinating\ncoordination\ncoordinations\ncoordinative\ncoordinator\ncoordinators\ncoos\ncoot\ncootie\ncooties\ncoots\ncop\ncopacetic\ncopaiba\ncopal\ncoparcenaries\ncoparcenary\ncoparcener\ncoparceners\ncopartner\ncopartners\ncopartnership\ncope\ncoped\ncopenhagen\ncopepod\ncopepods\ncoper\ncopernican\ncopernicans\ncopernicus\ncopers\ncopes\ncopestone\ncopestones\ncopied\ncopier\ncopiers\ncopies\ncopilot\ncopilots\ncoping\ncopings\ncopious\ncopiously\ncopiousness\ncoplanar\ncoplanarity\ncopland\ncopolymer\ncopolymeric\ncopolymerization\ncopolymerize\ncopolymerized\ncopolymerizes\ncopolymerizing\ncopolymers\ncopout\ncopouts\ncopped\ncopper\ncopperas\ncoppered\ncopperfield\ncopperhead\ncopperheads\ncoppering\ncopperleaf\ncopperleafs\ncopperplate\ncopperplates\ncoppers\ncoppersmith\ncoppersmiths\ncopperware\ncopperwares\ncoppery\ncoppice\ncoppices\ncopping\ncopra\ncopresent\ncopresented\ncopresenting\ncopresents\ncopresident\ncopresidents\ncoprince\ncoprinces\ncoprincipal\ncoprincipals\ncoprisoner\ncoprisoners\ncoprocessing\ncoprocessor\ncoprocessors\ncoproduce\ncoproduced\ncoproducer\ncoproducers\ncoproduces\ncoproducing\ncoproduction\ncoproductions\ncoprolalia\ncoprolalias\ncoprolite\ncoprolites\ncoprolitic\ncoprology\ncopromoter\ncopromoters\ncoprophagous\ncoprophagy\ncoprophilia\ncoprophiliac\ncoprophiliacs\ncoprophilic\ncoprophilous\ncoproprietor\ncoproprietors\ncoprosperity\ncops\ncopse\ncopses\ncopt\ncopter\ncopters\ncoptic\ncopts\ncopublish\ncopublished\ncopublisher\ncopublishers\ncopublishes\ncopublishing\ncopula\ncopular\ncopulas\ncopulate\ncopulated\ncopulates\ncopulating\ncopulation\ncopulations\ncopulative\ncopulatively\ncopulatory\ncopy\ncopyable\ncopybook\ncopybooks\ncopyboy\ncopyboys\ncopycat\ncopycats\ncopycatted\ncopycatting\ncopydesk\ncopydesks\ncopyedit\ncopyedited\ncopyediting\ncopyeditor\ncopyeditors\ncopyedits\ncopyholder\ncopyholders\ncopying\ncopyist\ncopyists\ncopyreader\ncopyreaders\ncopyright\ncopyrightable\ncopyrighted\ncopyrighter\ncopyrighters\ncopyrighting\ncopyrights\ncopywriter\ncopywriters\ncoq\ncoquet\ncoquetries\ncoquetry\ncoquets\ncoquette\ncoquetted\ncoquettes\ncoquetting\ncoquettish\ncoquettishly\ncoquettishness\ncoquille\ncoquilles\ncoquina\ncoquinas\ncoquito\ncoquitos\ncoracle\ncoracles\ncoracoid\ncoracoids\ncoral\ncoralberries\ncoralberry\ncoralline\ncorallines\ncoralloid\ncoralroot\ncoralroots\ncorals\ncorban\ncorbans\ncorbeil\ncorbeils\ncorbel\ncorbeled\ncorbeling\ncorbelings\ncorbels\ncorbina\ncorbinas\ncorbusier\ncorcovado\ncord\ncordage\ncordate\ncordately\ncorded\ncordelia\ncorder\ncorders\ncordial\ncordiale\ncordiality\ncordially\ncordialness\ncordials\ncordierite\ncordierites\ncordiform\ncordillera\ncordilleran\ncordilleras\ncording\ncordite\ncordless\ncordlessly\ncordoba\ncordon\ncordoned\ncordoning\ncordons\ncordova\ncordovan\ncordovans\ncords\ncorduroy\ncorduroyed\ncorduroying\ncorduroys\ncordwood\ncore\ncorecipient\ncorecipients\ncored\ncoreligionist\ncoreligionists\ncoreopsis\ncorepressor\ncorepressors\ncorer\ncorers\ncores\ncoresearcher\ncoresearchers\ncoresident\ncoresidential\ncoresidents\ncorespondency\ncorespondent\ncorespondents\ncorf\ncorfu\ncorgi\ncorgis\ncoria\ncoriaceous\ncoriander\ncoring\ncorinth\ncorinthian\ncorinthians\ncoriolanus\ncorium\ncork\ncorkage\ncorkages\ncorkboard\ncorkboards\ncorked\ncorker\ncorkers\ncorkier\ncorkiest\ncorkiness\ncorking\ncorks\ncorkscrew\ncorkscrewed\ncorkscrewing\ncorkscrews\ncorkwood\ncorkwoods\ncorky\ncorm\ncormel\ncormels\ncormorant\ncormorants\ncorms\ncorn\ncornball\ncornballs\ncornbraid\ncornbraided\ncornbraiding\ncornbraids\ncornbread\ncorncob\ncorncobs\ncorncrake\ncorncrakes\ncorncrib\ncorncribs\ncorndodger\ncorndodgers\ncornea\ncorneal\ncorneas\ncorned\ncorneitis\ncornel\ncornell\ncornels\ncorneous\ncorner\ncornerback\ncornerbacks\ncornered\ncornering\ncorners\ncornerstone\ncornerstones\ncornerwise\ncornet\ncornetist\ncornetists\ncornets\ncornfield\ncornfields\ncornflower\ncornflowers\ncornhusk\ncornhusker\ncornhuskers\ncornhusking\ncornhuskings\ncornhusks\ncornice\ncorniced\ncornices\ncorniche\ncornicing\ncornicle\ncornicles\ncorniculate\ncornier\ncorniest\ncornification\ncornifications\ncornified\ncornifies\ncornify\ncornifying\ncornily\ncorniness\ncorning\ncornish\ncornishman\ncornishmen\ncornishwoman\ncornishwomen\ncornmeal\ncornpone\ncornrow\ncornrowed\ncornrowing\ncornrows\ncorns\ncornstalk\ncornstalks\ncornstarch\ncornu\ncornua\ncornual\ncornucopia\ncornucopian\ncornucopias\ncornute\ncornwall\ncorny\ncorolla\ncorollaries\ncorollary\ncorollas\ncorollate\ncorona\ncoronae\ncoronagraph\ncoronagraphs\ncoronal\ncoronals\ncoronaries\ncoronary\ncoronas\ncoronation\ncoronations\ncoroner\ncoroners\ncoronership\ncoronet\ncoronets\ncorot\ncorotate\ncorotated\ncorotates\ncorotating\ncorotation\ncorotational\ncoroutine\ncoroutines\ncorpocracies\ncorpocracy\ncorpocratic\ncorpora\ncorporal\ncorporality\ncorporally\ncorporals\ncorporate\ncorporately\ncorporation\ncorporations\ncorporative\ncorporator\ncorporators\ncorporeal\ncorporeality\ncorporeally\ncorporealness\ncorporeity\ncorposant\ncorposants\ncorps\ncorpse\ncorpses\ncorpsman\ncorpsmen\ncorpulence\ncorpulent\ncorpulently\ncorpus\ncorpuscle\ncorpuscles\ncorpuscular\ncorpuses\ncorrade\ncorraded\ncorrades\ncorrading\ncorral\ncorralled\ncorralling\ncorrals\ncorrasion\ncorrasive\ncorrect\ncorrectable\ncorrected\ncorrecting\ncorrection\ncorrectional\ncorrections\ncorrectitude\ncorrectitudes\ncorrective\ncorrectively\ncorrectives\ncorrectly\ncorrectness\ncorrector\ncorrectors\ncorrects\ncorreggio\ncorrelate\ncorrelated\ncorrelates\ncorrelating\ncorrelation\ncorrelational\ncorrelations\ncorrelative\ncorrelatively\ncorrelatives\ncorrespond\ncorresponded\ncorrespondence\ncorrespondences\ncorrespondencies\ncorrespondency\ncorrespondent\ncorrespondently\ncorrespondents\ncorresponding\ncorrespondingly\ncorresponds\ncorresponsive\ncorresponsively\ncorrida\ncorridas\ncorridor\ncorridors\ncorrie\ncorries\ncorrigenda\ncorrigendum\ncorrigibility\ncorrigible\ncorrigibly\ncorrival\ncorrivalry\ncorrivals\ncorroborant\ncorroborate\ncorroborated\ncorroborates\ncorroborating\ncorroboration\ncorroborations\ncorroborative\ncorroborator\ncorroborators\ncorroboratory\ncorroboree\ncorroborees\ncorrode\ncorroded\ncorrodes\ncorrodible\ncorroding\ncorrosible\ncorrosion\ncorrosions\ncorrosive\ncorrosively\ncorrosiveness\ncorrosives\ncorrosivity\ncorrugate\ncorrugated\ncorrugates\ncorrugating\ncorrugation\ncorrugations\ncorrupt\ncorrupted\ncorrupter\ncorrupters\ncorruptibility\ncorruptible\ncorruptibleness\ncorruptibly\ncorrupting\ncorruption\ncorruptionist\ncorruptionists\ncorruptions\ncorruptive\ncorruptly\ncorruptness\ncorrupts\ncorsage\ncorsages\ncorsair\ncorsairs\ncorselet\ncorselets\ncorset\ncorseted\ncorseting\ncorsets\ncorsica\ncorsican\ncorsicans\ncortege\ncorteges\ncortex\ncortexes\ncortez\ncortical\ncortically\ncorticate\ncortices\ncorticoid\ncorticoids\ncorticolous\ncorticospinal\ncorticosteroid\ncorticosteroids\ncorticosterone\ncorticosterones\ncorticotrophin\ncorticotrophins\ncorticotropin\ncorticotropins\ncortin\ncortins\ncortisol\ncortisols\ncortisone\ncortège\ncortèges\ncoruler\ncorulers\ncorundum\ncorunna\ncoruscant\ncoruscate\ncoruscated\ncoruscates\ncoruscating\ncoruscation\ncoruscations\ncoruña\ncorves\ncorvette\ncorvettes\ncorvine\ncorvus\ncorvée\ncorybant\ncorybantes\ncorybantic\ncorybants\ncorydalis\ncorymb\ncorymbose\ncorymbosely\ncorymbous\ncorynebacterium\ncorynebacteriums\ncoryneform\ncoryphaei\ncoryphaeus\ncoryphée\ncoryphées\ncoryza\ncosa\ncoscript\ncoscripted\ncoscripting\ncoscripts\ncosec\ncosecant\ncosecants\ncoseismal\ncoseismic\ncosign\ncosignatories\ncosignatory\ncosigned\ncosigner\ncosigners\ncosigning\ncosigns\ncosine\ncosines\ncosmetic\ncosmetically\ncosmetician\ncosmeticians\ncosmeticize\ncosmeticized\ncosmeticizes\ncosmeticizing\ncosmetics\ncosmetologist\ncosmetologists\ncosmetology\ncosmic\ncosmically\ncosmochemical\ncosmochemistry\ncosmodrome\ncosmodromes\ncosmogenic\ncosmogonic\ncosmogonical\ncosmogonically\ncosmogonies\ncosmogonist\ncosmogonists\ncosmogony\ncosmographer\ncosmographers\ncosmographic\ncosmographical\ncosmographically\ncosmographies\ncosmography\ncosmologic\ncosmological\ncosmologically\ncosmologies\ncosmologist\ncosmologists\ncosmology\ncosmonaut\ncosmonauts\ncosmopolis\ncosmopolitan\ncosmopolitanism\ncosmopolitans\ncosmopolite\ncosmopolites\ncosmopolitism\ncosmos\ncosmoses\ncosponsor\ncosponsored\ncosponsoring\ncosponsors\ncosponsorship\ncossack\ncossacks\ncosset\ncosseted\ncosseting\ncossets\ncost\ncosta\ncostae\ncostal\ncostar\ncostard\ncostards\ncostarred\ncostarring\ncostars\ncostate\ncosted\ncoster\ncostermonger\ncostermongers\ncosters\ncosting\ncostings\ncostive\ncostively\ncostiveness\ncostless\ncostlessness\ncostlier\ncostliest\ncostliness\ncostly\ncostmaries\ncostmary\ncostochondritis\ncostrel\ncostrels\ncosts\ncostume\ncostumed\ncostumer\ncostumers\ncostumes\ncostuming\ncosurfactant\ncosy\ncot\ncotangent\ncotangential\ncotangents\ncote\ncotenancy\ncotenant\ncotenants\ncoterie\ncoteries\ncoterminous\ncotes\ncothurni\ncothurnus\ncotidal\ncotillion\ncotillions\ncotman\ncotoneaster\ncotoneasters\ncotopaxi\ncotransduce\ncotransduced\ncotransduces\ncotransducing\ncotransduction\ncotransfer\ncotransferred\ncotransferring\ncotransfers\ncotransport\ncotrustee\ncotrustees\ncots\ncotswold\ncotswolds\ncotta\ncottae\ncottage\ncottager\ncottagers\ncottages\ncottas\ncotter\ncotters\ncotton\ncottoned\ncottoning\ncottonmouth\ncottonmouths\ncottons\ncottonseed\ncottonseeds\ncottontail\ncottontails\ncottonweed\ncottonweeds\ncottonwood\ncottonwoods\ncottony\ncoturnix\ncoturnixs\ncotyledon\ncotyledonal\ncotyledonous\ncotyledons\ncotyloid\ncouch\ncouchant\ncouched\ncoucher\ncouchers\ncouches\ncouchette\ncouchettes\ncouching\ncougar\ncougars\ncough\ncoughed\ncoughing\ncoughs\ncould\ncould've\ncouldest\ncouldn\ncouldn't\ncouldst\ncoulee\ncoulees\ncoulisse\ncoulisses\ncouloir\ncouloirs\ncoulomb\ncoulombic\ncoulombs\ncoulometric\ncoulometrically\ncoulometry\ncoulter\ncoulters\ncoumaric\ncoumarin\ncoumarins\ncouncil\ncouncilman\ncouncilmen\ncouncilor\ncouncilors\ncouncils\ncouncilwoman\ncouncilwomen\ncounsel\ncounseled\ncounseling\ncounselor\ncounselors\ncounselorship\ncounsels\ncount\ncountability\ncountable\ncountably\ncountdown\ncountdowns\ncounted\ncountenance\ncountenanced\ncountenancer\ncountenancers\ncountenances\ncountenancing\ncounter\ncounteraccusation\ncounteract\ncounteracted\ncounteracting\ncounteraction\ncounteractions\ncounteractive\ncounteractively\ncounteracts\ncounteradaptation\ncounteradvertising\ncounteragent\ncounteraggression\ncounterargue\ncounterargued\ncounterargues\ncounterarguing\ncounterargument\ncounterarguments\ncounterassault\ncounterattack\ncounterattacked\ncounterattacker\ncounterattacking\ncounterattacks\ncounterbalance\ncounterbalanced\ncounterbalances\ncounterbalancing\ncounterbid\ncounterblast\ncounterblockade\ncounterblow\ncounterblows\ncountercampaign\ncounterchallenge\ncounterchallenges\ncounterchange\ncounterchanged\ncounterchanges\ncounterchanging\ncountercharge\ncountercharged\ncountercharges\ncountercharging\ncountercheck\ncounterchecked\ncounterchecking\ncounterchecks\ncounterclaim\ncounterclaimant\ncounterclaimants\ncounterclaimed\ncounterclaiming\ncounterclaims\ncounterclockwise\ncountercommercial\ncountercomplaint\ncounterconditioning\ncounterconditionings\ncounterconspiracy\ncounterconvention\ncountercountermeasure\ncountercoup\ncountercoups\ncountercriticism\ncountercry\ncountercultural\ncounterculture\ncountercultures\ncounterculturist\ncounterculturists\ncountercurrent\ncountercurrently\ncountercurrents\ncountercyclical\ncounterdemand\ncounterdemonstrate\ncounterdemonstration\ncounterdemonstrations\ncounterdemonstrator\ncounterdemonstrators\ncounterdeployment\ncountered\ncountereducational\ncountereffort\ncounterespionage\ncounterevidence\ncounterexample\ncounterexamples\ncounterfactual\ncounterfeit\ncounterfeited\ncounterfeiter\ncounterfeiters\ncounterfeiting\ncounterfeits\ncounterfire\ncounterfoil\ncounterfoils\ncounterforce\ncounterforces\ncounterglow\ncounterglows\ncountergovernment\ncounterhypothesis\ncounterimage\ncounterincentive\ncounterinflation\ncounterinflationary\ncounterinfluence\ncountering\ncounterinstance\ncounterinstitution\ncounterinsurgencies\ncounterinsurgency\ncounterinsurgent\ncounterinsurgents\ncounterintelligence\ncounterinterpretation\ncounterintuitive\ncounterirritant\ncounterirritants\ncounterirritation\ncounterman\ncountermand\ncountermanded\ncountermanding\ncountermands\ncountermarch\ncountermarched\ncountermarches\ncountermarching\ncountermeasure\ncountermeasures\ncountermemo\ncountermen\ncountermine\ncountermined\ncountermines\ncountermining\ncountermobilization\ncountermove\ncountermoved\ncountermovement\ncountermoves\ncountermoving\ncountermyth\ncounteroffensive\ncounteroffensives\ncounteroffer\ncounteroffers\ncounterorder\ncounterpane\ncounterpanes\ncounterpart\ncounterparts\ncounterperson\ncounterpersons\ncounterpetition\ncounterpicket\ncounterplan\ncounterplans\ncounterplay\ncounterplayer\ncounterplays\ncounterplea\ncounterpleas\ncounterplot\ncounterplots\ncounterplotted\ncounterplotting\ncounterploy\ncounterpoint\ncounterpointed\ncounterpointing\ncounterpoints\ncounterpoise\ncounterpoised\ncounterpoises\ncounterpoising\ncounterpose\ncounterposed\ncounterposes\ncounterposing\ncounterpower\ncounterpressure\ncounterproductive\ncounterproductively\ncounterprogramming\ncounterprogrammings\ncounterproject\ncounterproliferation\ncounterpropaganda\ncounterproposal\ncounterproposals\ncounterprotest\ncounterpunch\ncounterpunched\ncounterpuncher\ncounterpunchers\ncounterpunches\ncounterpunching\ncounterquestion\ncounterraid\ncounterrally\ncounterreaction\ncounterreform\ncounterreformation\ncounterreformations\ncounterreformer\ncounterresponse\ncounterretaliation\ncounterrevolution\ncounterrevolutionaries\ncounterrevolutionary\ncounterrevolutionist\ncounterrevolutionists\ncounterrevolutions\ncounters\ncounterscientific\ncountershading\ncountershadings\ncountershaft\ncountershafts\ncountershot\ncountersign\ncountersignature\ncountersignatures\ncountersigned\ncountersigning\ncountersigns\ncountersink\ncountersinking\ncountersinks\ncountersniper\ncounterspell\ncounterspies\ncounterspy\ncounterstain\ncounterstained\ncounterstaining\ncounterstains\ncounterstate\ncounterstatement\ncounterstep\ncounterstrategist\ncounterstrategy\ncounterstream\ncounterstrike\ncounterstroke\ncounterstrokes\ncounterstyle\ncountersue\ncountersued\ncountersues\ncountersuggestion\ncountersuing\ncountersuit\ncountersuits\ncountersunk\ncountersurveillance\ncountertactics\ncountertendency\ncountertenor\ncountertenors\ncounterterror\ncounterterrorism\ncounterterrorist\ncounterterrorists\ncounterterrors\ncounterthreat\ncounterthrust\ncountertop\ncountertops\ncountertrade\ncountertrader\ncountertraders\ncountertrades\ncountertradition\ncountertransference\ncountertransferences\ncountertrend\ncountervail\ncountervailed\ncountervailing\ncountervails\ncounterviolence\ncounterweigh\ncounterweighed\ncounterweighing\ncounterweighs\ncounterweight\ncounterweighted\ncounterweights\ncounterwoman\ncounterwomen\ncounterworld\ncountess\ncountesses\ncounties\ncounting\ncountinghouse\ncountless\ncountlessly\ncountries\ncountrified\ncountry\ncountryman\ncountrymen\ncountryseat\ncountryseats\ncountryside\ncountrysides\ncountrywide\ncountrywoman\ncountrywomen\ncounts\ncounty\ncountywide\ncoup\ncoupe\ncoupes\ncouple\ncoupled\ncoupler\ncouplers\ncouples\ncouplet\ncouplets\ncoupling\ncouplings\ncoupon\ncouponing\ncouponings\ncoupons\ncoups\ncoupé\ncoupés\ncourage\ncourageous\ncourageously\ncourageousness\ncourant\ncourante\ncourantes\ncourgette\ncourgettes\ncourier\ncouriers\ncourlan\ncourlans\ncourse\ncoursed\ncourser\ncoursers\ncourses\ncourseware\ncoursework\ncoursing\ncoursings\ncourt\ncourted\ncourteous\ncourteously\ncourteousness\ncourtesan\ncourtesans\ncourtesies\ncourtesy\ncourthouse\ncourthouses\ncourtier\ncourtiers\ncourting\ncourtlier\ncourtliest\ncourtliness\ncourtly\ncourtroom\ncourtrooms\ncourts\ncourtship\ncourtships\ncourtside\ncourtyard\ncourtyards\ncouscous\ncousin\ncousinhood\ncousinly\ncousins\ncousinship\ncouth\ncoutts\ncouture\ncouturier\ncouturiers\ncouturière\ncouturières\ncouvade\ncouvades\ncovalence\ncovalency\ncovalent\ncovalently\ncovariance\ncovariant\ncove\ncoved\ncovellite\ncovellites\ncoven\ncovenant\ncovenantal\ncovenantally\ncovenanted\ncovenantee\ncovenantees\ncovenanter\ncovenanters\ncovenanting\ncovenantor\ncovenantors\ncovenants\ncovens\ncoventry\ncover\ncoverable\ncoverage\ncoverall\ncoveralls\ncoverdale\ncovered\ncoverer\ncoverers\ncovering\ncoverings\ncoverless\ncoverlet\ncoverlets\ncovers\ncovert\ncovertly\ncovertness\ncoverts\ncoverture\ncovertures\ncoves\ncovet\ncovetable\ncoveted\ncoveter\ncoveters\ncoveting\ncovetingly\ncovetous\ncovetously\ncovetousness\ncovets\ncovey\ncoveys\ncoving\ncow\ncoward\ncowardice\ncowardliness\ncowardly\ncowards\ncowbane\ncowbanes\ncowbell\ncowbells\ncowberries\ncowberry\ncowbird\ncowbirds\ncowboy\ncowboys\ncowcatcher\ncowcatchers\ncowed\ncowedly\ncower\ncowered\ncowering\ncowers\ncowfish\ncowfishes\ncowgirl\ncowgirls\ncowhand\ncowhands\ncowherb\ncowherbs\ncowherd\ncowherds\ncowhide\ncowhided\ncowhides\ncowhiding\ncowing\ncowinner\ncowinners\ncowl\ncowled\ncowlick\ncowlicks\ncowling\ncowlings\ncowls\ncowman\ncowmen\ncoworker\ncoworkers\ncowpea\ncowpeas\ncowper\ncowpoke\ncowpokes\ncowponies\ncowpony\ncowpox\ncowpoxes\ncowpuncher\ncowpunchers\ncowrie\ncowries\ncowrite\ncowriter\ncowriters\ncowrites\ncowriting\ncowritten\ncowrote\ncowry\ncows\ncowshed\ncowsheds\ncowslip\ncowslips\ncox\ncoxa\ncoxae\ncoxal\ncoxalgia\ncoxalgias\ncoxalgic\ncoxcomb\ncoxcombries\ncoxcombry\ncoxcombs\ncoxed\ncoxes\ncoxing\ncoxitis\ncoxitises\ncoxsackievirus\ncoxsackieviruses\ncoxswain\ncoxswained\ncoxswaining\ncoxswains\ncoy\ncoydog\ncoydogs\ncoyer\ncoyest\ncoyly\ncoyness\ncoyote\ncoyotes\ncoyotillo\ncoyotillos\ncoypu\ncoypus\ncozen\ncozenage\ncozenages\ncozened\ncozener\ncozeners\ncozening\ncozens\ncozied\ncozier\ncozies\ncoziest\ncozily\ncoziness\ncozumel\ncozy\ncozying\ncrab\ncrabapple\ncrabapples\ncrabbe\ncrabbed\ncrabbedly\ncrabbedness\ncrabber\ncrabbers\ncrabbier\ncrabbiest\ncrabbily\ncrabbiness\ncrabbing\ncrabby\ncrabgrass\ncrabmeat\ncrabmeats\ncrabs\ncrabstick\ncrabsticks\ncrabwise\ncrack\ncrackbrain\ncrackbrained\ncrackbrains\ncrackdown\ncrackdowns\ncracked\ncracker\ncrackerjack\ncrackerjacks\ncrackers\ncracking\ncrackings\ncrackle\ncrackled\ncrackles\ncrackleware\ncracklewares\ncracklier\ncrackliest\ncrackling\ncracklings\ncrackly\ncracknel\ncracknels\ncrackpot\ncrackpots\ncracks\ncracksman\ncracksmen\ncrackup\ncrackups\ncracow\ncradle\ncradleboard\ncradleboards\ncradled\ncradler\ncradlers\ncradles\ncradlesong\ncradlesongs\ncradling\ncraft\ncrafted\ncrafter\ncrafters\ncraftier\ncraftiest\ncraftily\ncraftiness\ncrafting\ncrafts\ncraftsman\ncraftsmanlike\ncraftsmanly\ncraftsmanship\ncraftsmen\ncraftspeople\ncraftsperson\ncraftspersons\ncraftswoman\ncraftswomen\ncraftwork\ncraftworker\ncraftworkers\ncraftworks\ncrafty\ncrag\ncragged\ncraggier\ncraggiest\ncraggily\ncragginess\ncraggy\ncrags\ncraig\ncrake\ncrakes\ncram\ncrambe\ncrambes\ncrambo\ncramboes\ncrammed\ncrammer\ncrammers\ncramming\ncramp\ncramped\ncrampfish\ncrampfishes\ncramping\ncrampon\ncrampons\ncramps\ncrams\ncranberries\ncranberry\ncrane\ncraned\ncranes\ncranesbill\ncranesbills\ncrania\ncranial\ncranially\ncraniate\ncraniates\ncraniectomies\ncraniectomy\ncraning\ncraniocerebral\ncraniofacial\ncraniological\ncraniologically\ncraniologist\ncraniologists\ncraniology\ncraniometer\ncraniometers\ncraniometric\ncraniometrical\ncraniometry\ncraniosacral\ncraniotomies\ncraniotomy\ncranium\ncraniums\ncrank\ncrankcase\ncrankcases\ncranked\ncrankier\ncrankiest\ncrankily\ncrankiness\ncranking\ncrankpin\ncranks\ncrankshaft\ncrankshafts\ncranky\ncranmer\ncrannied\ncrannies\ncranny\ncrap\ncrape\ncraped\ncrapehanger\ncrapehangers\ncrapes\ncraping\ncrapped\ncrapper\ncrappers\ncrappie\ncrappier\ncrappies\ncrappiest\ncrapping\ncrappy\ncraps\ncrapshoot\ncrapshooter\ncrapshooters\ncrapshoots\ncrapulence\ncrapulent\ncrapulous\ncrapulously\ncrash\ncrashed\ncrasher\ncrashers\ncrashes\ncrashing\ncrashworthiness\ncrashworthy\ncrass\ncrasser\ncrassest\ncrassitude\ncrassly\ncrassness\ncrate\ncrated\ncrater\ncratered\ncratering\ncraterlet\ncraterlets\ncraters\ncrates\ncrating\ncravat\ncravats\ncrave\ncraved\ncraven\ncravenly\ncravenness\ncravens\ncraver\ncravers\ncraves\ncraving\ncravingly\ncravings\ncraw\ncrawdad\ncrawdads\ncrawfish\ncrawfished\ncrawfishes\ncrawfishing\ncrawl\ncrawled\ncrawler\ncrawlers\ncrawlier\ncrawliest\ncrawling\ncrawlingly\ncrawls\ncrawlspace\ncrawlspaces\ncrawlway\ncrawlways\ncrawly\ncraws\ncrayfish\ncrayfishes\ncrayon\ncrayoned\ncrayoning\ncrayonist\ncrayonists\ncrayons\ncraze\ncrazed\ncrazes\ncrazier\ncrazies\ncraziest\ncrazily\ncraziness\ncrazinesses\ncrazing\ncrazy\ncrazyweed\ncrazyweeds\ncreak\ncreaked\ncreakier\ncreakiest\ncreakily\ncreakiness\ncreaking\ncreakingly\ncreaks\ncreaky\ncream\ncreamcups\ncreamed\ncreamer\ncreameries\ncreamers\ncreamery\ncreamier\ncreamiest\ncreamily\ncreaminess\ncreaming\ncreampuff\ncreampuffs\ncreams\ncreamy\ncrease\ncreased\ncreaseless\ncreaseproof\ncreaser\ncreasers\ncreases\ncreasing\ncreasy\ncreate\ncreated\ncreates\ncreatine\ncreatines\ncreating\ncreatinine\ncreatinines\ncreation\ncreational\ncreationism\ncreationist\ncreationists\ncreations\ncreative\ncreatively\ncreativeness\ncreativity\ncreator\ncreators\ncreatural\ncreature\ncreatureliness\ncreaturely\ncreatures\ncredence\ncredential\ncredentialed\ncredentialing\ncredentialism\ncredentialisms\ncredentials\ncredenza\ncredenzas\ncredibility\ncredible\ncredibleness\ncredibly\ncredit\ncreditability\ncreditable\ncreditableness\ncreditably\ncredited\ncrediting\ncreditor\ncreditors\ncredits\ncreditworthiness\ncreditworthy\ncredo\ncredos\ncredulity\ncredulous\ncredulously\ncredulousness\ncreed\ncreedal\ncreeds\ncreek\ncreeks\ncreel\ncreels\ncreep\ncreeper\ncreepers\ncreepier\ncreepiest\ncreepily\ncreepiness\ncreeping\ncreeps\ncreepy\ncremains\ncremate\ncremated\ncremates\ncremating\ncremation\ncremations\ncremator\ncrematoria\ncrematories\ncrematorium\ncrematoriums\ncremators\ncrematory\ncreme\ncremes\ncremona\ncrenate\ncrenately\ncrenation\ncrenations\ncrenature\ncrenatures\ncrenel\ncrenelated\ncrenelation\ncrenellate\ncrenellated\ncrenellates\ncrenellating\ncrenellation\ncrenellations\ncrenellé\ncrenels\ncrenshaw\ncrenshaws\ncrenulate\ncrenulation\ncreodont\ncreodonts\ncreole\ncreoles\ncreolization\ncreolize\ncreolized\ncreolizes\ncreolizing\ncreon\ncreosol\ncreosols\ncreosote\ncreosoted\ncreosotes\ncreosoting\ncrepe\ncrepehanger\ncrepehangers\ncrepes\ncrepitant\ncrepitate\ncrepitated\ncrepitates\ncrepitating\ncrepitation\ncrepitations\ncrept\ncrepuscular\ncrepuscule\ncrepuscules\ncrescendi\ncrescendo\ncrescendoed\ncrescendoes\ncrescendoing\ncrescendos\ncrescent\ncrescentic\ncrescents\ncresol\ncresols\ncress\ncresset\ncressets\ncressida\ncrest\ncresta\ncrested\ncrestfallen\ncrestfallenly\ncrestfallenness\ncresting\ncrestings\ncrests\ncresyl\ncresylic\ncresyls\ncretaceous\ncretaceously\ncretan\ncretans\ncrete\ncretic\ncretics\ncretin\ncretinism\ncretinize\ncretinized\ncretinizes\ncretinizing\ncretinoid\ncretinous\ncretins\ncretonne\ncretonnes\ncrevalle\ncrevalles\ncrevasse\ncrevassed\ncrevasses\ncrevassing\ncrevice\ncreviced\ncrevices\ncrew\ncrewcut\ncrewed\ncrewel\ncrewels\ncrewelwork\ncrewelworks\ncrewing\ncrewman\ncrewmate\ncrewmates\ncrewmember\ncrewmembers\ncrewmen\ncrews\ncreüsa\ncri\ncrib\ncribbage\ncribbed\ncribber\ncribbers\ncribbing\ncribriform\ncribs\ncricetid\ncricetids\ncrick\ncricked\ncricket\ncricketed\ncricketer\ncricketers\ncricketing\ncrickets\ncrickety\ncricking\ncricks\ncricoid\ncricoids\ncried\ncrier\ncriers\ncries\ncrime\ncrimea\ncrimean\ncrimeless\ncrimelessness\ncrimes\ncriminal\ncriminalities\ncriminality\ncriminalization\ncriminalize\ncriminalized\ncriminalizes\ncriminalizing\ncriminally\ncriminals\ncriminate\ncriminated\ncriminates\ncriminating\ncrimination\ncriminative\ncriminator\ncriminators\ncriminatory\ncriminogenic\ncriminological\ncriminologically\ncriminologist\ncriminologists\ncriminology\ncrimp\ncrimped\ncrimper\ncrimpers\ncrimpier\ncrimpiest\ncrimpiness\ncrimping\ncrimps\ncrimpy\ncrimson\ncrimsoned\ncrimsoning\ncrimsons\ncringe\ncringed\ncringes\ncringing\ncringle\ncringles\ncrinkle\ncrinkled\ncrinkleroot\ncrinkleroots\ncrinkles\ncrinkling\ncrinkly\ncrinoid\ncrinoids\ncrinoline\ncrinolined\ncrinolines\ncrinum\ncrinums\ncriollo\ncriollos\ncriosphinx\ncriosphinxes\ncripple\ncrippled\ncrippler\ncripplers\ncripples\ncrippling\ncripps\ncris\ncrises\ncrisis\ncrisp\ncrispate\ncrispation\ncrispations\ncrisped\ncrisper\ncrispers\ncrispest\ncrispier\ncrispiest\ncrispin\ncrispiness\ncrisping\ncrisply\ncrispness\ncrisps\ncrispy\ncrissa\ncrissal\ncrisscross\ncrisscrossed\ncrisscrosses\ncrisscrossing\ncrissum\ncrista\ncristae\ncristate\ncriteria\ncriterial\ncriterion\ncriterions\ncritic\ncritical\ncriticality\ncritically\ncriticalness\ncriticaster\ncriticasters\ncriticism\ncriticisms\ncriticizable\ncriticize\ncriticized\ncriticizer\ncriticizers\ncriticizes\ncriticizing\ncritics\ncritique\ncritiqued\ncritiques\ncritiquing\ncritter\ncritters\ncroak\ncroaked\ncroaker\ncroakers\ncroakily\ncroaking\ncroaks\ncroaky\ncroat\ncroatia\ncroatian\ncroatians\ncroats\ncrocein\ncroceins\ncrochet\ncrocheted\ncrocheting\ncrochets\ncrocidolite\ncrocidolites\ncrock\ncrocked\ncrockery\ncrocket\ncrockets\ncrocking\ncrocks\ncrocodile\ncrocodiles\ncrocodilian\ncrocodilians\ncrocoite\ncrocoites\ncrocus\ncrocuses\ncroesus\ncrofter\ncrofters\ncrohn\ncroissant\ncroissants\ncromlech\ncromlechs\ncromwell\ncromwellian\ncrone\ncrones\ncronies\ncronin\ncronus\ncrony\ncronyism\ncrook\ncrookbacked\ncrooked\ncrookedly\ncrookedness\ncrookeries\ncrookery\ncrooking\ncrookneck\ncrooknecks\ncrooks\ncroon\ncrooned\ncrooner\ncrooners\ncrooning\ncroons\ncrop\ncropland\ncroplands\ncropped\ncropper\ncroppers\ncropping\ncrops\ncroquet\ncroqueted\ncroqueting\ncroquets\ncroquette\ncroquettes\ncroquignole\ncroquignoles\ncrosier\ncrosiers\ncross\ncrossbar\ncrossbars\ncrossbeam\ncrossbeams\ncrossbill\ncrossbills\ncrossbones\ncrossbow\ncrossbowman\ncrossbows\ncrossbred\ncrossbreed\ncrossbreeding\ncrossbreeds\ncrosscheck\ncrosschecked\ncrosschecking\ncrosschecks\ncrosscourt\ncrosscurrent\ncrosscurrents\ncrosscut\ncrosscuts\ncrosscutting\ncrosscuttings\ncrosse\ncrossed\ncrosser\ncrossers\ncrosses\ncrossfire\ncrosshair\ncrosshairs\ncrosshatch\ncrosshatched\ncrosshatches\ncrosshatching\ncrosshead\ncrossheads\ncrossing\ncrossings\ncrossly\ncrossness\ncrossopterygian\ncrossopterygians\ncrossover\ncrossovers\ncrosspatch\ncrosspatches\ncrosspiece\ncrosspieces\ncrossroad\ncrossroads\ncrossruff\ncrossruffed\ncrossruffing\ncrossruffs\ncrosstalk\ncrosstalks\ncrosstie\ncrossties\ncrosstree\ncrosstrees\ncrosswalk\ncrosswalks\ncrossway\ncrossways\ncrosswayss\ncrosswind\ncrosswinds\ncrosswise\ncrossword\ncrosswords\ncrotch\ncrotched\ncrotches\ncrotchet\ncrotchetiness\ncrotchets\ncrotchety\ncroton\ncrotons\ncrottin\ncrottins\ncrouch\ncrouched\ncrouches\ncrouching\ncroup\ncroupier\ncroupiers\ncroupous\ncroupy\ncrouse\ncroustade\ncroustades\ncrouton\ncroutons\ncrow\ncrowbar\ncrowbarred\ncrowbarring\ncrowbars\ncrowberries\ncrowberry\ncrowd\ncrowded\ncrowder\ncrowders\ncrowding\ncrowds\ncrowed\ncrowfoot\ncrowfoots\ncrowing\ncrown\ncrowned\ncrowning\ncrowns\ncrows\ncroze\ncrozes\ncru\ncrucial\ncrucially\ncruciate\ncruciately\ncrucible\ncrucibles\ncrucifer\ncruciferous\ncrucifers\ncrucified\ncrucifier\ncrucifiers\ncrucifies\ncrucifix\ncrucifixes\ncrucifixion\ncrucifixions\ncruciform\ncruciformly\ncrucify\ncrucifying\ncrud\ncruddier\ncruddiest\ncruddiness\ncruddy\ncrude\ncrudely\ncrudeness\ncruder\ncrudest\ncrudities\ncrudity\ncrudités\ncruel\ncrueler\ncruelest\ncruelly\ncruelties\ncruelty\ncruet\ncruets\ncruise\ncruised\ncruiser\ncruisers\ncruiserweight\ncruiserweights\ncruises\ncruising\ncruller\ncrullers\ncrumb\ncrumbed\ncrumbing\ncrumble\ncrumbled\ncrumbles\ncrumblier\ncrumbliest\ncrumbliness\ncrumbling\ncrumbly\ncrumbs\ncrummier\ncrummiest\ncrummy\ncrump\ncrumped\ncrumpet\ncrumpets\ncrumping\ncrumple\ncrumpled\ncrumples\ncrumpling\ncrumply\ncrumps\ncrunch\ncrunchable\ncrunched\ncrunches\ncrunchier\ncrunchiest\ncrunchiness\ncrunching\ncrunchy\ncrupper\ncruppers\ncrura\ncrural\ncrus\ncrusade\ncrusaded\ncrusader\ncrusaders\ncrusades\ncrusading\ncrusado\ncrusadoes\ncruse\ncruses\ncrush\ncrushable\ncrushed\ncrusher\ncrushers\ncrushes\ncrushing\ncrushingly\ncrushproof\ncrusoe\ncrust\ncrustacean\ncrustaceans\ncrustaceous\ncrustal\ncrusted\ncrustier\ncrustiest\ncrustily\ncrustiness\ncrusting\ncrustless\ncrustose\ncrusts\ncrusty\ncrutch\ncrutched\ncrutches\ncrutching\ncrux\ncruxes\ncruz\ncruzeiro\ncruzeiros\ncry\ncrybabies\ncrybaby\ncrying\ncrymotherapies\ncrymotherapy\ncryobank\ncryobanks\ncryobiological\ncryobiologically\ncryobiologist\ncryobiologists\ncryobiology\ncryogen\ncryogenic\ncryogenically\ncryogenics\ncryogeny\ncryolite\ncryolites\ncryometer\ncryometers\ncryonic\ncryonics\ncryophilic\ncryopreservation\ncryopreserve\ncryopreserved\ncryopreserves\ncryopreserving\ncryoprobe\ncryoprobes\ncryoprotectant\ncryoprotectants\ncryoprotective\ncryoscope\ncryoscopes\ncryoscopic\ncryoscopies\ncryoscopy\ncryostat\ncryostatic\ncryostats\ncryosurgeon\ncryosurgeons\ncryosurgery\ncryosurgical\ncryotherapies\ncryotherapy\ncrypt\ncryptanalysis\ncryptanalyst\ncryptanalysts\ncryptanalytic\ncryptanalyze\ncryptanalyzed\ncryptanalyzes\ncryptanalyzing\ncryptesthesia\ncryptic\ncryptically\ncrypticness\ncrypto\ncryptoclastic\ncryptococcal\ncryptococcosis\ncryptococcus\ncryptocrystalline\ncryptogam\ncryptogamic\ncryptogamous\ncryptogams\ncryptogenic\ncryptogram\ncryptogrammic\ncryptograms\ncryptograph\ncryptographed\ncryptographer\ncryptographers\ncryptographic\ncryptographically\ncryptographing\ncryptographs\ncryptography\ncryptologic\ncryptological\ncryptologist\ncryptologists\ncryptology\ncryptomeria\ncryptomerias\ncryptorchid\ncryptorchism\ncryptos\ncryptosporidiosis\ncryptozoite\ncryptozoites\ncryptozoological\ncryptozoologist\ncryptozoologists\ncryptozoology\ncrypts\ncrystal\ncrystalliferous\ncrystalline\ncrystallinity\ncrystallite\ncrystallites\ncrystallitic\ncrystallizable\ncrystallization\ncrystallize\ncrystallized\ncrystallizer\ncrystallizers\ncrystallizes\ncrystallizing\ncrystallographer\ncrystallographers\ncrystallographic\ncrystallographical\ncrystallographically\ncrystallography\ncrystalloid\ncrystalloidal\ncrystalloids\ncrystals\ncrécy\ncrèche\ncrèches\ncrème\ncrèmes\ncrêpe\ncrêpes\nctenidia\nctenidium\nctenoid\nctenophoran\nctenophore\nctenophores\ncuadrilla\ncuadrillas\ncuatro\ncuatros\ncub\ncuba\ncubage\ncubages\ncuban\ncubans\ncubature\ncubatures\ncubbies\ncubby\ncubbyhole\ncubbyholes\ncube\ncubeb\ncubebs\ncubed\ncuber\ncubers\ncubes\ncubic\ncubical\ncubically\ncubicalness\ncubicle\ncubicles\ncubicly\ncubics\ncubiform\ncubing\ncubism\ncubist\ncubistic\ncubistically\ncubists\ncubit\ncubits\ncuboid\ncuboidal\ncuboids\ncubs\ncubé\ncuchifrito\ncuchifritos\ncuchulain\ncuckold\ncuckolded\ncuckolding\ncuckoldries\ncuckoldry\ncuckolds\ncuckoo\ncuckooed\ncuckooflower\ncuckooflowers\ncuckooing\ncuckoopint\ncuckoopints\ncuckoos\ncucullate\ncucullately\ncucumber\ncucumbers\ncucurbit\ncucurbits\ncud\ncudbear\ncudbears\ncuddies\ncuddle\ncuddled\ncuddles\ncuddlesome\ncuddlier\ncuddliest\ncuddling\ncuddly\ncuddy\ncudgel\ncudgeled\ncudgeling\ncudgels\ncudweed\ncudweeds\ncue\ncued\ncueing\ncuernavaca\ncues\ncuesta\ncuestas\ncuff\ncuffed\ncuffing\ncufflink\ncufflinks\ncuffs\ncui\ncuing\ncuirass\ncuirassed\ncuirasses\ncuirassier\ncuirassiers\ncuirassing\ncuisinart\ncuisine\ncuisse\ncuisses\ncul\nculch\nculches\nculet\nculets\nculex\nculiacán\nculices\nculinary\ncull\nculled\nculler\ncullers\ncullet\ncullets\ncullies\nculling\ncullis\ncullises\nculloden\nculls\ncully\nculm\nculminant\nculminate\nculminated\nculminates\nculminating\nculmination\nculminations\nculms\nculotte\nculottes\nculpa\nculpability\nculpable\nculpably\nculprit\nculprits\ncult\ncultic\ncultigen\ncultigens\ncultish\ncultism\ncultist\ncultists\ncultivability\ncultivable\ncultivar\ncultivatable\ncultivate\ncultivated\ncultivates\ncultivating\ncultivation\ncultivations\ncultivator\ncultivators\ncultrate\ncults\ncultural\nculturally\nculturati\nculture\ncultured\ncultures\nculturing\ncultus\ncultuses\nculver\nculverin\nculverins\nculvers\nculvert\nculverts\ncum\ncumaean\ncumber\ncumbered\ncumberer\ncumberers\ncumbering\ncumberland\ncumbers\ncumbersome\ncumbersomely\ncumbria\ncumbrian\ncumbrians\ncumbrous\ncumbrously\ncumbrousness\ncumin\ncummerbund\ncummerbunds\ncumshaw\ncumshaws\ncumulate\ncumulated\ncumulates\ncumulating\ncumulation\ncumulations\ncumulative\ncumulatively\ncumulativeness\ncumuli\ncumuliform\ncumulonimbi\ncumulonimbus\ncumulonimbuses\ncumulous\ncumulus\ncunard\ncunctation\ncunctations\ncunctative\ncunctator\ncunctators\ncuneal\ncuneate\ncuneately\ncuneiform\ncunha\ncunner\ncunners\ncunnilingual\ncunnilingus\ncunnilinguses\ncunning\ncunningly\ncunningness\ncunnings\ncunt\ncunts\ncup\ncupbearer\ncupbearers\ncupboard\ncupboards\ncupcake\ncupcakes\ncupel\ncupeled\ncupeling\ncupellation\ncupellations\ncupeller\ncupellers\ncupels\ncupflower\ncupflowers\ncupful\ncupfuls\ncupid\ncupidity\ncupids\ncupola\ncupolas\ncupped\ncuppier\ncuppiest\ncupping\ncuppings\ncuppy\ncupreous\ncupric\ncupriferous\ncuprite\ncuprites\ncupronickel\ncupronickels\ncuprous\ncups\ncupulate\ncupule\ncupules\ncur\ncurability\ncurable\ncurableness\ncurably\ncuracies\ncuracy\ncurare\ncurarization\ncurarize\ncurarized\ncurarizes\ncurarizing\ncurassow\ncurassows\ncurate\ncurates\ncurative\ncuratively\ncurativeness\ncuratives\ncurator\ncuratorial\ncurators\ncuratorship\ncuraçao\ncuraçaos\ncurb\ncurbed\ncurbing\ncurbs\ncurbside\ncurbsides\ncurbstone\ncurbstones\ncurculio\ncurculios\ncurcuma\ncurcumas\ncurd\ncurded\ncurding\ncurdle\ncurdled\ncurdles\ncurdling\ncurds\ncurdy\ncure\ncured\ncureless\ncurer\ncurers\ncures\ncurettage\ncurette\ncurettement\ncurettements\ncurettes\ncurfew\ncurfews\ncuria\ncuriae\ncurial\ncurie\ncuries\ncuring\ncurio\ncurios\ncuriosa\ncuriosities\ncuriosity\ncurious\ncuriously\ncuriousness\ncurium\ncurl\ncurled\ncurler\ncurlers\ncurlew\ncurlews\ncurlicue\ncurlicued\ncurlicues\ncurlier\ncurliest\ncurlily\ncurliness\ncurling\ncurlings\ncurls\ncurly\ncurmudgeon\ncurmudgeonly\ncurmudgeonry\ncurmudgeons\ncurrant\ncurrants\ncurrencies\ncurrency\ncurrent\ncurrently\ncurrentness\ncurrents\ncurricle\ncurricles\ncurricula\ncurricular\ncurriculum\ncurriculums\ncurried\ncurrier\ncurrieries\ncurriers\ncurriery\ncurries\ncurrish\ncurrishly\ncurry\ncurrycomb\ncurrycombed\ncurrycombing\ncurrycombs\ncurrying\ncurs\ncurse\ncursed\ncursedly\ncursedness\ncurser\ncursers\ncurses\ncursing\ncursive\ncursively\ncursiveness\ncursives\ncursor\ncursorial\ncursorily\ncursoriness\ncursors\ncursory\ncurt\ncurtail\ncurtailed\ncurtailer\ncurtailers\ncurtailing\ncurtailment\ncurtailments\ncurtails\ncurtain\ncurtained\ncurtaining\ncurtains\ncurtate\ncurter\ncurtesies\ncurtest\ncurtesy\ncurtilage\ncurtilages\ncurtly\ncurtness\ncurtsey\ncurtseyed\ncurtseying\ncurtseys\ncurtsied\ncurtsies\ncurtsy\ncurtsying\ncurule\ncurvaceous\ncurvaceously\ncurvaceousness\ncurvature\ncurvatures\ncurve\ncurveball\ncurveballs\ncurved\ncurvedness\ncurves\ncurvet\ncurvets\ncurvetted\ncurvetting\ncurvilinear\ncurvilinearity\ncurvilinearly\ncurving\ncurvy\ncuré\ncurés\ncuscus\ncuscuses\ncusec\ncusecs\ncushaw\ncushaws\ncushier\ncushiest\ncushily\ncushiness\ncushion\ncushioned\ncushioning\ncushions\ncushiony\ncushitic\ncushy\ncusk\ncusp\ncuspate\ncusped\ncuspid\ncuspidate\ncuspidation\ncuspidations\ncuspidor\ncuspidors\ncuspids\ncusps\ncuss\ncussed\ncussedly\ncussedness\ncusses\ncussing\ncussword\ncusswords\ncustard\ncustards\ncustardy\ncustodial\ncustodian\ncustodians\ncustodianship\ncustodies\ncustody\ncustom\ncustomable\ncustomarily\ncustomariness\ncustomary\ncustomer\ncustomers\ncustomhouse\ncustomhouses\ncustomizable\ncustomization\ncustomizations\ncustomize\ncustomized\ncustomizer\ncustomizers\ncustomizes\ncustomizing\ncustoms\ncut\ncutaneous\ncutaneously\ncutaway\ncutaways\ncutback\ncutbacks\ncutch\ncutches\ncute\ncutely\ncuteness\ncuter\ncutes\ncutesier\ncutesiest\ncutesiness\ncutest\ncutesy\ncutgrass\ncutgrasses\ncuticle\ncuticles\ncuticular\ncutie\ncuties\ncutin\ncutinization\ncutinize\ncutinized\ncutinizes\ncutinizing\ncutins\ncutis\ncutlass\ncutlasses\ncutler\ncutlers\ncutlery\ncutlet\ncutlets\ncutoff\ncutoffs\ncutout\ncutouts\ncutover\ncutpurse\ncutpurses\ncuts\ncuttable\ncutter\ncutters\ncutthroat\ncutthroats\ncutting\ncuttingly\ncuttings\ncuttingss\ncuttlebone\ncuttlebones\ncuttlefish\ncuttlefishes\ncutup\ncutups\ncutwater\ncutwaters\ncutwork\ncutworks\ncutworm\ncutworms\ncuvette\ncuvettes\ncuvier\ncyan\ncyanamide\ncyanamides\ncyanate\ncyanates\ncyanic\ncyanide\ncyanided\ncyanides\ncyaniding\ncyanine\ncyanines\ncyanoacrylate\ncyanoacrylates\ncyanobacterium\ncyanobacteriums\ncyanocobalamin\ncyanocobalamins\ncyanogen\ncyanogenesis\ncyanogenetic\ncyanogens\ncyanohydrin\ncyanohydrins\ncyanosed\ncyanoses\ncyanosis\ncyanotic\ncyanotype\ncyanotypes\ncyathium\ncyathiums\ncybele\ncyberconference\ncybernate\ncybernated\ncybernates\ncybernating\ncybernation\ncybernetic\ncybernetically\ncybernetician\ncyberneticians\ncyberneticist\ncyberneticists\ncybernetics\ncyberspace\ncyborg\ncyborgs\ncycad\ncycads\ncyclades\ncycladic\ncyclamate\ncyclamates\ncyclamen\ncyclamens\ncyclase\ncyclases\ncycle\ncycled\ncycler\ncyclers\ncycles\ncyclic\ncyclical\ncyclicality\ncyclically\ncycling\ncyclist\ncyclists\ncyclization\ncyclizations\ncycloalkane\ncycloalkanes\ncyclohexane\ncyclohexanes\ncycloheximide\ncycloheximides\ncycloid\ncycloidal\ncycloids\ncyclometer\ncyclometers\ncyclometric\ncyclometry\ncyclone\ncyclones\ncyclonic\ncyclonical\ncyclooxygenase\ncycloparaffin\ncycloparaffins\ncyclopean\ncyclopedia\ncyclopedias\ncyclopedic\ncyclopedist\ncyclopedists\ncyclopentane\ncyclopentanes\ncyclopes\ncyclophosphamide\ncyclophosphamides\ncycloplegia\ncycloplegias\ncyclopropane\ncyclopropanes\ncyclops\ncyclopses\ncyclorama\ncycloramas\ncycloramic\ncycloserine\ncycloserines\ncycloses\ncyclosis\ncyclosporine\ncyclosporines\ncyclostomate\ncyclostomatous\ncyclostome\ncyclostomes\ncyclostyle\ncyclostyled\ncyclostyles\ncyclostyling\ncyclothyme\ncyclothymes\ncyclothymia\ncyclothymias\ncyclothymic\ncyclotron\ncyclotrons\ncygnet\ncygnets\ncygnus\ncylinder\ncylinders\ncylindric\ncylindrical\ncylindricality\ncylindrically\ncylindroid\ncylindroids\ncyma\ncymas\ncymatia\ncymatium\ncymbal\ncymbaleer\ncymbaleers\ncymbalist\ncymbalists\ncymbals\ncymbeline\ncymbidium\ncymbidiums\ncyme\ncymene\ncymenes\ncymes\ncymiferous\ncymling\ncymlings\ncymogene\ncymogenes\ncymoid\ncymophane\ncymophanes\ncymose\ncymosely\ncymric\ncymry\ncynic\ncynical\ncynically\ncynicalness\ncynicism\ncynicisms\ncynics\ncynoscephalae\ncynosural\ncynosure\ncynosures\ncynthia\ncypress\ncypresses\ncyprian\ncyprians\ncyprinid\ncyprinids\ncyprinodont\ncyprinodonts\ncyprinoid\ncyprinoids\ncypriot\ncypriots\ncypripedium\ncypripediums\ncyproheptadine\ncyproheptadines\ncyproterone\ncyproterones\ncyprus\ncypsela\ncypselae\ncyrenaic\ncyrenaica\ncyrenaics\ncyrene\ncyrillic\ncyst\ncystectomies\ncystectomy\ncysteine\ncysteines\ncystic\ncysticerci\ncysticercoid\ncysticercoids\ncysticercosis\ncysticercus\ncystine\ncystines\ncystitis\ncystocele\ncystoceles\ncystoid\ncystoids\ncystolith\ncystoliths\ncystoscope\ncystoscopes\ncystoscopic\ncystoscopy\ncystostomies\ncystostomy\ncysts\ncythera\ncytherean\ncytidine\ncytidines\ncytochemical\ncytochemistry\ncytochrome\ncytochromes\ncytogenesis\ncytogenetic\ncytogenetical\ncytogenetically\ncytogeneticist\ncytogeneticists\ncytogenetics\ncytogeny\ncytokinesis\ncytokinetic\ncytokinin\ncytokinins\ncytologic\ncytological\ncytologist\ncytologists\ncytology\ncytolyses\ncytolysin\ncytolysins\ncytolysis\ncytolytic\ncytomegalic\ncytomegalovirus\ncytomegaloviruses\ncytomembrane\ncytomembranes\ncytopathic\ncytopathogenic\ncytopathogenicity\ncytophilic\ncytophotometer\ncytophotometers\ncytophotometric\ncytophotometrically\ncytophotometry\ncytoplasm\ncytoplasmic\ncytoplasmically\ncytoplast\ncytoplastic\ncytoplasts\ncytosine\ncytosines\ncytoskeleton\ncytoskeletons\ncytosol\ncytosols\ncytostasis\ncytostatic\ncytostatically\ncytostatics\ncytotaxonomic\ncytotaxonomies\ncytotaxonomist\ncytotaxonomists\ncytotaxonomy\ncytotechnologist\ncytotechnologists\ncytotechnology\ncytotoxic\ncytotoxicity\ncytotoxin\ncytotoxins\nczar\nczardas\nczardom\nczarevitch\nczarevitches\nczarevna\nczarevnas\nczarina\nczarinas\nczarism\nczarisms\nczarist\nczarists\nczaritza\nczaritzas\nczars\nczech\nczechoslovak\nczechoslovakia\nczechoslovakian\nczechoslovakians\nczechoslovaks\nczechs\ncádiz\ncárdenas\ncéleste\ncélestes\ncélèbre\ncélèbres\ncévennes\ncézanne\ncézannesque\ncèpe\ncèpes\ncíbola\ncórdoba\ncôte\ncôtes\nd\nd'affaires\nd'antibes\nd'aosta\nd'art\nd'azur\nd'elegance\nd'esprit\nd'estime\nd'hôte\nd'hôtel\nd'oc\nd'oeil\nd'oeuvre\nd'oeuvres\nd'oyly\nd'oïl\nd'état\nd'être\nd'œil\nd'œuvre\nd'œuvres\nda\ndab\ndabbed\ndabber\ndabbers\ndabbing\ndabble\ndabbled\ndabbler\ndabblers\ndabbles\ndabbling\ndabchick\ndabchicks\ndabs\ndacca\ndace\ndaces\ndacha\ndachas\ndachau\ndachshund\ndachshunds\ndacoit\ndacoits\ndacoity\ndacquoise\ndacquoises\ndacron\ndactinomycin\ndactinomycins\ndactyl\ndactylic\ndactylically\ndactylogram\ndactylograms\ndactylographic\ndactylography\ndactylology\ndactyls\ndad\ndada\ndadaism\ndadaist\ndadaistic\ndadaists\ndaddies\ndaddy\ndaddyish\ndado\ndadoed\ndadoes\ndadoing\ndados\ndadra\ndads\ndaedal\ndaedalian\ndaedalus\ndaemon\ndaemonic\ndaemons\ndaffier\ndaffiest\ndaffily\ndaffiness\ndaffodil\ndaffodils\ndaffy\ndaft\ndafter\ndaftest\ndaftly\ndaftness\ndag\ndagan\ndagestan\ndagger\ndaggers\ndagon\ndags\ndaguerre\ndaguerreotype\ndaguerreotyped\ndaguerreotyper\ndaguerreotypers\ndaguerreotypes\ndaguerreotyping\ndaguerreotypy\ndagwood\ndagwoods\ndahabeah\ndahabeahs\ndahl\ndahlia\ndahlias\ndahomey\ndahoon\ndahoons\ndaikon\ndailies\ndailiness\ndaily\ndaimio\ndaimios\ndaimon\ndaimons\ndaintier\ndainties\ndaintiest\ndaintily\ndaintiness\ndainty\ndaiquiri\ndaiquiris\ndairies\ndairy\ndairyer\ndairyers\ndairying\ndairymaid\ndairymaids\ndairyman\ndairymen\ndairywoman\ndairywomen\ndais\ndaises\ndaisies\ndaisy\ndakar\ndakota\ndakotan\ndakotans\ndakotas\ndalai\ndalapon\ndalapons\ndalasi\ndale\ndalek\ndaleks\ndales\ndaleth\ndalhousie\ndallas\ndalles\ndalliance\ndalliances\ndallied\ndallier\ndalliers\ndallies\ndally\ndallying\ndallyingly\ndalmatia\ndalmatian\ndalmatians\ndalmatic\ndalmatics\ndalrymple\ndalton\ndaltonian\ndaltonic\ndaltonism\ndaltons\ndam\ndamage\ndamageability\ndamageable\ndamaged\ndamager\ndamagers\ndamages\ndamaging\ndamagingly\ndaman\ndamascene\ndamascened\ndamascener\ndamasceners\ndamascenes\ndamascening\ndamascus\ndamask\ndamasked\ndamasking\ndamasks\ndame\ndames\ndaminozide\ndaminozides\ndammar\ndammars\ndammed\ndammer\ndammers\ndamming\ndammit\ndamn\ndamnable\ndamnableness\ndamnably\ndamnation\ndamnatory\ndamnder\ndamndest\ndamned\ndamneder\ndamnedest\ndamnification\ndamnified\ndamnifies\ndamnify\ndamnifying\ndamning\ndamningly\ndamns\ndamocles\ndamon\ndamp\ndamped\ndampen\ndampened\ndampener\ndampeners\ndampening\ndampens\ndamper\ndampers\ndampest\ndamping\ndampings\ndampish\ndamply\ndampness\ndamps\ndams\ndamsel\ndamselfish\ndamselfishes\ndamselflies\ndamselfly\ndamsels\ndamson\ndamsons\ndan\ndana\ndanaides\ndanaë\ndance\ndanceability\ndanceable\ndanced\ndancegoer\ndancegoers\ndancegoing\ndancer\ndancerly\ndancers\ndances\ndancewear\ndancewears\ndancier\ndanciest\ndancing\ndancingly\ndancy\ndandelion\ndandelions\ndander\ndandiacal\ndandier\ndandies\ndandiest\ndandification\ndandified\ndandifies\ndandify\ndandifying\ndandily\ndandle\ndandled\ndandles\ndandling\ndandruff\ndandruffy\ndandy\ndandyish\ndandyishly\ndandyism\ndandyisms\ndane\ndanegeld\ndanegelds\ndanelaw\ndanelaws\ndanes\ndang\ndanged\ndanger\ndangerous\ndangerously\ndangerousness\ndangers\ndangle\ndangleberries\ndangleberry\ndangled\ndangler\ndanglers\ndangles\ndangling\ndangly\ndangs\ndaniel\ndanielle\ndanio\ndanios\ndanish\ndanishes\ndanite\ndanites\ndank\ndanker\ndankest\ndankly\ndankness\ndans\ndanseur\ndanseurs\ndanseuse\ndanseuses\ndante\ndantean\ndanteans\ndantesque\ndanton\ndanube\ndanubian\ndanville\ndanzig\ndap\ndaphne\ndaphnes\ndaphnia\ndaphnis\ndapped\ndapper\ndapperly\ndapperness\ndapping\ndapple\ndappled\ndapples\ndappling\ndaps\ndapsone\ndapsones\ndardanelles\ndardanus\ndare\ndared\ndaredevil\ndaredevilry\ndaredevils\ndaredeviltry\ndaren\ndaren't\ndarer\ndarers\ndares\ndaresay\ndaring\ndaringly\ndaringness\ndariole\ndarioles\ndarius\ndarién\ndarjeeling\ndark\ndarken\ndarkened\ndarkener\ndarkeners\ndarkening\ndarkens\ndarker\ndarkest\ndarkish\ndarkle\ndarkled\ndarkles\ndarkling\ndarklings\ndarkly\ndarkness\ndarkroom\ndarkrooms\ndarks\ndarksome\ndarlene\ndarling\ndarlingly\ndarlingness\ndarlings\ndarn\ndarnation\ndarned\ndarnedest\ndarnedests\ndarnel\ndarnels\ndarner\ndarners\ndarning\ndarnley\ndarns\ndaro\ndart\ndartboard\ndartboards\ndarted\ndarter\ndarters\ndarting\ndartmouth\ndarts\ndarvon\ndarwin\ndarwinian\ndarwinians\ndarwinism\ndarwinist\ndarwinistic\ndarwinists\ndash\ndashboard\ndashboards\ndashed\ndasheen\ndasheens\ndasher\ndashers\ndashes\ndashi\ndashiki\ndashikis\ndashing\ndashingly\ndashis\ndashpot\ndashpots\ndassie\ndassies\ndastard\ndastardliness\ndastardly\ndastards\ndasyure\ndasyures\ndata\ndatabanks\ndatabase\ndatabased\ndatabases\ndatabasing\ndatable\ndatagram\ndatamation\ndate\ndateable\ndated\ndatedly\ndatedness\ndateless\ndateline\ndatelined\ndatelines\ndatelining\ndater\ndaters\ndates\ndating\ndative\ndatively\ndatives\ndatum\ndatums\ndatura\ndaturas\ndaub\ndaubed\ndauber\ndaubers\ndaubery\ndaubing\ndaubs\ndaugavpils\ndaughter\ndaughterless\ndaughterly\ndaughters\ndaunt\ndaunted\ndaunter\ndaunters\ndaunting\ndauntingly\ndauntless\ndauntlessly\ndauntlessness\ndaunts\ndauphin\ndauphine\ndauphines\ndauphins\ndauphiné\ndave\ndavenant\ndavenport\ndavenports\ndavid\ndavit\ndavits\ndavos\ndavy\ndaw\ndawdle\ndawdled\ndawdler\ndawdlers\ndawdles\ndawdling\ndawdlingly\ndawn\ndawned\ndawning\ndawns\ndaws\nday\ndayak\ndayaks\ndaybed\ndaybeds\ndaybook\ndaybooks\ndaybreak\ndaybreaks\ndaycare\ndaydream\ndaydreamed\ndaydreamer\ndaydreamers\ndaydreaming\ndaydreams\ndaydreamt\ndayflies\ndayflower\ndayflowers\ndayfly\ndayhop\ndayhops\ndaylight\ndaylights\ndaylilies\ndaylily\ndaylong\ndaypack\ndaypacks\ndayroom\ndayrooms\ndays\ndayside\ndaysides\ndayspring\ndaystar\ndaystars\ndaytime\ndaytimes\ndayton\ndaytona\ndaywear\ndaze\ndazed\ndazedly\ndazedness\ndazes\ndazing\ndazzle\ndazzled\ndazzler\ndazzlers\ndazzles\ndazzling\ndazzlingly\nde\ndeaccession\ndeaccessioned\ndeaccessioning\ndeaccessions\ndeacidification\ndeacidified\ndeacidifies\ndeacidify\ndeacidifying\ndeacon\ndeaconess\ndeaconesses\ndeaconries\ndeaconry\ndeacons\ndeactivate\ndeactivated\ndeactivates\ndeactivating\ndeactivation\ndeactivations\ndeactivator\ndeactivators\ndead\ndeadbeat\ndeadbeats\ndeadbolt\ndeadbolts\ndeaden\ndeadened\ndeadener\ndeadeners\ndeadening\ndeadeningly\ndeadenings\ndeadens\ndeader\ndeadest\ndeadeye\ndeadeyes\ndeadfall\ndeadfalls\ndeadhead\ndeadheaded\ndeadheading\ndeadheads\ndeadlier\ndeadliest\ndeadlight\ndeadlights\ndeadline\ndeadlined\ndeadlines\ndeadliness\ndeadlining\ndeadlock\ndeadlocked\ndeadlocking\ndeadlocks\ndeadly\ndeadness\ndeadpan\ndeadpanned\ndeadpanner\ndeadpanners\ndeadpanning\ndeadpans\ndeadweight\ndeadwood\ndeaerate\ndeaerated\ndeaerates\ndeaerating\ndeaeration\ndeaerator\ndeaerators\ndeaf\ndeafen\ndeafened\ndeafening\ndeafeningly\ndeafens\ndeafer\ndeafest\ndeafly\ndeafness\ndeal\ndealate\ndealated\ndealateds\ndealates\ndealation\ndealcoholization\ndealcoholize\ndealcoholized\ndealcoholizes\ndealcoholizing\ndealer\ndealers\ndealership\ndealerships\ndealfish\ndealfishes\ndealignment\ndealignments\ndealing\ndealings\ndeallocate\ndeallocated\ndeallocates\ndeallocating\ndeallocation\ndeallocations\ndeallocator\ndealmaker\ndealmakers\ndealmaking\ndeals\ndealt\ndeaminase\ndeaminases\ndeaminate\ndeaminated\ndeaminates\ndeaminating\ndeamination\ndeaminization\ndeaminize\ndeaminized\ndeaminizes\ndeaminizing\ndean\ndeaneries\ndeanery\ndeans\ndeanship\ndear\ndearborn\ndearer\ndearest\ndearly\ndearness\ndears\ndearth\ndeath\ndeathbed\ndeathbeds\ndeathblow\ndeathblows\ndeathless\ndeathlessly\ndeathlessness\ndeathlike\ndeathly\ndeaths\ndeathtrap\ndeathtraps\ndeathward\ndeathwatch\ndeathwatches\ndeattribution\ndeattributions\ndeauville\ndeb\ndebacle\ndebacles\ndebar\ndebark\ndebarkation\ndebarkations\ndebarked\ndebarking\ndebarks\ndebarment\ndebarments\ndebarred\ndebarring\ndebars\ndebase\ndebased\ndebasement\ndebasements\ndebaser\ndebasers\ndebases\ndebasing\ndebatable\ndebatably\ndebate\ndebated\ndebatement\ndebater\ndebaters\ndebates\ndebating\ndebauch\ndebauched\ndebauchedly\ndebauchee\ndebauchees\ndebaucher\ndebaucheries\ndebauchers\ndebauchery\ndebauches\ndebauching\ndebenture\ndebentures\ndebilitate\ndebilitated\ndebilitates\ndebilitating\ndebilitation\ndebilitations\ndebilitative\ndebilities\ndebility\ndebit\ndebited\ndebiting\ndebits\ndebonair\ndebonairly\ndebonairness\ndebone\ndeboned\ndeboner\ndeboners\ndebones\ndeboning\ndeborah\ndebouch\ndebouched\ndebouches\ndebouching\ndebouchment\ndebouchments\ndebouchure\ndebouchures\ndebra\ndebrief\ndebriefed\ndebriefing\ndebriefings\ndebriefs\ndebris\ndebt\ndebtless\ndebtor\ndebtors\ndebts\ndebug\ndebugged\ndebugger\ndebuggers\ndebugging\ndebugs\ndebunk\ndebunked\ndebunker\ndebunkers\ndebunking\ndebunks\ndebussy\ndebut\ndebutant\ndebutante\ndebutantes\ndebutants\ndebuted\ndebuting\ndebuts\ndecaampere\ndecaamperes\ndecabecquerel\ndecabecquerels\ndecacandela\ndecacandelas\ndecacoulomb\ndecacoulombs\ndecade\ndecadelong\ndecadence\ndecadencies\ndecadency\ndecadent\ndecadently\ndecadents\ndecades\ndecaf\ndecafarad\ndecafarads\ndecaffeinate\ndecaffeinated\ndecaffeinates\ndecaffeinating\ndecaffeination\ndecagon\ndecagonal\ndecagonally\ndecagons\ndecagram\ndecagrams\ndecagynous\ndecahedra\ndecahedral\ndecahedron\ndecahedrons\ndecahenries\ndecahenry\ndecahenrys\ndecahertz\ndecajoule\ndecajoules\ndecakelvin\ndecakelvins\ndecal\ndecalcification\ndecalcified\ndecalcifier\ndecalcifiers\ndecalcifies\ndecalcify\ndecalcifying\ndecalcomania\ndecalescence\ndecalescences\ndecalescent\ndecaliter\ndecaliters\ndecalogue\ndecalogues\ndecals\ndecalumen\ndecalumens\ndecalux\ndecameron\ndecameter\ndecameters\ndecametric\ndecamole\ndecamoles\ndecamp\ndecamped\ndecamping\ndecampment\ndecamps\ndecandrous\ndecane\ndecanes\ndecanewton\ndecanewtons\ndecant\ndecantation\ndecanted\ndecanter\ndecanters\ndecanting\ndecants\ndecaohm\ndecaohms\ndecapascal\ndecapascals\ndecapitate\ndecapitated\ndecapitates\ndecapitating\ndecapitation\ndecapitations\ndecapitator\ndecapitators\ndecapod\ndecapodal\ndecapodan\ndecapodous\ndecapods\ndecapolis\ndecaradian\ndecaradians\ndecarbonate\ndecarbonated\ndecarbonates\ndecarbonating\ndecarbonation\ndecarbonization\ndecarbonize\ndecarbonized\ndecarbonizer\ndecarbonizers\ndecarbonizes\ndecarbonizing\ndecarboxylase\ndecarboxylases\ndecarboxylation\ndecarboxylations\ndecarburization\ndecarburize\ndecarburized\ndecarburizes\ndecarburizing\ndecare\ndecares\ndecasecond\ndecaseconds\ndecasiemens\ndecasievert\ndecasieverts\ndecasteradian\ndecasteradians\ndecastyle\ndecastyles\ndecasualization\ndecasyllabic\ndecasyllabics\ndecasyllable\ndecasyllables\ndecatesla\ndecateslas\ndecathlete\ndecathletes\ndecathlon\ndecathlons\ndecatur\ndecavolt\ndecavolts\ndecawatt\ndecawatts\ndecaweber\ndecawebers\ndecay\ndecayed\ndecayer\ndecayers\ndecaying\ndecays\ndecca\ndeccan\ndecease\ndeceased\ndeceases\ndeceasing\ndecedent\ndecedents\ndeceit\ndeceitful\ndeceitfully\ndeceitfulness\ndeceits\ndeceivable\ndeceive\ndeceived\ndeceiver\ndeceivers\ndeceives\ndeceiving\ndeceivingly\ndecelerate\ndecelerated\ndecelerates\ndecelerating\ndeceleration\ndecelerations\ndecelerator\ndecelerators\ndecember\ndecembers\ndecembrist\ndecembrists\ndecemvir\ndecemviral\ndecemvirate\ndecemvirates\ndecemviri\ndecemvirs\ndecencies\ndecency\ndecennaries\ndecennary\ndecennia\ndecennial\ndecennially\ndecennials\ndecennium\ndecenniums\ndecent\ndecently\ndecentness\ndecentralization\ndecentralizationist\ndecentralizationists\ndecentralizations\ndecentralize\ndecentralized\ndecentralizes\ndecentralizing\ndeception\ndeceptional\ndeceptions\ndeceptive\ndeceptively\ndeceptiveness\ndecerebrate\ndecerebrated\ndecerebrates\ndecerebrating\ndecerebration\ndecertification\ndecertified\ndecertifies\ndecertify\ndecertifying\ndechlorinate\ndechlorinated\ndechlorinates\ndechlorinating\ndechlorination\ndeciampere\ndeciamperes\ndeciare\ndeciares\ndecibecquerel\ndecibecquerels\ndecibel\ndecibels\ndecicandela\ndecicandelas\ndecicoulomb\ndecicoulombs\ndecidability\ndecidable\ndecide\ndecided\ndecidedly\ndecidedness\ndecider\ndeciders\ndecides\ndeciding\ndecidua\ndeciduae\ndecidual\ndeciduas\ndeciduate\ndeciduous\ndeciduously\ndeciduousness\ndecifarad\ndecifarads\ndecigram\ndecigrams\ndecihenries\ndecihenry\ndecihenrys\ndecihertz\ndecijoule\ndecijoules\ndecikelvin\ndecikelvins\ndecile\ndeciles\ndeciliter\ndeciliters\ndecillion\ndecillions\ndecillionth\ndecillionths\ndecilumen\ndecilumens\ndecilux\ndecimal\ndecimalization\ndecimalize\ndecimalized\ndecimalizes\ndecimalizing\ndecimally\ndecimals\ndecimate\ndecimated\ndecimates\ndecimating\ndecimation\ndecimations\ndecimator\ndecimators\ndecimeter\ndecimeters\ndecimole\ndecimoles\ndecinewton\ndecinewtons\ndeciohm\ndeciohms\ndecipascal\ndecipascals\ndecipher\ndecipherability\ndecipherable\ndeciphered\ndecipherer\ndecipherers\ndeciphering\ndecipherment\ndeciphers\ndeciradian\ndeciradians\ndecisecond\ndeciseconds\ndecisiemens\ndecisievert\ndecisieverts\ndecision\ndecisional\ndecisioned\ndecisioning\ndecisions\ndecisive\ndecisively\ndecisiveness\ndecisteradian\ndecisteradians\ndecitesla\ndeciteslas\ndecivolt\ndecivolts\ndeciwatt\ndeciwatts\ndeciweber\ndeciwebers\ndeck\ndecked\ndecker\ndeckers\ndeckhand\ndeckhands\ndeckhouse\ndeckhouses\ndecking\ndeckle\ndeckled\ndeckles\ndeckling\ndecks\ndeclaim\ndeclaimed\ndeclaimer\ndeclaimers\ndeclaiming\ndeclaims\ndeclamation\ndeclamations\ndeclamatory\ndeclarable\ndeclarant\ndeclarants\ndeclaration\ndeclarations\ndeclarative\ndeclaratively\ndeclaratives\ndeclaratory\ndeclare\ndeclared\ndeclarer\ndeclarers\ndeclares\ndeclaring\ndeclass\ndeclassed\ndeclasses\ndeclassifiable\ndeclassification\ndeclassifications\ndeclassified\ndeclassifies\ndeclassify\ndeclassifying\ndeclassing\ndeclaw\ndeclawed\ndeclawing\ndeclaws\ndeclension\ndeclensional\ndeclensions\ndeclinable\ndeclination\ndeclinational\ndeclinations\ndecline\ndeclined\ndecliner\ndecliners\ndeclines\ndeclining\ndeclivities\ndeclivitous\ndeclivity\ndeco\ndecoct\ndecocted\ndecocting\ndecoction\ndecoctions\ndecocts\ndecode\ndecoded\ndecoder\ndecoders\ndecodes\ndecoding\ndecodings\ndecollate\ndecollated\ndecollates\ndecollating\ndecollation\ndecollations\ndecollator\ndecollators\ndecollectivization\ndecollectivize\ndecollectivized\ndecollectivizes\ndecollectivizing\ndecolonization\ndecolonize\ndecolonized\ndecolonizes\ndecolonizing\ndecolorant\ndecolorants\ndecolorization\ndecolorize\ndecolorized\ndecolorizer\ndecolorizers\ndecolorizes\ndecolorizing\ndecommission\ndecommissioned\ndecommissioning\ndecommissions\ndecompensate\ndecompensated\ndecompensates\ndecompensating\ndecompensation\ndecompile\ndecompiled\ndecompiler\ndecompilers\ndecompiles\ndecompiling\ndecomposability\ndecomposable\ndecompose\ndecomposed\ndecomposer\ndecomposers\ndecomposes\ndecomposing\ndecomposition\ndecompositional\ndecompositions\ndecompound\ndecompounded\ndecompounding\ndecompounds\ndecompress\ndecompressed\ndecompresses\ndecompressing\ndecompression\ndecompressions\ndeconcentrate\ndeconcentrated\ndeconcentrates\ndeconcentrating\ndeconcentration\ndecondition\ndeconditioned\ndeconditioning\ndeconditions\ndecongest\ndecongestant\ndecongestants\ndecongested\ndecongesting\ndecongestion\ndecongestive\ndecongests\ndeconsecrate\ndeconsecrated\ndeconsecrates\ndeconsecrating\ndeconsecration\ndeconsecrations\ndeconstruct\ndeconstructed\ndeconstructing\ndeconstruction\ndeconstructionism\ndeconstructionist\ndeconstructionists\ndeconstructs\ndecontaminant\ndecontaminate\ndecontaminated\ndecontaminates\ndecontaminating\ndecontamination\ndecontaminations\ndecontaminator\ndecontaminators\ndecontextualize\ndecontextualized\ndecontextualizes\ndecontextualizing\ndecontrol\ndecontrolled\ndecontrolling\ndecontrols\ndecor\ndecorate\ndecorated\ndecorates\ndecorating\ndecoration\ndecorations\ndecorative\ndecoratively\ndecorativeness\ndecorator\ndecorators\ndecorous\ndecorously\ndecorousness\ndecors\ndecorticate\ndecorticated\ndecorticates\ndecorticating\ndecortication\ndecorticator\ndecorticators\ndecorum\ndecos\ndecoupage\ndecoupages\ndecouple\ndecoupled\ndecoupler\ndecouplers\ndecouples\ndecoupling\ndecoy\ndecoyed\ndecoyer\ndecoyers\ndecoying\ndecoys\ndecrease\ndecreased\ndecreases\ndecreasing\ndecreasingly\ndecree\ndecreeable\ndecreed\ndecreeing\ndecreer\ndecreers\ndecrees\ndecrement\ndecremental\ndecremented\ndecrementing\ndecrements\ndecreolization\ndecreolizations\ndecrepit\ndecrepitate\ndecrepitated\ndecrepitates\ndecrepitating\ndecrepitation\ndecrepitly\ndecrepitude\ndecrescendo\ndecrescendos\ndecrescent\ndecretal\ndecretals\ndecretive\ndecretory\ndecried\ndecrier\ndecriers\ndecries\ndecriminalization\ndecriminalize\ndecriminalized\ndecriminalizes\ndecriminalizing\ndecry\ndecrying\ndecrypt\ndecrypted\ndecrypting\ndecryption\ndecrypts\ndecumbence\ndecumbency\ndecumbent\ndecuple\ndecurrent\ndecurrently\ndecussate\ndecussated\ndecussately\ndecussates\ndecussating\ndecussation\ndecussations\ndedans\ndedicate\ndedicated\ndedicatedly\ndedicatee\ndedicatees\ndedicates\ndedicating\ndedication\ndedications\ndedicative\ndedicator\ndedicators\ndedicatory\ndedifferentiate\ndedifferentiated\ndedifferentiates\ndedifferentiating\ndedifferentiation\ndeduce\ndeduced\ndeduces\ndeducible\ndeducing\ndeduct\ndeducted\ndeductibility\ndeductible\ndeductibles\ndeducting\ndeduction\ndeductions\ndeductive\ndeductively\ndeducts\ndeed\ndeeded\ndeeding\ndeedless\ndeeds\ndeejay\ndeejays\ndeem\ndeemed\ndeeming\ndeems\ndeep\ndeepen\ndeepened\ndeepening\ndeepens\ndeeper\ndeepest\ndeepfreeze\ndeeply\ndeepness\ndeeps\ndeepwater\ndeer\ndeerflies\ndeerfly\ndeerhound\ndeerhounds\ndeerskin\ndeerskins\ndeerstalker\ndeerstalkers\ndeeryard\ndeeryards\ndeescalate\ndeescalated\ndeescalates\ndeescalating\ndeet\ndeets\ndeface\ndefaceable\ndefaced\ndefacement\ndefacements\ndefacer\ndefacers\ndefaces\ndefacing\ndefalcate\ndefalcated\ndefalcates\ndefalcating\ndefalcation\ndefalcations\ndefalcator\ndefalcators\ndefamation\ndefamatory\ndefame\ndefamed\ndefamer\ndefamers\ndefames\ndefaming\ndefang\ndefanged\ndefanging\ndefangs\ndefat\ndefats\ndefatted\ndefatting\ndefault\ndefaulted\ndefaulter\ndefaulters\ndefaulting\ndefaults\ndefeasance\ndefeasances\ndefeasibility\ndefeasible\ndefeasibleness\ndefeat\ndefeated\ndefeater\ndefeaters\ndefeating\ndefeatism\ndefeatist\ndefeatists\ndefeats\ndefecate\ndefecated\ndefecates\ndefecating\ndefecation\ndefecations\ndefecator\ndefecators\ndefect\ndefected\ndefecting\ndefection\ndefections\ndefective\ndefectively\ndefectiveness\ndefectives\ndefector\ndefectors\ndefects\ndefeminize\ndefeminized\ndefeminizes\ndefeminizing\ndefend\ndefendable\ndefendant\ndefendants\ndefended\ndefender\ndefenders\ndefending\ndefends\ndefenestrate\ndefenestrated\ndefenestrates\ndefenestrating\ndefenestration\ndefenestrations\ndefense\ndefensed\ndefenseless\ndefenselessly\ndefenselessness\ndefenseman\ndefensemen\ndefenses\ndefensibility\ndefensible\ndefensibleness\ndefensibly\ndefensing\ndefensive\ndefensively\ndefensiveness\ndefensives\ndefer\ndeference\ndeferens\ndeferent\ndeferentia\ndeferential\ndeferentially\ndeferment\ndeferments\ndeferrable\ndeferral\ndeferrals\ndeferred\ndeferrer\ndeferrers\ndeferring\ndefers\ndefervesce\ndefervesced\ndefervescence\ndefervescences\ndefervescent\ndefervesces\ndefervescing\ndefiance\ndefiant\ndefiantly\ndefibrillate\ndefibrillated\ndefibrillates\ndefibrillating\ndefibrillation\ndefibrillative\ndefibrillator\ndefibrillators\ndefibrillatory\ndeficiencies\ndeficiency\ndeficient\ndeficiently\ndeficit\ndeficits\ndefied\ndefier\ndefiers\ndefies\ndefilade\ndefiladed\ndefilades\ndefilading\ndefile\ndefiled\ndefilement\ndefiler\ndefilers\ndefiles\ndefiling\ndefilingly\ndefinability\ndefinable\ndefinably\ndefine\ndefined\ndefinement\ndefiner\ndefiners\ndefines\ndefinienda\ndefiniendum\ndefiniens\ndefinientia\ndefining\ndefinite\ndefinitely\ndefiniteness\ndefinition\ndefinitional\ndefinitions\ndefinitive\ndefinitively\ndefinitiveness\ndefinitives\ndefinitude\ndefinitudes\ndeflagrate\ndeflagrated\ndeflagrates\ndeflagrating\ndeflagration\ndeflate\ndeflated\ndeflates\ndeflating\ndeflation\ndeflationary\ndeflationist\ndeflationists\ndeflations\ndeflator\ndeflators\ndeflect\ndeflectable\ndeflected\ndeflecting\ndeflection\ndeflections\ndeflective\ndeflector\ndeflectors\ndeflects\ndeflexed\ndeflexion\ndeflexions\ndefloration\ndeflorations\ndeflower\ndeflowered\ndeflowerer\ndeflowerers\ndeflowering\ndeflowers\ndefoam\ndefoamed\ndefoaming\ndefoams\ndefocus\ndefocused\ndefocuses\ndefocusing\ndefocussed\ndefocusses\ndefocussing\ndefoe\ndefog\ndefogged\ndefogger\ndefoggers\ndefogging\ndefogs\ndefoliant\ndefoliants\ndefoliate\ndefoliated\ndefoliates\ndefoliating\ndefoliation\ndefoliator\ndefoliators\ndeforce\ndeforced\ndeforcement\ndeforces\ndeforcing\ndeforest\ndeforestation\ndeforested\ndeforester\ndeforesters\ndeforesting\ndeforests\ndeform\ndeformability\ndeformable\ndeformation\ndeformational\ndeformations\ndeformed\ndeforming\ndeformities\ndeformity\ndeforms\ndefraud\ndefraudation\ndefrauded\ndefrauder\ndefrauders\ndefrauding\ndefrauds\ndefray\ndefrayable\ndefrayal\ndefrayals\ndefrayed\ndefraying\ndefrays\ndefrock\ndefrocked\ndefrocking\ndefrocks\ndefrost\ndefrosted\ndefroster\ndefrosters\ndefrosting\ndefrosts\ndeft\ndefter\ndeftest\ndeftly\ndeftness\ndefuel\ndefueled\ndefueling\ndefuels\ndefunct\ndefunctive\ndefunctness\ndefund\ndefunded\ndefunding\ndefunds\ndefuse\ndefused\ndefuses\ndefusing\ndefy\ndefying\ndegas\ndegassed\ndegasses\ndegassing\ndegauss\ndegaussed\ndegausser\ndegaussers\ndegausses\ndegaussing\ndegeneracies\ndegeneracy\ndegenerate\ndegenerated\ndegenerately\ndegenerateness\ndegenerates\ndegenerating\ndegeneration\ndegenerations\ndegenerative\ndeglamorize\ndeglamorized\ndeglamorizes\ndeglamorizing\ndeglaze\ndeglazed\ndeglazes\ndeglazing\ndeglutinate\ndeglutinated\ndeglutinates\ndeglutinating\ndeglutination\ndeglutition\ndeglutitory\ndeglycerolize\ndeglycerolized\ndeglycerolizes\ndeglycerolizing\ndegradability\ndegradable\ndegradation\ndegradations\ndegrade\ndegraded\ndegradedly\ndegradedness\ndegrader\ndegraders\ndegrades\ndegrading\ndegradingly\ndegranulation\ndegrease\ndegreased\ndegreaser\ndegreasers\ndegreases\ndegreasing\ndegree\ndegreed\ndegrees\ndegression\ndegressions\ndegressive\ndegressively\ndegum\ndegumming\ndegust\ndegustation\ndegusted\ndegusting\ndegusts\ndehire\ndehired\ndehires\ndehiring\ndehisce\ndehisced\ndehiscence\ndehiscent\ndehisces\ndehiscing\ndehorn\ndehorned\ndehorning\ndehorns\ndehumanization\ndehumanize\ndehumanized\ndehumanizes\ndehumanizing\ndehumidification\ndehumidifications\ndehumidified\ndehumidifier\ndehumidifiers\ndehumidifies\ndehumidify\ndehumidifying\ndehydratase\ndehydratases\ndehydrate\ndehydrated\ndehydrates\ndehydrating\ndehydration\ndehydrator\ndehydrators\ndehydrochlorinase\ndehydrochlorinases\ndehydrochlorinate\ndehydrochlorinated\ndehydrochlorinates\ndehydrochlorinating\ndehydrochlorination\ndehydrogenase\ndehydrogenases\ndehydrogenate\ndehydrogenated\ndehydrogenates\ndehydrogenating\ndehydrogenation\ndehydrogenization\ndehydrogenize\ndehydrogenized\ndehydrogenizes\ndehydrogenizing\ndehypnotize\ndehypnotized\ndehypnotizes\ndehypnotizing\ndei\ndeice\ndeiced\ndeicer\ndeicers\ndeices\ndeicide\ndeicides\ndeicing\ndeictic\ndeictically\ndeific\ndeification\ndeified\ndeifier\ndeifiers\ndeifies\ndeify\ndeifying\ndeign\ndeigned\ndeigning\ndeigns\ndeimos\ndeindustrialization\ndeindustrialize\ndeindustrialized\ndeindustrializes\ndeindustrializing\ndeinstitutionalization\ndeinstitutionalize\ndeinstitutionalized\ndeinstitutionalizes\ndeinstitutionalizing\ndeionization\ndeionize\ndeionized\ndeionizer\ndeionizers\ndeionizes\ndeionizing\ndeipnosophist\ndeipnosophists\ndeirdre\ndeism\ndeist\ndeistic\ndeistical\ndeistically\ndeists\ndeities\ndeity\ndeject\ndejected\ndejectedly\ndejectedness\ndejecting\ndejection\ndejects\ndekagram\ndekagrams\ndekaliter\ndekaliters\ndekameter\ndekameters\ndeke\ndeked\ndekes\ndeking\ndekker\ndel\ndelacroix\ndelaminate\ndelaminated\ndelaminates\ndelaminating\ndelamination\ndelaminations\ndelate\ndelated\ndelates\ndelating\ndelation\ndelations\ndelator\ndelators\ndelaware\ndelawarean\ndelawares\ndelay\ndelayed\ndelayer\ndelayers\ndelaying\ndelays\ndele\ndelectability\ndelectable\ndelectableness\ndelectables\ndelectably\ndelectation\ndelectations\ndeled\ndelegable\ndelegacies\ndelegacy\ndelegalization\ndelegalize\ndelegalized\ndelegalizes\ndelegalizing\ndelegate\ndelegated\ndelegates\ndelegating\ndelegation\ndelegations\ndelegator\ndelegators\ndelegitimization\ndelegitimize\ndelegitimized\ndelegitimizes\ndelegitimizing\ndeleing\ndeles\ndelete\ndeleted\ndeleterious\ndeleteriously\ndeleteriousness\ndeletes\ndeleting\ndeletion\ndeletions\ndelft\ndelfts\ndelftware\ndelhi\ndeli\ndeliberant\ndeliberate\ndeliberated\ndeliberately\ndeliberateness\ndeliberates\ndeliberating\ndeliberation\ndeliberations\ndeliberative\ndeliberatively\ndeliberativeness\ndeliberator\ndeliberators\ndelicacies\ndelicacy\ndelicate\ndelicately\ndelicateness\ndelicates\ndelicatessen\ndelicatessens\ndelicious\ndeliciously\ndeliciousness\ndelict\ndelicti\ndelicto\ndelicts\ndelight\ndelighted\ndelightedly\ndelightedness\ndelighter\ndelighters\ndelightful\ndelightfully\ndelightfulness\ndelighting\ndelights\ndelightsome\ndelightsomely\ndelightsomeness\ndelilah\ndelimit\ndelimitate\ndelimitated\ndelimitates\ndelimitating\ndelimitation\ndelimitative\ndelimited\ndelimiter\ndelimiters\ndelimiting\ndelimits\ndelineate\ndelineated\ndelineates\ndelineating\ndelineation\ndelineations\ndelineative\ndelineator\ndelineators\ndelinquencies\ndelinquency\ndelinquent\ndelinquently\ndelinquents\ndeliquesce\ndeliquesced\ndeliquescence\ndeliquescent\ndeliquesces\ndeliquescing\ndeliria\ndeliriant\ndelirious\ndeliriously\ndeliriousness\ndelirium\ndeliriums\ndelis\ndelist\ndelisted\ndelisting\ndelists\ndeliver\ndeliverability\ndeliverable\ndeliverables\ndeliverance\ndelivered\ndeliverer\ndeliverers\ndeliveries\ndelivering\ndelivers\ndelivery\ndeliveryman\ndeliverymen\ndell\ndell'arte\ndells\ndelmonico\ndelocalization\ndelocalize\ndelocalized\ndelocalizes\ndelocalizing\ndelouse\ndeloused\ndelouses\ndelousing\ndelphi\ndelphian\ndelphic\ndelphically\ndelphinium\ndelphiniums\ndelphinus\ndelta\ndeltaic\ndeltas\ndeltic\ndeltiology\ndeltoid\ndeltoids\ndelude\ndeluded\ndeluder\ndeluders\ndeludes\ndeluding\ndeludingly\ndeluge\ndeluged\ndeluges\ndeluging\ndelusion\ndelusional\ndelusionary\ndelusions\ndelusive\ndelusively\ndelusiveness\ndelusory\ndeluster\ndeluxe\ndelve\ndelved\ndelver\ndelvers\ndelves\ndelving\ndemagnetization\ndemagnetize\ndemagnetized\ndemagnetizer\ndemagnetizers\ndemagnetizes\ndemagnetizing\ndemagnification\ndemagog\ndemagogic\ndemagogically\ndemagogism\ndemagogs\ndemagogue\ndemagoguery\ndemagogues\ndemagogy\ndemand\ndemandable\ndemanded\ndemander\ndemanders\ndemanding\ndemandingly\ndemands\ndemantoid\ndemantoids\ndemarcate\ndemarcated\ndemarcates\ndemarcating\ndemarcation\ndemarcations\ndemarcator\ndemarcators\ndemark\ndematerialization\ndematerialize\ndematerialized\ndematerializes\ndematerializing\ndeme\ndemean\ndemeaned\ndemeaning\ndemeaningly\ndemeanor\ndemeanors\ndemeans\ndement\ndemented\ndementedly\ndementedness\ndementia\ndemential\ndementing\ndements\ndemerit\ndemeritorious\ndemeritoriously\ndemerits\ndemerol\ndemersal\ndemes\ndemesne\ndemesnes\ndemeter\ndemeton\ndemetons\ndemies\ndemigod\ndemigoddess\ndemigoddesses\ndemigods\ndemijohn\ndemijohns\ndemilitarization\ndemilitarize\ndemilitarized\ndemilitarizes\ndemilitarizing\ndemimondaine\ndemimondaines\ndemimonde\ndemimondes\ndemineralization\ndemineralize\ndemineralized\ndemineralizer\ndemineralizers\ndemineralizes\ndemineralizing\ndemirelief\ndemireliefs\ndemirep\ndemireps\ndemisable\ndemise\ndemised\ndemisemiquaver\ndemisemiquavers\ndemises\ndemising\ndemission\ndemissions\ndemit\ndemitasse\ndemitasses\ndemits\ndemitted\ndemitting\ndemiurge\ndemiurgeous\ndemiurges\ndemiurgic\ndemiurgical\ndemiurgically\ndemiworld\ndemiworlds\ndemo\ndemob\ndemobbed\ndemobbing\ndemobilization\ndemobilize\ndemobilized\ndemobilizes\ndemobilizing\ndemobs\ndemocracies\ndemocracy\ndemocrat\ndemocratic\ndemocratically\ndemocratization\ndemocratize\ndemocratized\ndemocratizer\ndemocratizes\ndemocratizing\ndemocrats\ndemocritus\ndemodulate\ndemodulated\ndemodulates\ndemodulating\ndemodulation\ndemodulations\ndemodulator\ndemodulators\ndemoed\ndemogorgon\ndemographer\ndemographers\ndemographic\ndemographical\ndemographically\ndemographics\ndemography\ndemoing\ndemoiselle\ndemoiselles\ndemolish\ndemolished\ndemolisher\ndemolishers\ndemolishes\ndemolishing\ndemolishment\ndemolition\ndemolitionist\ndemolitionists\ndemolitions\ndemon\ndemonetization\ndemonetizations\ndemonetize\ndemonetized\ndemonetizes\ndemonetizing\ndemoniac\ndemoniacal\ndemoniacally\ndemonian\ndemonic\ndemonical\ndemonically\ndemonism\ndemonization\ndemonize\ndemonized\ndemonizes\ndemonizing\ndemonolatry\ndemonologic\ndemonological\ndemonologist\ndemonologists\ndemonology\ndemons\ndemonstrability\ndemonstrable\ndemonstrableness\ndemonstrably\ndemonstrandum\ndemonstrate\ndemonstrated\ndemonstrates\ndemonstrating\ndemonstration\ndemonstrational\ndemonstrations\ndemonstrative\ndemonstratively\ndemonstrativeness\ndemonstratives\ndemonstrator\ndemonstrators\ndemoralization\ndemoralize\ndemoralized\ndemoralizer\ndemoralizers\ndemoralizes\ndemoralizing\ndemoralizingly\ndemos\ndemosthenes\ndemote\ndemoted\ndemotes\ndemotic\ndemoting\ndemotion\ndemotions\ndemount\ndemountable\ndemounted\ndemounting\ndemounts\ndemulcent\ndemulcents\ndemur\ndemure\ndemurely\ndemureness\ndemurer\ndemurest\ndemurrable\ndemurrage\ndemurrages\ndemurral\ndemurrals\ndemurred\ndemurrer\ndemurrers\ndemurring\ndemurs\ndemy\ndemyelinate\ndemyelinated\ndemyelinates\ndemyelinating\ndemyelination\ndemystification\ndemystified\ndemystifier\ndemystifiers\ndemystifies\ndemystify\ndemystifying\ndemythologization\ndemythologize\ndemythologized\ndemythologizer\ndemythologizers\ndemythologizes\ndemythologizing\nden\ndenarii\ndenarius\ndenary\ndenationalization\ndenationalize\ndenationalized\ndenationalizes\ndenationalizing\ndenaturalization\ndenaturalize\ndenaturalized\ndenaturalizes\ndenaturalizing\ndenaturant\ndenaturants\ndenaturation\ndenature\ndenatured\ndenatures\ndenaturing\ndendriform\ndendrimers\ndendrite\ndendrites\ndendritic\ndendritically\ndendrobium\ndendrobiums\ndendrochronological\ndendrochronologically\ndendrochronologist\ndendrochronologists\ndendrochronology\ndendroid\ndendrologic\ndendrological\ndendrologist\ndendrologists\ndendrology\ndendron\ndendrons\ndene\ndeneb\ndenebola\ndenegation\ndenegations\ndenervate\ndenervated\ndenervates\ndenervating\ndenervation\ndenes\ndengue\ndeniability\ndeniable\ndeniably\ndenial\ndenials\ndenied\ndenier\ndeniers\ndenies\ndenigrate\ndenigrated\ndenigrates\ndenigrating\ndenigration\ndenigrations\ndenigrative\ndenigrator\ndenigrators\ndenigratory\ndenim\ndenims\ndenise\ndenitrification\ndenitrified\ndenitrifies\ndenitrify\ndenitrifying\ndenizen\ndenizenation\ndenizened\ndenizening\ndenizens\ndenmark\ndenned\ndenning\ndenominable\ndenominate\ndenominated\ndenominates\ndenominating\ndenomination\ndenominational\ndenominationalism\ndenominationalist\ndenominationalists\ndenominationally\ndenominations\ndenominative\ndenominatives\ndenominator\ndenominators\ndenormalize\ndenormalized\ndenotable\ndenotation\ndenotational\ndenotationally\ndenotations\ndenotative\ndenotatively\ndenote\ndenoted\ndenotement\ndenotes\ndenoting\ndenotive\ndenouement\ndenouements\ndenounce\ndenounced\ndenouncement\ndenouncements\ndenouncer\ndenouncers\ndenounces\ndenouncing\ndens\ndense\ndensely\ndenseness\ndenser\ndensest\ndensification\ndensify\ndensimeter\ndensimeters\ndensimetric\ndensities\ndensitometer\ndensitometers\ndensitometric\ndensitometry\ndensity\ndent\ndental\ndentalia\ndentalium\ndentaliums\ndentally\ndentals\ndentate\ndentately\ndentation\ndentations\ndente\ndented\ndenticle\ndenticles\ndenticular\ndenticulate\ndenticulated\ndenticulately\ndenticulation\ndentiform\ndentifrice\ndentigerous\ndentil\ndentils\ndentin\ndentinal\ndentine\ndenting\ndentins\ndentist\ndentistry\ndentists\ndentition\ndentoid\ndents\ndentulous\ndenture\ndentures\ndenturist\ndenturists\ndenuclearization\ndenuclearize\ndenuclearized\ndenuclearizes\ndenuclearizing\ndenudate\ndenudated\ndenudates\ndenudating\ndenudation\ndenudations\ndenude\ndenuded\ndenudement\ndenudes\ndenuding\ndenumerability\ndenumerable\ndenumerably\ndenunciate\ndenunciated\ndenunciates\ndenunciating\ndenunciation\ndenunciations\ndenunciative\ndenunciator\ndenunciators\ndenunciatory\ndenver\ndeny\ndenying\ndenyingly\ndeo\ndeodar\ndeodara\ndeodaras\ndeodars\ndeodorant\ndeodorants\ndeodorization\ndeodorizations\ndeodorize\ndeodorized\ndeodorizer\ndeodorizers\ndeodorizes\ndeodorizing\ndeontological\ndeontologist\ndeontologists\ndeontology\ndeorbit\ndeorbited\ndeorbiting\ndeorbits\ndeoxidation\ndeoxidization\ndeoxidize\ndeoxidized\ndeoxidizer\ndeoxidizers\ndeoxidizes\ndeoxidizing\ndeoxycorticosterone\ndeoxycorticosterones\ndeoxygenate\ndeoxygenated\ndeoxygenates\ndeoxygenating\ndeoxygenation\ndeoxyribonuclease\ndeoxyribonucleases\ndeoxyribonucleic\ndeoxyribonucleotide\ndeoxyribonucleotides\ndeoxyribose\ndeoxyriboses\ndepart\ndeparted\ndeparteds\ndeparting\ndepartment\ndepartmental\ndepartmentalization\ndepartmentalize\ndepartmentalized\ndepartmentalizes\ndepartmentalizing\ndepartmentally\ndepartments\ndeparts\ndeparture\ndepartures\ndepauperate\ndepauperation\ndepend\ndependability\ndependable\ndependableness\ndependably\ndepended\ndependence\ndependences\ndependencies\ndependency\ndependent\ndependently\ndependents\ndepending\ndepends\ndepersonalization\ndepersonalize\ndepersonalized\ndepersonalizes\ndepersonalizing\ndepict\ndepicted\ndepicter\ndepicting\ndepiction\ndepictions\ndepicts\ndepigmentation\ndepigmentations\ndepilate\ndepilated\ndepilates\ndepilating\ndepilation\ndepilator\ndepilatories\ndepilators\ndepilatory\ndeplane\ndeplaned\ndeplanes\ndeplaning\ndepletable\ndeplete\ndepleted\ndepletes\ndepleting\ndepletion\ndepletions\ndepletive\ndeplorability\ndeplorable\ndeplorableness\ndeplorably\ndeplore\ndeplored\ndeplorer\ndeplorers\ndeplores\ndeploring\ndeploringly\ndeploy\ndeployability\ndeployable\ndeployed\ndeployer\ndeployers\ndeploying\ndeployment\ndeployments\ndeploys\ndeplumation\ndeplume\ndeplumed\ndeplumes\ndepluming\ndepolarization\ndepolarize\ndepolarized\ndepolarizer\ndepolarizers\ndepolarizes\ndepolarizing\ndepoliticization\ndepoliticize\ndepoliticized\ndepoliticizes\ndepoliticizing\ndepollute\ndepolluted\ndepollutes\ndepolluting\ndepone\ndeponed\ndeponent\ndeponents\ndepones\ndeponing\ndepopulate\ndepopulated\ndepopulates\ndepopulating\ndepopulation\ndepopulations\ndepopulator\ndepopulators\ndeport\ndeportable\ndeportation\ndeportations\ndeported\ndeportee\ndeportees\ndeporting\ndeportment\ndeports\ndeposable\ndeposal\ndeposals\ndepose\ndeposed\ndeposes\ndeposing\ndeposit\ndepositaries\ndepositary\ndeposited\ndepositing\ndeposition\ndepositional\ndepositions\ndepositor\ndepositories\ndepositors\ndepository\ndeposits\ndepot\ndepots\ndepravation\ndepravations\ndeprave\ndepraved\ndepravedly\ndepravedness\ndepravement\ndepraver\ndepravers\ndepraves\ndepraving\ndepravities\ndepravity\ndeprecate\ndeprecated\ndeprecates\ndeprecating\ndeprecatingly\ndeprecation\ndeprecations\ndeprecative\ndeprecator\ndeprecatorily\ndeprecators\ndeprecatory\ndepreciable\ndepreciate\ndepreciated\ndepreciates\ndepreciating\ndepreciatingly\ndepreciation\ndepreciations\ndepreciative\ndepreciator\ndepreciators\ndepreciatory\ndepredate\ndepredated\ndepredates\ndepredating\ndepredation\ndepredations\ndepredator\ndepredators\ndepredatory\ndepress\ndepressant\ndepressants\ndepressed\ndepresses\ndepressible\ndepressing\ndepressingly\ndepression\ndepressions\ndepressive\ndepressively\ndepressiveness\ndepressives\ndepressor\ndepressors\ndepressurization\ndepressurize\ndepressurized\ndepressurizes\ndepressurizing\ndeprivable\ndeprival\ndeprivation\ndeprivations\ndeprive\ndeprived\ndeprives\ndepriving\ndeprogram\ndeprogrammed\ndeprogrammer\ndeprogrammers\ndeprogramming\ndeprograms\ndepth\ndepthless\ndepths\ndepurate\ndepurated\ndepurates\ndepurating\ndepuration\ndepurations\ndepurative\ndepurator\ndepurators\ndeputation\ndeputations\ndepute\ndeputed\ndeputes\ndeputies\ndeputing\ndeputization\ndeputize\ndeputized\ndeputizes\ndeputizing\ndeputy\ndequeue\ndequeued\ndequeueing\ndequeues\ndequeuing\nder\nderacinate\nderacinated\nderacinates\nderacinating\nderacination\nderail\nderailed\nderailing\nderailleur\nderailleurs\nderailment\nderailments\nderails\nderange\nderanged\nderangement\nderangements\nderanges\nderanging\nderate\nderated\nderates\nderating\nderbies\nderby\nderbyshire\nderecognition\nderecognize\nderecognized\nderecognizes\nderecognizing\ndereference\ndereferenced\ndereferencer\ndereferencers\ndereferences\ndereferencing\nderegulate\nderegulated\nderegulates\nderegulating\nderegulation\nderegulations\nderegulator\nderegulators\nderegulatory\nderelict\ndereliction\nderelicts\nderepress\nderepressed\nderepresses\nderepressing\nderepression\nderib\nderibbed\nderibbing\nderibs\nderide\nderided\nderider\nderiders\nderides\nderiding\nderidingly\nderision\nderisive\nderisively\nderisiveness\nderisory\nderivability\nderivable\nderivate\nderivation\nderivational\nderivationally\nderivations\nderivative\nderivatively\nderivativeness\nderivatives\nderive\nderived\nderiver\nderivers\nderives\nderiving\nderma\ndermabrasion\ndermabrasions\ndermal\ndermapteran\ndermapterans\ndermas\ndermatitis\ndermatogen\ndermatogens\ndermatoid\ndermatologic\ndermatological\ndermatologist\ndermatologists\ndermatology\ndermatome\ndermatomes\ndermatophyte\ndermatophytes\ndermatophytic\ndermatophytosis\ndermatoplasty\ndermatoses\ndermatosis\ndermis\ndermises\nderogate\nderogated\nderogates\nderogating\nderogation\nderogations\nderogative\nderogatively\nderogator\nderogatorily\nderogatoriness\nderogators\nderogatory\nderrick\nderricks\nderriere\nderrieres\nderring\nderringer\nderringers\nderris\nderrière\nderrières\ndervish\ndervishes\ndesacralize\ndesacralized\ndesacralizes\ndesacralizing\ndesalinate\ndesalinated\ndesalinates\ndesalinating\ndesalination\ndesalinator\ndesalinators\ndesalinization\ndesalinize\ndesalinized\ndesalinizes\ndesalinizing\ndesalt\ndesalted\ndesalting\ndesalts\ndescant\ndescanted\ndescanter\ndescanters\ndescanting\ndescants\ndescartes\ndescend\ndescendant\ndescendants\ndescended\ndescendent\ndescendents\ndescender\ndescenders\ndescendible\ndescending\ndescends\ndescent\ndescents\ndeschutes\ndescramble\ndescrambled\ndescrambler\ndescramblers\ndescrambles\ndescrambling\ndescribable\ndescribe\ndescribed\ndescriber\ndescribers\ndescribes\ndescribing\ndescried\ndescrier\ndescriers\ndescries\ndescription\ndescriptions\ndescriptive\ndescriptively\ndescriptiveness\ndescriptor\ndescriptors\ndescry\ndescrying\ndesdemona\ndesecrate\ndesecrated\ndesecrater\ndesecraters\ndesecrates\ndesecrating\ndesecration\ndesecrations\ndesecrator\ndesecrators\ndesegregate\ndesegregated\ndesegregates\ndesegregating\ndesegregation\ndesegregationist\ndesegregationists\ndeselect\ndeselected\ndeselecting\ndeselects\ndesensitization\ndesensitize\ndesensitized\ndesensitizer\ndesensitizers\ndesensitizes\ndesensitizing\ndesert\ndeserted\ndeserter\ndeserters\ndesertic\ndesertification\ndeserting\ndesertion\ndesertions\ndeserts\ndeserve\ndeserved\ndeservedly\ndeservedness\ndeserver\ndeservers\ndeserves\ndeserving\ndeservingly\ndesex\ndesexed\ndesexes\ndesexing\ndesexualization\ndesexualize\ndesexualized\ndesexualizes\ndesexualizing\ndesiccant\ndesiccants\ndesiccate\ndesiccated\ndesiccates\ndesiccating\ndesiccation\ndesiccations\ndesiccative\ndesiccator\ndesiccators\ndesiderata\ndesiderate\ndesiderated\ndesiderates\ndesiderating\ndesideration\ndesiderative\ndesideratum\ndesign\ndesignable\ndesignate\ndesignated\ndesignates\ndesignating\ndesignation\ndesignations\ndesignative\ndesignator\ndesignators\ndesignatory\ndesigned\ndesignedly\ndesignee\ndesignees\ndesigner\ndesigners\ndesigning\ndesigningly\ndesigns\ndesipramine\ndesipramines\ndesirability\ndesirable\ndesirableness\ndesirables\ndesirably\ndesire\ndesired\ndesirer\ndesirers\ndesires\ndesiring\ndesirous\ndesirously\ndesirousness\ndesist\ndesistance\ndesisted\ndesisting\ndesists\ndesk\ndeskill\ndeskilled\ndeskilling\ndeskills\ndeskman\ndeskmen\ndesks\ndesktop\ndesktops\ndesman\ndesmans\ndesmid\ndesmids\ndesolate\ndesolated\ndesolately\ndesolateness\ndesolater\ndesolaters\ndesolates\ndesolating\ndesolatingly\ndesolation\ndesolator\ndesolators\ndesorb\ndesorbed\ndesorbing\ndesorbs\ndesorption\ndespair\ndespaired\ndespairer\ndespairers\ndespairing\ndespairingly\ndespairs\ndespatch\ndespatched\ndespatches\ndespatching\ndesperado\ndesperadoes\ndesperados\ndesperate\ndesperately\ndesperateness\ndesperation\ndespicable\ndespicableness\ndespicably\ndespisal\ndespise\ndespised\ndespisement\ndespisements\ndespiser\ndespisers\ndespises\ndespising\ndespite\ndespiteful\ndespitefully\ndespitefulness\ndespoil\ndespoiled\ndespoiler\ndespoilers\ndespoiling\ndespoilment\ndespoilments\ndespoils\ndespoliation\ndespond\ndesponded\ndespondence\ndespondency\ndespondent\ndespondently\ndesponding\ndespondingly\ndesponds\ndespot\ndespotic\ndespotically\ndespotism\ndespots\ndesquamate\ndesquamated\ndesquamates\ndesquamating\ndesquamation\ndessert\ndesserts\ndessertspoon\ndessertspoonful\ndessertspoonfuls\ndessertspoons\ndestabilization\ndestabilize\ndestabilized\ndestabilizes\ndestabilizing\ndestain\ndestained\ndestaining\ndestains\ndestalinization\ndestalinizations\ndesterilize\ndesterilized\ndesterilizes\ndesterilizing\ndestination\ndestinations\ndestine\ndestined\ndestines\ndestinies\ndestining\ndestiny\ndestitute\ndestituteness\ndestitution\ndestroy\ndestroyed\ndestroyer\ndestroyers\ndestroying\ndestroys\ndestruct\ndestructed\ndestructibility\ndestructible\ndestructibleness\ndestructing\ndestruction\ndestructionist\ndestructionists\ndestructions\ndestructive\ndestructively\ndestructiveness\ndestructivity\ndestructor\ndestructors\ndestructs\ndesuetude\ndesulfurization\ndesulfurize\ndesulfurized\ndesulfurizes\ndesulfurizing\ndesultorily\ndesultoriness\ndesultory\ndesynchronize\ndesynchronized\ndesynchronizes\ndesynchronizing\ndetach\ndetachability\ndetachable\ndetachably\ndetached\ndetachedly\ndetachedness\ndetaches\ndetaching\ndetachment\ndetachments\ndetail\ndetailed\ndetailedly\ndetailedness\ndetailer\ndetailers\ndetailing\ndetails\ndetain\ndetained\ndetainee\ndetainees\ndetainer\ndetainers\ndetaining\ndetainment\ndetains\ndetect\ndetectability\ndetectable\ndetected\ndetecter\ndetecters\ndetecting\ndetection\ndetections\ndetective\ndetectives\ndetector\ndetectors\ndetects\ndetent\ndetente\ndetentes\ndetention\ndetentions\ndetents\ndeter\ndeterge\ndeterged\ndetergence\ndetergences\ndetergency\ndetergent\ndetergents\ndeterges\ndeterging\ndeteriorate\ndeteriorated\ndeteriorates\ndeteriorating\ndeterioration\ndeteriorations\ndeteriorative\ndeterment\ndeterments\ndeterminability\ndeterminable\ndeterminableness\ndeterminably\ndeterminacy\ndeterminant\ndeterminantal\ndeterminants\ndeterminate\ndeterminately\ndeterminateness\ndeterminater\ndeterminaters\ndetermination\ndeterminations\ndeterminative\ndeterminatively\ndeterminativeness\ndeterminatives\ndetermine\ndetermined\ndeterminedly\ndeterminedness\ndeterminer\ndeterminers\ndetermines\ndetermining\ndeterminism\ndeterminist\ndeterministic\ndeterministically\ndeterminists\ndeterrable\ndeterred\ndeterrence\ndeterrent\ndeterrently\ndeterrents\ndeterrer\ndeterrers\ndeterring\ndeters\ndetersive\ndetersives\ndetest\ndetestability\ndetestable\ndetestableness\ndetestably\ndetestation\ndetested\ndetester\ndetesters\ndetesting\ndetests\ndethatch\ndethatched\ndethatcher\ndethatchers\ndethatches\ndethatching\ndethrone\ndethroned\ndethronement\ndethrones\ndethroning\ndetinue\ndetinues\ndetonabilities\ndetonability\ndetonable\ndetonatable\ndetonate\ndetonated\ndetonates\ndetonating\ndetonation\ndetonations\ndetonative\ndetonator\ndetonators\ndetour\ndetoured\ndetouring\ndetours\ndetox\ndetoxed\ndetoxes\ndetoxicant\ndetoxicants\ndetoxicate\ndetoxicated\ndetoxicates\ndetoxicating\ndetoxication\ndetoxification\ndetoxified\ndetoxifies\ndetoxify\ndetoxifying\ndetoxing\ndetract\ndetracted\ndetracting\ndetractingly\ndetraction\ndetractions\ndetractive\ndetractively\ndetractor\ndetractors\ndetracts\ndetrain\ndetrained\ndetraining\ndetrainment\ndetrains\ndetribalization\ndetribalize\ndetribalized\ndetribalizes\ndetribalizing\ndetriment\ndetrimental\ndetrimentally\ndetriments\ndetrital\ndetrition\ndetritions\ndetritus\ndetroit\ndetumescence\ndetumescences\ndetumescent\ndeucalion\ndeuce\ndeuced\ndeucedly\ndeuces\ndeucing\ndeum\ndeums\ndeus\ndeuteragonist\ndeuteragonists\ndeuteranope\ndeuteranopia\ndeuteranopias\ndeuteranopic\ndeuterate\ndeuterated\ndeuterates\ndeuterating\ndeuteration\ndeuterations\ndeuterium\ndeuterocanonical\ndeuterogamy\ndeuteron\ndeuteronomic\ndeuteronomy\ndeuterons\ndeutoplasm\ndeutoplasmic\ndeutoplasms\ndeutsch\ndeutsche\ndeutschmark\ndeutschmarks\ndeutzia\ndeutzias\ndeux\ndevaluate\ndevaluated\ndevaluates\ndevaluating\ndevaluation\ndevaluations\ndevalue\ndevalued\ndevalues\ndevaluing\ndevanagari\ndevastate\ndevastated\ndevastates\ndevastating\ndevastatingly\ndevastation\ndevastations\ndevastative\ndevastator\ndevastators\ndevelop\ndevelopable\ndeveloped\ndeveloper\ndevelopers\ndeveloping\ndevelopment\ndevelopmental\ndevelopmentally\ndevelopments\ndevelops\ndeverbative\ndeverbatives\ndevereux\ndevest\ndevested\ndevesting\ndevests\ndevi\ndeviance\ndeviances\ndeviancies\ndeviancy\ndeviant\ndeviants\ndeviate\ndeviated\ndeviates\ndeviating\ndeviation\ndeviational\ndeviationism\ndeviationist\ndeviationists\ndeviations\ndeviator\ndeviators\ndeviatory\ndevice\ndevices\ndevil\ndeviled\ndevilfish\ndevilfishes\ndeviling\ndevilish\ndevilishly\ndevilishness\ndevilkin\ndevilkins\ndevilled\ndevilling\ndevilment\ndevilments\ndevilries\ndevilry\ndevils\ndeviltries\ndeviltry\ndevilwood\ndevilwoods\ndevious\ndeviously\ndeviousness\ndevisable\ndevise\ndevised\ndevisee\ndevisees\ndeviser\ndevisers\ndevises\ndevising\ndevisor\ndevisors\ndevitalization\ndevitalize\ndevitalized\ndevitalizes\ndevitalizing\ndevitrifiable\ndevitrification\ndevitrified\ndevitrifies\ndevitrify\ndevitrifying\ndevocalization\ndevocalize\ndevocalized\ndevocalizes\ndevocalizing\ndevoice\ndevoiced\ndevoices\ndevoicing\ndevoid\ndevoir\ndevoirs\ndevolatilization\ndevolatilize\ndevolatilized\ndevolatilizes\ndevolatilizing\ndevolution\ndevolutionary\ndevolutionist\ndevolutionists\ndevolve\ndevolved\ndevolvement\ndevolves\ndevolving\ndevon\ndevonian\ndevote\ndevoted\ndevotedly\ndevotedness\ndevotee\ndevotees\ndevotement\ndevotes\ndevoting\ndevotion\ndevotional\ndevotionally\ndevotionals\ndevotions\ndevour\ndevoured\ndevourer\ndevourers\ndevouring\ndevouringly\ndevours\ndevout\ndevouter\ndevoutest\ndevoutly\ndevoutness\ndew\ndewali\ndewan\ndewans\ndewater\ndewatered\ndewatering\ndewaters\ndewberries\ndewberry\ndewclaw\ndewclawed\ndewdrop\ndewdrops\ndewed\ndewfall\ndewier\ndewiest\ndewily\ndewiness\ndewing\ndewlap\ndewlaps\ndewless\ndeworm\ndewormed\ndewormer\ndewormers\ndeworming\ndeworms\ndews\ndewy\ndex\ndexamethasone\ndexamethasones\ndexedrine\ndexes\ndexie\ndexies\ndexter\ndexterity\ndexterous\ndexterously\ndexterousness\ndextral\ndextrality\ndextrally\ndextran\ndextrans\ndextrin\ndextro\ndextroamphetamine\ndextroamphetamines\ndextroglucose\ndextroglucoses\ndextrorotation\ndextrorotations\ndextrorotatory\ndextrorse\ndextrorsely\ndextrose\ndhabi\ndharma\ndharmic\ndharna\ndharnas\ndhaulagiri\ndhole\ndholes\ndhoti\ndhotis\ndhow\ndhows\ndhurrie\ndhurries\ndi\ndiabase\ndiabases\ndiabetes\ndiabetic\ndiabetics\ndiable\ndiablerie\ndiableries\ndiablo\ndiabolic\ndiabolical\ndiabolically\ndiabolicalness\ndiabolism\ndiabolist\ndiabolists\ndiabolize\ndiabolized\ndiabolizes\ndiabolizing\ndiacetylmorphine\ndiachronic\ndiachronically\ndiachronies\ndiachrony\ndiaconal\ndiaconate\ndiaconates\ndiacritic\ndiacritical\ndiacritically\ndiacritics\ndiadelphous\ndiadem\ndiademed\ndiademing\ndiadems\ndiadromous\ndiads\ndiaeresis\ndiagenesis\ndiagenetic\ndiageotropic\ndiageotropism\ndiaghilev\ndiagnosable\ndiagnose\ndiagnoseable\ndiagnosed\ndiagnoses\ndiagnosing\ndiagnosis\ndiagnostic\ndiagnostically\ndiagnostician\ndiagnosticians\ndiagnostics\ndiagonal\ndiagonalizable\ndiagonalization\ndiagonalize\ndiagonalized\ndiagonalizes\ndiagonalizing\ndiagonally\ndiagonals\ndiagram\ndiagramed\ndiagraming\ndiagrammable\ndiagrammatic\ndiagrammatical\ndiagrammatically\ndiagrammed\ndiagramming\ndiagrams\ndiakineses\ndiakinesis\ndiakinetic\ndial\ndialect\ndialectal\ndialectally\ndialectic\ndialectical\ndialectically\ndialectician\ndialecticians\ndialectics\ndialectological\ndialectologically\ndialectologist\ndialectologists\ndialectology\ndialects\ndialed\ndialer\ndialers\ndialing\ndialled\ndialling\ndialog\ndialoged\ndialogic\ndialogical\ndialogically\ndialoging\ndialogist\ndialogistic\ndialogistical\ndialogistically\ndialogists\ndialogs\ndialogue\ndialogued\ndialoguer\ndialoguers\ndialogues\ndialoguing\ndials\ndialup\ndialups\ndialyses\ndialysis\ndialytic\ndialytically\ndialyzabilities\ndialyzability\ndialyzable\ndialyze\ndialyzed\ndialyzer\ndialyzers\ndialyzes\ndialyzing\ndiamagnet\ndiamagnetic\ndiamagnetism\ndiamagnets\ndiamante\ndiamantes\ndiamanté\ndiamantés\ndiameter\ndiameters\ndiametral\ndiametric\ndiametrical\ndiametrically\ndiamine\ndiamines\ndiamond\ndiamondback\ndiamondbacks\ndiamonded\ndiamondiferous\ndiamonding\ndiamonds\ndiana\ndiandrous\ndiane\ndianthus\ndiapason\ndiapasons\ndiapause\ndiapauses\ndiapedeses\ndiapedesis\ndiapedetic\ndiaper\ndiapered\ndiapering\ndiapers\ndiaphaneity\ndiaphanous\ndiaphanously\ndiaphanousness\ndiaphone\ndiaphoreses\ndiaphoresis\ndiaphoretic\ndiaphoretics\ndiaphragm\ndiaphragmatic\ndiaphragmatically\ndiaphragms\ndiaphyseal\ndiaphyses\ndiaphysial\ndiaphysis\ndiapir\ndiapiric\ndiapirs\ndiapophyses\ndiapophysial\ndiapophysis\ndiapositive\ndiapsid\ndiapsids\ndiarchal\ndiarchic\ndiarchies\ndiarchy\ndiaries\ndiarist\ndiarists\ndiarize\ndiarized\ndiarizes\ndiarizing\ndiarrhea\ndiarrheal\ndiarrheas\ndiarrheic\ndiarrhetic\ndiarthrodial\ndiarthroses\ndiarthrosis\ndiary\ndiaspora\ndiasporas\ndiaspore\ndiaspores\ndiastase\ndiastases\ndiastasic\ndiastasis\ndiastatic\ndiastema\ndiastemata\ndiastematic\ndiastole\ndiastoles\ndiastolic\ndiastrophic\ndiastrophically\ndiastrophism\ndiastrophisms\ndiatessaron\ndiatessarons\ndiathermic\ndiathermy\ndiatheses\ndiathesis\ndiathetic\ndiatom\ndiatomaceous\ndiatomic\ndiatomite\ndiatoms\ndiatonic\ndiatonically\ndiatonicism\ndiatribe\ndiatribes\ndiatropic\ndiatropism\ndiatropisms\ndiaz\ndiazepam\ndiazine\ndiazines\ndiazinon\ndiazinons\ndiazo\ndiazonium\ndiazoniums\ndibasic\ndibber\ndibbers\ndibble\ndibbled\ndibbler\ndibblers\ndibbles\ndibbling\ndibden\ndibranchiate\ndibranchiates\ndibromide\ndibromides\ndibs\ndicarboxylic\ndicast\ndicastic\ndicasts\ndice\ndiced\ndicentra\ndicentras\ndicephalous\ndicer\ndicers\ndices\ndicey\ndichasia\ndichasial\ndichasially\ndichasium\ndichloride\ndichlorodiphenyl\ndichlorodiphenyltrichloroethane\ndichlorodiphenyltrichloroethanes\ndichlorvos\ndichogamous\ndichogamy\ndichondra\ndichondras\ndichotic\ndichotically\ndichotomic\ndichotomies\ndichotomist\ndichotomists\ndichotomization\ndichotomize\ndichotomized\ndichotomizes\ndichotomizing\ndichotomous\ndichotomously\ndichotomousness\ndichotomy\ndichroic\ndichroism\ndichroisms\ndichroite\ndichroites\ndichromat\ndichromate\ndichromatic\ndichromatism\ndichromats\ndichromic\ndicier\ndiciest\ndicing\ndick\ndickcissel\ndickcissels\ndickens\ndickensian\ndickensians\ndicker\ndickered\ndickering\ndickers\ndickey\ndickeys\ndickies\ndicks\ndicky\ndiclinous\ndicliny\ndicofol\ndicofols\ndicot\ndicots\ndicotyledon\ndicotyledonous\ndicotyledons\ndicrotic\ndicrotism\ndicta\ndictaphone\ndictaphones\ndictate\ndictated\ndictates\ndictating\ndictation\ndictations\ndictator\ndictatorial\ndictatorially\ndictatorialness\ndictators\ndictatorship\ndictatorships\ndiction\ndictional\ndictionally\ndictionaries\ndictionary\ndictu\ndictum\ndictums\ndictyosome\ndictyosomes\ndictyostelium\ndid\ndidact\ndidactic\ndidactical\ndidactically\ndidacticism\ndidactics\ndidacts\ndidapper\ndidappers\ndiddle\ndiddled\ndiddler\ndiddlers\ndiddles\ndiddling\ndiddly\ndiddlysquat\ndiderot\ndidn\ndidn't\ndido\ndidoes\ndidos\ndidst\ndidymium\ndidymous\ndidynamous\ndie\ndieback\ndiebacks\ndied\ndieffenbachia\ndieffenbachias\ndiego\ndiehard\ndiehards\ndieldrin\ndieldrins\ndielectric\ndielectrically\ndielectrics\ndiem\ndiemen\ndiencephalic\ndiencephalon\ndiencephalons\ndieppe\ndiereses\ndieresis\ndies\ndiesel\ndieselize\ndieselized\ndieselizes\ndieselizing\ndiesels\ndieses\ndiesinker\ndiesinkers\ndiesinking\ndiesis\ndiestock\ndiestocks\ndiestrous\ndiestrus\ndiet\ndietaries\ndietarily\ndietary\ndieted\ndieter\ndieters\ndietetic\ndietetically\ndietetics\ndiethyl\ndiethylcarbamazine\ndiethylstilbestrol\ndietician\ndieticians\ndieting\ndietitian\ndietitians\ndietrich\ndiets\ndiffer\ndiffered\ndifference\ndifferenced\ndifferences\ndifferencing\ndifferent\ndifferentia\ndifferentiability\ndifferentiable\ndifferentiae\ndifferential\ndifferentially\ndifferentials\ndifferentiate\ndifferentiated\ndifferentiates\ndifferentiating\ndifferentiation\ndifferentiations\ndifferentiator\ndifferentiators\ndifferently\ndifferentness\ndiffering\ndiffers\ndifficile\ndifficult\ndifficulties\ndifficultly\ndifficulty\ndiffidence\ndiffident\ndiffidently\ndiffract\ndiffracted\ndiffracting\ndiffraction\ndiffractions\ndiffractive\ndiffractively\ndiffractiveness\ndiffractometer\ndiffractometers\ndiffracts\ndiffuse\ndiffused\ndiffusely\ndiffuseness\ndiffuser\ndiffusers\ndiffuses\ndiffusible\ndiffusibly\ndiffusing\ndiffusion\ndiffusional\ndiffusions\ndiffusive\ndiffusively\ndiffusiveness\ndig\ndigamma\ndigammas\ndigamous\ndigamy\ndigastric\ndigastrics\ndigest\ndigested\ndigester\ndigesters\ndigestibility\ndigestible\ndigestibleness\ndigestibly\ndigesting\ndigestion\ndigestions\ndigestive\ndigestively\ndigestiveness\ndigestives\ndigests\ndigger\ndiggers\ndigging\ndiggings\ndigit\ndigital\ndigitalin\ndigitalins\ndigitalis\ndigitalization\ndigitalize\ndigitalized\ndigitalizes\ndigitalizing\ndigitally\ndigitals\ndigitate\ndigitately\ndigitation\ndigitations\ndigitigrade\ndigitization\ndigitize\ndigitized\ndigitizer\ndigitizers\ndigitizes\ndigitizing\ndigitoxin\ndigitoxins\ndigits\ndiglossia\ndiglossias\ndiglyceride\ndiglycerides\ndignified\ndignifiedly\ndignifies\ndignify\ndignifying\ndignitaries\ndignitary\ndignities\ndignity\ndigoxin\ndigoxins\ndigraph\ndigraphic\ndigraphs\ndigress\ndigressed\ndigresses\ndigressing\ndigression\ndigressional\ndigressionary\ndigressions\ndigressive\ndigressively\ndigressiveness\ndigs\ndihedral\ndihedrals\ndihybrid\ndihybrids\ndihydric\ndihydroxy\ndihydroxyphenylalanine\ndihydroxyphenylalanines\ndijkstra\ndijon\ndikaryon\ndikaryons\ndike\ndiked\ndikes\ndiking\ndiktat\ndiktats\ndilantin\ndilapidate\ndilapidated\ndilapidates\ndilapidating\ndilapidation\ndilapidations\ndilatability\ndilatable\ndilatably\ndilatancies\ndilatancy\ndilatant\ndilatants\ndilatation\ndilatational\ndilatations\ndilatator\ndilatators\ndilate\ndilated\ndilatedness\ndilates\ndilating\ndilation\ndilations\ndilative\ndilatometer\ndilatometers\ndilatometric\ndilatometry\ndilator\ndilatorily\ndilatoriness\ndilators\ndilatory\ndildo\ndildos\ndilemma\ndilemmas\ndilemmatic\ndilettante\ndilettantes\ndilettantish\ndilettantism\ndiligence\ndiligent\ndiligently\ndill\ndillies\ndills\ndilly\ndillydallied\ndillydallies\ndillydally\ndillydallying\ndiluent\ndiluents\ndilute\ndiluted\ndiluteness\ndiluter\ndiluters\ndilutes\ndiluting\ndilution\ndilutions\ndilutive\ndilutor\ndilutors\ndiluvial\ndim\ndime\ndimenhydrinate\ndimenhydrinates\ndimension\ndimensional\ndimensionality\ndimensionally\ndimensioned\ndimensioning\ndimensionless\ndimensions\ndimer\ndimercaprol\ndimercaprols\ndimeric\ndimerism\ndimerization\ndimerize\ndimerized\ndimerizes\ndimerizing\ndimerous\ndimers\ndimes\ndimeter\ndimeters\ndimethoate\ndimethoates\ndimethyl\ndimethylnitrosamine\ndimethylnitrosamines\ndimethyls\ndimethylsulfoxide\ndimethylsulfoxides\ndiminish\ndiminishable\ndiminished\ndiminishes\ndiminishing\ndiminishment\ndiminishments\ndiminuendo\ndiminuendos\ndiminution\ndiminutional\ndiminutive\ndiminutively\ndiminutiveness\ndiminutives\ndimities\ndimittis\ndimity\ndimly\ndimmable\ndimmed\ndimmer\ndimmers\ndimmest\ndimming\ndimness\ndimorph\ndimorphic\ndimorphism\ndimorphisms\ndimorphous\ndimorphs\ndimout\ndimple\ndimpled\ndimples\ndimpling\ndimply\ndims\ndimwit\ndimwits\ndimwitted\ndimwittedly\ndimwittedness\ndin\ndinar\ndinard\ndinars\ndine\ndined\ndiner\ndiners\ndines\ndinette\ndinettes\nding\ndingbat\ndingbats\ndingdong\ndingdonged\ndingdonging\ndingdongs\ndinged\ndinghies\ndinghy\ndingier\ndingiest\ndingily\ndinginess\ndinging\ndingle\ndingles\ndingo\ndingoes\ndings\ndingus\ndinguses\ndingy\ndining\ndinitrobenzene\ndinitrobenzenes\ndink\ndinkey\ndinkeys\ndinkier\ndinkiest\ndinks\ndinkum\ndinky\ndinned\ndinner\ndinnerless\ndinners\ndinnertime\ndinnerware\ndinning\ndinoflagellate\ndinoflagellates\ndinosaur\ndinosaurian\ndinosaurians\ndinosauric\ndinosaurlike\ndinosaurs\ndinothere\ndinotheres\ndins\ndint\ndinted\ndinting\ndints\ndinucleotide\ndinucleotides\ndiocesan\ndiocesans\ndiocese\ndioceses\ndiocletian\ndiode\ndiodes\ndiodorus\ndioecious\ndioeciously\ndioecism\ndiogenes\ndioicous\ndiomede\ndiomedes\ndione\ndionysia\ndionysiac\ndionysian\ndionysius\ndionysos\ndionysus\ndiophantine\ndiopside\ndiopsides\ndiopter\ndiopters\ndioptometer\ndioptometers\ndioptometry\ndioptral\ndioptric\ndioptrics\ndiorama\ndioramas\ndioramic\ndiorite\ndiorites\ndioritic\ndioscuri\ndioxane\ndioxanes\ndioxide\ndioxides\ndioxin\ndioxins\ndip\ndipeptidase\ndipeptidases\ndipeptide\ndipeptides\ndipetalous\ndiphase\ndiphasic\ndiphenyl\ndiphenylamine\ndiphenylaminechloroarsine\ndiphenylaminechloroarsines\ndiphenylamines\ndiphenylhydantoin\ndiphenylhydantoins\ndiphenylketone\ndiphenylketones\ndiphenyls\ndiphosgene\ndiphosgenes\ndiphosphate\ndiphosphates\ndiphosphoglyceric\ndiphtheria\ndiphtherial\ndiphtheric\ndiphtheritic\ndiphtheroid\ndiphtheroids\ndiphthong\ndiphthongal\ndiphthongization\ndiphthongize\ndiphthongized\ndiphthongizes\ndiphthongizing\ndiphthongs\ndiphycercal\ndiphycercy\ndiphyletic\ndiphyllous\ndiphyodont\ndiplegia\ndiplegias\ndiplex\ndiplexer\ndiplexers\ndiploblastic\ndiplococcal\ndiplococci\ndiplococcic\ndiplococcus\ndiplodocus\ndiplodocuses\ndiploe\ndiploes\ndiploic\ndiploid\ndiploids\ndiploidy\ndiploma\ndiplomacies\ndiplomacy\ndiplomas\ndiplomat\ndiplomate\ndiplomates\ndiplomatic\ndiplomatically\ndiplomatics\ndiplomatist\ndiplomatists\ndiplomats\ndiplont\ndiplontic\ndiplonts\ndiplopia\ndiplopias\ndiplopic\ndiplopod\ndiplopodous\ndiplopods\ndiplosis\ndipnoan\ndipnoans\ndipodic\ndipodies\ndipody\ndipolar\ndipole\ndipoles\ndipped\ndipper\ndipperful\ndipperfuls\ndippers\ndippier\ndippiest\ndipping\ndippy\ndipropellant\ndipropellants\ndiprotic\ndips\ndipsomania\ndipsomaniac\ndipsomaniacal\ndipsomaniacs\ndipstick\ndipsticks\ndipteral\ndipteran\ndipterans\ndipterous\ndiptych\ndiptychs\ndipyridamole\ndipyridamoles\ndiquat\ndiquats\ndirac\ndire\ndirect\ndirected\ndirecting\ndirection\ndirectional\ndirectionality\ndirectionally\ndirectionals\ndirectionless\ndirections\ndirective\ndirectives\ndirectivity\ndirectly\ndirectness\ndirectoire\ndirector\ndirectorate\ndirectorates\ndirectorial\ndirectorially\ndirectories\ndirectors\ndirectorship\ndirectorships\ndirectory\ndirectress\ndirectresses\ndirectrices\ndirectrix\ndirectrixes\ndirects\ndireful\ndirefully\ndirefulness\ndirely\ndireness\ndirer\ndirest\ndirge\ndirgeful\ndirges\ndirham\ndirhams\ndirichlet\ndirigible\ndirigibles\ndirk\ndirked\ndirking\ndirks\ndirndl\ndirndls\ndirt\ndirtied\ndirtier\ndirties\ndirtiest\ndirtily\ndirtiness\ndirty\ndirtying\ndisabilities\ndisability\ndisable\ndisabled\ndisablement\ndisables\ndisabling\ndisablingly\ndisabuse\ndisabused\ndisabuses\ndisabusing\ndisaccharidase\ndisaccharidases\ndisaccharide\ndisaccharides\ndisaccord\ndisaccorded\ndisaccording\ndisaccords\ndisaccustom\ndisaccustomed\ndisaccustoming\ndisaccustoms\ndisadvantage\ndisadvantaged\ndisadvantagedness\ndisadvantageous\ndisadvantageously\ndisadvantageousness\ndisadvantages\ndisadvantaging\ndisaffect\ndisaffected\ndisaffectedly\ndisaffecting\ndisaffection\ndisaffects\ndisaffiliate\ndisaffiliated\ndisaffiliates\ndisaffiliating\ndisaffiliation\ndisaffiliations\ndisaffirm\ndisaffirmance\ndisaffirmation\ndisaffirmed\ndisaffirming\ndisaffirms\ndisaggregate\ndisaggregated\ndisaggregates\ndisaggregating\ndisaggregation\ndisaggregative\ndisagree\ndisagreeable\ndisagreeableness\ndisagreeably\ndisagreed\ndisagreeing\ndisagreement\ndisagreements\ndisagrees\ndisallow\ndisallowable\ndisallowance\ndisallowed\ndisallowing\ndisallows\ndisambiguate\ndisambiguated\ndisambiguates\ndisambiguating\ndisambiguation\ndisambiguations\ndisannul\ndisannulled\ndisannulling\ndisannulment\ndisannuls\ndisappear\ndisappearance\ndisappearances\ndisappeared\ndisappearing\ndisappears\ndisappoint\ndisappointed\ndisappointedly\ndisappointing\ndisappointingly\ndisappointment\ndisappointments\ndisappoints\ndisapprobation\ndisapproval\ndisapprove\ndisapproved\ndisapprover\ndisapprovers\ndisapproves\ndisapproving\ndisapprovingly\ndisarm\ndisarmament\ndisarmed\ndisarmer\ndisarmers\ndisarming\ndisarmingly\ndisarms\ndisarrange\ndisarranged\ndisarrangement\ndisarranges\ndisarranging\ndisarray\ndisarrayed\ndisarraying\ndisarrays\ndisarticulate\ndisarticulated\ndisarticulates\ndisarticulating\ndisarticulation\ndisarticulator\ndisarticulators\ndisassemble\ndisassembled\ndisassembler\ndisassemblers\ndisassembles\ndisassembling\ndisassembly\ndisassociate\ndisassociated\ndisassociates\ndisassociating\ndisassociation\ndisaster\ndisasters\ndisastrous\ndisastrously\ndisastrousness\ndisavow\ndisavowable\ndisavowal\ndisavowals\ndisavowed\ndisavowing\ndisavows\ndisband\ndisbanded\ndisbanding\ndisbandment\ndisbandments\ndisbands\ndisbar\ndisbarment\ndisbarred\ndisbarring\ndisbars\ndisbelief\ndisbelieve\ndisbelieved\ndisbeliever\ndisbelievers\ndisbelieves\ndisbelieving\ndisbelievingly\ndisbranch\ndisbranched\ndisbranches\ndisbranching\ndisbud\ndisbudded\ndisbudding\ndisbuds\ndisburden\ndisburdened\ndisburdening\ndisburdenment\ndisburdens\ndisbursable\ndisbursal\ndisbursals\ndisburse\ndisbursed\ndisbursement\ndisbursements\ndisburser\ndisbursers\ndisburses\ndisbursing\ndisc\ndiscalced\ndiscard\ndiscardable\ndiscarded\ndiscarder\ndiscarders\ndiscarding\ndiscards\ndiscarnate\ndiscern\ndiscerned\ndiscerner\ndiscerners\ndiscernible\ndiscernibly\ndiscerning\ndiscerningly\ndiscernment\ndiscerns\ndischarge\ndischargeable\ndischarged\ndischargee\ndischargees\ndischarger\ndischargers\ndischarges\ndischarging\ndisci\ndisciform\ndisciple\ndisciples\ndiscipleship\ndisciplinable\ndisciplinal\ndisciplinarian\ndisciplinarians\ndisciplinarily\ndisciplinarity\ndisciplinary\ndiscipline\ndisciplined\ndiscipliner\ndiscipliners\ndisciplines\ndisciplining\ndisclaim\ndisclaimed\ndisclaimer\ndisclaimers\ndisclaiming\ndisclaims\ndisclamation\ndisclamations\ndisclimax\ndisclimaxes\ndisclosable\ndisclose\ndisclosed\ndiscloser\ndisclosers\ndiscloses\ndisclosing\ndisclosure\ndisclosures\ndisco\ndiscoed\ndiscographer\ndiscographers\ndiscographic\ndiscographical\ndiscographies\ndiscography\ndiscoid\ndiscoidal\ndiscoideum\ndiscoing\ndiscolor\ndiscoloration\ndiscolored\ndiscoloring\ndiscolors\ndiscombobulate\ndiscombobulated\ndiscombobulates\ndiscombobulating\ndiscombobulation\ndiscomfit\ndiscomfited\ndiscomfiting\ndiscomfits\ndiscomfiture\ndiscomfort\ndiscomfortable\ndiscomforted\ndiscomforting\ndiscomfortingly\ndiscomforts\ndiscommend\ndiscommendable\ndiscommended\ndiscommending\ndiscommends\ndiscommode\ndiscommoded\ndiscommodes\ndiscommoding\ndiscompose\ndiscomposed\ndiscomposedly\ndiscomposes\ndiscomposing\ndiscomposingly\ndiscomposure\ndisconcert\ndisconcerted\ndisconcerting\ndisconcertingly\ndisconcertment\ndisconcerts\ndisconfirm\ndisconfirmatory\ndisconfirmed\ndisconfirming\ndisconfirms\ndisconformities\ndisconformity\ndisconnect\ndisconnected\ndisconnectedly\ndisconnectedness\ndisconnecting\ndisconnection\ndisconnects\ndisconsolate\ndisconsolately\ndisconsolateness\ndisconsolation\ndiscontent\ndiscontented\ndiscontentedly\ndiscontentedness\ndiscontenting\ndiscontentment\ndiscontents\ndiscontinuance\ndiscontinuation\ndiscontinuations\ndiscontinue\ndiscontinued\ndiscontinues\ndiscontinuing\ndiscontinuities\ndiscontinuity\ndiscontinuous\ndiscontinuously\ndiscontinuousness\ndiscophile\ndiscophiles\ndiscord\ndiscordance\ndiscordancy\ndiscordant\ndiscordantly\ndiscorded\ndiscording\ndiscords\ndiscorporate\ndiscos\ndiscotheque\ndiscotheques\ndiscothèque\ndiscothèques\ndiscount\ndiscountable\ndiscounted\ndiscountenance\ndiscountenanced\ndiscountenances\ndiscountenancing\ndiscounter\ndiscounters\ndiscounting\ndiscounts\ndiscourage\ndiscourageable\ndiscouraged\ndiscouragement\ndiscouragements\ndiscourager\ndiscouragers\ndiscourages\ndiscouraging\ndiscouragingly\ndiscourse\ndiscoursed\ndiscourser\ndiscoursers\ndiscourses\ndiscoursing\ndiscourteous\ndiscourteously\ndiscourteousness\ndiscourtesies\ndiscourtesy\ndiscover\ndiscoverability\ndiscoverable\ndiscovered\ndiscoverer\ndiscoverers\ndiscoveries\ndiscovering\ndiscovers\ndiscovery\ndiscredit\ndiscreditable\ndiscreditably\ndiscredited\ndiscrediting\ndiscredits\ndiscreet\ndiscreetly\ndiscreetness\ndiscrepance\ndiscrepances\ndiscrepancies\ndiscrepancy\ndiscrepant\ndiscrepantly\ndiscrete\ndiscretely\ndiscreteness\ndiscretion\ndiscretional\ndiscretionally\ndiscretionarily\ndiscretionary\ndiscretization\ndiscretize\ndiscretized\ndiscretizes\ndiscretizing\ndiscriminability\ndiscriminable\ndiscriminably\ndiscriminant\ndiscriminants\ndiscriminate\ndiscriminated\ndiscriminately\ndiscriminates\ndiscriminating\ndiscriminatingly\ndiscrimination\ndiscriminational\ndiscriminations\ndiscriminative\ndiscriminatively\ndiscriminator\ndiscriminatorily\ndiscriminators\ndiscriminatory\ndiscs\ndiscursion\ndiscursive\ndiscursively\ndiscursiveness\ndiscus\ndiscuses\ndiscuss\ndiscussable\ndiscussant\ndiscussants\ndiscussed\ndiscusser\ndiscussers\ndiscusses\ndiscussible\ndiscussing\ndiscussion\ndiscussions\ndisdain\ndisdained\ndisdainful\ndisdainfully\ndisdainfulness\ndisdaining\ndisdains\ndisease\ndiseased\ndiseases\ndiseconomies\ndiseconomy\ndisembark\ndisembarkation\ndisembarked\ndisembarking\ndisembarks\ndisembarrass\ndisembarrassed\ndisembarrasses\ndisembarrassing\ndisembarrassment\ndisembodied\ndisembodies\ndisembodiment\ndisembody\ndisembodying\ndisembogue\ndisembogued\ndisemboguement\ndisembogues\ndisemboguing\ndisembowel\ndisemboweled\ndisemboweling\ndisembowelment\ndisembowelments\ndisembowels\ndisemploy\ndisemployed\ndisemploying\ndisemployment\ndisemploys\ndisempower\ndisempowered\ndisempowering\ndisempowerment\ndisempowers\ndisenable\ndisenabled\ndisenables\ndisenabling\ndisenchant\ndisenchanted\ndisenchanter\ndisenchanters\ndisenchanting\ndisenchantingly\ndisenchantment\ndisenchants\ndisencumber\ndisencumbered\ndisencumbering\ndisencumberment\ndisencumbers\ndisendow\ndisendowed\ndisendower\ndisendowers\ndisendowing\ndisendowment\ndisendows\ndisenfranchise\ndisenfranchised\ndisenfranchisement\ndisenfranchises\ndisenfranchising\ndisengage\ndisengaged\ndisengagement\ndisengages\ndisengaging\ndisentail\ndisentailed\ndisentailing\ndisentailment\ndisentails\ndisentangle\ndisentangled\ndisentanglement\ndisentangles\ndisentangling\ndisenthrall\ndisenthralled\ndisenthralling\ndisenthralls\ndisentitle\ndisentitled\ndisentitles\ndisentitling\ndisentomb\ndisentombed\ndisentombing\ndisentombs\ndisentwine\ndisentwined\ndisentwines\ndisentwining\ndisequilibrate\ndisequilibrated\ndisequilibrates\ndisequilibrating\ndisequilibration\ndisequilibrium\ndisestablish\ndisestablished\ndisestablishes\ndisestablishing\ndisestablishment\ndisestablishmentarian\ndisestablishmentarians\ndisesteem\ndisesteemed\ndisesteeming\ndisesteems\ndiseur\ndiseurs\ndiseuse\ndiseuses\ndisfavor\ndisfavored\ndisfavoring\ndisfavors\ndisfeature\ndisfeatured\ndisfeaturement\ndisfeatures\ndisfeaturing\ndisfiguration\ndisfigure\ndisfigured\ndisfigurement\ndisfigurements\ndisfigurer\ndisfigurers\ndisfigures\ndisfiguring\ndisfranchise\ndisfranchised\ndisfranchisement\ndisfranchiser\ndisfranchisers\ndisfranchises\ndisfranchising\ndisfrock\ndisfrocked\ndisfrocking\ndisfrocks\ndisgorge\ndisgorged\ndisgorgement\ndisgorges\ndisgorging\ndisgrace\ndisgraced\ndisgraceful\ndisgracefully\ndisgracefulness\ndisgracer\ndisgracers\ndisgraces\ndisgracing\ndisgruntle\ndisgruntled\ndisgruntlement\ndisgruntles\ndisgruntling\ndisguise\ndisguised\ndisguisedly\ndisguisement\ndisguisements\ndisguiser\ndisguisers\ndisguises\ndisguising\ndisgust\ndisgusted\ndisgustedly\ndisgustful\ndisgustfully\ndisgusting\ndisgustingly\ndisgusts\ndish\ndishabille\ndisharmonic\ndisharmonies\ndisharmonious\ndisharmoniously\ndisharmonize\ndisharmonized\ndisharmonizes\ndisharmonizing\ndisharmony\ndishcloth\ndishcloths\ndishearten\ndisheartened\ndisheartening\ndishearteningly\ndisheartenment\ndisheartenments\ndisheartens\ndished\ndishes\ndishevel\ndisheveled\ndisheveling\ndishevelment\ndishevels\ndishier\ndishiest\ndishing\ndishonest\ndishonesties\ndishonestly\ndishonesty\ndishonor\ndishonorable\ndishonorableness\ndishonorably\ndishonored\ndishonorer\ndishonorers\ndishonoring\ndishonors\ndishpan\ndishpans\ndishrag\ndishrags\ndishtowel\ndishtowels\ndishware\ndishwares\ndishwasher\ndishwashers\ndishwashing\ndishwater\ndishwaters\ndishy\ndisillusion\ndisillusioned\ndisillusioning\ndisillusionment\ndisillusions\ndisillusive\ndisincarnate\ndisincentive\ndisincentives\ndisinclination\ndisinclinations\ndisincline\ndisinclined\ndisinclines\ndisinclining\ndisincorporate\ndisincorporated\ndisincorporates\ndisincorporating\ndisincorporation\ndisinfect\ndisinfectant\ndisinfectants\ndisinfected\ndisinfecting\ndisinfection\ndisinfects\ndisinfest\ndisinfestant\ndisinfestants\ndisinfestation\ndisinfested\ndisinfesting\ndisinfests\ndisinflation\ndisinflationary\ndisinform\ndisinformant\ndisinformants\ndisinformation\ndisinformed\ndisinformer\ndisinformers\ndisinforming\ndisinforms\ndisingenuous\ndisingenuously\ndisingenuousness\ndisinherit\ndisinheritance\ndisinheritances\ndisinherited\ndisinheriting\ndisinherits\ndisinhibit\ndisinhibited\ndisinhibiting\ndisinhibition\ndisinhibitions\ndisinhibits\ndisintegrate\ndisintegrated\ndisintegrates\ndisintegrating\ndisintegration\ndisintegrations\ndisintegrative\ndisintegrator\ndisintegrators\ndisinter\ndisinterest\ndisinterested\ndisinterestedly\ndisinterestedness\ndisintermediation\ndisintermediations\ndisinterment\ndisinterred\ndisinterring\ndisinters\ndisintoxicate\ndisintoxicated\ndisintoxicates\ndisintoxicating\ndisintoxication\ndisinvent\ndisinvented\ndisinventing\ndisinvention\ndisinvents\ndisinvest\ndisinvested\ndisinvesting\ndisinvestment\ndisinvestments\ndisinvests\ndisinvitation\ndisinvite\ndisinvited\ndisinvites\ndisinviting\ndisjoin\ndisjoined\ndisjoining\ndisjoins\ndisjoint\ndisjointed\ndisjointedly\ndisjointedness\ndisjointing\ndisjoints\ndisjunct\ndisjunction\ndisjunctive\ndisjunctively\ndisjuncture\ndisjunctures\ndisk\ndisked\ndiskette\ndiskettes\ndisking\ndiskless\ndisklike\ndisks\ndislikable\ndislike\ndisliked\ndislikes\ndisliking\ndislocate\ndislocated\ndislocates\ndislocating\ndislocation\ndislocations\ndislodge\ndislodged\ndislodgement\ndislodges\ndislodging\ndislodgment\ndisloyal\ndisloyally\ndisloyalties\ndisloyalty\ndismal\ndismally\ndismalness\ndismantle\ndismantled\ndismantlement\ndismantles\ndismantling\ndismast\ndismasted\ndismasting\ndismasts\ndismay\ndismayed\ndismaying\ndismayingly\ndismays\ndismember\ndismembered\ndismembering\ndismemberment\ndismembers\ndismiss\ndismissal\ndismissals\ndismissed\ndismisses\ndismissible\ndismissing\ndismission\ndismissive\ndismount\ndismountable\ndismounted\ndismounting\ndismounts\ndisney\ndisneyland\ndisobedience\ndisobedient\ndisobediently\ndisobey\ndisobeyed\ndisobeyer\ndisobeyers\ndisobeying\ndisobeys\ndisoblige\ndisobliged\ndisobliges\ndisobliging\ndisobligingly\ndisorder\ndisordered\ndisorderedly\ndisorderedness\ndisordering\ndisorderliness\ndisorderly\ndisorders\ndisorganization\ndisorganize\ndisorganized\ndisorganizes\ndisorganizing\ndisorient\ndisorientate\ndisorientated\ndisorientates\ndisorientating\ndisorientation\ndisoriented\ndisorienting\ndisorients\ndisown\ndisowned\ndisowning\ndisownment\ndisowns\ndisparage\ndisparaged\ndisparagement\ndisparager\ndisparagers\ndisparages\ndisparaging\ndisparagingly\ndisparate\ndisparately\ndisparateness\ndisparities\ndisparity\ndisparlure\ndisparlures\ndispassion\ndispassionate\ndispassionately\ndispassionateness\ndispatch\ndispatched\ndispatcher\ndispatchers\ndispatches\ndispatching\ndispel\ndispelled\ndispelling\ndispels\ndispensability\ndispensable\ndispensableness\ndispensaries\ndispensary\ndispensation\ndispensational\ndispensations\ndispensatories\ndispensatory\ndispense\ndispensed\ndispenser\ndispensers\ndispenses\ndispensing\ndispeople\ndispeopled\ndispeoples\ndispeopling\ndispersal\ndispersant\ndisperse\ndispersed\ndispersedly\ndisperser\ndispersers\ndisperses\ndispersible\ndispersing\ndispersion\ndispersions\ndispersive\ndispersively\ndispersiveness\ndispirit\ndispirited\ndispiritedly\ndispiritedness\ndispiriting\ndispirits\ndisplace\ndisplaceable\ndisplaced\ndisplacement\ndisplacements\ndisplacer\ndisplacers\ndisplaces\ndisplacing\ndisplant\ndisplanted\ndisplanting\ndisplants\ndisplay\ndisplayable\ndisplayed\ndisplaying\ndisplays\ndisplease\ndispleased\ndispleases\ndispleasing\ndispleasingly\ndispleasure\ndisport\ndisported\ndisporting\ndisportment\ndisports\ndisposability\ndisposable\ndisposal\ndisposals\ndispose\ndisposed\ndisposer\ndisposers\ndisposes\ndisposing\ndisposition\ndispositions\ndispossess\ndispossessed\ndispossesses\ndispossessing\ndispossession\ndispossessions\ndispossessor\ndispossessors\ndispossessory\ndispraise\ndispraised\ndispraiser\ndispraisers\ndispraises\ndispraising\ndispraisingly\ndisproof\ndisproportion\ndisproportional\ndisproportionally\ndisproportionate\ndisproportionately\ndisproportionateness\ndisproportionation\ndisproportioned\ndisproportioning\ndisproportions\ndisprovable\ndisproval\ndisprove\ndisproved\ndisproves\ndisproving\ndisputability\ndisputable\ndisputably\ndisputant\ndisputants\ndisputation\ndisputations\ndisputatious\ndisputatiously\ndisputatiousness\ndispute\ndisputed\ndisputer\ndisputers\ndisputes\ndisputing\ndisqualification\ndisqualifications\ndisqualified\ndisqualifies\ndisqualify\ndisqualifying\ndisquiet\ndisquieted\ndisquieting\ndisquietingly\ndisquietly\ndisquietness\ndisquiets\ndisquietude\ndisquisition\ndisraeli\ndisrate\ndisrated\ndisrates\ndisrating\ndisregard\ndisregarded\ndisregarder\ndisregarders\ndisregardful\ndisregarding\ndisregards\ndisrelish\ndisrelished\ndisrelishes\ndisrelishing\ndisremember\ndisremembered\ndisremembering\ndisremembers\ndisrepair\ndisreputability\ndisreputable\ndisreputableness\ndisreputably\ndisrepute\ndisrespect\ndisrespectability\ndisrespectable\ndisrespected\ndisrespectful\ndisrespectfully\ndisrespectfulness\ndisrespecting\ndisrespects\ndisrobe\ndisrobed\ndisrober\ndisrobers\ndisrobes\ndisrobing\ndisrupt\ndisrupted\ndisrupter\ndisrupters\ndisrupting\ndisruption\ndisruptions\ndisruptive\ndisruptively\ndisruptiveness\ndisruptor\ndisruptors\ndisrupts\ndissatisfaction\ndissatisfactions\ndissatisfactory\ndissatisfied\ndissatisfiedly\ndissatisfies\ndissatisfy\ndissatisfying\ndissect\ndissected\ndissectible\ndissecting\ndissection\ndissections\ndissector\ndissectors\ndissects\ndisseize\ndisseized\ndisseizes\ndisseizin\ndisseizing\ndisseizins\ndissemblance\ndissemble\ndissembled\ndissembler\ndissemblers\ndissembles\ndissembling\ndissemblingly\ndisseminate\ndisseminated\ndisseminates\ndisseminating\ndissemination\ndisseminations\ndisseminator\ndisseminators\ndisseminule\ndisseminules\ndissension\ndissensions\ndissent\ndissented\ndissenter\ndissenters\ndissentience\ndissentient\ndissentients\ndissenting\ndissentingly\ndissents\ndissepiment\ndissepimental\ndissepiments\ndissert\ndissertate\ndissertated\ndissertates\ndissertating\ndissertation\ndissertations\ndissertator\ndissertators\ndisserted\ndisserting\ndisserts\ndisserve\ndisserved\ndisserves\ndisservice\ndisserving\ndissever\ndisseverance\ndissevered\ndissevering\ndisseverment\ndissevers\ndissidence\ndissident\ndissidents\ndissilient\ndissimilar\ndissimilarities\ndissimilarity\ndissimilarly\ndissimilate\ndissimilated\ndissimilates\ndissimilating\ndissimilation\ndissimilations\ndissimilatory\ndissimilitude\ndissimulate\ndissimulated\ndissimulates\ndissimulating\ndissimulation\ndissimulations\ndissimulative\ndissimulator\ndissimulators\ndissipate\ndissipated\ndissipatedly\ndissipatedness\ndissipater\ndissipaters\ndissipates\ndissipating\ndissipation\ndissipations\ndissipative\ndissipator\ndissipators\ndissociability\ndissociable\ndissociableness\ndissociably\ndissociate\ndissociated\ndissociates\ndissociating\ndissociation\ndissociations\ndissociative\ndissolubility\ndissoluble\ndissolubleness\ndissolute\ndissolutely\ndissoluteness\ndissolution\ndissolutive\ndissolvable\ndissolve\ndissolved\ndissolvent\ndissolvents\ndissolver\ndissolvers\ndissolves\ndissolving\ndissonance\ndissonances\ndissonancies\ndissonancy\ndissonant\ndissonantly\ndissuade\ndissuaded\ndissuader\ndissuaders\ndissuades\ndissuading\ndissuasion\ndissuasions\ndissuasive\ndissuasively\ndissuasiveness\ndissymmetric\ndissymmetrical\ndissymmetrically\ndissymmetries\ndissymmetry\ndistaff\ndistaffs\ndistal\ndistally\ndistance\ndistanced\ndistances\ndistancing\ndistant\ndistantly\ndistantness\ndistaste\ndistasted\ndistasteful\ndistastefully\ndistastefulness\ndistastes\ndistasting\ndistemper\ndistemperate\ndistempered\ndistempering\ndistempers\ndistend\ndistended\ndistending\ndistends\ndistensibility\ndistensible\ndistension\ndistensions\ndistention\ndistich\ndistichous\ndistichously\ndistichs\ndistil\ndistill\ndistillable\ndistillate\ndistillates\ndistillation\ndistillations\ndistilled\ndistiller\ndistilleries\ndistillers\ndistillery\ndistilling\ndistills\ndistils\ndistinct\ndistinction\ndistinctions\ndistinctive\ndistinctively\ndistinctiveness\ndistinctly\ndistinctness\ndistinguish\ndistinguishability\ndistinguishable\ndistinguishably\ndistinguished\ndistinguishes\ndistinguishing\ndistingué\ndistort\ndistortable\ndistorted\ndistortedly\ndistorter\ndistorters\ndistorting\ndistortion\ndistortional\ndistortionary\ndistortions\ndistortive\ndistorts\ndistract\ndistracted\ndistractedly\ndistracter\ndistracters\ndistractibility\ndistractible\ndistracting\ndistractingly\ndistraction\ndistractions\ndistractive\ndistracts\ndistrain\ndistrainable\ndistrained\ndistrainee\ndistrainees\ndistrainer\ndistrainers\ndistraining\ndistrainment\ndistrainor\ndistrainors\ndistrains\ndistraint\ndistraints\ndistrait\ndistraught\ndistraughtly\ndistress\ndistressed\ndistresses\ndistressful\ndistressfully\ndistressfulness\ndistressing\ndistressingly\ndistributable\ndistributaries\ndistributary\ndistribute\ndistributed\ndistributee\ndistributes\ndistributing\ndistribution\ndistributional\ndistributions\ndistributive\ndistributively\ndistributiveness\ndistributives\ndistributivity\ndistributor\ndistributors\ndistributorship\ndistributorships\ndistrict\ndistricted\ndistricting\ndistricts\ndistrictwide\ndistrust\ndistrusted\ndistrustful\ndistrustfully\ndistrustfulness\ndistrusting\ndistrusts\ndisturb\ndisturbance\ndisturbances\ndisturbed\ndisturber\ndisturbers\ndisturbing\ndisturbingly\ndisturbs\ndisulfide\ndisulfides\ndisulfoton\ndisulfotons\ndisunion\ndisunionist\ndisunionists\ndisunite\ndisunited\ndisunites\ndisunities\ndisuniting\ndisunity\ndisuse\ndisused\ndisutility\ndisvalue\ndisvalued\ndisvalues\ndisvaluing\ndisyllabic\ndisyllable\ndisyllables\nditch\nditched\nditcher\nditchers\nditches\nditching\ndither\ndithered\nditherer\nditherers\ndithering\ndithers\ndithery\ndithyramb\ndithyrambic\ndithyrambs\nditsier\nditsiest\nditsy\ndittanies\ndittany\nditties\nditto\ndittoed\ndittoes\ndittoing\ndittos\nditty\ndiu\ndiuresis\ndiuretic\ndiuretically\ndiuretics\ndiurnal\ndiurnally\ndiurnals\ndiuron\ndiurons\ndiva\ndivagate\ndivagated\ndivagates\ndivagating\ndivagation\ndivagations\ndivalent\ndivan\ndivans\ndivaricate\ndivaricated\ndivaricately\ndivaricates\ndivaricating\ndivarication\ndivarications\ndivas\ndive\ndived\ndiver\ndiverge\ndiverged\ndivergence\ndivergences\ndivergencies\ndivergency\ndivergent\ndivergently\ndiverges\ndiverging\ndivers\ndiverse\ndiversely\ndiverseness\ndiversification\ndiversified\ndiversifier\ndiversifiers\ndiversifies\ndiversiform\ndiversify\ndiversifying\ndiversion\ndiversionary\ndiversionist\ndiversionists\ndiversions\ndiversities\ndiversity\ndivert\ndiverted\ndiverter\ndiverters\ndiverticula\ndiverticular\ndiverticulitis\ndiverticulosis\ndiverticulum\ndivertimenti\ndivertimento\ndivertimentos\ndiverting\ndivertingly\ndivertissement\ndivertissements\ndiverts\ndives\ndivest\ndivested\ndivesting\ndivestiture\ndivestitures\ndivestment\ndivestments\ndivests\ndividable\ndivide\ndivided\ndividend\ndividends\ndivider\ndividers\ndivides\ndividing\ndivination\ndivinations\ndivinatory\ndivine\ndivined\ndivinely\ndivineness\ndiviner\ndiviners\ndivines\ndivinest\ndiving\ndivining\ndivinities\ndivinity\ndivisibility\ndivisible\ndivisibleness\ndivisibly\ndivision\ndivisional\ndivisionism\ndivisionist\ndivisionists\ndivisions\ndivisive\ndivisively\ndivisiveness\ndivisor\ndivisors\ndivorce\ndivorced\ndivorcee\ndivorcees\ndivorcement\ndivorcements\ndivorces\ndivorcing\ndivorcé\ndivorcée\ndivorcées\ndivorcés\ndivot\ndivots\ndivulge\ndivulged\ndivulgement\ndivulgence\ndivulger\ndivulgers\ndivulges\ndivulging\ndivvied\ndivvies\ndivvy\ndivvying\ndiwali\ndixie\ndixiecrat\ndixiecratic\ndixiecrats\ndixieland\ndixit\ndixon\ndizen\ndizened\ndizening\ndizenment\ndizens\ndizygotic\ndizygous\ndizzied\ndizzier\ndizzies\ndizziest\ndizzily\ndizziness\ndizzy\ndizzying\ndizzyingly\ndjakarta\ndjellaba\ndjellabah\ndjibouti\ndjiboutian\ndjiboutians\ndna\ndnieper\ndo\ndo's\ndoable\ndobbies\ndobbin\ndobbins\ndobby\ndoberman\ndobermans\ndobra\ndobras\ndobro\ndobson\ndobsonflies\ndobsonfly\ndobsons\ndoc\ndocent\ndocents\ndocetic\ndocetism\ndocetist\ndocetists\ndoch\ndocile\ndocilely\ndocility\ndock\ndockage\ndocked\ndocker\ndockers\ndocket\ndocketed\ndocketing\ndockets\ndockhand\ndockhands\ndocking\ndockmackie\ndockmackies\ndockominium\ndockominiums\ndocks\ndockside\ndocksides\ndockworker\ndockworkers\ndockyard\ndockyards\ndocs\ndoctor\ndoctoral\ndoctorate\ndoctorates\ndoctored\ndoctoring\ndoctorless\ndoctorly\ndoctors\ndoctorship\ndoctrinaire\ndoctrinaires\ndoctrinairism\ndoctrinal\ndoctrinally\ndoctrinarian\ndoctrine\ndoctrines\ndocudrama\ndocudramas\ndocudramatic\ndocument\ndocumentable\ndocumental\ndocumentalist\ndocumentalists\ndocumentarian\ndocumentarians\ndocumentaries\ndocumentarily\ndocumentarist\ndocumentarists\ndocumentary\ndocumentation\ndocumentational\ndocumented\ndocumenter\ndocumenters\ndocumenting\ndocuments\ndocutainment\ndocutainments\ndodder\ndoddered\ndodderer\ndodderers\ndoddering\ndodders\ndoddery\ndodecagon\ndodecagonal\ndodecagons\ndodecahedra\ndodecahedral\ndodecahedron\ndodecahedrons\ndodecanese\ndodecaphonic\ndodecaphonism\ndodecaphonist\ndodecaphonists\ndodecaphony\ndodge\ndodged\ndodger\ndodgeries\ndodgers\ndodgery\ndodges\ndodgier\ndodgiest\ndodging\ndodgy\ndodo\ndodoes\ndodoma\ndodos\ndoe\ndoer\ndoers\ndoes\ndoeskin\ndoeskins\ndoesn\ndoesn't\ndoff\ndoffed\ndoffing\ndoffs\ndog\ndogbane\ndogbanes\ndogberries\ndogberry\ndogcart\ndogcarts\ndogcatcher\ndogcatchers\ndoge\ndoges\ndogface\ndogfaces\ndogfight\ndogfighter\ndogfighters\ndogfighting\ndogfightings\ndogfights\ndogfish\ndogfishes\ndogged\ndoggedly\ndoggedness\ndoggerel\ndoggerels\ndoggeries\ndoggery\ndoggie\ndoggier\ndoggies\ndoggiest\ndogging\ndoggish\ndoggishly\ndoggishness\ndoggo\ndoggone\ndoggoned\ndoggoning\ndoggy\ndoghouse\ndoghouses\ndogie\ndogies\ndogleg\ndoglegged\ndoglegging\ndoglegs\ndoglike\ndogma\ndogmas\ndogmata\ndogmatic\ndogmatically\ndogmaticalness\ndogmatics\ndogmatism\ndogmatist\ndogmatists\ndogmatization\ndogmatize\ndogmatized\ndogmatizes\ndogmatizing\ndognap\ndognaped\ndognaping\ndognapped\ndognapper\ndognappers\ndognapping\ndognaps\ndogrib\ndogribs\ndogs\ndogsbodies\ndogsbody\ndogsled\ndogsledder\ndogsledders\ndogsledding\ndogsleds\ndogtooth\ndogtooths\ndogtrot\ndogtrots\ndogtrotted\ndogtrotting\ndogwatch\ndogwatches\ndogwood\ndogwoods\ndoilies\ndoily\ndoing\ndoings\ndoister\ndojo\ndojos\ndolabriform\ndolby\ndolce\ndoldrums\ndole\ndoled\ndoleful\ndolefully\ndolefulness\ndolerite\ndoleritic\ndoles\ndolesome\ndolichocephalic\ndolichocephalism\ndolichocephaly\ndolichocranial\ndolichocrany\ndoling\ndoll\ndollar\ndollarfish\ndollarfishes\ndollars\ndolled\ndollhouse\ndollhouses\ndollied\ndollies\ndolling\ndollish\ndollishly\ndollishness\ndollop\ndollops\ndolls\ndolly\ndollying\ndolma\ndolmades\ndolman\ndolmans\ndolmas\ndolmen\ndolmens\ndolomite\ndolomites\ndolomitic\ndolomitization\ndolomitize\ndolor\ndoloroso\ndolorous\ndolorously\ndolorousness\ndolors\ndolphin\ndolphins\ndolt\ndoltish\ndoltishly\ndoltishness\ndolts\ndom\ndomain\ndomains\ndome\ndomed\ndomenichino\ndomes\ndomesday\ndomestic\ndomestically\ndomesticate\ndomesticated\ndomesticates\ndomesticating\ndomestication\ndomestications\ndomesticities\ndomesticity\ndomesticize\ndomesticized\ndomesticizes\ndomesticizing\ndomestics\ndomical\ndomically\ndomicile\ndomiciled\ndomiciles\ndomiciliary\ndomiciliate\ndomiciliation\ndomiciling\ndominance\ndominant\ndominantly\ndominants\ndominate\ndominated\ndominates\ndominating\ndomination\ndominations\ndominative\ndominator\ndominators\ndominatrices\ndominatrix\ndominatrixes\ndomineer\ndomineered\ndomineering\ndomineeringly\ndomineeringness\ndomineers\ndoming\ndomingo\ndomini\ndominic\ndominica\ndominical\ndominican\ndominicans\ndominie\ndominies\ndominion\ndominions\ndominique\ndomino\ndominoes\ndominos\ndomitian\ndomo\ndomos\ndoms\ndon\ndon't\ndon'ts\ndonald\ndonate\ndonated\ndonatello\ndonates\ndonating\ndonation\ndonations\ndonatism\ndonatist\ndonatists\ndonative\ndonatives\ndonator\ndonators\ndone\ndonee\ndonees\ndoneness\ndong\ndongs\ndonjon\ndonjons\ndonkey\ndonkeys\ndonkeywork\ndonkeyworks\ndonna\ndonnas\ndonne\ndonned\ndonning\ndonnish\ndonnishly\ndonnishness\ndonnybrook\ndonnybrooks\ndonnée\ndonor\ndonors\ndons\ndonut\ndonuts\ndoodad\ndoodads\ndoodle\ndoodlebug\ndoodlebugs\ndoodled\ndoodler\ndoodlers\ndoodles\ndoodling\ndoohickey\ndoohickeys\ndoom\ndoomed\ndoomful\ndoomfully\ndooming\ndooms\ndoomsayer\ndoomsayers\ndoomsday\ndoomster\ndoor\ndoorbell\ndoorbells\ndoored\ndoorframe\ndoorframes\ndooring\ndoorjamb\ndoorjambs\ndoorkeeper\ndoorkeepers\ndoorknob\ndoorknobs\ndoorknocker\ndoorknockers\ndoorless\ndoorman\ndoormat\ndoormats\ndoormen\ndoornail\ndoornails\ndoorplate\ndoorplates\ndoorpost\ndoorposts\ndoors\ndoorsill\ndoorsills\ndoorstep\ndoorsteps\ndoorstop\ndoorstopper\ndoorstoppers\ndoorstops\ndoorway\ndoorways\ndoorwoman\ndoorwomen\ndooryard\ndoozie\ndoozies\ndoozy\ndopa\ndopamine\ndopant\ndopants\ndope\ndoped\ndoper\ndopers\ndopes\ndopester\ndopesters\ndopey\ndopier\ndopiest\ndopiness\ndoping\ndoppelganger\ndoppelgangers\ndoppelgänger\ndoppelgängers\ndoppler\ndorado\ndorbeetle\ndorbeetles\ndorchester\ndordogne\ndordrecht\ndorian\ndorians\ndoric\ndories\ndork\ndorking\ndorkings\ndorks\ndorm\ndormancy\ndormant\ndormer\ndormers\ndormice\ndormin\ndormins\ndormitories\ndormitory\ndormouse\ndorms\ndormy\ndornick\ndornicks\ndoronicum\ndoronicums\ndorothy\ndorp\ndorps\ndorris\ndorsa\ndorsad\ndorsal\ndorsally\ndorset\ndorsiventral\ndorsiventrally\ndorsolateral\ndorsolaterally\ndorsoventral\ndorsum\ndortmund\ndory\ndorée\ndos\ndosage\ndosages\ndose\ndosed\ndoser\ndosers\ndoses\ndosimeter\ndosimeters\ndosimetric\ndosimetry\ndosing\ndoss\ndossal\ndossals\ndossed\ndosses\ndossier\ndossiers\ndossing\ndostoevski\ndostoyevskian\ndostoyevsky\ndot\ndotage\ndotal\ndotard\ndotards\ndote\ndoted\ndoter\ndoters\ndotes\ndoting\ndotingly\ndotless\ndots\ndotted\ndotter\ndotterel\ndotters\ndottier\ndottiest\ndottily\ndottiness\ndotting\ndottle\ndottles\ndotty\ndouble\ndoubled\ndoubleday\ndoubleheader\ndoubleheaders\ndoubleness\ndoubler\ndoublers\ndoubles\ndoublespeak\ndoublet\ndoublethink\ndoublethinks\ndoubleton\ndoubletons\ndoubletree\ndoubletrees\ndoublets\ndoublewide\ndoublewides\ndoubleword\ndoublewords\ndoubling\ndoubloon\ndoubloons\ndoubly\ndoubt\ndoubtable\ndoubted\ndoubter\ndoubters\ndoubtful\ndoubtfully\ndoubtfulness\ndoubting\ndoubtingly\ndoubtless\ndoubtlessly\ndoubtlessness\ndoubts\ndouceur\ndouceurs\ndouche\ndouched\ndouches\ndouching\ndoug\ndough\ndoughboy\ndoughboys\ndoughface\ndoughfaces\ndoughier\ndoughiest\ndoughiness\ndoughlike\ndoughnut\ndoughnuts\ndoughtier\ndoughtiest\ndoughtily\ndoughtiness\ndoughty\ndoughy\ndouglas\ndoum\ndoums\ndour\ndourer\ndourest\ndourine\ndourines\ndourly\ndourness\ndouro\ndouse\ndoused\ndouser\ndousers\ndouses\ndousing\ndoute\ndove\ndovecote\ndovecotes\ndovekie\ndovekies\ndover\ndoves\ndovetail\ndovetailed\ndovetailing\ndovetails\ndovish\ndovishness\ndow\ndowager\ndowagers\ndowdier\ndowdies\ndowdiest\ndowdily\ndowdiness\ndowdy\ndowdyish\ndowel\ndoweled\ndoweling\ndowels\ndower\ndowered\ndowering\ndowers\ndowitcher\ndowitchers\ndown\ndownbeat\ndownbeats\ndownburst\ndownbursts\ndowncast\ndowncourt\ndowndraft\ndowndrafts\ndowned\ndowner\ndowners\ndownfall\ndownfallen\ndownfalls\ndownfield\ndowngrade\ndowngraded\ndowngrades\ndowngrading\ndownhaul\ndownhauls\ndownhearted\ndownheartedly\ndownheartedness\ndownhill\ndownhills\ndownier\ndowniest\ndowniness\ndowning\ndownlink\ndownlinked\ndownlinking\ndownlinks\ndownload\ndownloadable\ndownloaded\ndownloading\ndownloads\ndownplay\ndownplayed\ndownplaying\ndownplays\ndownpour\ndownpours\ndownrange\ndownrigger\ndownriggers\ndownright\ndownrightly\ndownrightness\ndownriver\ndowns\ndownscale\ndownscaled\ndownscales\ndownscaling\ndownshift\ndownshifted\ndownshifting\ndownshifts\ndownside\ndownsides\ndownsize\ndownsized\ndownsizes\ndownsizing\ndownslide\ndownslides\ndownslope\ndownspin\ndownspins\ndownspout\ndownspouts\ndownstage\ndownstairs\ndownstate\ndownstater\ndownstaters\ndownstream\ndownstroke\ndownswing\ndownswings\ndowntick\ndownticks\ndowntime\ndowntimes\ndowntown\ndowntowner\ndowntowners\ndowntowns\ndowntrend\ndowntrended\ndowntrending\ndowntrends\ndowntrodden\ndownturn\ndownturns\ndownward\ndownwardly\ndownwardness\ndownwards\ndownwind\ndowny\ndownzone\ndownzoned\ndownzones\ndownzoning\ndowries\ndowry\ndowse\ndowsed\ndowser\ndowsers\ndowses\ndowsing\ndoxies\ndoxological\ndoxologically\ndoxologies\ndoxology\ndoxorubicin\ndoxorubicins\ndoxy\ndoxycycline\ndoxycyclines\ndoyen\ndoyenne\ndoyennes\ndoyens\ndoyle\ndoze\ndozed\ndozen\ndozens\ndozenth\ndozer\ndozers\ndozes\ndozier\ndoziest\ndozily\ndoziness\ndozing\ndozy\ndoña\ndr\ndrab\ndrabbed\ndrabber\ndrabbest\ndrabbing\ndrabble\ndrabbled\ndrabbles\ndrabbling\ndrably\ndrabness\ndrabs\ndracaena\ndracaenas\ndrachenfels\ndrachm\ndrachma\ndrachmae\ndrachmas\ndrachms\ndraconian\ndraconic\ndraconically\ndracula\ndraft\ndraftable\ndrafted\ndraftee\ndraftees\ndrafter\ndrafters\ndraftier\ndraftiest\ndraftily\ndraftiness\ndrafting\ndraftings\ndrafts\ndraftsman\ndraftsmanship\ndraftsmen\ndraftsperson\ndraftspersons\ndraftswoman\ndraftswomen\ndrafty\ndrag\ndragged\ndragger\ndraggers\ndraggier\ndraggiest\ndragging\ndraggingly\ndraggle\ndraggled\ndraggles\ndraggling\ndraggy\ndraglift\ndraglifts\ndragline\ndraglines\ndragnet\ndragnets\ndragoman\ndragomans\ndragomen\ndragon\ndragonet\ndragonets\ndragonflies\ndragonfly\ndragonhead\ndragonheads\ndragonish\ndragonroot\ndragonroots\ndragons\ndragoon\ndragooned\ndragooning\ndragoons\ndrags\ndragster\ndragsters\ndragée\ndrain\ndrainable\ndrainage\ndrained\ndrainer\ndrainers\ndraining\ndrainpipe\ndrainpipes\ndrains\ndrake\ndrakes\ndram\ndrama\ndramamine\ndramas\ndramatic\ndramatically\ndramatics\ndramatis\ndramatist\ndramatists\ndramatization\ndramatizations\ndramatize\ndramatized\ndramatizes\ndramatizing\ndramaturge\ndramaturges\ndramaturgic\ndramaturgical\ndramaturgically\ndramaturgy\ndrams\ndrang\ndrank\ndrapability\ndrapable\ndrape\ndraped\ndraper\ndraperies\ndrapers\ndrapery\ndrapes\ndraping\ndrastic\ndrastically\ndrat\ndratted\ndratting\ndraught\ndraughts\ndravidian\ndravidians\ndravidic\ndraw\ndrawable\ndrawback\ndrawbacks\ndrawbar\ndrawbars\ndrawbridge\ndrawbridges\ndrawdown\ndrawdowns\ndrawee\ndrawees\ndrawer\ndrawerful\ndrawers\ndrawing\ndrawings\ndrawknife\ndrawknives\ndrawl\ndrawled\ndrawler\ndrawlers\ndrawling\ndrawlingly\ndrawls\ndrawly\ndrawn\ndrawnwork\ndrawplate\ndrawplates\ndraws\ndrawshave\ndrawshaves\ndrawstring\ndrawstrings\ndrawtube\ndrawtubes\ndray\ndrayage\ndrayed\ndraying\ndrayman\ndraymen\ndrays\ndrayton\ndread\ndreaded\ndreadful\ndreadfully\ndreadfulness\ndreading\ndreadlocked\ndreadlocks\ndreadnought\ndreadnoughts\ndreads\ndream\ndreamboat\ndreamboats\ndreamed\ndreamer\ndreamers\ndreamful\ndreamfully\ndreamfulness\ndreamier\ndreamiest\ndreamily\ndreaminess\ndreaming\ndreamland\ndreamlands\ndreamless\ndreamlessly\ndreamlessness\ndreamlike\ndreams\ndreamscape\ndreamscapes\ndreamt\ndreamtime\ndreamtimes\ndreamworld\ndreamworlds\ndreamy\ndrear\ndrearier\ndreariest\ndrearily\ndreariness\ndreary\ndreck\ndrecks\ndrecky\ndredge\ndredged\ndredger\ndredgers\ndredges\ndredging\ndreg\ndregs\ndreidel\ndreidels\ndrench\ndrenched\ndrencher\ndrenchers\ndrenches\ndrenching\ndresden\ndress\ndressage\ndressed\ndresser\ndressers\ndresses\ndressier\ndressiest\ndressily\ndressiness\ndressing\ndressings\ndressmaker\ndressmakers\ndressmaking\ndressy\ndrew\ndreyfus\ndrib\ndribble\ndribbled\ndribbler\ndribblers\ndribbles\ndribbling\ndriblet\ndriblets\ndribs\ndried\ndrier\ndriers\ndries\ndriest\ndrift\ndriftage\ndriftages\ndrifted\ndrifter\ndrifters\ndrifting\ndriftingly\ndrifts\ndriftwood\ndrifty\ndrill\ndrillability\ndrillable\ndrilled\ndriller\ndrillers\ndrilling\ndrillings\ndrillmaster\ndrillmasters\ndrills\ndrillstock\ndrillstocks\ndrily\ndrink\ndrinkability\ndrinkable\ndrinkables\ndrinker\ndrinkers\ndrinking\ndrinks\ndrip\ndripless\ndripped\ndripper\ndrippier\ndrippiest\ndrippily\ndrippiness\ndripping\ndrippings\ndrippy\ndrips\ndripstone\ndripstones\ndrivability\ndrivable\ndrive\ndrivel\ndriveled\ndriveler\ndrivelers\ndriveline\ndrivelines\ndriveling\ndrivelled\ndrivelling\ndrivels\ndriven\ndrivenness\ndriver\ndriverless\ndrivers\ndrives\ndrivetrain\ndrivetrains\ndriveway\ndriveways\ndriving\ndrivingly\ndrizzle\ndrizzled\ndrizzles\ndrizzling\ndrizzly\ndrogue\ndrogues\ndroit\ndroits\ndroll\ndroller\ndrolleries\ndrollery\ndrollest\ndrollness\ndrolls\ndrolly\ndromedaries\ndromedary\ndromond\ndromonds\ndrone\ndroned\ndroner\ndroners\ndrones\ndroning\ndroningly\ndrool\ndrooled\ndrooling\ndrools\ndroop\ndrooped\ndroopier\ndroopiest\ndroopily\ndroopiness\ndrooping\ndroopingly\ndroops\ndroopy\ndrop\ndropforge\ndropforged\ndropforges\ndropforging\ndrophead\ndropkick\ndropkicked\ndropkicker\ndropkickers\ndropkickes\ndropkicking\ndropkicks\ndroplet\ndroplets\ndroplight\ndroplights\ndropout\ndropouts\ndropped\ndropper\ndropperful\ndroppers\ndropping\ndroppings\ndrops\ndropsical\ndropsically\ndropsy\ndropwort\ndropworts\ndrosera\ndroseras\ndroshkies\ndroshky\ndrosophila\ndross\ndrossy\ndrought\ndroughtiness\ndroughts\ndroughty\ndrove\ndrover\ndrovers\ndroves\ndrown\ndrowned\ndrowning\ndrownings\ndrowns\ndrowse\ndrowsed\ndrowses\ndrowsier\ndrowsiest\ndrowsily\ndrowsiness\ndrowsing\ndrowsy\ndrub\ndrubbed\ndrubber\ndrubbers\ndrubbing\ndrubbings\ndrubs\ndrudge\ndrudged\ndrudger\ndrudgeries\ndrudgers\ndrudgery\ndrudges\ndrudgework\ndrudgeworks\ndrudging\ndrudgingly\ndrug\ndrugged\ndrugget\ndruggets\ndruggie\ndruggier\ndruggies\ndruggiest\ndrugging\ndruggist\ndruggists\ndruggy\ndrugless\ndrugmaker\ndrugmakers\ndrugola\ndrugolas\ndrugs\ndrugstore\ndrugstores\ndruid\ndruidic\ndruidical\ndruidically\ndruidism\ndruids\ndrum\ndrumbeat\ndrumbeater\ndrumbeaters\ndrumbeating\ndrumbeats\ndrumette\ndrumettes\ndrumfire\ndrumfires\ndrumhead\ndrumheads\ndrumlike\ndrumlin\ndrumlins\ndrummed\ndrummer\ndrummers\ndrumming\ndrumroll\ndrumrolls\ndrums\ndrumstick\ndrumsticks\ndrunk\ndrunkard\ndrunkards\ndrunken\ndrunkenly\ndrunkenness\ndrunker\ndrunkest\ndrunks\ndrupaceous\ndrupe\ndrupelet\ndrupelets\ndrupes\ndruse\ndruses\ndruthers\ndry\ndryable\ndryad\ndryadic\ndryads\ndryasdust\ndryasdusts\ndryden\ndryer\ndryers\ndryest\ndrying\ndryings\ndrylands\ndrylot\ndrylots\ndryly\ndryness\ndryopithecine\ndryopithecines\ndrypoint\ndrypoints\ndrys\ndrysalter\ndrysalters\ndrysaltery\ndrywall\ndrywalls\nduad\nduads\ndual\ndualism\ndualist\ndualistic\ndualistically\ndualists\ndualities\nduality\ndualize\ndualized\ndualizes\ndualizing\ndually\ndub\ndubai\ndubbed\ndubber\ndubbers\ndubbin\ndubbing\ndubbins\ndubieties\ndubiety\ndubious\ndubiously\ndubiousness\ndubitable\ndubitably\ndublin\ndubliner\ndubliners\ndubnium\ndubrovnik\ndubs\ndubuque\nducal\nducally\nducat\nducats\nduce\nduces\nduchess\nduchesses\nduchies\nduchy\nduck\nduckbill\nduckbilled\nduckbills\nduckboard\nducked\nducker\nduckers\nduckier\nduckiest\nducking\nduckling\nducklings\nduckpin\nduckpins\nducks\nducktail\nducktails\nduckweed\nduckweeds\nducky\nduct\nductal\nducted\nductile\nductilibility\nductility\nducting\nductings\nductless\nducts\nductule\nductules\nductwork\nductworks\ndud\ndude\nduded\ndudeen\ndudeens\ndudes\ndudgeon\ndudgeons\nduding\ndudish\ndudishly\nduds\ndue\nduel\ndueled\ndueler\nduelers\ndueling\nduelist\nduelists\nduelled\nduelling\nduels\nduende\nduendes\ndueness\nduenna\nduennas\nduennaship\ndues\nduet\nduets\nduetted\nduetting\nduff\nduffel\nduffels\nduffer\nduffers\nduffle\nduffles\nduffs\ndug\ndugong\ndugongs\ndugout\ndugouts\ndugs\nduiker\nduikers\nduke\nduked\ndukedom\ndukedoms\ndukes\ndukhobor\ndukhobors\nduking\ndulcet\ndulcetly\ndulcification\ndulcified\ndulcifies\ndulcify\ndulcifying\ndulcimer\ndulcimers\ndulcimore\ndulcimores\ndulcinea\ndull\ndullard\ndullards\ndulled\nduller\ndulles\ndullest\ndulling\ndullish\ndullishly\ndullness\ndulls\ndullsville\ndullsvilles\ndully\ndulness\ndulse\ndulses\nduluth\nduly\nduma\ndumas\ndumb\ndumbbell\ndumbbells\ndumbed\ndumber\ndumbest\ndumbfound\ndumbfounded\ndumbfounding\ndumbfounds\ndumbing\ndumbly\ndumbness\ndumbo\ndumbos\ndumbs\ndumbstruck\ndumbwaiter\ndumbwaiters\ndumdum\ndumdums\ndumfound\ndumfounded\ndumfounding\ndumfounds\ndumfries\ndumka\ndumky\ndummied\ndummies\ndummkopf\ndummkopfs\ndummy\ndummying\ndumortierite\ndumortierites\ndump\ndumpcart\ndumpcarts\ndumped\ndumper\ndumpers\ndumpier\ndumpiest\ndumpily\ndumpiness\ndumping\ndumpish\ndumpling\ndumplings\ndumps\ndumpsite\ndumpsites\ndumpster\ndumpsters\ndumpties\ndumpty\ndumpy\ndun\nduncan\ndunce\ndunces\ndunderhead\ndunderheaded\ndunderheads\ndundrearies\ndune\ndunedin\nduneland\ndunelike\ndunes\ndung\ndungaree\ndungarees\ndunged\ndungeon\ndungeons\ndunghill\ndunghills\ndunging\ndungs\ndungy\ndunite\ndunites\ndunitic\ndunk\ndunked\ndunker\ndunkers\ndunking\ndunkirk\ndunks\ndunlin\ndunlins\ndunlop\ndunlops\ndunnage\ndunnages\ndunned\ndunning\nduns\nduo\nduodecimal\nduodecimally\nduodecimals\nduodecimo\nduodecimos\nduodena\nduodenal\nduodenary\nduodenum\nduodenums\nduologue\nduologues\nduomo\nduomos\nduopolies\nduopoly\nduopsonies\nduopsony\nduos\nduotone\ndupability\ndupable\ndupe\nduped\nduper\nduperies\ndupers\ndupery\ndupes\nduping\nduple\nduplex\nduplexer\nduplexers\nduplexes\nduplexity\nduplicable\nduplicatable\nduplicate\nduplicated\nduplicately\nduplicates\nduplicating\nduplication\nduplications\nduplicative\nduplicator\nduplicators\nduplicatory\nduplicities\nduplicitous\nduplicitously\nduplicitousness\nduplicity\ndupont\ndura\ndurability\ndurable\ndurableness\ndurables\ndurably\ndural\nduralumin\nduralumins\nduramen\nduramens\ndurance\nduration\ndurations\ndurban\ndurbar\ndurbars\nduress\ndurga\ndurham\ndurian\ndurians\nduring\ndurkheim\ndurkheimian\ndurmast\ndurmasts\nduro\nduroc\ndurocs\ndurometer\ndurometers\nduros\ndurra\ndurras\ndurum\ndusk\ndusked\nduskier\nduskiest\nduskily\nduskiness\ndusking\ndusks\ndusky\ndust\ndustbin\ndustbins\ndustcover\ndustcovers\ndusted\nduster\ndusters\ndustheap\ndustheaps\ndustier\ndustiest\ndustily\ndustiness\ndusting\ndustings\ndustless\ndustlike\ndustman\ndustmen\ndustpan\ndustpans\ndusts\ndustsheet\ndustsheets\ndustup\ndustups\ndusty\ndutch\ndutchman\ndutchmen\ndutchwoman\ndutchwomen\nduteous\nduteously\ndutiable\nduties\ndutiful\ndutifully\ndutifulness\nduty\nduumvir\nduumvirate\nduumvirates\nduumvirs\nduvet\nduvets\nduvetyn\nduvetyns\ndvorak\ndvorák\ndwarf\ndwarfed\ndwarfing\ndwarfish\ndwarfishly\ndwarfishness\ndwarfism\ndwarflike\ndwarfness\ndwarfs\ndwarves\ndweeb\ndweebs\ndwell\ndwelled\ndweller\ndwellers\ndwelling\ndwellings\ndwells\ndwelt\ndwindle\ndwindled\ndwindles\ndwindling\ndyad\ndyadic\ndyadically\ndyadics\ndyads\ndyak\ndyaks\ndyarchies\ndyarchy\ndybbuk\ndybbukim\ndybbuks\ndye\ndyeability\ndyeable\ndyed\ndyeing\ndyer\ndyer's\ndyers\ndyes\ndyestuff\ndyestuffs\ndyewood\ndyewoods\ndyfed\ndying\ndyke\ndykes\ndynamic\ndynamical\ndynamically\ndynamicist\ndynamicists\ndynamics\ndynamism\ndynamist\ndynamistic\ndynamists\ndynamite\ndynamited\ndynamiter\ndynamiters\ndynamites\ndynamitic\ndynamiting\ndynamo\ndynamoelectric\ndynamoelectrical\ndynamometer\ndynamometers\ndynamometric\ndynamometrical\ndynamometry\ndynamos\ndynamotor\ndynamotors\ndynast\ndynastic\ndynastically\ndynasties\ndynasts\ndynasty\ndynatron\ndynatrons\ndyne\ndynes\ndynode\ndynodes\ndyscalculia\ndyscalculias\ndyscrasia\ndyscrasias\ndysenteric\ndysentery\ndysfunction\ndysfunctional\ndysgenesis\ndysgenic\ndysgenics\ndysgraphia\ndysgraphias\ndysgraphic\ndyskinesia\ndyskinesias\ndyslectic\ndyslexia\ndyslexic\ndyslexics\ndyslogistic\ndyslogistically\ndysmenorrhea\ndysmenorrheal\ndysmenorrheic\ndyspepsia\ndyspeptic\ndyspeptically\ndyspeptics\ndysphagia\ndysphagias\ndysphagic\ndysphasia\ndysphasic\ndysphasics\ndysphonia\ndysphonias\ndysphonic\ndysphoria\ndysphorias\ndysphoric\ndysplasia\ndysplastic\ndyspnea\ndyspneas\ndyspneic\ndysprosium\ndysrhythmia\ndysrhythmias\ndysteleological\ndysteleologist\ndysteleologists\ndysteleology\ndystopia\ndystopian\ndystopias\ndystrophic\ndystrophication\ndystrophy\ndysuria\ndysurias\ndysuric\ndáil\ndébouché\ndébride\ndébrided\ndébridement\ndébrides\ndébriding\ndébut\ndébutant\ndébutante\ndébutantes\ndébutants\ndébuts\ndébâcle\ndébâcles\ndéclassé\ndécolletage\ndécolletages\ndécolleté\ndécor\ndécors\ndégagé\ndéjà\ndémarche\ndémodé\ndénouement\ndénouements\ndéshabillé\ndétente\ndétentes\ndétentist\ndétentists\ndéveloppé\ndürer\ndüsseldorf\ne\ne'er\neach\neager\neagerer\neagerest\neagerly\neagerness\neagle\neagled\neagles\neaglet\neaglets\neagling\neagre\neagres\nealdorman\nealdormen\near\nearache\nearaches\neardrop\neardrops\neardrum\neardrums\neared\nearflap\nearflaps\nearful\nearfuls\nearing\nearings\nearl\nearlap\nearlaps\nearldom\nearldoms\nearless\nearlier\nearliest\nearliness\nearlobe\nearlobes\nearlock\nearlocks\nearls\nearly\nearmark\nearmarked\nearmarking\nearmarkings\nearmarks\nearmuff\nearmuffs\nearn\nearned\nearner\nearners\nearnest\nearnestly\nearnestness\nearnests\nearning\nearnings\nearns\nearp\nearphone\nearphones\nearpiece\nearpieces\nearplug\nearplugs\nearring\nearrings\nears\nearshot\nearshots\nearsplitting\nearth\nearthborn\nearthbound\nearthed\nearthen\nearthenware\nearthier\nearthiest\nearthily\nearthiness\nearthing\nearthlight\nearthlights\nearthlike\nearthliness\nearthling\nearthlings\nearthly\nearthman\nearthmen\nearthmover\nearthmovers\nearthmoving\nearthnut\nearthnuts\nearthquake\nearthquakes\nearthrise\nearthrises\nearths\nearthshaker\nearthshakers\nearthshaking\nearthshakingly\nearthshine\nearthshines\nearthstar\nearthstars\nearthward\nearthwards\nearthwork\nearthworks\nearthworm\nearthworms\nearthy\nearwax\nearwaxes\nearwig\nearwigged\nearwigging\nearwigs\nearwitness\nearwitnesses\nearworm\nearworms\nease\neased\neaseful\neasefully\neasefulness\neasel\neasels\neasement\neasements\neases\neasier\neasiest\neasily\neasiness\neasing\neast\neastbound\neaster\neasterlies\neasterly\neastern\neasterner\neasterners\neasternmost\neasternness\neasters\neastertide\neastertides\neasthampton\neasting\neastings\neastward\neastwardly\neastwards\neasy\neasygoing\neasygoingness\neat\neatable\neatables\neaten\neater\neateries\neaters\neatery\neating\neats\neau\neaux\neaves\neavesdrop\neavesdropped\neavesdropper\neavesdroppers\neavesdropping\neavesdrops\nebb\nebbed\nebbing\nebbs\nebola\neboli\nebon\nebonics\nebonies\nebonite\nebonites\nebonize\nebonized\nebonizes\nebonizing\nebons\nebony\nebracteate\nebro\nebullience\nebulliencies\nebulliency\nebullient\nebulliently\nebullition\nebullitions\neburnation\neburnations\necce\neccentric\neccentrically\neccentricities\neccentricity\neccentrics\necchymoses\necchymosis\necchymotic\necclesia\necclesiae\necclesial\necclesiastes\necclesiastic\necclesiastical\necclesiastically\necclesiasticism\necclesiasticisms\necclesiastics\necclesiasticus\necclesiological\necclesiology\neccrine\necdyses\necdysiast\necdysiasts\necdysis\necdysone\necdysones\necesis\necesises\nechard\nechards\nechelon\necheloned\necheloning\nechelons\necheveria\necheverias\nechidna\nechidnas\nechinate\nechini\nechinococci\nechinococcoses\nechinococcosis\nechinococcus\nechinoderm\nechinodermal\nechinodermatous\nechinoderms\nechinoid\nechinoids\nechinus\necho\nechocardiogram\nechocardiograms\nechocardiograph\nechocardiographic\nechocardiographs\nechocardiography\nechoed\nechoencephalogram\nechoencephalograms\nechoencephalograph\nechoencephalographic\nechoencephalographs\nechoencephalography\nechoer\nechoers\nechoes\nechoey\nechogram\nechograms\nechography\nechoic\nechoing\necholalia\necholalias\necholalic\necholocate\necholocated\necholocates\necholocating\necholocation\nechovirus\nechoviruses\neclair\neclairs\neclampsia\neclampsias\neclamptic\neclectic\neclectically\neclecticism\neclectics\neclipse\neclipsed\neclipses\neclipsing\necliptic\necliptics\neclogue\neclogues\neclosion\neclosions\necocatastrophe\necocatastrophes\necocide\necofreak\necofreaks\necologic\necological\necologically\necologies\necologist\necologists\necology\neconometric\neconometrical\neconometrically\neconometrician\neconometricians\neconometrics\neconometrist\neconometrists\neconomic\neconomical\neconomically\neconomics\neconomies\neconomist\neconomists\neconomize\neconomized\neconomizer\neconomizers\neconomizes\neconomizing\neconomy\necophysiological\necophysiology\necospecies\necosphere\necospheres\necosystem\necosystems\necoterrorism\necoterrorist\necoterrorists\necotone\necotones\necotype\necotypes\necotypic\necru\necrus\necstasies\necstasy\necstatic\necstatically\nectocommensal\nectocommensals\nectoderm\nectodermal\nectodermic\nectogenous\nectomere\nectomeres\nectomeric\nectomorph\nectomorphic\nectomorphs\nectomorphy\nectoparasite\nectoparasites\nectoparasitic\nectoparasitism\nectopia\nectopias\nectopic\nectoplasm\nectoplasmic\nectosarc\nectosarcs\nectotherm\nectothermic\nectotherms\nectotrophic\necuador\necuadorean\necuadoreans\necuadorian\necuadorians\necumenical\necumenicalism\necumenically\necumenicism\necumenicisms\necumenicist\necumenicists\necumenicity\necumenics\necumenism\necumenist\necumenists\neczema\neczemas\neczematous\nedacious\nedacities\nedacity\nedam\nedaphic\nedaphically\nedda\neddic\neddied\neddies\neddo\neddoes\neddy\neddying\nedelweiss\nedelweisses\nedema\nedemas\nedemata\nedematous\neden\nedenic\nedentate\nedentates\nedentulous\nedgar\nedge\nedged\nedgeless\nedger\nedgers\nedges\nedgeways\nedgewise\nedgier\nedgiest\nedgily\nedginess\nedging\nedgings\nedgy\nedh\nedhs\nedibility\nedible\nedibleness\nedibles\nedict\nedictal\nedicts\nedification\nedifice\nedifices\nedified\nedifier\nedifiers\nedifies\nedify\nedifying\nedifyingly\nedinburgh\nedison\nedit\neditable\nedited\nedith\nediting\nedition\neditions\neditor\neditorial\neditorialist\neditorialists\neditorialization\neditorializations\neditorialize\neditorialized\neditorializer\neditorializers\neditorializes\neditorializing\neditorially\neditorials\neditors\neditorship\neditorships\neditress\neditresses\nedits\nedmund\nedom\nedomite\nedomites\nedomitish\neducability\neducable\neducate\neducated\neducatedness\neducates\neducating\neducation\neducational\neducationalist\neducationalists\neducationally\neducationist\neducationists\neducations\neducative\neducator\neducators\neduce\neduced\neduces\neducible\neducing\neduction\neductions\neductor\neductors\nedulcorate\nedulcorated\nedulcorates\nedulcorating\nedward\nedwardian\neel\neelgrass\neelgrasses\neellike\neelpout\neelpouts\neels\neelskin\neelworm\neelworms\neely\neerie\neerier\neeriest\neerily\neeriness\neery\nef\nefate\nefface\neffaceable\neffaced\neffacement\neffacer\neffacers\neffaces\neffacing\neffect\neffected\neffecter\neffecters\neffectible\neffecting\neffective\neffectively\neffectiveness\neffectives\neffectivity\neffector\neffectors\neffects\neffectual\neffectuality\neffectually\neffectualness\neffectuate\neffectuated\neffectuates\neffectuating\neffectuation\neffeminacy\neffeminate\neffeminately\neffeminateness\neffeminates\neffeminize\neffeminized\neffeminizes\neffeminizing\neffendi\neffendis\nefferent\nefferentia\nefferently\nefferents\neffervesce\neffervesced\neffervescence\neffervescency\neffervescent\neffervescently\neffervesces\neffervescing\neffete\neffetely\neffeteness\nefficacies\nefficacious\nefficaciously\nefficaciousness\nefficacity\nefficacy\nefficiencies\nefficiency\nefficient\nefficiently\neffigies\neffigy\neffloresce\neffloresced\nefflorescence\nefflorescent\neffloresces\nefflorescing\neffluence\neffluences\neffluent\neffluents\neffluvia\neffluvial\neffluvium\neffluviums\nefflux\neffluxes\neffluxion\neffluxions\neffort\neffortful\neffortfully\neffortless\neffortlessly\neffortlessness\nefforts\neffronteries\neffrontery\neffulgence\neffulgences\neffulgent\neffuse\neffused\neffuses\neffusing\neffusion\neffusions\neffusive\neffusively\neffusiveness\nefik\nefiks\neft\nefts\neftsoons\negad\negads\negalitarian\negalitarianism\negalitarians\negalite\negalites\negeria\negerias\negest\negesta\negested\negesting\negestion\negestions\negestive\negests\negg\neggbeater\neggbeaters\neggcup\neggcups\negged\negger\neggers\neggfruit\neggfruits\negghead\neggheaded\neggheadedness\neggheads\negging\neggless\neggnog\neggnogs\neggplant\neggplants\neggs\neggshell\neggshells\neglantine\neglantines\nego\negocentric\negocentrically\negocentricities\negocentricity\negocentrics\negocentrism\negoism\negoisms\negoist\negoistic\negoistical\negoistically\negoists\negomania\negomaniac\negomaniacal\negomaniacally\negomaniacs\negomanias\negos\negotism\negotisms\negotist\negotistic\negotistical\negotistically\negotists\negregious\negregiously\negregiousness\negress\negressed\negresses\negressing\negression\negressions\negret\negrets\negypt\negyptian\negyptians\negyptological\negyptologist\negyptologists\negyptology\neh\neider\neiderdown\neiderdowns\neiders\neidetic\neidetically\neidola\neidolon\neidolons\neiffel\neigenfunction\neigenspace\neigenstate\neigenvalue\neigenvalues\neigenvector\neigenvectors\neight\neighteen\neighteenfold\neighteenmo\neighteenmos\neighteens\neighteenth\neighteenths\neightfold\neighth\neighthly\neighths\neighties\neightieth\neightieths\neightpenny\neights\neightvo\neightvos\neighty\neightyfold\neilat\neileen\neindhoven\neinkorn\neinkorns\neinstein\neinsteinian\neinsteinium\neire\neisenach\neisenhower\neisteddfod\neisteddfodau\neisteddfods\neither\nejaculate\nejaculated\nejaculates\nejaculating\nejaculation\nejaculations\nejaculator\nejaculators\nejaculatory\neject\nejecta\nejectable\nejected\nejecting\nejection\nejections\nejective\nejectment\nejectments\nejector\nejectors\nejects\neke\neked\nekes\neking\nekistic\nekistical\nekistician\nekisticians\nekistics\nekpwele\nel\nelaborate\nelaborated\nelaborately\nelaborateness\nelaborates\nelaborating\nelaboration\nelaborations\nelaborative\nelaborator\nelaborators\nelagabalus\nelaine\nelam\nelamite\nelamites\neland\nelands\nelapid\nelapids\nelapse\nelapsed\nelapses\nelapsing\nelara\nelasmobranch\nelasmobranchs\nelastase\nelastases\nelastic\nelastically\nelasticities\nelasticity\nelasticized\nelastics\nelastin\nelastins\nelastomer\nelastomeric\nelastomers\nelate\nelated\nelatedly\nelatedness\nelater\nelaterid\nelaterids\nelaterite\nelaterites\nelaters\nelates\nelating\nelation\nelations\nelavil\nelba\nelbe\nelbow\nelbowed\nelbowing\nelbowroom\nelbows\nelder\nelderberries\nelderberry\neldercare\nelderlies\nelderliness\nelderly\nelders\neldership\neldest\neldritch\neleanor\neleatic\neleaticism\neleatics\nelecampane\nelecampanes\nelect\nelectability\nelectable\nelected\nelecting\nelection\nelectioneer\nelectioneered\nelectioneerer\nelectioneerers\nelectioneering\nelectioneers\nelections\nelective\nelectively\nelectiveness\nelectives\nelector\nelectoral\nelectorally\nelectorate\nelectorates\nelectors\nelectra\nelectress\nelectresses\nelectret\nelectrets\nelectric\nelectrical\nelectrically\nelectrician\nelectricians\nelectricities\nelectricity\nelectrics\nelectrifiable\nelectrification\nelectrified\nelectrifier\nelectrifiers\nelectrifies\nelectrify\nelectrifying\nelectrifyingly\nelectroacoustic\nelectroacoustically\nelectroacoustics\nelectroanalyses\nelectroanalysis\nelectroanalytic\nelectroanalytical\nelectrocardiogram\nelectrocardiograms\nelectrocardiograph\nelectrocardiographic\nelectrocardiographically\nelectrocardiographs\nelectrocardiography\nelectrochemical\nelectrochemically\nelectrochemist\nelectrochemistry\nelectrochemists\nelectrocoagulation\nelectrocoagulations\nelectroconvulsive\nelectrocorticogram\nelectrocorticograms\nelectrocute\nelectrocuted\nelectrocutes\nelectrocuting\nelectrocution\nelectrocutions\nelectrode\nelectrodeposit\nelectrodeposited\nelectrodepositing\nelectrodeposition\nelectrodepositions\nelectrodeposits\nelectrodermal\nelectrodes\nelectrodialyses\nelectrodialysis\nelectrodialytic\nelectrodynamic\nelectrodynamics\nelectrodynamometer\nelectrodynamometers\nelectroencephalogram\nelectroencephalograms\nelectroencephalograph\nelectroencephalographic\nelectroencephalographs\nelectroencephalography\nelectroform\nelectroformed\nelectroforming\nelectroforms\nelectrogasdynamic\nelectrogasdynamics\nelectrogenesis\nelectrogenic\nelectrogram\nelectrograms\nelectrograph\nelectrographs\nelectrohydraulic\nelectrohydraulically\nelectrojet\nelectrokinetic\nelectrokinetics\nelectroless\nelectrologist\nelectrologists\nelectroluminescence\nelectroluminescences\nelectroluminescent\nelectrolyses\nelectrolysis\nelectrolyte\nelectrolytes\nelectrolytic\nelectrolytically\nelectrolyze\nelectrolyzed\nelectrolyzes\nelectrolyzing\nelectromagnet\nelectromagnetic\nelectromagnetically\nelectromagnetism\nelectromagnetisms\nelectromagnets\nelectromechanical\nelectromechanically\nelectrometallurgical\nelectrometallurgy\nelectrometer\nelectrometers\nelectromotive\nelectromyogram\nelectromyograms\nelectromyograph\nelectromyographic\nelectromyographically\nelectromyographs\nelectromyography\nelectron\nelectronegative\nelectronegativity\nelectronic\nelectronically\nelectronics\nelectrons\nelectrooculogram\nelectrooculograms\nelectrophile\nelectrophiles\nelectrophilic\nelectrophilicity\nelectrophorese\nelectrophoresed\nelectrophoreses\nelectrophoresing\nelectrophoresis\nelectrophoretic\nelectrophoretically\nelectrophoretogram\nelectrophoretograms\nelectrophori\nelectrophorus\nelectrophotographic\nelectrophotography\nelectrophysiologic\nelectrophysiological\nelectrophysiologically\nelectrophysiologist\nelectrophysiologists\nelectrophysiology\nelectroplate\nelectroplated\nelectroplates\nelectroplating\nelectropositive\nelectroreception\nelectroreceptor\nelectroreceptors\nelectroretinogram\nelectroretinograms\nelectroretinograph\nelectroretinographic\nelectroretinography\nelectroscope\nelectroscopes\nelectroscopic\nelectroshock\nelectroshocked\nelectroshocking\nelectroshocks\nelectrostatic\nelectrostatically\nelectrostatics\nelectrosurgeries\nelectrosurgery\nelectrosurgical\nelectrosurgically\nelectrotherapeutics\nelectrotherapies\nelectrotherapist\nelectrotherapists\nelectrotherapy\nelectrothermal\nelectrothermally\nelectrotonic\nelectrotonically\nelectrotonus\nelectrotonuses\nelectrotype\nelectrotyped\nelectrotyper\nelectrotypers\nelectrotypes\nelectrotypic\nelectrotyping\nelectrovalence\nelectrovalencies\nelectrovalency\nelectrovalent\nelectrowinning\nelectrum\nelectrums\nelects\nelectuaries\nelectuary\neleemosynary\nelegance\nelegances\nelegancies\nelegancy\nelegant\nelegantly\nelegiac\nelegiacal\nelegiacally\nelegiacs\nelegies\nelegist\nelegists\nelegit\nelegits\nelegize\nelegized\nelegizes\nelegizing\nelegy\neleison\nelement\nelemental\nelementally\nelementals\nelementarily\nelementariness\nelementary\nelements\nelemi\nelemis\nelephant\nelephantiasis\nelephantine\nelephants\neleusinian\neleusinians\neleusis\nelevate\nelevated\nelevateds\nelevates\nelevating\nelevation\nelevations\nelevator\nelevators\neleven\nelevenfold\nelevens\nelevenses\neleventh\nelevenths\nelevon\nelevons\nelf\nelfin\nelfish\nelfishly\nelfishness\nelflock\nelflocks\nelgar\nelhi\neli\nelicit\nelicitation\nelicitations\nelicited\neliciting\nelicitor\nelicitors\nelicits\nelide\nelided\nelides\neliding\neligibilities\neligibility\neligible\neligibles\neligibly\nelijah\neliminate\neliminated\neliminates\neliminating\nelimination\neliminations\neliminative\neliminator\neliminators\neliminatory\neliot\nelisha\nelision\nelisions\nelite\nelites\nelitism\nelitisms\nelitist\nelitists\nelixir\nelixirs\nelizabeth\nelizabethan\nelizabethans\nelk\nelkhound\nelkhounds\nelks\nell\nellagic\nellen\nellesmere\nellington\nelliot\nelliott\nellipse\nellipses\nellipsis\nellipsoid\nellipsoidal\nellipsoids\nelliptic\nelliptical\nelliptically\nellipticity\nells\nelm\nelmo\nelms\nelocution\nelocutionary\nelocutionist\nelocutionists\nelodea\nelodeas\neloign\neloigned\neloigning\neloigns\nelongate\nelongated\nelongates\nelongating\nelongation\nelongations\nelope\neloped\nelopement\nelopements\neloper\nelopers\nelopes\neloping\neloquence\neloquent\neloquently\neloquentness\nels\nelse\nelsewhere\neluant\neluants\neluate\neluates\nelucidate\nelucidated\nelucidates\nelucidating\nelucidation\nelucidations\nelucidative\nelucidator\nelucidators\nelucidatory\nelucubrate\nelucubrated\nelucubrates\nelucubrating\nelucubration\nelucubrations\nelude\neluded\neludes\neluding\nelusion\nelusions\nelusive\nelusively\nelusiveness\nelusory\nelute\neluted\nelutes\neluting\nelution\nelutions\nelutriate\nelutriated\nelutriates\nelutriating\nelutriation\nelutriations\nelutriator\nelutriators\neluvial\neluviate\neluviated\neluviates\neluviating\neluviation\neluviations\neluvium\neluviums\nelver\nelvers\nelves\nelvis\nelvish\nelysian\nelysium\nelytra\nelytroid\nelytron\nem\nemaciate\nemaciated\nemaciates\nemaciating\nemaciation\nemaciations\nemail\nemailed\nemailing\nemails\nemalangeni\nemanate\nemanated\nemanates\nemanating\nemanation\nemanational\nemanations\nemanative\nemancipate\nemancipated\nemancipates\nemancipating\nemancipation\nemancipationist\nemancipationists\nemancipations\nemancipative\nemancipator\nemancipators\nemancipatory\nemarginate\nemargination\nemarginations\nemasculate\nemasculated\nemasculates\nemasculating\nemasculation\nemasculations\nemasculative\nemasculator\nemasculators\nemasculatory\nembalm\nembalmed\nembalmer\nembalmers\nembalming\nembalmment\nembalmments\nembalms\nembank\nembanked\nembanking\nembankment\nembankments\nembanks\nembarcadero\nembarcaderos\nembargo\nembargoed\nembargoes\nembargoing\nembargos\nembark\nembarkation\nembarkations\nembarked\nembarking\nembarkment\nembarkments\nembarks\nembarrass\nembarrassable\nembarrassed\nembarrassedly\nembarrasses\nembarrassing\nembarrassingly\nembarrassment\nembarrassments\nembassage\nembassages\nembassies\nembassy\nembattle\nembattled\nembattlement\nembattlements\nembattles\nembattling\nembay\nembayed\nembaying\nembayment\nembayments\nembays\nembed\nembeddable\nembedded\nembedding\nembedment\nembedments\nembeds\nembellish\nembellished\nembellisher\nembellishers\nembellishes\nembellishing\nembellishment\nembellishments\nember\nembers\nembezzle\nembezzled\nembezzlement\nembezzlements\nembezzler\nembezzlers\nembezzles\nembezzling\nembitter\nembittered\nembittering\nembitterment\nembitterments\nembitters\nemblaze\nemblazed\nemblazes\nemblazing\nemblazon\nemblazoned\nemblazoner\nemblazoners\nemblazoning\nemblazonment\nemblazonments\nemblazonries\nemblazonry\nemblazons\nemblem\nemblematic\nemblematical\nemblematically\nemblematize\nemblematized\nemblematizes\nemblematizing\nemblemed\nemblements\nembleming\nemblemize\nemblemized\nemblemizes\nemblemizing\nemblems\nembodied\nembodier\nembodiers\nembodies\nembodiment\nembodiments\nembody\nembodying\nembolden\nemboldened\nemboldening\nemboldens\nembolectomies\nembolectomy\nemboli\nembolic\nembolies\nembolism\nembolismic\nembolisms\nembolization\nembolus\nemboly\nembonpoint\nembonpoints\nembosom\nembosomed\nembosoming\nembosoms\nemboss\nembossable\nembossed\nembosser\nembossers\nembosses\nembossing\nembossment\nembossments\nembouchement\nembouchure\nembouchures\nembourgeoisement\nembourgeoisements\nembowed\nembowel\nemboweled\nemboweling\nembowelled\nembowelling\nembowels\nembower\nembowered\nembowering\nembowers\nembrace\nembraceable\nembraced\nembracement\nembracements\nembraceor\nembraceors\nembracer\nembraceries\nembracers\nembracery\nembraces\nembracing\nembracingly\nembracive\nembranchment\nembranchments\nembrangle\nembrangled\nembranglement\nembranglements\nembrangles\nembrangling\nembrasure\nembrasured\nembrasures\nembrittle\nembrittled\nembrittlement\nembrittlements\nembrittles\nembrittling\nembrocate\nembrocated\nembrocates\nembrocating\nembrocation\nembrocations\nembroider\nembroidered\nembroiderer\nembroiderers\nembroideries\nembroidering\nembroiders\nembroidery\nembroil\nembroiled\nembroiling\nembroilment\nembroilments\nembroils\nembrown\nembrowned\nembrowning\nembrowns\nembrue\nembrued\nembrues\nembruing\nembryectomies\nembryectomy\nembryo\nembryogenesis\nembryogenetic\nembryogenic\nembryogeny\nembryoid\nembryoids\nembryologic\nembryological\nembryologically\nembryologies\nembryologist\nembryologists\nembryology\nembryonal\nembryonated\nembryonic\nembryonically\nembryopathies\nembryopathy\nembryos\nembryotic\nemcee\nemceed\nemceeing\nemcees\nemend\nemendable\nemendate\nemendated\nemendates\nemendating\nemendation\nemendations\nemendator\nemendators\nemendatory\nemended\nemender\nemenders\nemending\nemends\nemerald\nemeralds\nemerge\nemerged\nemergence\nemergences\nemergencies\nemergency\nemergent\nemergents\nemerges\nemerging\nemeries\nemerita\nemeritae\nemeritas\nemeriti\nemeritus\nemersed\nemersion\nemersions\nemerson\nemery\nemeses\nemesis\nemetic\nemetically\nemetics\nemetine\nemetines\nemigrant\nemigrants\nemigrate\nemigrated\nemigrates\nemigrating\nemigration\nemigrations\nemigratory\nemilia\nemilion\neminence\neminences\neminencies\neminency\neminent\neminently\nemir\nemirate\nemirates\nemirs\nemissaries\nemissary\nemission\nemissions\nemissive\nemissivity\nemit\nemits\nemittance\nemitted\nemitter\nemitters\nemitting\nemma\nemmanuel\nemmaus\nemmenagogue\nemmenagogues\nemmer\nemmers\nemmet\nemmetropia\nemmetropias\nemmetropic\nemmets\nemmy\nemmys\nemodin\nemodins\nemollient\nemollients\nemolument\nemoluments\nemote\nemoted\nemoter\nemoters\nemotes\nemoting\nemotion\nemotional\nemotionalism\nemotionalist\nemotionalistic\nemotionalists\nemotionality\nemotionalize\nemotionalized\nemotionalizes\nemotionalizing\nemotionally\nemotionless\nemotionlessly\nemotionlessness\nemotions\nemotive\nemotively\nemotiveness\nemotivity\nempale\nempaled\nempales\nempaling\nempanada\nempanel\nempaneled\nempaneling\nempanelled\nempanelling\nempanels\nempathetic\nempathetically\nempathic\nempathize\nempathized\nempathizer\nempathizers\nempathizes\nempathizing\nempathy\nempedocles\nempennage\nempennages\nemperies\nemperor\nemperors\nemperorship\nemperorships\nempery\nemphases\nemphasis\nemphasize\nemphasized\nemphasizes\nemphasizing\nemphatic\nemphatically\nemphysema\nemphysematous\nemphysemic\nemphysemics\nempire\nempires\nempiric\nempirical\nempirically\nempiricism\nempiricist\nempiricists\nempirics\nemplace\nemplaced\nemplacement\nemplacements\nemplaces\nemplacing\nemplane\nemplaned\nemplanes\nemplaning\nemploy\nemployability\nemployable\nemploye\nemployed\nemployee\nemployees\nemployer\nemployers\nemployes\nemploying\nemployment\nemployments\nemploys\nempoison\nempoisoned\nempoisoning\nempoisonment\nempoisons\nemporia\nemporium\nemporiums\nempower\nempowered\nempowering\nempowerment\nempowerments\nempowers\nempress\nempressement\nempressements\nempresses\nemprise\nemprises\nemptied\nemptier\nempties\nemptiest\nemptily\nemptiness\nemptor\nempty\nemptying\nempurple\nempurpled\nempurples\nempurpling\nempyema\nempyemas\nempyemata\nempyemic\nempyreal\nempyrean\nempyreans\nems\nemu\nemulate\nemulated\nemulates\nemulating\nemulation\nemulations\nemulative\nemulatively\nemulator\nemulators\nemulous\nemulously\nemulousness\nemulsible\nemulsifiable\nemulsification\nemulsifications\nemulsified\nemulsifier\nemulsifiers\nemulsifies\nemulsify\nemulsifying\nemulsion\nemulsions\nemulsive\nemulsoid\nemulsoidal\nemulsoids\nemunctories\nemunctory\nemus\nen\nenable\nenabled\nenabler\nenablers\nenables\nenabling\nenact\nenactable\nenacted\nenacting\nenactment\nenactments\nenactor\nenactors\nenacts\nenamel\nenameled\nenameler\nenamelers\nenameling\nenamelist\nenamelists\nenamelled\nenamelling\nenamels\nenamelware\nenamine\nenamines\nenamoenantiomeric\nenamor\nenamored\nenamoring\nenamors\nenamour\nenamoured\nenamouring\nenamours\nenantiomer\nenantiomers\nenantiomorph\nenantiomorphic\nenantiomorphism\nenantiomorphous\nenantiomorphs\nenarthroses\nenarthrosis\nenate\nenates\nenatic\nenation\nenations\nencaenia\nencage\nencaged\nencages\nencaging\nencamp\nencamped\nencamping\nencampment\nencampments\nencamps\nencapsulant\nencapsulants\nencapsulate\nencapsulated\nencapsulates\nencapsulating\nencapsulation\nencapsulations\nencapsulator\nencapsulators\nencapsule\nencapsuled\nencapsules\nencapsuling\nencase\nencased\nencasement\nencasements\nencases\nencash\nencashable\nencashed\nencashes\nencashing\nencashment\nencasing\nencaustic\nencaustics\nenceinte\nenceintes\nenceladus\nencephala\nencephalic\nencephalitic\nencephalitis\nencephalitogen\nencephalitogenic\nencephalitogens\nencephalogram\nencephalograms\nencephalograph\nencephalographic\nencephalographically\nencephalographies\nencephalographs\nencephalography\nencephaloma\nencephalomas\nencephalomata\nencephalomyelitis\nencephalon\nencephalopathic\nencephalopathies\nencephalopathy\nencephalous\nenchain\nenchained\nenchaining\nenchainment\nenchainments\nenchains\nenchant\nenchanted\nenchanter\nenchanters\nenchanting\nenchantingly\nenchantment\nenchantments\nenchantress\nenchantresses\nenchants\nenchase\nenchased\nenchases\nenchasing\nenchilada\nenchiladas\nenchiridia\nenchiridion\nenchiridions\nencina\nencinas\nencipher\nenciphered\nencipherer\nencipherers\nenciphering\nencipherment\nencipherments\nenciphers\nencircle\nencircled\nencirclement\nencirclements\nencircles\nencircling\nenclasp\nenclasped\nenclasping\nenclasps\nenclave\nenclaves\nenclitic\nenclitics\nenclose\nenclosed\nencloses\nenclosing\nenclosure\nenclosures\nencode\nencoded\nencoder\nencoders\nencodes\nencoding\nencodings\nencomia\nencomiast\nencomiastic\nencomiastical\nencomiasts\nencomium\nencomiums\nencompass\nencompassed\nencompasses\nencompassing\nencompassment\nencompassments\nencore\nencored\nencores\nencoring\nencounter\nencountered\nencountering\nencounters\nencourage\nencouraged\nencouragement\nencouragements\nencourager\nencouragers\nencourages\nencouraging\nencouragingly\nencrimson\nencrimsoned\nencrimsoning\nencrimsons\nencroach\nencroached\nencroacher\nencroachers\nencroaches\nencroaching\nencroachment\nencroachments\nencrust\nencrustation\nencrustations\nencrusted\nencrusting\nencrusts\nencrypt\nencrypted\nencrypting\nencryption\nencryptions\nencrypts\nencumber\nencumbered\nencumbering\nencumbers\nencumbrance\nencumbrancer\nencumbrancers\nencumbrances\nencyclical\nencyclicals\nencyclopaedia\nencyclopaedias\nencyclopedia\nencyclopedias\nencyclopedic\nencyclopedically\nencyclopedism\nencyclopedisms\nencyclopedist\nencyclopedists\nencyst\nencystation\nencystations\nencysted\nencysting\nencystment\nencystments\nencysts\nend\nendamage\nendamaged\nendamages\nendamaging\nendameba\nendamebae\nendamebas\nendamoeba\nendanger\nendangered\nendangering\nendangerment\nendangerments\nendangers\nendarch\nendarterectomies\nendarterectomy\nendarteritis\nendbrain\nendbrains\nendear\nendeared\nendearing\nendearingly\nendearment\nendearments\nendears\nendeavor\nendeavored\nendeavorer\nendeavorers\nendeavoring\nendeavors\nended\nendemic\nendemically\nendemicity\nendemics\nendemism\nendemisms\nender\nendergonic\nendermic\nendermically\nenders\nendexine\nendexines\nendgame\nendgames\nending\nendings\nendive\nendives\nendleaf\nendleaves\nendless\nendlessly\nendlessness\nendlong\nendmost\nendnote\nendnotes\nendobiotic\nendoblast\nendoblasts\nendocardia\nendocardial\nendocarditic\nendocarditis\nendocardium\nendocarp\nendocarpal\nendocarps\nendochondral\nendocrania\nendocranium\nendocrine\nendocrinologic\nendocrinological\nendocrinologist\nendocrinologists\nendocrinology\nendocytic\nendocytose\nendocytosed\nendocytoses\nendocytosing\nendocytosis\nendocytotic\nendoderm\nendodermal\nendodermis\nendoderms\nendodontia\nendodontic\nendodontically\nendodontics\nendodontist\nendodontists\nendoenzyme\nendoenzymes\nendoergic\nendogamous\nendogamy\nendogenic\nendogenous\nendogenously\nendogeny\nendolymph\nendolymphatic\nendolymphs\nendometria\nendometrial\nendometrioses\nendometriosis\nendometrium\nendomitosis\nendomitotic\nendomorph\nendomorphic\nendomorphism\nendomorphs\nendomorphy\nendonuclease\nendonucleases\nendoparasite\nendoparasites\nendoparasitic\nendoparasitism\nendopeptidase\nendopeptidases\nendophyte\nendophytes\nendophytic\nendoplasm\nendoplasmic\nendorphin\nendorphins\nendorsable\nendorse\nendorsed\nendorsee\nendorsees\nendorsement\nendorsements\nendorser\nendorsers\nendorses\nendorsing\nendorsor\nendorsors\nendoscope\nendoscopes\nendoscopic\nendoscopically\nendoscopies\nendoscopy\nendoskeletal\nendoskeleton\nendoskeletons\nendosmosis\nendosmotic\nendosmotically\nendosperm\nendospore\nendospores\nendosporia\nendosporium\nendostea\nendosteal\nendosteally\nendosteum\nendostyle\nendosulfan\nendosulfans\nendosymbiont\nendosymbiosis\nendosymbiotic\nendothecia\nendothecium\nendothelia\nendothelial\nendothelioid\nendothelioma\nendotheliomas\nendotheliomata\nendothelium\nendotherm\nendothermal\nendothermic\nendotherms\nendothermy\nendotoxic\nendotoxin\nendotoxins\nendotracheal\nendotrophic\nendow\nendowed\nendowing\nendowment\nendowments\nendows\nendpaper\nendpapers\nendpin\nendpins\nendplate\nendplates\nendplay\nendplayed\nendplaying\nendplays\nendpoint\nendpoints\nendrin\nendrins\nends\nendsville\nendsvilles\nendue\nendued\nendues\nenduing\nendurable\nendurably\nendurance\nendure\nendured\nendures\nenduring\nenduringly\nenduringness\nenduro\nenduros\nendways\nendwise\nendymion\nenema\nenemas\nenemies\nenemy\nenergetic\nenergetically\nenergetics\nenergies\nenergize\nenergized\nenergizer\nenergizers\nenergizes\nenergizing\nenergy\nenervate\nenervated\nenervates\nenervating\nenervation\nenervations\nenervative\nenervator\nenervators\nenface\nenfaced\nenfacement\nenfacements\nenfaces\nenfacing\nenfant\nenfants\nenfeeble\nenfeebled\nenfeeblement\nenfeeblements\nenfeebler\nenfeeblers\nenfeebles\nenfeebling\nenfeoff\nenfeoffed\nenfeoffing\nenfeoffment\nenfeoffments\nenfeoffs\nenfetter\nenfettered\nenfettering\nenfetters\nenfever\nenfevered\nenfevering\nenfevers\nenfield\nenfilade\nenfiladed\nenfilades\nenfilading\nenfin\nenflame\nenflamed\nenflames\nenflaming\nenfleurage\nenfleurages\nenflurane\nenfluranes\nenfold\nenfolded\nenfolder\nenfolders\nenfolding\nenfolds\nenforce\nenforceability\nenforceable\nenforced\nenforcement\nenforcements\nenforcer\nenforcers\nenforces\nenforcing\nenframe\nenframed\nenframement\nenframes\nenframing\nenfranchise\nenfranchised\nenfranchisement\nenfranchisements\nenfranchises\nenfranchising\nengage\nengaged\nengagement\nengagements\nengager\nengagers\nengages\nengaging\nengagingly\nengagé\nengarland\nengarlanded\nengarlanding\nengarlands\nengels\nengender\nengendered\nengenderer\nengenderers\nengendering\nengenders\nengild\nengilded\nengilding\nengilds\nengine\nengined\nengineer\nengineered\nengineering\nengineerings\nengineers\nenginery\nengines\nengining\nengird\nengirded\nengirding\nengirdle\nengirdled\nengirdles\nengirdling\nengirds\nengirt\nenglacial\nengland\nenglander\nenglanders\nenglish\nenglished\nenglishes\nenglishing\nenglishman\nenglishmen\nenglishness\nenglishwoman\nenglishwomen\nenglut\nengluts\nenglutted\nenglutting\nengorge\nengorged\nengorgement\nengorgements\nengorges\nengorging\nengraft\nengrafted\nengrafting\nengraftment\nengraftments\nengrafts\nengrailed\nengrain\nengrained\nengraining\nengrains\nengram\nengrams\nengrave\nengraved\nengraver\nengravers\nengraves\nengraving\nengravings\nengross\nengrossed\nengrosser\nengrossers\nengrosses\nengrossing\nengrossingly\nengrossment\nengrossments\nengulf\nengulfed\nengulfing\nengulfment\nengulfments\nengulfs\nenhalo\nenhaloed\nenhaloes\nenhaloing\nenhance\nenhanced\nenhancement\nenhancements\nenhancer\nenhancers\nenhances\nenhancing\nenhancive\nenharmonic\nenharmonically\nenigma\nenigmas\nenigmatic\nenigmatical\nenigmatically\nenisle\nenisled\nenisles\nenisling\neniwetok\nenjambement\nenjambements\nenjambment\nenjambments\nenjoin\nenjoinder\nenjoinders\nenjoined\nenjoiner\nenjoiners\nenjoining\nenjoinment\nenjoinments\nenjoins\nenjoy\nenjoyable\nenjoyableness\nenjoyably\nenjoyed\nenjoyer\nenjoyers\nenjoying\nenjoyment\nenjoyments\nenjoys\nenkephalin\nenkephalins\nenkindle\nenkindled\nenkindler\nenkindlers\nenkindles\nenkindling\nenlace\nenlaced\nenlacement\nenlacements\nenlaces\nenlacing\nenlarge\nenlargeable\nenlarged\nenlargement\nenlargements\nenlarger\nenlargers\nenlarges\nenlarging\nenlighten\nenlightened\nenlightener\nenlighteners\nenlightening\nenlightenment\nenlightenments\nenlightens\nenlist\nenlisted\nenlistee\nenlistees\nenlisting\nenlistment\nenlistments\nenlists\nenliven\nenlivened\nenlivener\nenliveners\nenlivening\nenlivenment\nenlivenments\nenlivens\nenmesh\nenmeshed\nenmeshes\nenmeshing\nenmeshment\nenmeshments\nenmities\nenmity\nennead\nenneads\nennoble\nennobled\nennoblement\nennoblements\nennobler\nennoblers\nennobles\nennobling\nennui\nenoch\nenoki\nenokidake\nenokidakes\nenokis\nenol\nenolase\nenolases\nenolic\nenological\nenologist\nenologists\nenology\nenols\nenormities\nenormity\nenormous\nenormously\nenormousness\nenosis\nenough\nenounce\nenounced\nenouncement\nenouncements\nenounces\nenouncing\nenow\nenphytotic\nenphytotics\nenplane\nenplaned\nenplanes\nenplaning\nenqueue\nenqueued\nenqueueing\nenqueues\nenqueuing\nenquire\nenquired\nenquires\nenquiries\nenquiring\nenquiry\nenrage\nenraged\nenragement\nenragements\nenrages\nenraging\nenrapt\nenrapture\nenraptured\nenrapturement\nenrapturements\nenraptures\nenrapturing\nenrich\nenriched\nenricher\nenrichers\nenriches\nenriching\nenrichment\nenrichments\nenrobe\nenrobed\nenrobes\nenrobing\nenroll\nenrolled\nenrollee\nenrollees\nenrolling\nenrollment\nenrollments\nenrolls\nenroot\nenrooted\nenrooting\nenroots\nens\nensample\nensamples\nensanguine\nensanguined\nensanguines\nensanguining\nensconce\nensconced\nensconces\nensconcing\nensemble\nensembles\nenserf\nenserfed\nenserfing\nenserfment\nenserfs\nenshrine\nenshrined\nenshrinement\nenshrinements\nenshrines\nenshrining\nenshroud\nenshrouded\nenshrouding\nenshrouds\nensiform\nensign\nensigns\nensilage\nensilaged\nensilages\nensilaging\nensile\nensiled\nensiles\nensiling\nenskied\nenskies\nensky\nenskying\nenslave\nenslaved\nenslavement\nenslavements\nenslaver\nenslavers\nenslaves\nenslaving\nensnare\nensnared\nensnarement\nensnarements\nensnarer\nensnarers\nensnares\nensnaring\nensnarl\nensnarled\nensnarling\nensnarls\nensorcel\nensorceled\nensorceling\nensorcell\nensorcelled\nensorcelling\nensorcellment\nensorcells\nensorcels\nensoul\nensouled\nensouling\nensouls\nensphere\nensphered\nenspheres\nensphering\nenstatite\nenstatites\nensue\nensued\nensues\nensuing\nensure\nensured\nensures\nensuring\nenswathe\nenswathed\nenswathes\nenswathing\nentablature\nentablatures\nentablement\nentablements\nentail\nentailed\nentailer\nentailers\nentailing\nentailment\nentailments\nentails\nentameba\nentamebae\nentamebas\nentamoeba\nentamoebae\nentamoebas\nentangle\nentangled\nentanglement\nentanglements\nentangler\nentanglers\nentangles\nentangling\nentases\nentasis\nentebbe\nentelechies\nentelechy\nentendre\nentendres\nentente\nententes\nenter\nenterable\nenteral\nenterally\nentered\nenteric\nentering\nenteritis\nenterobacteria\nenterobacterium\nenterobiasis\nenterococcal\nenterococci\nenterococcus\nenterocoele\nenterocoeles\nenterocolitis\nenterogastrone\nenterogastrones\nenterohepatitis\nenterokinase\nenterokinases\nenteron\nenterons\nenteropathies\nenteropathogen\nenteropathogenic\nenteropathogens\nenteropathy\nenterostomal\nenterostomies\nenterostomy\nenterotomies\nenterotomy\nenterotoxin\nenterotoxins\nenteroviral\nenterovirus\nenteroviruses\nenterprise\nenterpriser\nenterprisers\nenterprises\nenterprising\nenterprisingly\nenters\nentertain\nentertained\nentertainer\nentertainers\nentertaining\nentertainingly\nentertainment\nentertainments\nentertains\nenthalpies\nenthalpy\nenthrall\nenthralled\nenthralling\nenthrallingly\nenthrallment\nenthrallments\nenthralls\nenthrone\nenthroned\nenthronement\nenthronements\nenthrones\nenthroning\nenthuse\nenthused\nenthuses\nenthusiasm\nenthusiasms\nenthusiast\nenthusiastic\nenthusiastically\nenthusiasts\nenthusing\nenthymeme\nenthymemes\nentice\nenticed\nenticement\nenticements\nenticer\nenticers\nentices\nenticing\nenticingly\nentire\nentirely\nentireness\nentires\nentireties\nentirety\nentities\nentitle\nentitled\nentitlement\nentitlements\nentitles\nentitling\nentity\nentoblast\nentoblasts\nentoderm\nentodermal\nentodermic\nentoderms\nentoil\nentoiled\nentoiling\nentoils\nentomb\nentombed\nentombing\nentombment\nentombments\nentombs\nentomologic\nentomological\nentomologically\nentomologist\nentomologists\nentomology\nentomophagous\nentomophilous\nentomophily\nentomostracan\nentomostracans\nentourage\nentourages\nentozoa\nentozoan\nentozoic\nentr\nentr'acte\nentr'actes\nentrails\nentrain\nentrained\nentrainer\nentrainers\nentraining\nentrainment\nentrainments\nentrains\nentrance\nentranced\nentrancement\nentrancements\nentrances\nentranceway\nentranceways\nentrancing\nentrancingly\nentrant\nentrants\nentrap\nentrapment\nentrapments\nentrapped\nentrapping\nentraps\nentreat\nentreated\nentreaties\nentreating\nentreatingly\nentreatment\nentreatments\nentreats\nentreaty\nentrechat\nentrechats\nentrecôte\nentree\nentrees\nentremets\nentrench\nentrenched\nentrenches\nentrenching\nentrenchment\nentrenchments\nentrepreneur\nentrepreneurial\nentrepreneurialism\nentrepreneurism\nentrepreneurs\nentrepreneurship\nentrepreneurships\nentrepôt\nentresol\nentresols\nentries\nentropic\nentropically\nentropies\nentropy\nentrust\nentrusted\nentrusting\nentrustment\nentrusts\nentry\nentryway\nentryways\nentrée\nentrées\nentwine\nentwined\nentwinement\nentwinements\nentwines\nentwining\nentwist\nentwisted\nentwisting\nentwists\nenucleate\nenucleated\nenucleates\nenucleating\nenucleation\nenucleations\nenucleator\nenucleators\nenumerable\nenumerate\nenumerated\nenumerates\nenumerating\nenumeration\nenumerations\nenumerative\nenumerator\nenumerators\nenunciable\nenunciate\nenunciated\nenunciates\nenunciating\nenunciation\nenunciations\nenunciative\nenunciatively\nenunciator\nenunciators\nenure\nenured\nenures\nenuresis\nenuretic\nenuring\nenvelop\nenvelope\nenveloped\nenveloper\nenvelopers\nenvelopes\nenveloping\nenvelopment\nenvelopments\nenvelops\nenvenom\nenvenomed\nenvenoming\nenvenoms\nenviable\nenviableness\nenviably\nenvied\nenvier\nenviers\nenvies\nenvious\nenviously\nenviousness\nenviron\nenvironed\nenvironing\nenvironment\nenvironmental\nenvironmentalism\nenvironmentalist\nenvironmentalists\nenvironmentally\nenvironments\nenvirons\nenvisage\nenvisaged\nenvisages\nenvisaging\nenvision\nenvisioned\nenvisioning\nenvisions\nenvoi\nenvois\nenvoy\nenvoys\nenvy\nenvying\nenvyingly\nenwheel\nenwheeled\nenwheeling\nenwheels\nenwind\nenwinding\nenwinds\nenwomb\nenwombed\nenwombing\nenwombs\nenwound\nenwrap\nenwrapped\nenwrapping\nenwraps\nenwreathe\nenwreathed\nenwreathes\nenwreathing\nenzootic\nenzootics\nenzymatic\nenzymatically\nenzyme\nenzymes\nenzymic\nenzymically\nenzymologist\nenzymologists\nenzymology\neocene\neohippus\neolian\neolith\neolithic\neoliths\neon\neonian\neons\neos\neosin\neosinophil\neosinophilia\neosinophilias\neosinophilic\neosinophilous\neosinophils\neosins\nepact\nepacts\nepaminondas\neparchies\neparchy\nepaulet\nepaulets\nepaulette\nepaulettes\nepee\nepees\nepeirogenic\nepeirogenically\nepeirogenies\nepeirogeny\nepentheses\nepenthesis\nepenthetic\nepergne\nepergnes\nepernay\nepexegesis\nepexegetic\nepexegetical\nepexegetically\nephah\nephahs\nephebe\nephebes\nephebic\nephedrine\nephemera\nephemerae\nephemeral\nephemerality\nephemerally\nephemeralness\nephemerals\nephemeras\nephemerid\nephemerides\nephemerids\nephemeris\nephemeron\nephemerons\nephesian\nephesians\nephesus\nephod\nephods\nephor\nephori\nephors\nephraim\nepiblast\nepiblastic\nepiblasts\nepibolic\nepiboly\nepic\nepical\nepically\nepicalyces\nepicalyx\nepicalyxes\nepicanthi\nepicanthic\nepicanthus\nepicardia\nepicardial\nepicardium\nepicarp\nepicarps\nepicene\nepicenes\nepicenism\nepicenter\nepicenters\nepicentral\nepichlorohydrin\nepichlorohydrins\nepicondyle\nepicondyles\nepicotyl\nepicotyls\nepicritic\nepics\nepictetus\nepicure\nepicurean\nepicureanism\nepicureanisms\nepicureans\nepicures\nepicurism\nepicurisms\nepicurus\nepicuticle\nepicuticles\nepicycle\nepicycles\nepicyclic\nepicyclical\nepicyclically\nepicycloid\nepicycloidal\nepicycloids\nepidaurus\nepidemic\nepidemical\nepidemically\nepidemicity\nepidemics\nepidemiologic\nepidemiological\nepidemiologically\nepidemiologist\nepidemiologists\nepidemiology\nepidermal\nepidermic\nepidermis\nepidermoid\nepidiascope\nepidiascopes\nepididymal\nepididymides\nepididymis\nepidote\nepidotes\nepidotic\nepidural\nepidurals\nepifauna\nepifaunae\nepifaunal\nepifaunas\nepigastria\nepigastric\nepigastrium\nepigeal\nepigean\nepigene\nepigenesis\nepigenetic\nepigenous\nepigeous\nepiglottal\nepiglottic\nepiglottides\nepiglottis\nepiglottises\nepigone\nepigones\nepigonic\nepigonism\nepigram\nepigrammatic\nepigrammatically\nepigrammatism\nepigrammatisms\nepigrammatist\nepigrammatists\nepigrammatize\nepigrammatized\nepigrammatizer\nepigrammatizers\nepigrammatizes\nepigrammatizing\nepigrams\nepigraph\nepigrapher\nepigraphers\nepigraphic\nepigraphical\nepigraphically\nepigraphist\nepigraphists\nepigraphs\nepigraphy\nepigynies\nepigynous\nepigyny\nepilepsies\nepilepsy\nepileptic\nepileptics\nepileptogenic\nepileptoid\nepilog\nepilogs\nepilogue\nepilogues\nepimer\nepimeric\nepimers\nepimetheus\nepimysia\nepimysium\nepinastic\nepinasties\nepinasty\nepinephrine\nepineuria\nepineurial\nepineurium\nepipelagic\nepipetalous\nepiphanic\nepiphanies\nepiphanous\nepiphany\nepiphenomena\nepiphenomenal\nepiphenomenalism\nepiphenomenally\nepiphenomenon\nepiphyseal\nepiphyses\nepiphysial\nepiphysis\nepiphyte\nepiphytes\nepiphytic\nepiphytical\nepiphytically\nepiphytotic\nepiphytotics\nepiscia\nepiscias\nepiscopacies\nepiscopacy\nepiscopal\nepiscopalian\nepiscopalians\nepiscopally\nepiscopate\nepiscopates\nepiscope\nepiscopes\nepisiotomies\nepisiotomy\nepisode\nepisodes\nepisodic\nepisodically\nepisomal\nepisomally\nepisome\nepisomes\nepistases\nepistasis\nepistatic\nepistaxes\nepistaxis\nepistemic\nepistemically\nepistemological\nepistemologically\nepistemologist\nepistemologists\nepistemology\nepistle\nepistler\nepistlers\nepistles\nepistolary\nepistoler\nepistolers\nepistrophe\nepistyle\nepistyles\nepitaph\nepitaphial\nepitaphic\nepitaphs\nepitases\nepitasis\nepitaxial\nepitaxially\nepitaxies\nepitaxy\nepithalamia\nepithalamion\nepithalamium\nepithalamiums\nepithelia\nepithelial\nepithelialization\nepithelializations\nepithelialize\nepithelialized\nepithelializes\nepithelializing\nepithelioid\nepithelioma\nepitheliomas\nepitheliomata\nepitheliomatous\nepithelium\nepitheliums\nepithelization\nepithelizations\nepithelize\nepithelized\nepithelizes\nepithelizing\nepithet\nepithetic\nepithetical\nepithets\nepitome\nepitomes\nepitomic\nepitomical\nepitomize\nepitomized\nepitomizes\nepitomizing\nepizoa\nepizoic\nepizoism\nepizoisms\nepizoite\nepizoites\nepizoon\nepizootic\nepizootically\nepizootics\nepoch\nepochal\nepochally\nepochs\nepode\nepodes\neponym\neponymic\neponymies\neponymous\neponyms\neponymy\nepopee\nepopees\nepos\neposes\nepoxide\nepoxides\nepoxied\nepoxies\nepoxy\nepoxying\nepsilon\nepsilons\nepsom\nepstein\nequability\nequable\nequableness\nequably\nequal\nequaled\nequaling\nequalitarian\nequalitarianism\nequalities\nequality\nequalization\nequalizations\nequalize\nequalized\nequalizer\nequalizers\nequalizes\nequalizing\nequalled\nequalling\nequally\nequals\nequanimities\nequanimity\nequate\nequated\nequates\nequating\nequation\nequational\nequationally\nequations\nequator\nequatorial\nequatorially\nequatorials\nequators\nequatorward\nequerries\nequerry\nequestrian\nequestrianism\nequestrians\nequestrianship\nequestrienne\nequestriennes\nequiangular\nequicaloric\nequid\nequidistance\nequidistant\nequidistantly\nequids\nequilateral\nequilateralism\nequilateralist\nequilateralists\nequilaterally\nequilaterals\nequilibrate\nequilibrated\nequilibrates\nequilibrating\nequilibration\nequilibrations\nequilibrator\nequilibrators\nequilibratory\nequilibria\nequilibrist\nequilibristic\nequilibrists\nequilibrium\nequilibriums\nequimolar\nequine\nequinely\nequines\nequinoctial\nequinoctials\nequinox\nequinoxes\nequip\nequipage\nequipages\nequipment\nequipoise\nequipoised\nequipoises\nequipoising\nequipollence\nequipollences\nequipollent\nequipollently\nequipollents\nequiponderance\nequiponderances\nequiponderant\nequiponderate\nequiponderated\nequiponderates\nequiponderating\nequipotent\nequipotential\nequipped\nequipping\nequiprobable\nequips\nequiseta\nequisetum\nequisetums\nequitability\nequitable\nequitableness\nequitably\nequitant\nequitation\nequities\nequity\nequivalence\nequivalences\nequivalencies\nequivalency\nequivalent\nequivalently\nequivalents\nequivocal\nequivocalities\nequivocality\nequivocally\nequivocalness\nequivocate\nequivocated\nequivocates\nequivocating\nequivocation\nequivocations\nequivocator\nequivocators\nequivoque\nequivoques\ner\nera\neradicable\neradicate\neradicated\neradicates\neradicating\neradication\neradications\neradicative\neradicator\neradicators\neras\nerasabilities\nerasability\nerasable\nerase\nerased\neraser\nerasers\nerases\nerasing\nerasmus\nerastian\nerastianism\nerastians\nerastus\nerasure\nerasures\nerat\nerato\neratosthenes\nerbium\nere\nerebus\nerect\nerectable\nerected\nerectile\nerectilities\nerectility\nerecting\nerection\nerections\nerectly\nerectness\nerector\nerectors\nerects\nerelong\neremite\neremites\neremitic\neremitical\neremurus\nerenow\nerepsin\nerepsins\nerethism\nerethismic\nerethisms\nerewhile\nerfurt\nerg\nergastic\nergative\nergo\nergocalciferol\nergocalciferols\nergodic\nergodicity\nergograph\nergographic\nergographs\nergometer\nergometers\nergometric\nergonometric\nergonomic\nergonomically\nergonomics\nergonomist\nergonomists\nergonovine\nergosterol\nergosterols\nergot\nergotamine\nergotamines\nergotic\nergotism\nergotisms\nergots\nergs\neric\nericoid\nericsson\neridanus\nerie\neries\nerigeron\nerigerons\nerin\neristic\neristics\neritrea\neritrean\neritreans\nerlangen\nerlenmeyer\nermine\nermines\nerne\nernes\nerode\neroded\nerodes\nerodibility\nerodible\neroding\nerogenous\neroica\neros\nerose\nerosely\nerosion\nerosional\nerosionally\nerosions\nerosive\nerosiveness\nerosivity\nerotic\nerotica\nerotically\neroticism\neroticist\neroticists\neroticization\neroticizations\neroticize\neroticized\neroticizes\neroticizing\nerotics\nerotism\nerotisms\nerotize\nerotized\nerotizes\nerotizing\nerotogenic\nerotomania\nerotomanias\nerr\nerrancies\nerrancy\nerrand\nerrands\nerrant\nerrantly\nerrantries\nerrantry\nerrants\nerrata\nerratas\nerratic\nerratical\nerratically\nerraticism\nerratics\nerratum\nerred\nerrhine\nerrhines\nerring\nerroneous\nerroneously\nerroneousness\nerror\nerrorless\nerrors\nerrs\nersatz\nersatzes\nerse\nerst\nerstwhile\nerucic\neruct\neructate\neructated\neructates\neructating\neructation\neructations\neructative\neructed\neructing\neructs\nerudite\neruditely\neruditeness\nerudition\nerumpent\nerupt\nerupted\neruptible\nerupting\neruption\neruptions\neruptive\neruptively\nerupts\nerymanthian\nerymanthos\nerymanthus\neryngo\neryngoes\neryngos\nerysipelas\nerysipelatous\nerysipeloid\nerysipeloids\nerythema\nerythematic\nerythematous\nerythemic\nerythorbic\nerythrism\nerythrismal\nerythrisms\nerythrite\nerythrites\nerythroblast\nerythroblastic\nerythroblastoses\nerythroblastosis\nerythroblasts\nerythrocyte\nerythrocytes\nerythrocytic\nerythrocytometer\nerythrocytometers\nerythromycin\nerythropoiesis\nerythropoietic\nerythropoietin\nerythropoietins\nerzgebirge\nesau\nescadrille\nescadrilles\nescalade\nescaladed\nescalader\nescaladers\nescalades\nescalading\nescalate\nescalated\nescalates\nescalating\nescalation\nescalations\nescalator\nescalators\nescalatory\nescallop\nescalloped\nescalloping\nescallops\nescambia\nescapable\nescapade\nescapades\nescape\nescaped\nescapee\nescapees\nescapement\nescapements\nescaper\nescapers\nescapes\nescaping\nescapism\nescapisms\nescapist\nescapists\nescapologist\nescapologists\nescapology\nescargot\nescargots\nescarole\nescaroles\nescarp\nescarped\nescarping\nescarpment\nescarpments\nescarps\neschalot\neschalots\neschar\nescharotic\nescharotics\neschars\neschatological\neschatologically\neschatologist\neschatologists\neschatology\nescheat\nescheatable\nescheatage\nescheatages\nescheated\nescheating\nescheats\nescher\nescherichia\neschew\neschewal\neschewals\neschewed\neschewing\neschews\nescolar\nescolars\nescort\nescorted\nescorting\nescorts\nescot\nescoted\nescoting\nescots\nescritoire\nescritoires\nescrow\nescrowed\nescrowing\nescrows\nescudo\nescudos\nesculent\nesculents\nescutcheon\nescutcheoned\nescutcheons\nesdraelon\nesdras\nesemplastic\neserine\neserines\nesfahan\nesker\neskers\neskimo\neskimoan\neskimos\nesophageal\nesophagi\nesophagus\nesoteric\nesoterica\nesoterically\nesotericism\nesotericisms\nespadrille\nespadrilles\nespalier\nespaliered\nespaliering\nespaliers\nesparto\nespartos\nespañol\nespecial\nespecially\nesperance\nesperances\nesperantist\nesperantists\nesperanto\nespial\nespials\nespied\nespiegle\nespies\nespionage\nesplanade\nesplanades\nespousal\nespousals\nespouse\nespoused\nespouser\nespousers\nespouses\nespousing\nespresso\nespressos\nesprit\nespy\nespying\nespíritu\nesquiline\nesquimau\nesquimaux\nesquire\nesquires\ness\nessay\nessayed\nessayer\nessayers\nessaying\nessayist\nessayistic\nessayists\nessays\nessen\nessence\nessences\nessene\nessenes\nessenian\nessenic\nessenism\nessential\nessentialism\nessentialist\nessentialists\nessentiality\nessentially\nessentialness\nessentials\nessequibo\nessex\nessoin\nessoins\nessonite\nessonites\nest\nestablish\nestablishable\nestablished\nestablisher\nestablishers\nestablishes\nestablishing\nestablishment\nestablishmentarian\nestablishmentarianism\nestablishmentarians\nestablishments\nestaminet\nestaminets\nestancia\nestancias\nestate\nestates\nesteem\nesteemed\nesteeming\nesteems\nester\nesterase\nesterases\nesterification\nesterifications\nesterified\nesterifies\nesterify\nesterifying\nesters\nesther\nesthesia\nesthesias\nesthesiometer\nesthesiometers\nesthete\nesthetes\nesthetic\nesthetically\nesthetician\nestheticians\nestheticism\nesthetics\nestimable\nestimableness\nestimably\nestimate\nestimated\nestimates\nestimating\nestimation\nestimations\nestimative\nestimator\nestimators\nestival\nestivate\nestivated\nestivates\nestivating\nestivation\nestivations\nestonia\nestonian\nestonians\nestop\nestoppage\nestoppages\nestopped\nestoppel\nestoppels\nestopping\nestops\nestradiol\nestradiols\nestragon\nestragons\nestral\nestrange\nestranged\nestrangement\nestrangements\nestranger\nestrangers\nestranges\nestranging\nestray\nestrayed\nestraying\nestrays\nestremadura\nestremaduran\nestremadurans\nestriol\nestriols\nestrogen\nestrogenic\nestrogenically\nestrogens\nestrone\nestrones\nestrous\nestrual\nestrum\nestrums\nestrus\nestruses\nestuarial\nestuaries\nestuarine\nestuary\nesurience\nesuriency\nesurient\nesuriently\net\neta\netagere\netageres\netamine\netamines\netatism\netatisms\netatist\netc\netcetera\netceteras\netch\netched\netcher\netchers\netches\netching\netchings\neternal\neternality\neternalize\neternalized\neternalizes\neternalizing\neternally\neternalness\neternals\neterne\neternities\neternity\neternization\neternizations\neternize\neternized\neternizes\neternizing\netesian\neth\nethacrynic\nethambutol\nethambutols\nethamine\nethamines\nethane\nethanes\nethanol\nethanolamine\nethanolamines\nethanols\nethelbert\nethelred\nethene\nethenes\nether\nethereal\nethereality\netherealization\netherealizations\netherealize\netherealized\netherealizes\netherealizing\nethereally\netherealness\netheric\netherification\netherifications\netherified\netherifies\netherify\netherifying\netherization\netherizations\netherize\netherized\netherizer\netherizers\netherizes\netherizing\nethernet\nethernets\nethers\nethic\nethical\nethicalities\nethicality\nethically\nethicalness\nethicals\nethician\nethicians\nethicist\nethicists\nethics\nethinyl\nethinyls\nethion\nethions\nethiopia\nethiopian\nethiopians\nethiopic\nethiopics\nethmoid\nethmoidal\nethmoids\nethnarch\nethnarchs\nethnarchy\nethnic\nethnical\nethnically\nethnicities\nethnicity\nethnics\nethnobotanical\nethnobotanically\nethnobotanist\nethnobotanists\nethnobotany\nethnocentric\nethnocentrically\nethnocentricity\nethnocentrism\nethnographer\nethnographers\nethnographic\nethnographical\nethnographically\nethnography\nethnohistorian\nethnohistorians\nethnohistoric\nethnohistorical\nethnohistory\nethnologic\nethnological\nethnologically\nethnologist\nethnologists\nethnology\nethnomethodologist\nethnomethodologists\nethnomethodology\nethnomusicological\nethnomusicologist\nethnomusicologists\nethnomusicology\nethogram\nethograms\nethological\nethologies\nethologist\nethologists\nethology\nethos\nethoxy\nethoxyl\nethoxyls\neths\nethyl\nethylamine\nethylamines\nethylate\nethylated\nethylates\nethylating\nethylation\nethylations\nethylene\nethylenes\nethylenic\nethylic\nethyls\nethyne\nethynes\nethynyl\nethynyls\netiolate\netiolated\netiolates\netiolating\netiolation\netiolations\netiologic\netiological\netiologically\netiologies\netiologist\netiologists\netiology\netiquette\netiquettes\netna\neton\netonian\netonians\netruria\netrurian\netrurians\netruscan\netruscans\netude\netudes\netyma\netymological\netymologically\netymologies\netymologist\netymologists\netymologize\netymologized\netymologizes\netymologizing\netymology\netymon\netymons\neuboea\neucaine\neucaines\neucalypt\neucalypti\neucalyptol\neucalyptols\neucalypts\neucalyptus\neucalyptuses\neucharist\neucharistic\neucharistical\neucharists\neuchre\neuchred\neuchres\neuchring\neuchromatic\neuchromatin\neuchromatins\neuclase\neuclases\neuclid\neuclidean\neucrite\neucrites\neucritic\neudaemonist\neudaemonists\neudemon\neudemonism\neudemonist\neudemonistic\neudemonistical\neudemonists\neudemons\neugene\neugenic\neugenically\neugenicist\neugenicists\neugenics\neugenist\neugenists\neugenol\neugenols\neuglena\neuglenas\neuglobulin\neuglobulins\neugénie\neuhemerism\neuhemerisms\neuhemerist\neuhemeristic\neuhemeristically\neuhemerists\neuhemerize\neuhemerized\neuhemerizes\neuhemerizing\neukaryote\neukaryotes\neukaryotic\neulachon\neulachons\neuler\neulerian\neulogia\neulogies\neulogist\neulogistic\neulogistically\neulogists\neulogium\neulogiums\neulogize\neulogized\neulogizer\neulogizers\neulogizes\neulogizing\neulogy\neumenides\neunuch\neunuchism\neunuchoid\neunuchoids\neunuchs\neuonymus\neuonymuses\neupatrid\neupatridae\neupatrids\neupepsia\neupepsias\neupeptic\neupeptically\neuphemism\neuphemisms\neuphemist\neuphemistic\neuphemistically\neuphemists\neuphemize\neuphemized\neuphemizer\neuphemizers\neuphemizes\neuphemizing\neuphenic\neuphenics\neuphonic\neuphonically\neuphonies\neuphonious\neuphoniously\neuphoniousness\neuphonium\neuphoniums\neuphonize\neuphonized\neuphonizes\neuphonizing\neuphony\neuphorbia\neuphorbias\neuphoria\neuphoriant\neuphoriants\neuphorias\neuphoric\neuphorically\neuphotic\neuphrates\neuphrosyne\neuphuism\neuphuisms\neuphuist\neuphuistic\neuphuistical\neuphuistically\neuphuists\neuplastic\neuploid\neuploidies\neuploids\neuploidy\neupnea\neupneas\neupneic\neupneically\neurasia\neurasian\neurasians\neureka\neurhythmic\neurhythmics\neurhythmy\neuripedes\neuripi\neuripidean\neuripides\neuripus\neuro\neurobond\neurobonds\neurocentric\neurocentrism\neurocommunism\neurocommunist\neurocommunists\neurocrat\neurocratic\neurocrats\neurocurrencies\neurocurrency\neurodollar\neurodollars\neuromarket\neuromarkets\neuropa\neurope\neuropean\neuropeanism\neuropeanization\neuropeanize\neuropeanized\neuropeanizes\neuropeanizing\neuropeans\neuropium\neuros\neurus\neuryale\neuryales\neurybath\neurybathic\neurybaths\neurydice\neuryhaline\neuryphagous\neurypterid\neurypterids\neurytherm\neurythermal\neurytherms\neurythmic\neurythmics\neurythmies\neurythmy\neurytopic\neurytopicity\neusebius\neustachian\neustasies\neustasy\neustatic\neustele\neusteles\neutectic\neutectics\neuterpe\neuthanasia\neuthanasic\neuthanize\neuthanized\neuthanizes\neuthanizing\neuthenics\neuthenist\neuthenists\neutherian\neutherians\neuthyroid\neutrophic\neutrophication\neutrophications\neutrophies\neutrophy\neuxenite\neuxenites\nevacuant\nevacuants\nevacuate\nevacuated\nevacuates\nevacuating\nevacuation\nevacuations\nevacuative\nevacuator\nevacuators\nevacuee\nevacuees\nevadable\nevade\nevaded\nevader\nevaders\nevades\nevadible\nevading\nevaginate\nevaginated\nevaginates\nevaginating\nevagination\nevaginations\nevaluate\nevaluated\nevaluates\nevaluating\nevaluation\nevaluations\nevaluative\nevaluator\nevaluators\nevanesce\nevanesced\nevanescence\nevanescent\nevanescently\nevanesces\nevanescing\nevangel\nevangelic\nevangelical\nevangelicalism\nevangelically\nevangelicals\nevangelism\nevangelist\nevangelistic\nevangelistically\nevangelists\nevangelization\nevangelizations\nevangelize\nevangelized\nevangelizer\nevangelizers\nevangelizes\nevangelizing\nevangels\nevanton\nevaporability\nevaporable\nevaporate\nevaporated\nevaporates\nevaporating\nevaporation\nevaporations\nevaporative\nevaporatively\nevaporativity\nevaporator\nevaporators\nevaporite\nevaporites\nevaporitic\nevapotranspiration\nevasion\nevasions\nevasive\nevasively\nevasiveness\neve\nevection\nevectional\nevections\nevelyn\neven\nevened\nevener\neveners\nevenfall\nevenfalls\nevenhanded\nevenhandedly\nevenhandedness\nevening\nevenings\neveningwear\neveningwears\nevenki\nevenkis\nevenly\nevenness\nevens\nevensong\nevensongs\nevent\neventful\neventfully\neventfulness\neventide\neventides\neventless\nevents\neventual\neventualities\neventuality\neventually\neventuate\neventuated\neventuates\neventuating\never\neverbearing\neverblooming\neverest\neverglade\neverglades\nevergreen\nevergreens\neverlasting\neverlastingly\neverlastingness\nevermore\neversible\neversion\neversions\nevert\neverted\neverting\neverts\nevery\neverybody\neverybody's\neveryday\neverydayness\neveryman\neverymen\neveryone\neveryone's\neveryplace\neverything\neverywhere\neverywoman\neverywomen\neves\nevict\nevicted\nevictee\nevictees\nevicting\neviction\nevictions\nevictor\nevictors\nevicts\nevidence\nevidenced\nevidences\nevidencing\nevident\nevidential\nevidentially\nevidentiary\nevidently\nevil\nevildoer\nevildoers\nevildoing\nevildoings\neviler\nevilest\nevilly\nevilness\nevils\nevince\nevinced\nevinces\nevincible\nevincing\neviscerate\neviscerated\neviscerates\neviscerating\nevisceration\neviscerations\nevitable\nevocable\nevocation\nevocations\nevocative\nevocatively\nevocativeness\nevocator\nevocators\nevoke\nevoked\nevokes\nevoking\nevolute\nevolutes\nevolution\nevolutional\nevolutionarily\nevolutionary\nevolutionism\nevolutionist\nevolutionists\nevolutions\nevolvable\nevolve\nevolved\nevolvement\nevolvements\nevolves\nevolving\nevulsion\nevulsions\nevzone\nevzones\newe\newer\newers\newes\nex\nexaampere\nexaamperes\nexabecquerel\nexabecquerels\nexabit\nexabits\nexabyte\nexabytes\nexacandela\nexacandelas\nexacerbate\nexacerbated\nexacerbates\nexacerbating\nexacerbation\nexacerbations\nexacoulomb\nexacoulombs\nexact\nexacta\nexactable\nexactas\nexacted\nexacter\nexacters\nexacting\nexactingly\nexactingness\nexaction\nexactions\nexactitude\nexactly\nexactness\nexactor\nexactors\nexacts\nexafarad\nexafarads\nexaggerate\nexaggerated\nexaggeratedly\nexaggeratedness\nexaggerates\nexaggerating\nexaggeration\nexaggerations\nexaggerative\nexaggerator\nexaggerators\nexaggeratory\nexagram\nexagrams\nexahenries\nexahenry\nexahenrys\nexahertz\nexajoule\nexajoules\nexakelvin\nexakelvins\nexalt\nexaltation\nexaltations\nexalted\nexaltedly\nexaltedness\nexalter\nexalters\nexalting\nexalts\nexalumen\nexalumens\nexalux\nexam\nexamen\nexamens\nexameter\nexameters\nexaminable\nexaminant\nexaminants\nexamination\nexaminational\nexaminations\nexamine\nexamined\nexaminee\nexaminees\nexaminer\nexaminers\nexamines\nexamining\nexamole\nexamoles\nexample\nexampled\nexamples\nexampling\nexams\nexanewton\nexanewtons\nexanimate\nexanthem\nexanthema\nexanthemas\nexanthemata\nexanthematic\nexanthematous\nexanthems\nexaohm\nexaohms\nexapascal\nexapascals\nexaradian\nexaradians\nexarch\nexarchal\nexarchate\nexarchates\nexarchies\nexarchs\nexarchy\nexasecond\nexaseconds\nexasiemens\nexasievert\nexasieverts\nexasperate\nexasperated\nexasperatedly\nexasperater\nexasperaters\nexasperates\nexasperating\nexasperatingly\nexasperation\nexasteradian\nexasteradians\nexatesla\nexateslas\nexavolt\nexavolts\nexawatt\nexawatts\nexaweber\nexawebers\nexcalibur\nexcaliburs\nexcaudate\nexcavate\nexcavated\nexcavates\nexcavating\nexcavation\nexcavational\nexcavations\nexcavator\nexcavators\nexceed\nexceeded\nexceeding\nexceedingly\nexceeds\nexcel\nexcelled\nexcellence\nexcellences\nexcellencies\nexcellency\nexcellent\nexcellently\nexcelling\nexcels\nexcelsior\nexcept\nexcepted\nexcepting\nexception\nexceptionability\nexceptionable\nexceptionably\nexceptional\nexceptionality\nexceptionally\nexceptionalness\nexceptions\nexceptive\nexcepts\nexcerpt\nexcerpted\nexcerpter\nexcerpters\nexcerpting\nexcerption\nexcerptions\nexcerptor\nexcerptors\nexcerpts\nexcess\nexcessed\nexcesses\nexcessing\nexcessive\nexcessively\nexcessiveness\nexchange\nexchangeability\nexchangeable\nexchanged\nexchanger\nexchangers\nexchanges\nexchanging\nexchequer\nexchequers\nexcimer\nexcimers\nexcipient\nexcipients\nexciple\nexciples\nexcisable\nexcise\nexcised\nexciseman\nexcisemen\nexcises\nexcising\nexcision\nexcisions\nexcitabilities\nexcitability\nexcitable\nexcitableness\nexcitably\nexcitant\nexcitants\nexcitation\nexcitations\nexcitative\nexcitatory\nexcite\nexcited\nexcitedly\nexcitement\nexcitements\nexciter\nexciters\nexcites\nexciting\nexcitingly\nexciton\nexcitonics\nexcitons\nexcitor\nexcitors\nexclaim\nexclaimed\nexclaimer\nexclaimers\nexclaiming\nexclaims\nexclamation\nexclamations\nexclamatory\nexclave\nexclaves\nexcludability\nexcludable\nexclude\nexcluded\nexcluder\nexcluders\nexcludes\nexcludible\nexcluding\nexclusion\nexclusionary\nexclusionism\nexclusionist\nexclusionistic\nexclusionists\nexclusions\nexclusive\nexclusively\nexclusiveness\nexclusives\nexclusivity\nexcogitate\nexcogitated\nexcogitates\nexcogitating\nexcogitation\nexcogitations\nexcogitative\nexcommunicable\nexcommunicate\nexcommunicated\nexcommunicates\nexcommunicating\nexcommunication\nexcommunications\nexcommunicative\nexcommunicator\nexcommunicators\nexcommunicatory\nexcoriate\nexcoriated\nexcoriates\nexcoriating\nexcoriation\nexcoriations\nexcoriator\nexcoriators\nexcrement\nexcremental\nexcrementitious\nexcrements\nexcrescence\nexcrescences\nexcrescencies\nexcrescency\nexcrescent\nexcrescently\nexcreta\nexcretal\nexcrete\nexcreted\nexcreter\nexcreters\nexcretes\nexcreting\nexcretion\nexcretions\nexcretory\nexcruciate\nexcruciated\nexcruciates\nexcruciating\nexcruciatingly\nexcruciation\nexcruciations\nexculpable\nexculpate\nexculpated\nexculpates\nexculpating\nexculpation\nexculpations\nexculpatory\nexcurrent\nexcursion\nexcursionist\nexcursionists\nexcursions\nexcursive\nexcursively\nexcursiveness\nexcursus\nexcursuses\nexcusable\nexcusableness\nexcusably\nexcusatory\nexcuse\nexcused\nexcuser\nexcusers\nexcuses\nexcusing\nexec\nexecrable\nexecrableness\nexecrably\nexecrate\nexecrated\nexecrates\nexecrating\nexecration\nexecrations\nexecrative\nexecrator\nexecrators\nexecratory\nexecs\nexecutable\nexecutables\nexecutant\nexecutants\nexecute\nexecuted\nexecuter\nexecuters\nexecutes\nexecuting\nexecution\nexecutioner\nexecutioners\nexecutions\nexecutive\nexecutives\nexecutor\nexecutorial\nexecutors\nexecutorship\nexecutorships\nexecutory\nexecutrices\nexecutrix\nexecutrixes\nexedra\nexedrae\nexedras\nexegeses\nexegesis\nexegete\nexegetes\nexegetic\nexegetical\nexegetically\nexegetist\nexegetists\nexempla\nexemplar\nexemplarily\nexemplariness\nexemplarity\nexemplars\nexemplary\nexempli\nexemplifiable\nexemplification\nexemplifications\nexemplified\nexemplifier\nexemplifiers\nexemplifies\nexemplify\nexemplifying\nexemplum\nexempt\nexempted\nexemptible\nexempting\nexemption\nexemptions\nexempts\nexenterate\nexenterated\nexenterates\nexenterating\nexenteration\nexenterations\nexercisable\nexercise\nexercised\nexerciser\nexercisers\nexercises\nexercising\nexercitation\nexercitations\nexercycle\nexergonic\nexergue\nexergues\nexert\nexerted\nexerting\nexertion\nexertions\nexerts\nexes\nexeter\nexeunt\nexfoliate\nexfoliated\nexfoliates\nexfoliating\nexfoliation\nexfoliations\nexfoliative\nexfoliator\nexfoliators\nexhalant\nexhalants\nexhalation\nexhalations\nexhale\nexhaled\nexhalent\nexhalents\nexhales\nexhaling\nexhaust\nexhausted\nexhaustedly\nexhauster\nexhausters\nexhaustibility\nexhaustible\nexhausting\nexhaustingly\nexhaustion\nexhaustive\nexhaustively\nexhaustiveness\nexhaustivity\nexhaustless\nexhaustlessly\nexhaustlessness\nexhausts\nexhibit\nexhibited\nexhibiter\nexhibiters\nexhibiting\nexhibition\nexhibitioner\nexhibitioners\nexhibitionism\nexhibitionist\nexhibitionistic\nexhibitionists\nexhibitions\nexhibitive\nexhibitively\nexhibitor\nexhibitors\nexhibitory\nexhibits\nexhilarant\nexhilarants\nexhilarate\nexhilarated\nexhilarates\nexhilarating\nexhilaratingly\nexhilaration\nexhilarative\nexhilarator\nexhilarators\nexhort\nexhortation\nexhortations\nexhortative\nexhortatory\nexhorted\nexhorter\nexhorters\nexhorting\nexhorts\nexhumation\nexhumations\nexhume\nexhumed\nexhumer\nexhumers\nexhumes\nexhuming\nexigence\nexigences\nexigencies\nexigency\nexigent\nexigently\nexiguities\nexiguity\nexiguous\nexiguously\nexiguousness\nexile\nexiled\nexiles\nexilian\nexilic\nexiling\neximious\nexine\nexines\nexist\nexisted\nexistence\nexistences\nexistent\nexistential\nexistentialism\nexistentialist\nexistentialistic\nexistentialistically\nexistentialists\nexistentially\nexistents\nexisting\nexists\nexit\nexited\nexiting\nexits\nexobiological\nexobiologist\nexobiologists\nexobiology\nexocarp\nexocarps\nexocet\nexocets\nexocrine\nexocyclic\nexocytose\nexocytosed\nexocytoses\nexocytosing\nexocytosis\nexocytotic\nexodermis\nexodontia\nexodontias\nexodontics\nexodontist\nexodontists\nexodus\nexoduses\nexoenzyme\nexoenzymes\nexoergic\nexogamic\nexogamies\nexogamous\nexogamy\nexogenous\nexogenously\nexon\nexonerate\nexonerated\nexonerates\nexonerating\nexoneration\nexonerations\nexonerative\nexonic\nexons\nexonuclease\nexonucleases\nexopeptidase\nexopeptidases\nexophthalmic\nexophthalmos\nexorbitance\nexorbitances\nexorbitant\nexorbitantly\nexorcise\nexorcised\nexorciser\nexorcisers\nexorcises\nexorcising\nexorcism\nexorcisms\nexorcist\nexorcistic\nexorcistical\nexorcists\nexorcize\nexorcized\nexorcizes\nexorcizing\nexordia\nexordial\nexordium\nexordiums\nexoskeletal\nexoskeleton\nexoskeletons\nexosmosis\nexosmotic\nexosphere\nexospheres\nexospheric\nexospore\nexospores\nexosporia\nexosporium\nexostoses\nexostosis\nexoteric\nexoterically\nexothermal\nexothermally\nexothermic\nexothermically\nexotic\nexotica\nexotically\nexoticism\nexoticisms\nexoticness\nexotics\nexotism\nexotisms\nexotoxin\nexotoxins\nexpand\nexpandable\nexpanded\nexpander\nexpanders\nexpanding\nexpandor\nexpandors\nexpands\nexpanse\nexpanses\nexpansibility\nexpansible\nexpansile\nexpansion\nexpansional\nexpansionary\nexpansionism\nexpansionist\nexpansionistic\nexpansionists\nexpansions\nexpansive\nexpansively\nexpansiveness\nexpansivity\nexpatiate\nexpatiated\nexpatiates\nexpatiating\nexpatiation\nexpatiations\nexpatiatory\nexpatriate\nexpatriated\nexpatriates\nexpatriating\nexpatriation\nexpatriations\nexpect\nexpectable\nexpectably\nexpectance\nexpectances\nexpectancies\nexpectancy\nexpectant\nexpectantly\nexpectants\nexpectation\nexpectational\nexpectations\nexpectative\nexpected\nexpectedly\nexpectedness\nexpecting\nexpectorant\nexpectorants\nexpectorate\nexpectorated\nexpectorates\nexpectorating\nexpectoration\nexpectorations\nexpectorator\nexpectorators\nexpects\nexpedience\nexpediences\nexpediencies\nexpediency\nexpedient\nexpediential\nexpedientially\nexpediently\nexpedients\nexpedite\nexpedited\nexpediter\nexpediters\nexpedites\nexpediting\nexpedition\nexpeditionary\nexpeditions\nexpeditious\nexpeditiously\nexpeditiousness\nexpeditor\nexpeditors\nexpel\nexpellable\nexpellant\nexpelled\nexpellee\nexpellees\nexpeller\nexpellers\nexpelling\nexpels\nexpend\nexpendability\nexpendable\nexpendables\nexpendably\nexpended\nexpender\nexpenders\nexpending\nexpenditure\nexpenditures\nexpends\nexpense\nexpensed\nexpenses\nexpensing\nexpensive\nexpensively\nexpensiveness\nexperience\nexperienced\nexperiencer\nexperiencers\nexperiences\nexperiencing\nexperiential\nexperientialism\nexperientially\nexperiment\nexperimental\nexperimentalism\nexperimentalist\nexperimentalists\nexperimentally\nexperimentation\nexperimentations\nexperimented\nexperimenter\nexperimenters\nexperimenting\nexperiments\nexpert\nexperted\nexperting\nexpertise\nexpertism\nexpertly\nexpertness\nexperts\nexpiable\nexpiate\nexpiated\nexpiates\nexpiating\nexpiation\nexpiations\nexpiator\nexpiators\nexpiatory\nexpiration\nexpirations\nexpiratory\nexpire\nexpired\nexpires\nexpiries\nexpiring\nexpiry\nexplain\nexplainable\nexplained\nexplainer\nexplainers\nexplaining\nexplains\nexplanation\nexplanations\nexplanative\nexplanatively\nexplanatorily\nexplanatory\nexplant\nexplantation\nexplantations\nexplanted\nexplanting\nexplants\nexpletive\nexpletives\nexpletory\nexplicable\nexplicably\nexplicate\nexplicated\nexplicates\nexplicating\nexplication\nexplications\nexplicative\nexplicatively\nexplicatives\nexplicator\nexplicators\nexplicatory\nexplicit\nexplicitly\nexplicitness\nexplode\nexploded\nexploder\nexploders\nexplodes\nexploding\nexploit\nexploitability\nexploitable\nexploitation\nexploitations\nexploitative\nexploitatively\nexploited\nexploiter\nexploiters\nexploiting\nexploitive\nexploitively\nexploits\nexploration\nexplorational\nexplorations\nexplorative\nexploratively\nexploratory\nexplore\nexplored\nexplorer\nexplorers\nexplores\nexploring\nexplosion\nexplosions\nexplosive\nexplosively\nexplosiveness\nexplosives\nexpo\nexponent\nexponential\nexponentially\nexponentiate\nexponentiated\nexponentiates\nexponentiating\nexponentiation\nexponentiations\nexponents\nexport\nexportability\nexportable\nexportation\nexportations\nexported\nexporter\nexporters\nexporting\nexports\nexpos\nexpose\nexposed\nexposer\nexposers\nexposes\nexposing\nexposit\nexposited\nexpositing\nexposition\nexpositional\nexpositions\nexpositive\nexpositor\nexpositors\nexpository\nexposits\nexpostulate\nexpostulated\nexpostulates\nexpostulating\nexpostulation\nexpostulations\nexpostulative\nexpostulator\nexpostulators\nexpostulatory\nexposure\nexposures\nexposé\nexposés\nexpound\nexpounded\nexpounder\nexpounders\nexpounding\nexpounds\nexpress\nexpressage\nexpressed\nexpresser\nexpressers\nexpresses\nexpressible\nexpressing\nexpression\nexpressional\nexpressionism\nexpressionist\nexpressionistic\nexpressionistically\nexpressionists\nexpressionless\nexpressionlessly\nexpressionlessness\nexpressions\nexpressive\nexpressively\nexpressiveness\nexpressivities\nexpressivity\nexpressly\nexpressway\nexpressways\nexpropriate\nexpropriated\nexpropriates\nexpropriating\nexpropriation\nexpropriations\nexpropriator\nexpropriators\nexpropriatory\nexpulse\nexpulsed\nexpulses\nexpulsing\nexpulsion\nexpulsions\nexpulsive\nexpunction\nexpunctions\nexpunge\nexpunged\nexpunger\nexpungers\nexpunges\nexpunging\nexpurgate\nexpurgated\nexpurgates\nexpurgating\nexpurgation\nexpurgations\nexpurgator\nexpurgatorial\nexpurgators\nexpurgatory\nexquisite\nexquisitely\nexquisiteness\nexsanguinate\nexsanguinated\nexsanguinates\nexsanguinating\nexsanguination\nexsanguinations\nexsanguine\nexscind\nexscinded\nexscinding\nexscinds\nexsert\nexserted\nexsertile\nexserting\nexsertion\nexsertions\nexserts\nexsiccate\nexsiccated\nexsiccates\nexsiccating\nexsiccation\nexsiccations\nexsiccative\nexsiccator\nexsiccators\nexstipulate\nextant\nextemporal\nextemporally\nextemporaneity\nextemporaneous\nextemporaneously\nextemporaneousness\nextemporarily\nextemporary\nextempore\nextemporization\nextemporizations\nextemporize\nextemporized\nextemporizer\nextemporizers\nextemporizes\nextemporizing\nextend\nextendability\nextendable\nextended\nextendedly\nextendedness\nextender\nextenders\nextendibility\nextendible\nextending\nextends\nextensibility\nextensible\nextensile\nextension\nextensional\nextensionality\nextensionally\nextensions\nextensities\nextensity\nextensive\nextensively\nextensiveness\nextenso\nextensometer\nextensometers\nextensor\nextensors\nextent\nextents\nextenuate\nextenuated\nextenuates\nextenuating\nextenuatingly\nextenuation\nextenuations\nextenuative\nextenuatives\nextenuator\nextenuators\nextenuatory\nexterior\nexteriority\nexteriorization\nexteriorizations\nexteriorize\nexteriorized\nexteriorizes\nexteriorizing\nexteriorly\nexteriors\nexterminate\nexterminated\nexterminates\nexterminating\nextermination\nexterminations\nexterminative\nexterminator\nexterminators\nexterminatory\nextermine\nextermined\nextermines\nextermining\nextern\nexternal\nexternalism\nexternalisms\nexternalist\nexternalists\nexternalities\nexternality\nexternalization\nexternalizations\nexternalize\nexternalized\nexternalizes\nexternalizing\nexternally\nexternals\nexterne\nexternes\nexterns\nexternship\nexternships\nexteroceptive\nexteroceptor\nexteroceptors\nexterritorial\nexterritoriality\nexterritorially\nextinct\nextinction\nextinctions\nextinctive\nextinguish\nextinguishable\nextinguished\nextinguisher\nextinguishers\nextinguishes\nextinguishing\nextinguishment\nextinguishments\nextirpate\nextirpated\nextirpates\nextirpating\nextirpation\nextirpations\nextirpative\nextirpator\nextirpators\nextol\nextolled\nextoller\nextollers\nextolling\nextolment\nextols\nextort\nextorted\nextorter\nextorters\nextorting\nextortion\nextortionary\nextortionate\nextortionately\nextortioner\nextortioners\nextortionist\nextortionists\nextortions\nextortive\nextorts\nextra\nextracellular\nextracellularly\nextrachromosomal\nextracode\nextracodes\nextraconstitutional\nextracorporeal\nextracorporeally\nextracranial\nextract\nextractability\nextractable\nextracted\nextractible\nextracting\nextraction\nextractions\nextractive\nextractively\nextractives\nextractor\nextractors\nextracts\nextracurricular\nextraditable\nextradite\nextradited\nextradites\nextraditing\nextradition\nextraditions\nextrados\nextradoses\nextragalactic\nextrahepatic\nextrajudicial\nextrajudicially\nextralegal\nextralegally\nextralimital\nextralinguistic\nextralinguistically\nextralities\nextrality\nextramarital\nextramundane\nextramural\nextramurally\nextramusical\nextraneous\nextraneously\nextraneousness\nextranuclear\nextraocular\nextraordinaire\nextraordinarily\nextraordinariness\nextraordinary\nextrapolate\nextrapolated\nextrapolates\nextrapolating\nextrapolation\nextrapolations\nextrapolative\nextrapolator\nextrapolators\nextrapyramidal\nextras\nextrasensory\nextrasolar\nextrasystole\nextrasystoles\nextraterrestrial\nextraterrestrials\nextraterritorial\nextraterritorialities\nextraterritoriality\nextraterritorially\nextrauterine\nextravagance\nextravagances\nextravagancies\nextravagancy\nextravagant\nextravagantly\nextravagantness\nextravaganza\nextravaganzas\nextravagate\nextravagated\nextravagates\nextravagating\nextravagation\nextravagations\nextravasate\nextravasated\nextravasates\nextravasating\nextravasation\nextravasations\nextravascular\nextravehicular\nextraversion\nextravert\nextraverted\nextraverting\nextraverts\nextrema\nextreme\nextremely\nextremeness\nextremes\nextremis\nextremism\nextremist\nextremists\nextremities\nextremity\nextremum\nextricable\nextricate\nextricated\nextricates\nextricating\nextrication\nextrications\nextrinsic\nextrinsically\nextrorse\nextroversion\nextroversive\nextroversively\nextrovert\nextroverted\nextroverts\nextrudability\nextrudable\nextrude\nextruded\nextruder\nextruders\nextrudes\nextruding\nextrusion\nextrusions\nextrusive\nexuberance\nexuberant\nexuberantly\nexuberate\nexuberated\nexuberates\nexuberating\nexudate\nexudates\nexudation\nexudations\nexudative\nexude\nexuded\nexudes\nexuding\nexult\nexultance\nexultancy\nexultant\nexultantly\nexultation\nexulted\nexulting\nexultingly\nexults\nexurb\nexurban\nexurbanite\nexurbanites\nexurbia\nexurbias\nexurbs\nexuviae\nexuvial\nexuviate\nexuviated\nexuviates\nexuviating\nexuviation\nexuviations\nexxon\neyas\neyases\neye\neyeball\neyeballed\neyeballing\neyeballs\neyebolt\neyebolts\neyebright\neyebrights\neyebrow\neyebrows\neyecup\neyecups\neyed\neyedness\neyednesses\neyedropper\neyedropperful\neyedroppers\neyeful\neyefuls\neyeglass\neyeglasses\neyehole\neyeholes\neyehook\neyehooks\neyeing\neyelash\neyelashes\neyeless\neyelet\neyelets\neyelid\neyelids\neyelift\neyelifts\neyelike\neyeliner\neyeliners\neyepiece\neyepieces\neyepopper\neyepoppers\neyepopping\neyer\neyers\neyes\neyeshade\neyeshades\neyeshot\neyeshots\neyesight\neyesights\neyesore\neyesores\neyespot\neyespots\neyestalk\neyestalks\neyestrain\neyestrings\neyeteeth\neyetooth\neyewash\neyewashes\neyewear\neyewink\neyewinks\neyewitness\neyewitnesses\neying\neyra\neyras\neyre\neyres\neyrir\nezekias\nezekiel\nezra\nf\nfa\nfab\nfabergé\nfabian\nfabianism\nfabianist\nfabianists\nfabians\nfabius\nfable\nfabled\nfabler\nfablers\nfables\nfabliau\nfabliaux\nfabling\nfabre\nfabric\nfabricability\nfabricable\nfabricant\nfabricants\nfabricate\nfabricated\nfabricates\nfabricating\nfabrication\nfabrications\nfabricator\nfabricators\nfabrics\nfabular\nfabulate\nfabulated\nfabulates\nfabulating\nfabulation\nfabulations\nfabulator\nfabulators\nfabulist\nfabulists\nfabulous\nfabulously\nfabulousness\nfacade\nfacades\nface\nfaceable\nfacecloth\nfacecloths\nfaced\nfacedown\nfacedowns\nfaceless\nfacelessness\nfacelift\nfacelifts\nfacemask\nfacemasks\nfaceplate\nfaceplates\nfacer\nfacers\nfaces\nfacet\nfacete\nfaceted\nfacetiae\nfacetious\nfacetiously\nfacetiousness\nfacets\nfacetted\nfaceup\nfacia\nfacial\nfacially\nfacials\nfacias\nfacie\nfacies\nfacile\nfacilely\nfacileness\nfacilitate\nfacilitated\nfacilitates\nfacilitating\nfacilitation\nfacilitative\nfacilitator\nfacilitators\nfacilitatory\nfacilities\nfacility\nfacing\nfacings\nfacsimile\nfacsimiles\nfact\nfacticity\nfaction\nfactional\nfactionalism\nfactionalize\nfactionalized\nfactionalizes\nfactionalizing\nfactionally\nfactions\nfactious\nfactiously\nfactiousness\nfactitious\nfactitiously\nfactitiousness\nfactitive\nfactitively\nfacto\nfactoid\nfactoidal\nfactoids\nfactor\nfactorability\nfactorable\nfactorage\nfactorages\nfactored\nfactorial\nfactorials\nfactories\nfactoring\nfactorings\nfactorization\nfactorizations\nfactorize\nfactorized\nfactorizes\nfactorizing\nfactors\nfactorship\nfactory\nfactotum\nfactotums\nfacts\nfactual\nfactualism\nfactualist\nfactualists\nfactuality\nfactually\nfactualness\nfacture\nfactures\nfacula\nfaculae\nfacultative\nfacultatively\nfaculties\nfaculty\nfad\nfaddish\nfaddishly\nfaddishness\nfaddism\nfaddisms\nfaddist\nfaddists\nfaddy\nfade\nfadeaway\nfadeaways\nfaded\nfadeless\nfadelessly\nfadeout\nfadeouts\nfader\nfaders\nfades\nfading\nfadings\nfado\nfados\nfads\nfaecal\nfaeces\nfaena\nfaenas\nfaerie\nfaeries\nfaeroe\nfaeroes\nfaeroese\nfaery\nfafnir\nfag\nfagged\nfagging\nfaggot\nfaggoted\nfaggoting\nfaggots\nfagin\nfagins\nfagot\nfagoted\nfagoting\nfagotings\nfagots\nfags\nfahrenheit\nfaience\nfaiences\nfail\nfailed\nfailing\nfailingly\nfailings\nfaille\nfailles\nfails\nfailsafe\nfailure\nfailures\nfain\nfaint\nfainted\nfainter\nfainters\nfaintest\nfainthearted\nfaintheartedly\nfaintheartedness\nfainting\nfaintish\nfaintishness\nfaintly\nfaintness\nfaints\nfainéant\nfainéants\nfair\nfairbanks\nfaire\nfaired\nfairer\nfairest\nfairfax\nfairgoer\nfairgoers\nfairground\nfairgrounds\nfairhaven\nfairies\nfairing\nfairings\nfairish\nfairishly\nfairlead\nfairleader\nfairleaders\nfairleads\nfairly\nfairness\nfairs\nfairwater\nfairwaters\nfairway\nfairways\nfairy\nfairyism\nfairyisms\nfairyland\nfairylands\nfairylike\nfairytale\nfairytales\nfaisalabad\nfait\nfaith\nfaithful\nfaithfully\nfaithfulness\nfaithfuls\nfaithless\nfaithlessly\nfaithlessness\nfaiths\nfaitour\nfaitours\nfaits\nfajita\nfajitas\nfake\nfaked\nfaker\nfakeries\nfakers\nfakery\nfakes\nfaking\nfakir\nfakirs\nfalafel\nfalange\nfalangism\nfalangist\nfalangists\nfalasha\nfalashas\nfalcate\nfalcated\nfalces\nfalchion\nfalchions\nfalciform\nfalciparum\nfalcon\nfalconer\nfalconers\nfalconet\nfalconets\nfalconoid\nfalconry\nfalcons\nfalderal\nfalderals\nfaldstool\nfaldstools\nfaliscan\nfaliscans\nfalkland\nfalklands\nfall\nfallacies\nfallacious\nfallaciously\nfallaciousness\nfallacy\nfallal\nfallalery\nfallals\nfallback\nfallbacks\nfallboard\nfallboards\nfallen\nfaller\nfallers\nfallfish\nfallfishes\nfallibility\nfallible\nfallibleness\nfallibly\nfalling\nfallings\nfalloff\nfalloffs\nfallopian\nfallout\nfallouts\nfallow\nfallowed\nfallowing\nfallowness\nfallows\nfalls\nfalmouth\nfalse\nfalsehood\nfalsehoods\nfalsely\nfalseness\nfalser\nfalsest\nfalsetto\nfalsettos\nfalsie\nfalsies\nfalsifiability\nfalsifiable\nfalsification\nfalsifications\nfalsified\nfalsifier\nfalsifiers\nfalsifies\nfalsify\nfalsifying\nfalsities\nfalsity\nfalstaff\nfalstaffian\nfalster\nfaltboat\nfaltboats\nfalter\nfaltered\nfalterer\nfalterers\nfaltering\nfalteringly\nfalters\nfalx\nfamagusta\nfame\nfamed\nfames\nfamilial\nfamiliar\nfamiliarities\nfamiliarity\nfamiliarization\nfamiliarizations\nfamiliarize\nfamiliarized\nfamiliarizer\nfamiliarizers\nfamiliarizes\nfamiliarizing\nfamiliarly\nfamiliarness\nfamiliars\nfamilies\nfamilism\nfamilistic\nfamille\nfamily\nfamine\nfamines\nfaming\nfamish\nfamished\nfamishes\nfamishing\nfamishment\nfamishments\nfamous\nfamously\nfamousness\nfamuli\nfamulus\nfan\nfanac\nfanacs\nfanatic\nfanatical\nfanatically\nfanaticalness\nfanaticism\nfanaticize\nfanaticized\nfanaticizes\nfanaticizing\nfanatics\nfancied\nfancier\nfanciers\nfancies\nfanciest\nfanciful\nfancifully\nfancifulness\nfancily\nfanciness\nfancy\nfancying\nfancywork\nfandangle\nfandangles\nfandango\nfandangos\nfandom\nfandoms\nfane\nfanes\nfanfare\nfanfares\nfanfaronade\nfanfaronades\nfanfold\nfanfolds\nfang\nfanged\nfangs\nfanion\nfanions\nfanjet\nfanjets\nfanlight\nfanlights\nfanlike\nfanned\nfanner\nfanners\nfannies\nfanning\nfanny\nfanout\nfans\nfantabulous\nfantail\nfantailed\nfantails\nfantasia\nfantasias\nfantasie\nfantasied\nfantasies\nfantasist\nfantasists\nfantasize\nfantasized\nfantasizer\nfantasizes\nfantasizing\nfantasm\nfantasms\nfantast\nfantastic\nfantastical\nfantasticality\nfantastically\nfantasticalness\nfantasticate\nfantasticated\nfantasticates\nfantasticating\nfantastication\nfantastications\nfantastico\nfantasticoes\nfantasts\nfantasy\nfantasying\nfantasyland\nfantasylands\nfante\nfanti\nfantoccini\nfantod\nfantods\nfantom\nfantoms\nfanwise\nfanwort\nfanworts\nfanzine\nfanzines\nfar\nfarad\nfaradaic\nfaraday\nfaradays\nfaradic\nfaradism\nfaradisms\nfaradization\nfaradizations\nfaradize\nfaradized\nfaradizes\nfaradizing\nfarads\nfarandole\nfarandoles\nfaraway\nfarce\nfarced\nfarces\nfarceur\nfarceurs\nfarci\nfarcical\nfarcicality\nfarcically\nfarcicalness\nfarcie\nfarcing\nfarcy\nfard\nfarded\nfardel\nfardels\nfarding\nfards\nfare\nfarebeat\nfarebeaten\nfarebeater\nfarebeaters\nfarebeating\nfarebeats\nfared\nfarer\nfarers\nfares\nfarewell\nfarewelled\nfarewelling\nfarewells\nfarfal\nfarfals\nfarfel\nfarfels\nfarfetched\nfarfetchedness\nfaridabad\nfarina\nfarinaceous\nfarinas\nfaring\nfarinha\nfarinhas\nfarinose\nfarkleberries\nfarkleberry\nfarl\nfarls\nfarm\nfarmability\nfarmable\nfarmed\nfarmer\nfarmers\nfarmhand\nfarmhands\nfarmhouse\nfarmhouses\nfarming\nfarmington\nfarmland\nfarmlands\nfarms\nfarmstead\nfarmsteads\nfarmwoman\nfarmwomen\nfarmworker\nfarmworkers\nfarmyard\nfarmyards\nfarnese\nfaro\nfaroe\nfaroes\nfaroese\nfarolito\nfarolitos\nfaros\nfarouche\nfarraginous\nfarrago\nfarragoes\nfarrier\nfarrieries\nfarriers\nfarriery\nfarrow\nfarrowed\nfarrowing\nfarrows\nfarseeing\nfarsi\nfarsighted\nfarsightedly\nfarsightedness\nfarsistan\nfart\nfarted\nfarther\nfarthermost\nfarthest\nfarthing\nfarthingale\nfarthingales\nfarthings\nfarting\nfarts\nfasces\nfascia\nfasciae\nfascial\nfascias\nfasciate\nfasciated\nfasciation\nfasciations\nfascicle\nfascicled\nfascicles\nfascicular\nfascicularly\nfasciculate\nfasciculated\nfasciculately\nfasciculation\nfasciculations\nfascicule\nfascicules\nfasciculi\nfasciculus\nfascinate\nfascinated\nfascinates\nfascinating\nfascinatingly\nfascination\nfascinations\nfascinator\nfascinators\nfascine\nfascines\nfascioliases\nfascioliasis\nfascism\nfascist\nfascisti\nfascistic\nfascistically\nfascists\nfash\nfashed\nfashes\nfashing\nfashion\nfashionability\nfashionable\nfashionableness\nfashionables\nfashionably\nfashioned\nfashioner\nfashioners\nfashioning\nfashionmonger\nfashionmongers\nfashions\nfast\nfastback\nfastbacks\nfastball\nfastballs\nfasted\nfasten\nfastened\nfastener\nfasteners\nfastening\nfastenings\nfastens\nfaster\nfastest\nfastidious\nfastidiously\nfastidiousness\nfastigiate\nfastigiated\nfastigiately\nfastigium\nfastigiums\nfasting\nfastness\nfastnesses\nfasts\nfastuous\nfat\nfata\nfatal\nfatale\nfatales\nfatalism\nfatalist\nfatalistic\nfatalistically\nfatalists\nfatalities\nfatality\nfatally\nfatback\nfate\nfated\nfateful\nfatefully\nfatefulness\nfates\nfathead\nfatheaded\nfatheadedly\nfatheadedness\nfatheads\nfather\nfathered\nfatherhood\nfathering\nfatherland\nfatherlands\nfatherless\nfatherlessness\nfatherlike\nfatherliness\nfatherly\nfathers\nfathom\nfathomable\nfathomed\nfathometer\nfathoming\nfathomless\nfathomlessly\nfathomlessness\nfathoms\nfatidic\nfatidical\nfatigabilities\nfatigability\nfatigable\nfatigue\nfatigued\nfatigues\nfatiguing\nfatiguingly\nfatima\nfatimid\nfatimids\nfatimite\nfatimites\nfating\nfatless\nfatling\nfatlings\nfatly\nfatness\nfats\nfatso\nfatsoes\nfatstock\nfatted\nfatten\nfattened\nfattener\nfatteners\nfattening\nfattens\nfatter\nfattest\nfattier\nfatties\nfattiest\nfattily\nfattiness\nfatting\nfattish\nfattishness\nfatty\nfatuities\nfatuity\nfatuous\nfatuously\nfatuousness\nfatuus\nfatwood\nfatwoods\nfaubourg\nfaubourgs\nfaucal\nfauces\nfaucet\nfaucets\nfaucial\nfaugh\nfaulkner\nfaulknerian\nfault\nfaulted\nfaultfinder\nfaultfinders\nfaultfinding\nfaultfindings\nfaultier\nfaultiest\nfaultily\nfaultiness\nfaulting\nfaultless\nfaultlessly\nfaultlessness\nfaults\nfaulty\nfaun\nfauna\nfaunae\nfaunal\nfaunally\nfaunas\nfaunistic\nfaunistically\nfauns\nfaunus\nfaust\nfaustian\nfaustus\nfaut\nfaute\nfauteuil\nfauteuils\nfauve\nfauves\nfauvism\nfauvist\nfauvists\nfaux\nfavela\nfavelas\nfaveolate\nfavonian\nfavor\nfavorable\nfavorableness\nfavorably\nfavored\nfavoredness\nfavorer\nfavorers\nfavoring\nfavoringly\nfavorite\nfavorites\nfavoritism\nfavors\nfavus\nfavuses\nfawkes\nfawn\nfawned\nfawner\nfawners\nfawning\nfawningly\nfawns\nfawny\nfax\nfaxed\nfaxes\nfaxing\nfay\nfayalite\nfayalites\nfayed\nfayetteville\nfaying\nfays\nfaze\nfazed\nfazes\nfazing\nfaçade\nfaçades\nfaçadism\nfaïence\nfaïences\nfealties\nfealty\nfear\nfeared\nfearer\nfearers\nfearful\nfearfully\nfearfulness\nfearing\nfearless\nfearlessly\nfearlessness\nfears\nfearsome\nfearsomely\nfearsomeness\nfeasibility\nfeasible\nfeasiblefeasters\nfeasibleness\nfeasibly\nfeast\nfeasted\nfeaster\nfeasters\nfeasting\nfeasts\nfeat\nfeater\nfeatest\nfeather\nfeatherbed\nfeatherbedded\nfeatherbedding\nfeatherbeddings\nfeatherbeds\nfeatherbone\nfeatherbones\nfeatherbrain\nfeatherbrained\nfeatherbrains\nfeathered\nfeatheredge\nfeatheredged\nfeatheredges\nfeatherhead\nfeatherheaded\nfeatherheads\nfeatheriness\nfeathering\nfeatherings\nfeatherless\nfeathers\nfeatherstitch\nfeatherstitched\nfeatherstitches\nfeatherstitching\nfeatherweight\nfeatherweights\nfeathery\nfeatly\nfeats\nfeature\nfeatured\nfeatureless\nfeatures\nfeaturing\nfeaze\nfeazed\nfeazes\nfeazing\nfebricity\nfebrifacient\nfebrifacients\nfebrific\nfebrifuge\nfebrifuges\nfebrile\nfebruaries\nfebruary\nfebruarys\nfecal\nfeces\nfeckless\nfecklessly\nfecklessness\nfeckly\nfeculence\nfeculent\nfecund\nfecundate\nfecundated\nfecundates\nfecundating\nfecundation\nfecundations\nfecundity\nfed\nfedayee\nfedayeen\nfederacies\nfederacy\nfederal\nfederalism\nfederalist\nfederalists\nfederalization\nfederalizations\nfederalize\nfederalized\nfederalizes\nfederalizing\nfederally\nfederate\nfederated\nfederates\nfederating\nfederation\nfederations\nfederative\nfederatively\nfedora\nfedoras\nfeds\nfee\nfeeble\nfeebleminded\nfeeblemindedly\nfeeblemindedness\nfeebleness\nfeebler\nfeeblest\nfeeblish\nfeebly\nfeed\nfeedback\nfeedbag\nfeedbags\nfeedbox\nfeedboxes\nfeeder\nfeeders\nfeedhole\nfeedholes\nfeeding\nfeedings\nfeedlot\nfeedlots\nfeeds\nfeedstock\nfeedstuff\nfeedthrough\nfeedthroughs\nfeeing\nfeel\nfeeler\nfeelers\nfeeling\nfeelingly\nfeelingness\nfeelings\nfeels\nfees\nfeet\nfeetfirst\nfeeze\nfeezes\nfehling\nfeign\nfeigned\nfeigner\nfeigners\nfeigning\nfeigns\nfeijoada\nfeint\nfeinted\nfeinting\nfeints\nfeirie\nfeist\nfeistier\nfeistiest\nfeistiness\nfeists\nfeisty\nfelafel\nfeldspar\nfeldspars\nfeldspathic\nfelicific\nfelicitate\nfelicitated\nfelicitates\nfelicitating\nfelicitation\nfelicitations\nfelicitator\nfelicitators\nfelicities\nfelicitous\nfelicitously\nfelicitousness\nfelicity\nfelid\nfelids\nfeline\nfelinely\nfelineness\nfelines\nfelinities\nfelinity\nfelix\nfell\nfellable\nfellah\nfellaheen\nfellahin\nfellate\nfellated\nfellates\nfellating\nfellatio\nfellation\nfellations\nfellatios\nfellator\nfellators\nfelled\nfeller\nfellers\nfellies\nfelling\nfellness\nfelloe\nfelloes\nfellow\nfellowly\nfellowman\nfellowmen\nfellows\nfellowship\nfellowships\nfells\nfelly\nfelon\nfelones\nfelonies\nfelonious\nfeloniously\nfeloniousness\nfelonries\nfelonry\nfelons\nfelony\nfelsic\nfelsite\nfelsites\nfelsitic\nfelspar\nfelspars\nfelt\nfelted\nfelting\nfeltings\nfelts\nfelty\nfelucca\nfeluccas\nfelwort\nfelworts\nfemale\nfemaleness\nfemales\nfeme\nfemes\nfeminine\nfemininely\nfeminineness\nfeminines\nfemininities\nfemininity\nfeminism\nfeminist\nfeministic\nfeminists\nfeminity\nfeminization\nfeminizations\nfeminize\nfeminized\nfeminizes\nfeminizing\nfemme\nfemmes\nfemora\nfemoral\nfemtoampere\nfemtoamperes\nfemtobecquerel\nfemtobecquerels\nfemtocandela\nfemtocandelas\nfemtocoulomb\nfemtocoulombs\nfemtofarad\nfemtofarads\nfemtogram\nfemtograms\nfemtohenries\nfemtohenry\nfemtohenrys\nfemtohertz\nfemtojoule\nfemtojoules\nfemtokelvin\nfemtokelvins\nfemtolumen\nfemtolumens\nfemtolux\nfemtometer\nfemtometers\nfemtomole\nfemtomoles\nfemtonewton\nfemtonewtons\nfemtoohm\nfemtoohms\nfemtopascal\nfemtopascals\nfemtoradian\nfemtoradians\nfemtosecond\nfemtoseconds\nfemtosiemens\nfemtosievert\nfemtosieverts\nfemtosteradian\nfemtosteradians\nfemtotesla\nfemtoteslas\nfemtovolt\nfemtovolts\nfemtowatt\nfemtowatts\nfemtoweber\nfemtowebers\nfemur\nfemurs\nfen\nfence\nfenced\nfenceless\nfencelessness\nfencer\nfencerow\nfencerows\nfencers\nfences\nfencing\nfend\nfended\nfender\nfenders\nfending\nfends\nfenestra\nfenestrae\nfenestral\nfenestrate\nfenestrated\nfenestration\nfenestrations\nfenfluramine\nfeng\nfenian\nfenianism\nfenians\nfennec\nfennecs\nfennel\nfenny\nfens\nfentanyl\nfentanyls\nfenugreek\nfenuron\nfenurons\nfeoffee\nfeoffees\nfeoffer\nfeoffers\nfeoffment\nfeoffments\nfeoffor\nfeoffors\nfer\nferal\nferbam\nferbams\nferdinand\nfere\nferes\nferetories\nferetory\nferia\nferiae\nferial\nferias\nferine\nferity\nfermanagh\nfermat\nfermata\nfermatas\nferment\nfermentability\nfermentable\nfermentation\nfermentations\nfermentative\nfermented\nfermenter\nfermenters\nfermenting\nferments\nfermi\nfermion\nfermions\nfermis\nfermium\nfern\nferneries\nfernery\nfernier\nferniest\nfernlike\nferns\nferny\nferocious\nferociously\nferociousness\nferocity\nferrara\nferrate\nferrates\nferredoxin\nferredoxins\nferret\nferreted\nferreter\nferreters\nferreting\nferretings\nferrets\nferrety\nferriage\nferriages\nferric\nferricyanide\nferricyanides\nferried\nferries\nferriferous\nferris\nferrite\nferrites\nferritic\nferritin\nferritins\nferroalloy\nferroalloys\nferroconcrete\nferrocyanide\nferrocyanides\nferroelectric\nferroelectricity\nferroelectrics\nferromagnesian\nferromagnet\nferromagnetic\nferromagnetism\nferromagnets\nferromanganese\nferrosilicon\nferrosilicons\nferrotype\nferrotypes\nferrous\nferruginous\nferrule\nferruled\nferrules\nferruling\nferry\nferryboat\nferryboats\nferrying\nferryman\nferrymen\nfertile\nfertilely\nfertileness\nfertilities\nfertility\nfertilizable\nfertilization\nfertilizational\nfertilizations\nfertilize\nfertilized\nfertilizer\nfertilizers\nfertilizes\nfertilizing\nferula\nferulas\nferule\nferuled\nferules\nferulic\nferuling\nfervencies\nfervency\nfervent\nfervently\nferventness\nfervid\nfervidity\nfervidly\nfervidness\nfervor\nfervors\nfescennine\nfescue\nfescues\nfess\nfesse\nfessed\nfesses\nfessing\nfest\nfestal\nfestally\nfester\nfestered\nfestering\nfesters\nfestinate\nfestinated\nfestinately\nfestinates\nfestinating\nfestival\nfestivalgoer\nfestivalgoers\nfestivals\nfestive\nfestively\nfestiveness\nfestivities\nfestivity\nfestoon\nfestooned\nfestooneries\nfestoonery\nfestooning\nfestoons\nfests\nfestschrift\nfestschriften\nfestschrifts\nfeta\nfetal\nfetch\nfetched\nfetcher\nfetchers\nfetches\nfetching\nfetchingly\nfete\nfeted\nfeterita\nfeteritas\nfetes\nfetich\nfetiches\nfetichism\nfeticidal\nfeticide\nfeticides\nfetid\nfetidly\nfetidness\nfeting\nfetish\nfetishes\nfetishism\nfetishist\nfetishistic\nfetishistically\nfetishists\nfetishize\nfetishized\nfetishizes\nfetishizing\nfetlock\nfetlocks\nfetologist\nfetologists\nfetology\nfetoprotein\nfetoproteins\nfetor\nfetors\nfetoscope\nfetoscopes\nfetoscopy\nfetter\nfetterbush\nfetterbushes\nfettered\nfettering\nfetters\nfettle\nfettled\nfettles\nfettling\nfettlings\nfettuccine\nfetus\nfetuses\nfeu\nfeud\nfeudal\nfeudalism\nfeudalist\nfeudalistic\nfeudalists\nfeudalities\nfeudality\nfeudalization\nfeudalizations\nfeudalize\nfeudalized\nfeudalizes\nfeudalizing\nfeudally\nfeudatories\nfeudatory\nfeuded\nfeuding\nfeudist\nfeudists\nfeuds\nfeuilleton\nfeuilletonism\nfeuilletonist\nfeuilletonistic\nfeuilletonists\nfeuilletons\nfever\nfevered\nfeverfew\nfeverfews\nfevering\nfeverish\nfeverishly\nfeverishness\nfeverous\nfevers\nfeverweed\nfeverweeds\nfeverwort\nfeverworts\nfew\nfewer\nfewest\nfewness\nfewtrils\nfey\nfeyly\nfeyness\nfeynman\nfez\nfezzes\nfiacre\nfiacres\nfiancee\nfiancees\nfianchetti\nfianchetto\nfianchettoed\nfianchettoing\nfianchettos\nfiancé\nfiancée\nfiancées\nfiancés\nfiaschi\nfiasco\nfiascoes\nfiascos\nfiat\nfiats\nfib\nfibbed\nfibber\nfibbers\nfibbing\nfiber\nfiberboard\nfibered\nfiberfill\nfiberglass\nfiberization\nfiberizations\nfiberize\nfiberized\nfiberizes\nfiberizing\nfibers\nfiberscope\nfiberscopes\nfibonacci\nfibranne\nfibrannes\nfibril\nfibrillar\nfibrillary\nfibrillate\nfibrillated\nfibrillates\nfibrillating\nfibrillation\nfibrillations\nfibrillose\nfibrils\nfibrin\nfibrinogen\nfibrinogenic\nfibrinogenically\nfibrinogenous\nfibrinogens\nfibrinoid\nfibrinoids\nfibrinolyses\nfibrinolysin\nfibrinolysins\nfibrinolysis\nfibrinolytic\nfibrinous\nfibroblast\nfibroblastic\nfibroblasts\nfibrocartilage\nfibrocartilages\nfibrocystic\nfibroid\nfibroids\nfibroin\nfibroins\nfibroma\nfibromas\nfibromata\nfibromatous\nfibronectin\nfibroplasia\nfibroplastic\nfibroses\nfibrosis\nfibrositis\nfibrositises\nfibrotic\nfibrous\nfibrously\nfibrousness\nfibrovascular\nfibs\nfibula\nfibulae\nfibular\nfibulas\nfiche\nfiches\nfichtelgebirge\nfichu\nfichus\nficin\nfickle\nfickleness\nfickler\nficklest\nfickly\nfico\nficoes\nfictile\nfiction\nfictional\nfictionality\nfictionalization\nfictionalizations\nfictionalize\nfictionalized\nfictionalizes\nfictionalizing\nfictionally\nfictioneer\nfictioneering\nfictioneers\nfictionist\nfictionists\nfictionization\nfictionizations\nfictionize\nfictionized\nfictionizes\nfictionizing\nfictions\nfictitious\nfictitiously\nfictitiousness\nfictive\nfictively\nfictiveness\nficus\nficuses\nfid\nfiddle\nfiddleback\nfiddled\nfiddlehead\nfiddleheads\nfiddler\nfiddlers\nfiddles\nfiddlestick\nfiddlesticks\nfiddling\nfide\nfideism\nfideist\nfideistic\nfideists\nfidelis\nfidelities\nfidelity\nfides\nfidge\nfidged\nfidges\nfidget\nfidgeted\nfidgetiness\nfidgeting\nfidgets\nfidgety\nfidging\nfido\nfidos\nfids\nfiducial\nfiducially\nfiduciaries\nfiduciary\nfidus\nfie\nfief\nfiefdom\nfiefdoms\nfiefs\nfield\nfielded\nfielder\nfielders\nfieldfare\nfieldfares\nfielding\nfieldpiece\nfieldpieces\nfields\nfieldsman\nfieldsmen\nfieldstone\nfieldstrip\nfieldstripped\nfieldstripping\nfieldstrips\nfieldwork\nfieldworker\nfieldworkers\nfiend\nfiendish\nfiendishly\nfiendishness\nfiends\nfierce\nfiercely\nfierceness\nfiercer\nfiercest\nfierier\nfieriest\nfierily\nfieriness\nfiery\nfiesole\nfiesta\nfiestas\nfife\nfifer\nfifers\nfifes\nfifo\nfifteen\nfifteenfold\nfifteens\nfifteenth\nfifteenths\nfifth\nfifthly\nfifths\nfifties\nfiftieth\nfiftieths\nfifty\nfiftyfold\nfiftyish\nfig\nfigaro\nfight\nfightability\nfightable\nfighter\nfighters\nfighting\nfightingly\nfights\nfigment\nfigments\nfigs\nfigural\nfigurant\nfigurants\nfiguration\nfigurations\nfigurative\nfiguratively\nfigurativeness\nfigure\nfigured\nfigurehead\nfigureheads\nfigurer\nfigurers\nfigures\nfigurine\nfigurines\nfiguring\nfigwort\nfigworts\nfiji\nfijian\nfijians\nfila\nfilament\nfilamentary\nfilamentous\nfilaments\nfilar\nfilaree\nfilarees\nfilaria\nfilariae\nfilarial\nfilarian\nfilariases\nfilariasis\nfilariid\nfilariids\nfilature\nfilatures\nfilbert\nfilberts\nfilch\nfilched\nfilcher\nfilchers\nfilches\nfilching\nfilchner\nfile\nfiled\nfilefish\nfilefishes\nfilename\nfilenames\nfiler\nfilers\nfiles\nfilet\nfilets\nfilial\nfilially\nfiliate\nfiliated\nfiliates\nfiliating\nfiliation\nfiliations\nfilibuster\nfilibustered\nfilibusterer\nfilibusterers\nfilibustering\nfilibusters\nfiliform\nfiligree\nfiligreed\nfiligreeing\nfiligrees\nfiling\nfilings\nfiliopietistic\nfilipina\nfilipinas\nfilipino\nfilipinos\nfilippo\nfill\nfille\nfilled\nfiller\nfillers\nfillet\nfilleted\nfilleting\nfillets\nfillies\nfilling\nfillings\nfillip\nfilliped\nfilliping\nfillips\nfills\nfilly\nfillér\nfillérs\nfilm\nfilmcard\nfilmcards\nfilmdom\nfilmed\nfilmgoer\nfilmgoers\nfilmgoing\nfilmic\nfilmically\nfilmier\nfilmiest\nfilmily\nfilminess\nfilming\nfilmland\nfilmmaker\nfilmmakers\nfilmmaking\nfilmographer\nfilmographers\nfilmographies\nfilmography\nfilms\nfilmset\nfilmsets\nfilmsetter\nfilmsetters\nfilmsetting\nfilmsettings\nfilmstrip\nfilmstrips\nfilmy\nfiloplume\nfiloplumes\nfilose\nfilovirus\nfiloviruses\nfils\nfilter\nfilterability\nfilterable\nfiltered\nfilterer\nfilterers\nfiltering\nfilterless\nfilters\nfilth\nfilthier\nfilthiest\nfilthily\nfilthiness\nfilthy\nfiltrable\nfiltrate\nfiltrated\nfiltrates\nfiltrating\nfiltration\nfiltrations\nfilum\nfilé\nfimbria\nfimbriae\nfimbrial\nfimbriate\nfimbriated\nfimbriation\nfimbriations\nfin\nfinable\nfinagle\nfinagled\nfinagler\nfinaglers\nfinagles\nfinagling\nfinal\nfinale\nfinales\nfinalist\nfinalists\nfinalities\nfinality\nfinalization\nfinalizations\nfinalize\nfinalized\nfinalizer\nfinalizers\nfinalizes\nfinalizing\nfinally\nfinals\nfinance\nfinanceable\nfinanced\nfinances\nfinancial\nfinancially\nfinancials\nfinancier\nfinanciers\nfinancing\nfinback\nfinbacks\nfinca\nfincas\nfinch\nfinches\nfind\nfindable\nfinder\nfinders\nfinding\nfindings\nfinds\nfine\nfineable\nfined\nfinely\nfineness\nfiner\nfineries\nfinery\nfines\nfinespun\nfinesse\nfinessed\nfinesses\nfinessing\nfinest\nfinfish\nfinfishes\nfingal\nfinger\nfingerboard\nfingerboards\nfingerbreadth\nfingerbreadths\nfingered\nfingerer\nfingerers\nfingering\nfingerings\nfingerless\nfingerlike\nfingerling\nfingerlings\nfingernail\nfingernails\nfingerpick\nfingerpicked\nfingerpicker\nfingerpickers\nfingerpicking\nfingerpicks\nfingerpost\nfingerposts\nfingerprint\nfingerprinted\nfingerprinting\nfingerprints\nfingers\nfingerspell\nfingerspelled\nfingerspelling\nfingerspells\nfingertip\nfingertips\nfinial\nfinials\nfinical\nfinically\nfinicalness\nfinickier\nfinickiest\nfinickiness\nfinicking\nfinicky\nfining\nfinis\nfinish\nfinished\nfinisher\nfinishers\nfinishes\nfinishing\nfinisterre\nfinite\nfinitely\nfiniteness\nfinites\nfinitude\nfinitudes\nfink\nfinked\nfinking\nfinks\nfinland\nfinlander\nfinlanders\nfinlandization\nfinlandize\nfinlandized\nfinlandizes\nfinlandizing\nfinlike\nfinn\nfinnan\nfinnbogadóttir\nfinned\nfinnic\nfinnier\nfinniest\nfinning\nfinnish\nfinns\nfinny\nfinocchio\nfinochio\nfinochios\nfins\nfinsteraarhorn\nfiord\nfiords\nfipple\nfipples\nfir\nfirdausi\nfirdusi\nfire\nfireable\nfirearm\nfirearms\nfireball\nfireballs\nfirebase\nfirebases\nfirebird\nfirebirds\nfireboard\nfireboards\nfireboat\nfireboats\nfirebomb\nfirebombed\nfirebomber\nfirebombers\nfirebombing\nfirebombs\nfirebox\nfireboxes\nfirebrand\nfirebrands\nfirebrat\nfirebrats\nfirebreak\nfirebreaks\nfirebrick\nfirebricks\nfirebug\nfirebugs\nfireclay\nfireclays\nfirecracker\nfirecrackers\nfired\nfiredamp\nfiredog\nfiredogs\nfiredrake\nfiredrakes\nfirefighter\nfirefighters\nfirefighting\nfirefights\nfireflies\nfireflood\nfireflooding\nfirefloodings\nfirefloods\nfirefly\nfireguard\nfireguards\nfirehouse\nfirehouses\nfireless\nfirelight\nfirelock\nfirelocks\nfireman\nfiremen\nfirenze\nfireplace\nfireplaces\nfireplug\nfireplugs\nfirepower\nfireproof\nfireproofed\nfireproofing\nfireproofs\nfirer\nfirers\nfires\nfireside\nfiresides\nfirestone\nfirestones\nfirestorm\nfirestorms\nfiretrap\nfiretraps\nfirewall\nfirewalled\nfirewalling\nfirewalls\nfirewater\nfireweed\nfireweeds\nfirewood\nfirework\nfireworks\nfiring\nfirings\nfirkin\nfirkins\nfirm\nfirma\nfirmament\nfirmamental\nfirmaments\nfirmed\nfirmer\nfirmest\nfirming\nfirmly\nfirmness\nfirms\nfirmware\nfirn\nfirns\nfirozabad\nfirry\nfirs\nfirst\nfirstborn\nfirstborns\nfirstfruits\nfirsthand\nfirstling\nfirstlings\nfirstly\nfirsts\nfirth\nfirths\nfisc\nfiscal\nfiscally\nfiscs\nfish\nfishability\nfishable\nfishbone\nfishbones\nfishbowl\nfishbowls\nfishcake\nfishcakes\nfished\nfisher\nfisheries\nfisherman\nfishermen\nfishers\nfishery\nfishes\nfisheye\nfisheyes\nfishgig\nfishgigs\nfishhook\nfishhooks\nfishier\nfishiest\nfishily\nfishiness\nfishing\nfishings\nfishless\nfishlike\nfishmeal\nfishmonger\nfishmongers\nfishnet\nfishnets\nfishplate\nfishplates\nfishpond\nfishponds\nfishtail\nfishtailed\nfishtailing\nfishtails\nfishway\nfishways\nfishwife\nfishwives\nfishy\nfissile\nfissility\nfission\nfissionability\nfissionable\nfissional\nfissioned\nfissioning\nfissions\nfissipalmate\nfissiparous\nfissiparously\nfissiparousness\nfissiped\nfissipeds\nfissure\nfissured\nfissures\nfissuring\nfist\nfisted\nfistfight\nfistfights\nfistful\nfistfuls\nfistic\nfisticuffer\nfisticuffers\nfisticuffs\nfisting\nfistnote\nfistnotes\nfists\nfistula\nfistulae\nfistular\nfistulas\nfistulous\nfit\nfitch\nfitches\nfitchet\nfitchets\nfitchew\nfitchews\nfitful\nfitfully\nfitfulness\nfitly\nfitment\nfitments\nfitness\nfits\nfitted\nfitter\nfitters\nfittest\nfitting\nfittingly\nfittingness\nfittings\nfitzgerald\nfive\nfivefold\nfiver\nfivers\nfives\nfix\nfixable\nfixate\nfixated\nfixates\nfixating\nfixation\nfixations\nfixative\nfixatives\nfixe\nfixed\nfixedly\nfixedness\nfixer\nfixers\nfixes\nfixing\nfixings\nfixities\nfixity\nfixture\nfixtures\nfizz\nfizzed\nfizzes\nfizzier\nfizziest\nfizzing\nfizzle\nfizzled\nfizzles\nfizzling\nfizzy\nfjeld\nfjelds\nfjord\nfjords\nflab\nflabbergast\nflabbergasted\nflabbergasting\nflabbergastingly\nflabbergasts\nflabbier\nflabbiest\nflabbily\nflabbiness\nflabby\nflabella\nflabellate\nflabelliform\nflabellum\nflaccid\nflaccidity\nflaccidly\nflaccidness\nflack\nflacked\nflackery\nflacking\nflacks\nflacon\nflacons\nflag\nflagella\nflagellant\nflagellantism\nflagellants\nflagellar\nflagellate\nflagellated\nflagellates\nflagellating\nflagellation\nflagellations\nflagellator\nflagellators\nflagelliform\nflagellin\nflagellins\nflagellum\nflagellums\nflageolet\nflageolets\nflagged\nflagger\nflaggers\nflagging\nflaggingly\nflagitious\nflagitiously\nflagitiousness\nflagman\nflagmen\nflagon\nflagons\nflagpole\nflagpoles\nflagrance\nflagrancy\nflagrant\nflagrante\nflagrantly\nflags\nflagship\nflagships\nflagstaff\nflagstaffs\nflagstick\nflagsticks\nflagstone\nflagstones\nflail\nflailed\nflailing\nflails\nflair\nflairs\nflak\nflake\nflaked\nflaker\nflakers\nflakes\nflakey\nflakier\nflakiest\nflakily\nflakiness\nflaking\nflaky\nflam\nflambeau\nflambeaus\nflambeaux\nflamboyance\nflamboyancy\nflamboyant\nflamboyantly\nflamboyants\nflambé\nflambéed\nflambéing\nflambés\nflame\nflamed\nflamen\nflamenco\nflamencos\nflamens\nflameout\nflameouts\nflameproof\nflameproofed\nflameproofer\nflameproofers\nflameproofing\nflameproofs\nflamer\nflamers\nflames\nflamethrower\nflamethrowers\nflamier\nflamiest\nflamines\nflaming\nflamingly\nflamingo\nflamingoes\nflamingos\nflaminian\nflammability\nflammable\nflammables\nflams\nflamy\nflan\nflanders\nflange\nflanged\nflanges\nflanging\nflank\nflanked\nflanken\nflankens\nflanker\nflankerback\nflankerbacks\nflankers\nflanking\nflanks\nflannel\nflannelette\nflannelettes\nflannelly\nflannels\nflans\nflap\nflapdoodle\nflapdoodles\nflapjack\nflapjacks\nflappable\nflapped\nflapper\nflappers\nflapping\nflappy\nflaps\nflare\nflareback\nflarebacks\nflared\nflares\nflaring\nflaringly\nflash\nflashback\nflashbacks\nflashboard\nflashboards\nflashbulb\nflashbulbs\nflashcube\nflashcubes\nflashed\nflasher\nflashers\nflashes\nflashflood\nflashfloods\nflashgun\nflashguns\nflashier\nflashiest\nflashily\nflashiness\nflashing\nflashings\nflashlamp\nflashlamps\nflashlight\nflashlights\nflashover\nflashovers\nflashpoint\nflashpoints\nflashtube\nflashtubes\nflashy\nflask\nflasks\nflat\nflatbed\nflatbeds\nflatboat\nflatboats\nflatbottom\nflatbottomed\nflatbread\nflatbreads\nflatcar\nflatcars\nflatfeet\nflatfish\nflatfishes\nflatfoot\nflatfooted\nflatfooting\nflatfoots\nflathead\nflatheads\nflatiron\nflatirons\nflatland\nflatlander\nflatlanders\nflatlands\nflatlet\nflatlets\nflatling\nflatlings\nflatly\nflatness\nflats\nflatted\nflatten\nflattened\nflattener\nflatteners\nflattening\nflattens\nflatter\nflattered\nflatterer\nflatterers\nflatteries\nflattering\nflatteringly\nflatters\nflattery\nflattest\nflatting\nflattish\nflattop\nflattops\nflatulence\nflatulencies\nflatulency\nflatulent\nflatulently\nflatus\nflatware\nflatways\nflatwise\nflatwork\nflatworks\nflatworm\nflatworms\nflaubert\nflaunt\nflaunted\nflaunter\nflaunters\nflauntier\nflauntiest\nflauntily\nflauntiness\nflaunting\nflauntingly\nflaunts\nflaunty\nflauta\nflautas\nflautist\nflautists\nflavanone\nflavanones\nflavescent\nflavian\nflavin\nflavine\nflavines\nflavins\nflavius\nflavone\nflavones\nflavonoid\nflavonoids\nflavonol\nflavonols\nflavoprotein\nflavoproteins\nflavor\nflavored\nflavorer\nflavorers\nflavorful\nflavorfully\nflavoring\nflavorings\nflavorist\nflavorists\nflavorless\nflavorous\nflavors\nflavorsome\nflavory\nflaw\nflawed\nflawing\nflawless\nflawlessly\nflawlessness\nflaws\nflawy\nflax\nflaxen\nflaxes\nflaxier\nflaxiest\nflaxseed\nflaxseeds\nflaxy\nflay\nflayed\nflayer\nflayers\nflaying\nflays\nflea\nfleabag\nfleabags\nfleabane\nfleabanes\nfleabite\nfleabites\nfleapit\nfleapits\nfleas\nfleawort\nfleaworts\nfleck\nflecked\nflecking\nflecks\nflection\nflectional\nflections\nfled\nfledermaus\nfledge\nfledged\nfledgeling\nfledgelings\nfledges\nfledging\nfledgling\nfledglings\nflee\nfleece\nfleeced\nfleecer\nfleecers\nfleeces\nfleech\nfleeched\nfleeches\nfleeching\nfleecier\nfleeciest\nfleecily\nfleeciness\nfleecing\nfleecy\nfleeing\nfleer\nfleered\nfleering\nfleeringly\nfleers\nflees\nfleet\nfleeted\nfleeter\nfleetest\nfleeting\nfleetingly\nfleetingness\nfleetly\nfleetness\nfleets\nfleishig\nfleming\nflemings\nflemish\nflense\nflensed\nflenser\nflensers\nflenses\nflensing\nflesh\nfleshed\nfleshes\nfleshier\nfleshiest\nfleshiness\nfleshing\nfleshless\nfleshlier\nfleshliest\nfleshliness\nfleshly\nfleshment\nfleshpot\nfleshpots\nfleshy\nfletch\nfletched\nfletcher\nfletchers\nfletches\nfletching\nfletschhorn\nfleur\nfleurs\nfleury\nflew\nflews\nflex\nflexagon\nflexagons\nflexed\nflexes\nflexibilities\nflexibility\nflexible\nflexibleness\nflexibly\nflexile\nflexing\nflexion\nflexions\nflexitime\nflexitimes\nflexographer\nflexographers\nflexographic\nflexographically\nflexography\nflexor\nflexors\nflextime\nflexuosity\nflexuous\nflexuously\nflexural\nflexure\nflexures\nfley\nfleyed\nfleying\nfleys\nflibbertigibbet\nflibbertigibbets\nflibbertigibbety\nflic\nflick\nflickable\nflicked\nflicker\nflickered\nflickering\nflickeringly\nflickerings\nflickers\nflickertail\nflickertails\nflickery\nflicking\nflicks\nflics\nflied\nflier\nfliers\nflies\nflight\nflighted\nflightier\nflightiest\nflightily\nflightiness\nflighting\nflightless\nflights\nflightworthiness\nflightworthy\nflighty\nflimflam\nflimflammed\nflimflammer\nflimflammers\nflimflammery\nflimflamming\nflimflams\nflimsier\nflimsies\nflimsiest\nflimsily\nflimsiness\nflimsy\nflinch\nflinched\nflincher\nflinchers\nflinches\nflinching\nflinchingly\nflinders\nfling\nflinger\nflingers\nflinging\nflings\nflint\nflinthead\nflintheads\nflintier\nflintiest\nflintily\nflintiness\nflintlike\nflintlock\nflintlocks\nflints\nflinty\nflip\nflipbook\nflipbooks\nflippancies\nflippancy\nflippant\nflippantly\nflipped\nflipper\nflippers\nflippest\nflipping\nflips\nflirt\nflirtation\nflirtations\nflirtatious\nflirtatiously\nflirtatiousness\nflirted\nflirter\nflirters\nflirting\nflirts\nflirty\nflit\nflitch\nflitches\nflits\nflitted\nflitter\nflittered\nflittering\nflitters\nflitting\nflivver\nflivvers\nfloat\nfloatable\nfloatage\nfloatages\nfloatation\nfloated\nfloater\nfloaters\nfloating\nfloatplane\nfloatplanes\nfloats\nfloaty\nfloc\nfloccose\nflocculate\nflocculated\nflocculates\nflocculating\nflocculation\nflocculations\nfloccule\nflocculence\nflocculences\nflocculent\nflocculently\nfloccules\nflocculi\nflocculus\nflock\nflocked\nflocking\nflocks\nflocs\nfloe\nfloes\nflog\nflogged\nflogger\nfloggers\nflogging\nfloggings\nflogs\nflood\nflooded\nflooder\nflooders\nfloodgate\nfloodgates\nflooding\nfloodlight\nfloodlighted\nfloodlighting\nfloodlights\nfloodlit\nfloodplain\nfloodplains\nfloods\nfloodtide\nfloodtides\nfloodwall\nfloodwalls\nfloodwater\nfloodwaters\nfloodway\nfloodways\nflooey\nfloor\nfloorage\nfloorages\nfloorboard\nfloorboards\nfloored\nfloorer\nfloorers\nflooring\nfloorings\nfloors\nfloorshow\nfloorshows\nfloorwalker\nfloorwalkers\nfloozie\nfloozies\nfloozy\nflop\nflophouse\nflophouses\nflopped\nflopper\nfloppers\nfloppier\nfloppies\nfloppiest\nfloppily\nfloppiness\nflopping\nfloppy\nflops\nflora\nflorae\nfloral\nflorally\nfloras\nfloreated\nflorence\nflorentine\nflorentines\nflores\nflorescence\nflorescent\nfloret\nflorets\nfloriated\nfloriation\nfloriations\nfloribunda\nfloribundas\nfloricane\nfloricanes\nfloricultural\nfloriculturally\nfloriculture\nfloriculturist\nfloriculturists\nflorid\nflorida\nfloridan\nfloridans\nfloridean\nfloridian\nfloridians\nfloridity\nfloridly\nfloridness\nfloriferous\nfloriferously\nfloriferousness\nflorigen\nflorigenic\nflorigens\nflorilegia\nflorilegium\nflorin\nflorins\nflorist\nfloristic\nfloristically\nfloristics\nfloristry\nflorists\nfloruit\nfloruits\nfloss\nflossed\nflosser\nflossers\nflosses\nflossier\nflossiest\nflossily\nflossiness\nflossing\nflossy\nflota\nflotage\nflotages\nflotas\nflotation\nflotilla\nflotillas\nflotsam\nflotta\nflounce\nflounced\nflounces\nflouncing\nflouncings\nflouncy\nflounder\nfloundered\nfloundering\nflounders\nflour\nfloured\nflouring\nflourish\nflourished\nflourisher\nflourishers\nflourishes\nflourishing\nflourishingly\nflours\nfloury\nflout\nflouted\nflouter\nflouters\nflouting\nfloutingly\nflouts\nflow\nflowage\nflowages\nflowchart\nflowcharted\nflowcharting\nflowcharts\nflowed\nflower\nflowerage\nflowerages\nflowerbed\nflowerbeds\nflowered\nflowerer\nflowerers\nfloweret\nflowerets\nflowerful\nflowerier\nfloweriest\nfloweriness\nflowering\nflowerless\nflowerlike\nflowerpot\nflowerpots\nflowers\nflowery\nflowing\nflowingly\nflowmeter\nflowmeters\nflown\nflows\nflowstone\nflowstones\nflu\nflub\nflubbed\nflubber\nflubbers\nflubbing\nflubdub\nflubdubs\nflubs\nfluctuant\nfluctuate\nfluctuated\nfluctuates\nfluctuating\nfluctuation\nfluctuational\nfluctuations\nflue\nfluegelhorn\nfluegelhorns\nfluency\nfluent\nfluently\nflueric\nfluerics\nflues\nfluff\nfluffed\nfluffier\nfluffiest\nfluffily\nfluffiness\nfluffing\nfluffs\nfluffy\nfluid\nfluidal\nfluidally\nfluidextract\nfluidextracts\nfluidic\nfluidics\nfluidified\nfluidifies\nfluidify\nfluidifying\nfluidities\nfluidity\nfluidization\nfluidizations\nfluidize\nfluidized\nfluidizer\nfluidizers\nfluidizes\nfluidizing\nfluidly\nfluidness\nfluidram\nfluidrams\nfluids\nfluke\nflukes\nflukey\nflukier\nflukiest\nflukily\nflukiness\nfluky\nflulike\nflume\nflumes\nflummeries\nflummery\nflummox\nflummoxed\nflummoxes\nflummoxing\nflump\nflumped\nflumping\nflumps\nflung\nflunk\nflunked\nflunker\nflunkers\nflunkey\nflunkeys\nflunkies\nflunking\nflunkout\nflunkouts\nflunks\nflunky\nflunkyism\nfluor\nfluoresce\nfluoresced\nfluorescein\nfluoresceins\nfluorescence\nfluorescent\nfluorescents\nfluorescer\nfluorescers\nfluoresces\nfluorescing\nfluoridate\nfluoridated\nfluoridates\nfluoridating\nfluoridation\nfluoridations\nfluoride\nfluorides\nfluorimeter\nfluorimeters\nfluorimetric\nfluorimetry\nfluorinate\nfluorinated\nfluorinates\nfluorinating\nfluorination\nfluorinations\nfluorine\nfluorite\nfluorites\nfluorocarbon\nfluorocarbons\nfluorochemical\nfluorochemicals\nfluorochrome\nfluorochromes\nfluorography\nfluorometer\nfluorometers\nfluorometry\nfluoroscope\nfluoroscoped\nfluoroscopes\nfluoroscopic\nfluoroscopically\nfluoroscopies\nfluoroscoping\nfluoroscopist\nfluoroscopists\nfluoroscopy\nfluorosis\nfluorotic\nfluorouracil\nfluorouracils\nfluors\nfluorspar\nfluorspars\nfluphenazine\nfluphenazines\nflurazepam\nflurazepams\nflurried\nflurries\nflurry\nflurrying\nflush\nflushable\nflushed\nflusher\nflushers\nflushes\nflushest\nflushing\nflushless\nflushness\nflushometer\nflushometers\nfluster\nflustered\nflustering\nflusters\nflute\nfluted\nflutelike\nfluter\nfluters\nflutes\nflutey\nfluting\nflutings\nflutist\nflutists\nflutter\nflutterboard\nflutterboards\nfluttered\nflutterer\nflutterers\nfluttering\nflutters\nfluttery\nfluty\nfluvial\nfluviatile\nfluviomarine\nflux\nfluxed\nfluxes\nfluxing\nfluxion\nfluxional\nfluxionally\nfluxionary\nfluxions\nfly\nflyable\nflyaway\nflyaways\nflyblew\nflyblow\nflyblowing\nflyblown\nflyblows\nflyboat\nflyboats\nflyboy\nflyboys\nflyby\nflybys\nflycatcher\nflycatchers\nflyer\nflyers\nflying\nflyings\nflyleaf\nflyleaves\nflyman\nflymen\nflyover\nflyovers\nflypaper\nflypapers\nflypast\nflypasts\nflysch\nflysches\nflysheet\nflysheets\nflyspeck\nflyspecked\nflyspecking\nflyspecks\nflyswatter\nflyswatters\nflytrap\nflytraps\nflyway\nflyways\nflyweight\nflyweights\nflywheel\nflywheels\nflywhisk\nflywhisks\nflânerie\nflâneur\nflâneurs\nfléchette\nflèche\nflèches\nflügelhorn\nflügelhornist\nflügelhornists\nflügelhorns\nfo\nfo'c\nfo'c'sle\nfo'c'sles\nfoal\nfoaled\nfoaling\nfoals\nfoam\nfoamed\nfoamer\nfoamers\nfoamflower\nfoamflowers\nfoamier\nfoamiest\nfoamily\nfoaminess\nfoaming\nfoamless\nfoams\nfoamy\nfob\nfobbed\nfobbing\nfobs\nfocal\nfocalization\nfocalizations\nfocalize\nfocalized\nfocalizes\nfocalizing\nfocally\nfochabers\nfoci\nfocus\nfocusable\nfocused\nfocuser\nfocusers\nfocuses\nfocusing\nfocusless\nfocussed\nfocusses\nfocussing\nfodder\nfoddered\nfoddering\nfodders\nfodgel\nfoe\nfoehn\nfoehns\nfoeman\nfoemen\nfoes\nfoetal\nfoetid\nfoetidus\nfoetor\nfoetors\nfoetus\nfog\nfogbound\nfogbow\nfogbows\nfogdog\nfogdogs\nfogey\nfogeys\nfoggage\nfoggages\nfogged\nfogger\nfoggers\nfoggier\nfoggiest\nfoggily\nfogginess\nfogging\nfoggy\nfoghorn\nfoghorns\nfogies\nfogless\nfogs\nfogy\nfogyish\nfogyism\nfogyisms\nfoible\nfoibles\nfoil\nfoiled\nfoiling\nfoils\nfoilsman\nfoilsmen\nfoin\nfoined\nfoining\nfoins\nfoison\nfoisons\nfoist\nfoisted\nfoisting\nfoists\nfokker\nfolacin\nfolacins\nfolate\nfolates\nfold\nfoldable\nfoldaway\nfoldaways\nfoldboat\nfoldboats\nfolded\nfolder\nfolderol\nfolderols\nfolders\nfolding\nfoldout\nfoldouts\nfolds\nfoldup\nfoldups\nfolia\nfoliaceous\nfoliage\nfoliaged\nfoliages\nfoliar\nfoliate\nfoliated\nfoliates\nfoliating\nfoliation\nfoliations\nfolic\nfolie\nfoliicolous\nfolio\nfolioed\nfolioing\nfolios\nfoliose\nfolium\nfolk\nfolkie\nfolkier\nfolkies\nfolkiest\nfolkish\nfolkishly\nfolkishness\nfolklike\nfolklore\nfolkloric\nfolklorish\nfolklorist\nfolkloristic\nfolkloristics\nfolklorists\nfolkmoot\nfolkmoots\nfolkmote\nfolkmotes\nfolks\nfolksier\nfolksiest\nfolksily\nfolksiness\nfolksinger\nfolksingers\nfolksinging\nfolksong\nfolksongs\nfolksy\nfolktale\nfolktales\nfolkway\nfolkways\nfolky\nfollicle\nfollicles\nfollicular\nfolliculate\nfolliculated\nfolliculitis\nfollies\nfollow\nfollowed\nfollower\nfollowers\nfollowership\nfollowerships\nfollowing\nfollowings\nfollows\nfollowup\nfollowups\nfolly\nfolsom\nfomalhaut\nfoment\nfomentation\nfomentations\nfomented\nfomenter\nfomenters\nfomenting\nfoments\nfomite\nfomites\nfon\nfond\nfondant\nfondants\nfonder\nfondest\nfondle\nfondled\nfondler\nfondlers\nfondles\nfondling\nfondly\nfondness\nfondnesses\nfonds\nfondu\nfondue\nfondued\nfondues\nfonduing\nfondus\nfongafale\nfons\nfonseca\nfont\nfontainebleau\nfontal\nfontanel\nfontanelle\nfontanelles\nfontanels\nfontenoy\nfonteyn\nfontina\nfontinas\nfonts\nfood\nfoodie\nfoodies\nfoodless\nfoodlessness\nfoods\nfoodservices\nfoodstuff\nfoodstuffs\nfoodways\nfoofaraw\nfoofaraws\nfool\nfooled\nfooleries\nfoolery\nfoolhardier\nfoolhardiest\nfoolhardily\nfoolhardiness\nfoolhardy\nfooling\nfoolings\nfoolish\nfoolishly\nfoolishness\nfoolproof\nfools\nfoolscap\nfoolscaps\nfoon\nfoons\nfoot\nfootage\nfootages\nfootball\nfootballer\nfootballers\nfootballs\nfootbath\nfootbaths\nfootboard\nfootboards\nfootboy\nfootboys\nfootbridge\nfootbridges\nfootcloth\nfootcloths\nfooted\nfootedly\nfooter\nfooters\nfootfall\nfootfalls\nfootgear\nfoothill\nfoothills\nfoothold\nfootholds\nfooting\nfootings\nfootle\nfootled\nfootler\nfootlers\nfootles\nfootless\nfootlessly\nfootlessness\nfootlight\nfootlights\nfootling\nfootlocker\nfootlockers\nfootlong\nfootloose\nfootman\nfootmark\nfootmarks\nfootmen\nfootnote\nfootnoted\nfootnotes\nfootnoting\nfootpace\nfootpaces\nfootpad\nfootpads\nfootpath\nfootpaths\nfootprint\nfootprinting\nfootprints\nfootrace\nfootraces\nfootracing\nfootrest\nfootrests\nfootrope\nfootropes\nfoots\nfootsie\nfootslog\nfootslogged\nfootslogger\nfootsloggers\nfootslogging\nfootslogs\nfootsore\nfootsoreness\nfootstalk\nfootstalks\nfootstall\nfootstalls\nfootstep\nfootsteps\nfootstone\nfootstones\nfootstool\nfootstools\nfootsy\nfootwall\nfootwalls\nfootway\nfootways\nfootwear\nfootwork\nfoozle\nfoozled\nfoozler\nfoozlers\nfoozles\nfoozling\nfop\nfopped\nfopperies\nfoppery\nfopping\nfoppish\nfoppishly\nfoppishness\nfops\nfor\nfora\nforage\nforaged\nforager\nforagers\nforages\nforaging\nforaker\nforam\nforamen\nforamens\nforamina\nforaminal\nforaminifer\nforaminifera\nforaminiferal\nforaminiferan\nforaminiferous\nforaminifers\nforaminous\nforams\nforasmuch\nforay\nforayed\nforayer\nforayers\nforaying\nforays\nforb\nforbad\nforbade\nforbear\nforbearance\nforbearer\nforbearers\nforbearing\nforbears\nforbid\nforbiddance\nforbidden\nforbidder\nforbidders\nforbidding\nforbiddingly\nforbiddingness\nforbids\nforbore\nforborne\nforbs\nforby\nforbye\nforce\nforceable\nforced\nforcedly\nforceful\nforcefully\nforcefulness\nforceless\nforcemeat\nforceps\nforcepslike\nforcer\nforcers\nforces\nforcible\nforcibleness\nforcibly\nforcing\nforcipate\nforcipes\nford\nfordable\nforded\nfordid\nfording\nfordo\nfordoes\nfordoing\nfordone\nfords\nfore\nforearm\nforearmed\nforearming\nforearms\nforebay\nforebays\nforebear\nforebears\nforebode\nforeboded\nforeboder\nforeboders\nforebodes\nforeboding\nforebodingly\nforebodingness\nforebodings\nforebrain\nforebrains\nforecaddie\nforecaddies\nforecast\nforecastable\nforecasted\nforecaster\nforecasters\nforecasting\nforecastle\nforecastles\nforecasts\nforeclosable\nforeclose\nforeclosed\nforecloses\nforeclosing\nforeclosure\nforeclosures\nforecourt\nforecourts\nforedeck\nforedecks\nforedid\nforedo\nforedoes\nforedoing\nforedone\nforedoom\nforedoomed\nforedooming\nforedooms\nforeface\nforefaces\nforefather\nforefathers\nforefeel\nforefeeling\nforefeels\nforefeet\nforefelt\nforefend\nforefended\nforefending\nforefends\nforefinger\nforefingers\nforefoot\nforefront\nforegather\nforegathered\nforegathering\nforegathers\nforego\nforegoer\nforegoers\nforegoes\nforegoing\nforegone\nforeground\nforegrounds\nforegut\nforeguts\nforehand\nforehanded\nforehandedly\nforehandedness\nforehands\nforehead\nforeheads\nforehoof\nforeign\nforeigner\nforeigners\nforeignism\nforeignisms\nforeignness\nforejudge\nforejudged\nforejudges\nforejudging\nforejudgment\nforejudgments\nforeknew\nforeknow\nforeknowing\nforeknowledge\nforeknown\nforeknows\nforeladies\nforelady\nforeland\nforelands\nforeleg\nforelegs\nforelimb\nforelimbs\nforelock\nforelocks\nforeman\nforemanship\nforemast\nforemasts\nforemen\nforemilk\nforemost\nforemother\nforemothers\nforename\nforenamed\nforenames\nforenoon\nforenoons\nforensic\nforensically\nforensics\nforeordain\nforeordained\nforeordaining\nforeordainment\nforeordainments\nforeordains\nforeordination\nforeordinations\nforepart\nforeparts\nforepassed\nforepast\nforepaw\nforepaws\nforepeak\nforepeaks\nforeperson\nforepersons\nforeplay\nforequarter\nforequarters\nforeran\nforereach\nforereached\nforereaches\nforereaching\nforerun\nforerunner\nforerunners\nforerunning\nforeruns\nforesaid\nforesail\nforesails\nforesaw\nforesee\nforeseeability\nforeseeable\nforeseeing\nforeseen\nforeseer\nforeseers\nforesees\nforeshadow\nforeshadowed\nforeshadower\nforeshadowers\nforeshadowing\nforeshadows\nforeshank\nforesheet\nforesheets\nforeshock\nforeshocks\nforeshore\nforeshores\nforeshorten\nforeshortened\nforeshortening\nforeshortens\nforeshow\nforeshowed\nforeshowing\nforeshown\nforeshows\nforeside\nforesides\nforesight\nforesighted\nforesightedly\nforesightedness\nforesightful\nforeskin\nforeskins\nforespeak\nforespeaking\nforespeaks\nforespoke\nforespoken\nforest\nforestage\nforestages\nforestal\nforestall\nforestalled\nforestaller\nforestallers\nforestalling\nforestallment\nforestalls\nforestation\nforestations\nforestay\nforestays\nforestaysail\nforestaysails\nforested\nforester\nforesters\nforestial\nforesting\nforestland\nforestlands\nforestry\nforests\nforetaste\nforetasted\nforetastes\nforetasting\nforetell\nforeteller\nforetellers\nforetelling\nforetells\nforethought\nforethoughtful\nforethoughtfully\nforethoughtfulness\nforethoughts\nforetime\nforetimes\nforetoken\nforetokened\nforetokening\nforetokens\nforetold\nforetop\nforetopgallant\nforetopmast\nforetopmasts\nforetops\nforetopsail\nforetopsails\nforever\nforevermore\nforeverness\nforewarn\nforewarned\nforewarning\nforewarnings\nforewarns\nforewent\nforewing\nforewings\nforewoman\nforewomen\nforeword\nforewords\nforeworn\nforeyard\nforeyards\nforfeit\nforfeitable\nforfeited\nforfeiter\nforfeiters\nforfeiting\nforfeits\nforfeiture\nforfeitures\nforfend\nforfended\nforfending\nforfends\nforficate\nforgather\nforgathered\nforgathering\nforgathers\nforgave\nforge\nforgeability\nforgeable\nforged\nforger\nforgeries\nforgers\nforgery\nforges\nforget\nforgetful\nforgetfully\nforgetfulness\nforgetive\nforgets\nforgettable\nforgetter\nforgetters\nforgetting\nforging\nforgings\nforgivable\nforgivably\nforgive\nforgiven\nforgiveness\nforgiver\nforgivers\nforgives\nforgiving\nforgivingly\nforgivingness\nforgo\nforgoer\nforgoers\nforgoes\nforgoing\nforgone\nforgot\nforgotten\nforint\nforints\nfork\nforkball\nforkballer\nforkballers\nforkballs\nforked\nforker\nforkers\nforkful\nforkfuls\nforkier\nforkiest\nforking\nforklift\nforklifted\nforklifting\nforklifts\nforks\nforky\nforlorn\nforlornly\nforlornness\nform\nforma\nformability\nformable\nformal\nformaldehyde\nformalin\nformalins\nformalism\nformalisms\nformalist\nformalistic\nformalistically\nformalists\nformalities\nformality\nformalizable\nformalization\nformalizations\nformalize\nformalized\nformalizer\nformalizers\nformalizes\nformalizing\nformally\nformalness\nformals\nformalwear\nformant\nformants\nformat\nformate\nformates\nformation\nformational\nformations\nformative\nformatively\nformativeness\nformatives\nformats\nformatted\nformatter\nformatters\nformatting\nforme\nformed\nformee\nformer\nformerly\nformers\nformes\nformfeed\nformfeeds\nformfitting\nformful\nformic\nformica\nformicaries\nformicary\nformicivorous\nformidability\nformidable\nformidableness\nformidably\nforming\nformless\nformlessly\nformlessness\nformosa\nforms\nformula\nformulae\nformulaic\nformulaically\nformularies\nformularization\nformularizations\nformularize\nformularized\nformularizer\nformularizers\nformularizes\nformularizing\nformulary\nformulas\nformulate\nformulated\nformulates\nformulating\nformulation\nformulations\nformulator\nformulators\nformulization\nformulizations\nformulize\nformulized\nformulizer\nformulizers\nformulizes\nformulizing\nformwork\nformworks\nformyl\nformyls\nfornax\nfornicate\nfornicated\nfornicates\nfornicating\nfornication\nfornications\nfornicator\nfornicators\nfornices\nfornix\nforrader\nforrarder\nforsake\nforsaken\nforsakes\nforsaking\nforsook\nforsooth\nforspent\nforswear\nforswearer\nforswearers\nforswearing\nforswears\nforswore\nforsworn\nforsythia\nforsythias\nfort\nfortalice\nfortalices\nforte\nfortes\nforth\nforthcoming\nforthcomings\nforthright\nforthrightly\nforthrightness\nforthwith\nforties\nfortieth\nfortieths\nfortifiable\nfortification\nfortifications\nfortified\nfortifier\nfortifiers\nfortifies\nfortify\nfortifying\nfortifyingly\nfortiori\nfortis\nfortises\nfortissimo\nfortissimos\nfortississimo\nfortitude\nfortitudinous\nfortnight\nfortnightlies\nfortnightly\nfortnights\nfortran\nfortress\nfortresses\nfortresslike\nforts\nfortuities\nfortuitous\nfortuitously\nfortuitousness\nfortuity\nfortuna\nfortunate\nfortunately\nfortunateness\nfortunates\nfortune\nfortuned\nfortunes\nfortuneteller\nfortunetellers\nfortunetelling\nfortuning\nforty\nfortyfold\nfortyish\nforum\nforums\nforward\nforwarded\nforwarder\nforwarders\nforwarding\nforwardly\nforwardness\nforwards\nforwent\nforworn\nforzando\nforzandos\nfoss\nfossa\nfossae\nfossate\nfosse\nfosses\nfossick\nfossicked\nfossicker\nfossickers\nfossicking\nfossicks\nfossil\nfossiliferous\nfossilization\nfossilizations\nfossilize\nfossilized\nfossilizes\nfossilizing\nfossils\nfossorial\nfoster\nfosterage\nfostered\nfosterer\nfosterers\nfostering\nfosterling\nfosterlings\nfosters\nfou\nfoucault\nfoudroyant\nfought\nfoul\nfoulard\nfoulards\nfoulbrood\nfoulbroods\nfouled\nfouler\nfoulest\nfouling\nfoully\nfoulmouthed\nfoulness\nfouls\nfound\nfoundation\nfoundational\nfoundationally\nfoundationless\nfoundations\nfounded\nfounder\nfoundered\nfoundering\nfounders\nfounding\nfoundling\nfoundlings\nfoundries\nfoundry\nfounds\nfount\nfountain\nfountained\nfountainhead\nfountainheads\nfountaining\nfountains\nfounts\nfour\nfourchee\nfourchette\nfourchettes\nfourdrinier\nfourdriniers\nfourfold\nfourgon\nfourgons\nfourhanded\nfourier\nfourierism\nfourierist\nfourierists\nfourierite\nfourierites\nfourpenny\nfourragère\nfours\nfourscore\nfoursome\nfoursomes\nfoursquare\nfoursquarely\nfourteen\nfourteenfold\nfourteens\nfourteenth\nfourteenths\nfourth\nfourthly\nfourths\nfovea\nfoveae\nfoveal\nfoveate\nfoveiform\nfoveola\nfoveolae\nfoveolas\nfowl\nfowled\nfowler\nfowlers\nfowling\nfowls\nfox\nfoxed\nfoxes\nfoxfire\nfoxfires\nfoxglove\nfoxgloves\nfoxhole\nfoxholes\nfoxhound\nfoxhounds\nfoxhunt\nfoxhunted\nfoxhunter\nfoxhunters\nfoxhunting\nfoxhunts\nfoxier\nfoxiest\nfoxily\nfoxiness\nfoxing\nfoxtail\nfoxtails\nfoxtrot\nfoxtrots\nfoxtrotted\nfoxtrotting\nfoxy\nfoy\nfoyer\nfoyers\nfoyle\nfoys\nfra\nfracas\nfracases\nfractal\nfractals\nfracted\nfraction\nfractional\nfractionalization\nfractionalizations\nfractionalize\nfractionalized\nfractionalizes\nfractionalizing\nfractionally\nfractionate\nfractionated\nfractionates\nfractionating\nfractionation\nfractionations\nfractionator\nfractionators\nfractionization\nfractionizations\nfractionize\nfractionized\nfractionizes\nfractionizing\nfractions\nfractious\nfractiously\nfractiousness\nfractur\nfracture\nfractured\nfractures\nfracturing\nfracturs\nfrae\nfrag\nfragged\nfragger\nfraggers\nfragging\nfragile\nfragilely\nfragileness\nfragilities\nfragility\nfragment\nfragmental\nfragmentally\nfragmentarily\nfragmentariness\nfragmentary\nfragmentate\nfragmentated\nfragmentates\nfragmentating\nfragmentation\nfragmentations\nfragmented\nfragmenting\nfragmentize\nfragmentized\nfragmentizer\nfragmentizers\nfragmentizes\nfragmentizing\nfragments\nfragonard\nfragrance\nfragrances\nfragrancy\nfragrant\nfragrantly\nfrags\nfraidy\nfrail\nfrailer\nfrailest\nfrailly\nfrailness\nfrailties\nfrailty\nfraise\nfraises\nfraktur\nfrakturs\nframable\nframbesia\nframbesias\nframe\nframeable\nframed\nframer\nframers\nframes\nframeshift\nframework\nframeworks\nframing\nframingham\nframings\nfranc\nfranca\nfrancas\nfrance\nfranchise\nfranchised\nfranchisee\nfranchisees\nfranchiser\nfranchisers\nfranchises\nfranchising\nfranchisor\nfranchisors\nfrancis\nfranciscan\nfranciscans\nfrancisco\nfrancium\nfranco\nfrancolin\nfrancolins\nfranconia\nfranconian\nfranconians\nfrancophile\nfrancophiles\nfrancophilia\nfrancophobe\nfrancophobes\nfrancophobia\nfrancophobic\nfrancophone\nfrancophones\nfrancophonic\nfrancs\nfrangibility\nfrangible\nfrangibleness\nfrangipane\nfrangipani\nfrangipanis\nfranglais\nfrank\nfranked\nfrankenstein\nfrankenstein's\nfrankensteinian\nfrankensteins\nfranker\nfrankers\nfrankest\nfrankfort\nfrankforter\nfrankforters\nfrankfurt\nfrankfurter\nfrankfurters\nfrankincense\nfranking\nfrankish\nfranklin\nfranklinite\nfranklinites\nfranklins\nfrankly\nfrankness\nfrankpledge\nfrankpledges\nfranks\nfranseria\nfranserias\nfrantic\nfrantically\nfranticly\nfranticness\nfrançaise\nfrap\nfrappe\nfrapped\nfrappes\nfrapping\nfrappé\nfrappés\nfraps\nfraser\nfrat\nfraternal\nfraternalism\nfraternally\nfraternities\nfraternity\nfraternization\nfraternizations\nfraternize\nfraternized\nfraternizer\nfraternizers\nfraternizes\nfraternizing\nfratricidal\nfratricide\nfratricides\nfrats\nfrau\nfraud\nfrauds\nfraudulence\nfraudulent\nfraudulently\nfraudulentness\nfrauen\nfraught\nfraughted\nfraughting\nfraughts\nfraunhofer\nfraxinella\nfraxinellas\nfray\nfrayed\nfraying\nfrays\nfrazzle\nfrazzled\nfrazzles\nfrazzling\nfreak\nfreaked\nfreakier\nfreakiest\nfreakily\nfreakiness\nfreaking\nfreakish\nfreakishly\nfreakishness\nfreaks\nfreaky\nfreckle\nfreckled\nfreckles\nfreckling\nfreckly\nfrederick\nfredericton\nfree\nfreebase\nfreebased\nfreebaser\nfreebasers\nfreebases\nfreebasing\nfreebee\nfreebees\nfreebie\nfreebies\nfreeboard\nfreeboards\nfreeboot\nfreebooted\nfreebooter\nfreebooters\nfreebooting\nfreeboots\nfreeborn\nfreed\nfreedman\nfreedmen\nfreedom\nfreedoms\nfreedwoman\nfreedwomen\nfreeform\nfreehand\nfreehanded\nfreehandedly\nfreehandedness\nfreehearted\nfreeheartedly\nfreeheartedness\nfreehold\nfreeholder\nfreeholders\nfreeholds\nfreeing\nfreelance\nfreelanced\nfreelancer\nfreelancers\nfreelances\nfreelancing\nfreeload\nfreeloaded\nfreeloader\nfreeloaders\nfreeloading\nfreeloads\nfreely\nfreeman\nfreemartin\nfreemartins\nfreemason\nfreemasonry\nfreemasons\nfreemen\nfreeness\nfreeport\nfreer\nfreers\nfrees\nfreesia\nfreesias\nfreest\nfreestanding\nfreestone\nfreestones\nfreestyle\nfreestyles\nfreethinker\nfreethinkers\nfreethinking\nfreetown\nfreeware\nfreeway\nfreeways\nfreewheel\nfreewheeled\nfreewheeler\nfreewheelers\nfreewheeling\nfreewheelingly\nfreewheels\nfreewill\nfreezable\nfreeze\nfreezer\nfreezers\nfreezes\nfreezing\nfreiberg\nfreiburg\nfreight\nfreightage\nfreighted\nfreighter\nfreighters\nfreighting\nfreightliner\nfreightliners\nfreights\nfremantle\nfremitus\nfremontia\nfremontias\nfrena\nfrench\nfrenched\nfrenches\nfrenchification\nfrenchified\nfrenchifies\nfrenchify\nfrenchifying\nfrenching\nfrenchman\nfrenchmen\nfrenchness\nfrenchwoman\nfrenchwomen\nfrenetic\nfrenetical\nfrenetically\nfreneticism\nfrenula\nfrenulum\nfrenum\nfrenums\nfrenzied\nfrenziedly\nfrenzies\nfrenzy\nfrenzying\nfreon\nfrequence\nfrequences\nfrequencies\nfrequency\nfrequent\nfrequentation\nfrequentations\nfrequentative\nfrequentatives\nfrequented\nfrequenter\nfrequenters\nfrequenting\nfrequently\nfrequentness\nfrequents\nfresco\nfrescoed\nfrescoer\nfrescoers\nfrescoes\nfrescoing\nfrescoist\nfrescoists\nfrescos\nfresh\nfreshen\nfreshened\nfreshener\nfresheners\nfreshening\nfreshens\nfresher\nfreshest\nfreshet\nfreshets\nfreshly\nfreshman\nfreshmen\nfreshness\nfreshwater\nfresnel\nfresno\nfret\nfretful\nfretfully\nfretfulness\nfretless\nfrets\nfretsaw\nfretsaws\nfretted\nfretter\nfretters\nfretting\nfretwork\nfreud\nfreudian\nfreudianism\nfreudians\nfrey\nfreya\nfreyr\nfriability\nfriable\nfriableness\nfriar\nfriarbird\nfriarbirds\nfriaries\nfriarly\nfriars\nfriary\nfribble\nfribbled\nfribbler\nfribblers\nfribbles\nfribbling\nfribourg\nfricandeau\nfricandeaus\nfricassee\nfricasseed\nfricasseeing\nfricassees\nfricative\nfricatives\nfriction\nfrictional\nfrictionally\nfrictionless\nfrictionlessly\nfrictions\nfriday\nfridays\nfridge\nfridges\nfried\nfriedland\nfriedrichshafen\nfriend\nfriended\nfriending\nfriendless\nfriendlessness\nfriendlier\nfriendlies\nfriendliest\nfriendlily\nfriendliness\nfriendly\nfriends\nfriendship\nfriendships\nfrier\nfriers\nfries\nfriesian\nfriesians\nfriesland\nfrieze\nfriezes\nfrig\nfrigate\nfrigates\nfrigg\nfrigga\nfrigged\nfrigging\nfright\nfrighted\nfrighten\nfrightened\nfrightener\nfrighteners\nfrightening\nfrighteningly\nfrightens\nfrightful\nfrightfully\nfrightfulness\nfrighting\nfrights\nfrigid\nfrigidaire\nfrigidities\nfrigidity\nfrigidly\nfrigidness\nfrigorific\nfrigorifical\nfrigs\nfrijol\nfrijole\nfrijoles\nfrill\nfrilled\nfrillier\nfrilliest\nfrilliness\nfrilling\nfrills\nfrilly\nfringe\nfringed\nfringes\nfringing\nfringy\nfripperies\nfrippery\nfrisbee\nfrisbees\nfrisch\nfrisette\nfrisettes\nfriseur\nfriseurs\nfrisian\nfrisians\nfrisk\nfrisked\nfrisker\nfriskers\nfrisket\nfriskets\nfriskier\nfriskiest\nfriskily\nfriskiness\nfrisking\nfrisks\nfrisky\nfrisson\nfrissons\nfrisé\nfrisée\nfrit\nfrith\nfriths\nfritillaries\nfritillary\nfrits\nfrittata\nfrittatas\nfritted\nfritter\nfrittered\nfritterer\nfritterers\nfrittering\nfritters\nfritting\nfritz\nfritzes\nfriuli\nfrivol\nfrivoled\nfrivoler\nfrivolers\nfrivoling\nfrivolities\nfrivolity\nfrivolled\nfrivoller\nfrivollers\nfrivolling\nfrivolous\nfrivolously\nfrivolousness\nfrivols\nfrizette\nfrizettes\nfrizz\nfrizzed\nfrizzer\nfrizzers\nfrizzes\nfrizzier\nfrizziest\nfrizzily\nfrizziness\nfrizzing\nfrizzle\nfrizzled\nfrizzles\nfrizzlier\nfrizzliest\nfrizzling\nfrizzly\nfrizzy\nfro\nfrobenius\nfrobisher\nfrock\nfrocked\nfrocking\nfrocks\nfroe\nfroebel\nfroes\nfrog\nfrogeye\nfrogeyes\nfrogfish\nfrogfishes\nfroghopper\nfroghoppers\nfrogman\nfrogmen\nfrogmouth\nfrogmouths\nfrogs\nfroissart\nfrolic\nfrolicked\nfrolicker\nfrolickers\nfrolicking\nfrolics\nfrolicsome\nfrom\nfrond\nfronded\nfrondescence\nfrondescent\nfrondeur\nfrondeurs\nfrondose\nfrondosely\nfronds\nfrons\nfront\nfrontage\nfrontages\nfrontal\nfrontality\nfrontally\nfrontals\nfrontcourt\nfrontcourts\nfronted\nfrontenis\nfrontes\nfrontier\nfrontiers\nfrontiersman\nfrontiersmen\nfrontierswoman\nfrontierswomen\nfronting\nfrontispiece\nfrontispieces\nfrontless\nfrontlet\nfrontlets\nfrontline\nfrontogeneses\nfrontogenesis\nfrontolyses\nfrontolysis\nfronton\nfrontons\nfrontrunner\nfrontrunners\nfronts\nfrontward\nfrontwards\nfrore\nfrosh\nfroshes\nfrost\nfrostbelt\nfrostbit\nfrostbite\nfrostbites\nfrostbiting\nfrostbitten\nfrosted\nfrostfish\nfrostfishes\nfrostier\nfrostiest\nfrostily\nfrostiness\nfrosting\nfrostings\nfrosts\nfrostwork\nfrostworks\nfrosty\nfroth\nfrothed\nfrothier\nfrothiest\nfrothily\nfrothiness\nfrothing\nfroths\nfrothy\nfrottage\nfrottages\nfroufrou\nfroufrous\nfrow\nfroward\nfrowardly\nfrowardness\nfrown\nfrowned\nfrowner\nfrowners\nfrowning\nfrowningly\nfrowns\nfrows\nfrowsier\nfrowsiest\nfrowstier\nfrowstiest\nfrowsty\nfrowsy\nfrowzier\nfrowziest\nfrowziness\nfrowzy\nfroze\nfrozen\nfrozenly\nfrozenness\nfructiferous\nfructification\nfructifications\nfructified\nfructifies\nfructify\nfructifying\nfructose\nfructuous\nfrugal\nfrugalities\nfrugality\nfrugally\nfrugalness\nfrugivore\nfrugivores\nfrugivorous\nfruit\nfruitage\nfruitages\nfruitarian\nfruitarians\nfruitcake\nfruitcakes\nfruited\nfruiterer\nfruiterers\nfruitful\nfruitfully\nfruitfulness\nfruitier\nfruitiest\nfruitiness\nfruiting\nfruition\nfruitions\nfruitless\nfruitlessly\nfruitlessness\nfruitlet\nfruitlets\nfruits\nfruitwood\nfruitwoods\nfruity\nfrumentaceous\nfrumenties\nfrumenty\nfrump\nfrumpier\nfrumpiest\nfrumpily\nfrumpiness\nfrumpish\nfrumpishly\nfrumpishness\nfrumps\nfrumpy\nfrusta\nfrustrate\nfrustrated\nfrustrater\nfrustraters\nfrustrates\nfrustrating\nfrustratingly\nfrustration\nfrustrations\nfrustule\nfrustules\nfrustum\nfrustums\nfrutescence\nfrutescent\nfruticose\nfry\nfryer\nfryers\nfrying\nfräulein\nfräuleins\nftp\nfu\nfubsier\nfubsiest\nfubsy\nfuchsia\nfuchsias\nfuchsin\nfuchsine\nfuchsines\nfuchsins\nfuck\nfucked\nfucker\nfuckers\nfucking\nfucks\nfuckup\nfuckups\nfucoid\nfucoids\nfucose\nfucoses\nfucoxanthin\nfucoxanthins\nfucus\nfucuses\nfud\nfuddle\nfuddled\nfuddles\nfuddling\nfudge\nfudged\nfudges\nfudging\nfuds\nfuego\nfuehrer\nfuehrers\nfuel\nfueled\nfueler\nfuelers\nfueling\nfuelled\nfuelling\nfuels\nfuertaventura\nfuerteventura\nfug\nfugacious\nfugaciously\nfugaciousness\nfugacities\nfugacity\nfugal\nfugally\nfugged\nfugging\nfuggy\nfugit\nfugitive\nfugitively\nfugitiveness\nfugitives\nfugle\nfugled\nfugleman\nfuglemen\nfugles\nfugling\nfugs\nfugu\nfugue\nfugued\nfugues\nfuguing\nfuguist\nfuguists\nfugus\nfuissé\nfujairah\nfuji\nfujian\nfujinoyama\nfujis\nfujisan\nfujisawa\nfukien\nfula\nfulani\nfulanis\nfulas\nfulbright\nfulcra\nfulcrum\nfulcrums\nfulfil\nfulfill\nfulfilled\nfulfiller\nfulfillers\nfulfilling\nfulfillment\nfulfillments\nfulfills\nfulfilment\nfulfils\nfulgent\nfulgently\nfulgurant\nfulgurate\nfulgurated\nfulgurates\nfulgurating\nfulguration\nfulgurations\nfulgurite\nfulgurites\nfulgurous\nfulham\nfulhams\nfuliginous\nfuliginously\nfull\nfullback\nfullbacks\nfulled\nfuller\nfullerene\nfullerenes\nfullers\nfullest\nfulling\nfullmouthed\nfullness\nfulls\nfulltime\nfully\nfulmar\nfulmars\nfulminant\nfulminate\nfulminated\nfulminates\nfulminating\nfulmination\nfulminations\nfulminator\nfulminators\nfulminatory\nfulmine\nfulmined\nfulmines\nfulminic\nfulmining\nfulness\nfulsome\nfulsomely\nfulsomeness\nfulvous\nfumarase\nfumarases\nfumarate\nfumarates\nfumaric\nfumarole\nfumaroles\nfumarolic\nfumatoria\nfumatories\nfumatorium\nfumatoriums\nfumatory\nfumble\nfumbled\nfumbler\nfumblers\nfumbles\nfumbling\nfumblingly\nfume\nfumed\nfumes\nfumet\nfumets\nfumier\nfumiest\nfumigant\nfumigants\nfumigate\nfumigated\nfumigates\nfumigating\nfumigation\nfumigations\nfumigator\nfumigators\nfuming\nfumitories\nfumitory\nfumy\nfun\nfunafuti\nfunambulism\nfunambulist\nfunambulists\nfunchal\nfunction\nfunctional\nfunctionalism\nfunctionalist\nfunctionalistic\nfunctionalists\nfunctionalities\nfunctionality\nfunctionally\nfunctionaries\nfunctionary\nfunctioned\nfunctioning\nfunctionless\nfunctions\nfunctor\nfunctors\nfund\nfundable\nfundament\nfundamental\nfundamentalism\nfundamentalist\nfundamentalistic\nfundamentalists\nfundamentally\nfundamentals\nfundaments\nfunded\nfundi\nfundic\nfunding\nfundraise\nfundraised\nfundraiser\nfundraisers\nfundraises\nfundraising\nfunds\nfundus\nfuneral\nfunerals\nfunerary\nfunereal\nfunereally\nfunfair\nfunfairs\nfunfest\nfunfests\nfungal\nfungi\nfungibility\nfungible\nfungibles\nfungicidal\nfungicidally\nfungicide\nfungicides\nfungiform\nfungistat\nfungistats\nfungivorous\nfungo\nfungoes\nfungoid\nfungoids\nfungous\nfungus\nfunguses\nfunicle\nfunicles\nfunicular\nfuniculars\nfuniculi\nfuniculus\nfunk\nfunked\nfunkia\nfunkias\nfunkier\nfunkiest\nfunkiness\nfunking\nfunks\nfunky\nfunned\nfunnel\nfunneled\nfunnelform\nfunneling\nfunnelled\nfunnelling\nfunnels\nfunnier\nfunnies\nfunniest\nfunnily\nfunniness\nfunning\nfunny\nfunnyman\nfunnymen\nfuns\nfur\nfuran\nfurane\nfuranes\nfuranose\nfuranoses\nfurans\nfurbearer\nfurbearers\nfurbearing\nfurbelow\nfurbelowed\nfurbelowing\nfurbelows\nfurbish\nfurbished\nfurbisher\nfurbishers\nfurbishes\nfurbishing\nfurcate\nfurcated\nfurcately\nfurcates\nfurcating\nfurcation\nfurcations\nfurcula\nfurculae\nfurcular\nfurfur\nfurfuraceous\nfurfural\nfurfurals\nfurfuran\nfurfurans\nfurfures\nfuries\nfurioso\nfurious\nfuriously\nfurl\nfurled\nfurless\nfurling\nfurlong\nfurlongs\nfurlough\nfurloughed\nfurloughing\nfurloughs\nfurls\nfurmities\nfurmity\nfurnace\nfurnaces\nfurnish\nfurnished\nfurnisher\nfurnishers\nfurnishes\nfurnishing\nfurnishings\nfurniture\nfuror\nfurore\nfurores\nfurors\nfurosemide\nfurosemides\nfurred\nfurrier\nfurrieries\nfurriers\nfurriery\nfurriest\nfurriner\nfurriners\nfurriness\nfurring\nfurrings\nfurrow\nfurrowed\nfurrowing\nfurrows\nfurry\nfurs\nfurther\nfurtherance\nfurthered\nfurtherer\nfurtherers\nfurthering\nfurthermore\nfurthermost\nfurthers\nfurthest\nfurtive\nfurtively\nfurtiveness\nfuruncle\nfuruncles\nfuruncular\nfurunculosis\nfurunculous\nfury\nfurze\nfurzes\nfurzy\nfusain\nfusains\nfusaria\nfusarium\nfuscous\nfuse\nfused\nfusee\nfusees\nfusel\nfuselage\nfuselages\nfusels\nfuser\nfusers\nfuses\nfusibility\nfusible\nfusibleness\nfusiform\nfusil\nfusile\nfusileer\nfusileers\nfusilier\nfusiliers\nfusillade\nfusilladed\nfusillades\nfusillading\nfusils\nfusing\nfusion\nfusionism\nfusionist\nfusionists\nfusions\nfuss\nfussbudget\nfussbudgets\nfussbudgety\nfussed\nfusser\nfussers\nfusses\nfussier\nfussiest\nfussily\nfussiness\nfussing\nfusspot\nfusspots\nfussy\nfustian\nfustians\nfustic\nfustics\nfustier\nfustiest\nfustigate\nfustigated\nfustigates\nfustigating\nfustigation\nfustigations\nfustily\nfustiness\nfusty\nfusuma\nfuthark\nfutharks\nfuthorc\nfuthork\nfutile\nfutilely\nfutileness\nfutilitarian\nfutilitarianism\nfutilitarians\nfutilities\nfutility\nfuton\nfutons\nfuttock\nfuttocks\nfutuna\nfuture\nfutureless\nfuturelessness\nfutures\nfuturism\nfuturisms\nfuturist\nfuturistic\nfuturistically\nfuturistics\nfuturists\nfuturities\nfuturity\nfuturological\nfuturologist\nfuturologists\nfuturology\nfutz\nfutzed\nfutzes\nfutzing\nfuze\nfuzed\nfuzee\nfuzees\nfuzes\nfuzing\nfuzz\nfuzzed\nfuzzes\nfuzzier\nfuzziest\nfuzzily\nfuzziness\nfuzzing\nfuzzy\nfuzzyheaded\nfuzzyheadedness\nfyce\nfyces\nfyke\nfykes\nfylfot\nfylfots\nfyn\nfátima\nfès\nfête\nfêted\nfêtes\nfêting\nföhn\nföhns\nführer\nführers\ng\ngab\ngabardine\ngabardines\ngabbed\ngabber\ngabbers\ngabbier\ngabbiest\ngabbiness\ngabbing\ngabble\ngabbled\ngabbler\ngabblers\ngabbles\ngabbling\ngabbro\ngabbroic\ngabbroid\ngabbros\ngabby\ngabelle\ngabelles\ngaberdine\ngaberdines\ngabfest\ngabfests\ngabies\ngabion\ngabions\ngable\ngabled\ngabler\ngables\ngabon\ngabonese\ngaboon\ngaboons\ngaborone\ngabriel\ngabs\ngaby\ngad\ngadabout\ngadabouts\ngadara\ngadarene\ngadarenes\ngaddafi\ngadded\ngadder\ngadders\ngadding\ngadflies\ngadfly\ngadget\ngadgeteer\ngadgeteers\ngadgetry\ngadgets\ngadgety\ngadid\ngadids\ngadoid\ngadoids\ngadolinite\ngadolinites\ngadolinium\ngadoliniums\ngadroon\ngadrooned\ngadrooning\ngadroonings\ngadroons\ngads\ngadwall\ngadwalls\ngadzooks\ngaea\ngael\ngaeldom\ngaelic\ngaels\ngaff\ngaffe\ngaffed\ngaffer\ngaffers\ngaffes\ngaffing\ngaffs\ngag\ngaga\ngage\ngaged\ngager\ngagers\ngages\ngagged\ngagger\ngaggers\ngagging\ngaggle\ngaggles\ngaging\ngagman\ngagmen\ngags\ngagster\ngagsters\ngahnite\ngahnites\ngaia\ngaieties\ngaiety\ngaillardia\ngaillardias\ngaily\ngain\ngained\ngainer\ngainers\ngainesville\ngainful\ngainfully\ngainfulness\ngaingiving\ngaining\ngains\ngainsaid\ngainsay\ngainsayer\ngainsayers\ngainsaying\ngainsays\ngainsborough\ngainst\ngaiseric\ngait\ngaited\ngaiter\ngaiters\ngaithersburg\ngaiting\ngaits\ngaius\ngal\ngala\ngalabia\ngalabias\ngalactic\ngalactopoiesis\ngalactopoietic\ngalactorrhea\ngalactosamine\ngalactosamines\ngalactose\ngalactosemia\ngalactosemias\ngalactosemic\ngalactosidase\ngalactosidases\ngalactoside\ngalactosides\ngalago\ngalagos\ngalah\ngalahad\ngalahads\ngalahs\ngalangal\ngalangals\ngalantine\ngalantines\ngalanty\ngalapagos\ngalas\ngalatea\ngalateas\ngalatia\ngalatian\ngalatians\ngalavant\ngalavanted\ngalavanting\ngalavants\ngalax\ngalaxes\ngalaxies\ngalaxy\ngalbanum\ngalbanums\ngale\ngalea\ngaleae\ngaleate\ngaleated\ngalen\ngalena\ngalenas\ngalenical\ngalenicals\ngalenism\ngalenist\ngalenists\ngalere\ngaleres\ngalerius\ngales\ngalibi\ngalibis\ngalicia\ngalician\ngalicians\ngalilean\ngalileans\ngalilee\ngalilees\ngalileo\ngalimatias\ngalimatiases\ngalingale\ngalingales\ngaliot\ngaliots\ngalipot\ngalipots\ngalivant\ngalivanted\ngalivanting\ngalivants\ngall\ngalla\ngallamine\ngallant\ngallanted\ngallanting\ngallantly\ngallantries\ngallantry\ngallants\ngallas\ngallate\ngallates\ngallbladder\ngallbladders\ngalleass\ngalleasses\ngalled\ngallein\ngalleins\ngalleon\ngalleons\ngalleria\ngallerias\ngalleried\ngalleries\ngallery\ngalleta\ngalletas\ngalley\ngalleys\ngallflies\ngallfly\ngallia\ngalliard\ngalliards\ngallic\ngallican\ngallicanism\ngallicans\ngallicism\ngallicisms\ngallicization\ngallicizations\ngallicize\ngallicized\ngallicizes\ngallicizing\ngallied\ngallies\ngalligaskins\ngallimaufries\ngallimaufry\ngallinacean\ngallinaceans\ngallinaceous\ngallinas\ngalling\ngallingly\ngallinipper\ngallinippers\ngallinule\ngallinules\ngalliot\ngalliots\ngallipoli\ngallipot\ngallipots\ngallium\ngallivant\ngallivanted\ngallivanting\ngallivants\ngalliwasp\ngalliwasps\ngallnut\ngallnuts\ngallo\ngalloglass\ngalloglasses\ngallomania\ngallomanias\ngallon\ngallonage\ngallonages\ngallons\ngalloon\ngallooned\ngalloons\ngallop\ngallopade\ngalloped\ngalloper\ngallopers\ngalloping\ngallops\ngalloway\ngallowglass\ngallowglasses\ngallows\ngallowses\ngalls\ngallstone\ngallstones\ngallus\ngalluses\ngally\ngallying\ngalois\ngaloot\ngaloots\ngalop\ngalops\ngalore\ngalosh\ngaloshed\ngaloshes\ngals\ngalsworthy\ngalumph\ngalumphed\ngalumphing\ngalumphs\ngalvanic\ngalvanically\ngalvanism\ngalvanisms\ngalvanization\ngalvanizations\ngalvanize\ngalvanized\ngalvanizer\ngalvanizers\ngalvanizes\ngalvanizing\ngalvanomagnetic\ngalvanometer\ngalvanometers\ngalvanometric\ngalvanometrical\ngalvanometry\ngalvanoscope\ngalvanoscopes\ngalvanoscopic\ngalvanoscopy\ngalveston\ngalway\ngalwegian\ngalwegians\ngalyak\ngalyaks\ngalápagos\ngalère\ngam\ngama\ngamage\ngamay\ngamays\ngamba\ngambado\ngambadoes\ngambados\ngambas\ngambia\ngambian\ngambians\ngambier\ngambiers\ngambir\ngambirs\ngambit\ngambits\ngamble\ngambled\ngambler\ngamblers\ngambles\ngambling\ngamboge\ngamboges\ngambol\ngamboled\ngamboling\ngambolled\ngambolling\ngambols\ngambrel\ngambrels\ngambusia\ngambusias\ngame\ngamecock\ngamecocks\ngamed\ngamekeeper\ngamekeepers\ngamelan\ngamelans\ngamelike\ngamely\ngameness\ngamer\ngames\ngamesman\ngamesmanship\ngamesmen\ngamesome\ngamesomely\ngamesomeness\ngamest\ngamester\ngamesters\ngametangia\ngametangial\ngametangium\ngamete\ngametes\ngametic\ngametically\ngametocyte\ngametocytes\ngametogenesis\ngametogenic\ngametogenous\ngametophore\ngametophores\ngametophoric\ngametophyte\ngametophytes\ngametophytic\ngamey\ngamic\ngamier\ngamiest\ngamily\ngamin\ngamine\ngamines\ngaminess\ngaming\ngamings\ngamins\ngamma\ngammas\ngammed\ngammer\ngammers\ngamming\ngammon\ngammoned\ngammoner\ngammoners\ngammoning\ngammons\ngamogenesis\ngamogenetic\ngamogenetically\ngamopetalous\ngamophyllous\ngamosepalous\ngamow\ngamp\ngamps\ngams\ngamut\ngamuts\ngamy\ngan\nganciclovir\ngander\nganders\ngandhi\ngandhian\nganef\nganefs\nganesha\ngang\nganga\ngangbang\ngangbanged\ngangbanging\ngangbangs\ngangbuster\ngangbusters\nganged\nganger\ngangers\nganges\nganging\ngangland\nganglia\ngangliate\ngangliated\nganglier\ngangliest\ngangling\nganglion\nganglionated\nganglionic\nganglions\nganglioside\ngangliosides\ngangly\ngangplank\ngangplanks\ngangplow\ngangplows\ngangpunch\ngangpunched\ngangpunches\ngangpunching\ngangrel\ngangrels\ngangrene\ngangrened\ngangrenes\ngangrening\ngangrenous\ngangs\ngangster\ngangsterdom\ngangsterism\ngangsters\ngangue\ngangues\ngangway\ngangways\nganister\nganisters\nganja\nganjas\ngannet\ngannets\ngannister\ngannisters\nganof\nganofs\nganoid\nganoids\ngansu\ngantlet\ngantleted\ngantleting\ngantlets\ngantline\ngantlines\ngantlope\ngantlopes\ngantries\ngantry\ngantt\nganymede\ngaol\ngaoled\ngaoler\ngaolers\ngaoling\ngaols\ngap\ngape\ngaped\ngaper\ngapers\ngapes\ngapeworm\ngapeworms\ngaping\ngapingly\ngapped\ngapping\ngappy\ngaps\ngar\ngarage\ngarageable\ngaraged\ngarageman\ngaragemen\ngarages\ngaraging\ngaramond\ngarb\ngarbage\ngarbanzo\ngarbanzos\ngarbed\ngarbing\ngarble\ngarbled\ngarbler\ngarblers\ngarbles\ngarbling\ngarbo\ngarboard\ngarboards\ngarboil\ngarboils\ngarbologist\ngarbologists\ngarbology\ngarbs\ngarcía\ngarda\ngardant\ngarde\ngarden\ngardened\ngardener\ngardeners\ngardenful\ngardenia\ngardenias\ngardening\ngardens\ngarderobe\ngarderobes\ngardiners\ngardyloo\ngarfield\ngarfish\ngarfishes\ngarganey\ngarganeys\ngargantua\ngargantuan\ngargantuas\ngarget\ngargets\ngargle\ngargled\ngargles\ngargling\ngargoyle\ngargoyles\ngaribaldi\ngaribaldis\ngarish\ngarishly\ngarishness\ngarland\ngarlanded\ngarlanding\ngarlands\ngarlic\ngarlicked\ngarlicking\ngarlicks\ngarlicky\ngarment\ngarmented\ngarmenting\ngarments\ngarner\ngarnered\ngarnering\ngarners\ngarnet\ngarnetiferous\ngarnets\ngarni\ngarnierite\ngarnierites\ngarnis\ngarnish\ngarnished\ngarnishee\ngarnisheed\ngarnisheeing\ngarnishees\ngarnishes\ngarnishing\ngarnishment\ngarnishments\ngarniture\ngarnitures\ngaronne\ngarotte\ngarotted\ngarotter\ngarotters\ngarottes\ngarotting\ngarpike\ngarpikes\ngarred\ngarret\ngarrets\ngarrick\ngarring\ngarrison\ngarrisoned\ngarrisoning\ngarrisons\ngarron\ngarrons\ngarrote\ngarroted\ngarroter\ngarroters\ngarrotes\ngarroting\ngarrotte\ngarrotted\ngarrottes\ngarrotting\ngarrulity\ngarrulous\ngarrulously\ngarrulousness\ngars\ngarter\ngartered\ngartering\ngarters\ngarth\ngarths\ngarve\ngarvey\ngarveys\ngarçon\ngarçons\ngas\ngasbag\ngasbags\ngascon\ngasconade\ngasconaded\ngasconader\ngasconaders\ngasconades\ngasconading\ngascons\ngascony\ngasdynamic\ngasdynamicist\ngasdynamicists\ngasdynamics\ngaseous\ngaseousness\ngases\ngash\ngashed\ngasherbrum\ngashes\ngashing\ngasholder\ngasholders\ngashouse\ngashouses\ngasifiable\ngasification\ngasifications\ngasified\ngasifier\ngasifiers\ngasifies\ngasiform\ngasify\ngasifying\ngaskell\ngasket\ngaskets\ngaskin\ngaskins\ngaslight\ngaslights\ngaslit\ngasogene\ngasogenes\ngasohol\ngasolene\ngasolenes\ngasolier\ngasoliers\ngasoline\ngasolines\ngasolinic\ngasometer\ngasometers\ngasp\ngaspar\ngasped\ngasper\ngaspers\ngasping\ngaspingly\ngasps\ngaspé\ngassed\ngasser\ngassers\ngasses\ngassier\ngassiest\ngassily\ngassiness\ngassing\ngassings\ngassy\ngast\ngasted\ngastight\ngastightness\ngasting\ngastness\ngastraea\ngastraeas\ngastrea\ngastreas\ngastrectomies\ngastrectomy\ngastric\ngastrin\ngastrins\ngastritis\ngastrocnemii\ngastrocnemius\ngastroenteric\ngastroenteritis\ngastroenterologic\ngastroenterological\ngastroenterologist\ngastroenterologists\ngastroenterology\ngastrointestinal\ngastrolith\ngastroliths\ngastrologic\ngastrological\ngastrologically\ngastrologist\ngastrologists\ngastrology\ngastronome\ngastronomer\ngastronomers\ngastronomes\ngastronomic\ngastronomical\ngastronomically\ngastronomies\ngastronomist\ngastronomists\ngastronomy\ngastropod\ngastropodan\ngastropodous\ngastropods\ngastroscope\ngastroscopes\ngastroscopic\ngastroscopist\ngastroscopists\ngastroscopy\ngastrostomies\ngastrostomy\ngastrotomies\ngastrotomy\ngastrotrich\ngastrotriches\ngastrovascular\ngastrula\ngastrulae\ngastrular\ngastrulas\ngastrulate\ngastrulated\ngastrulates\ngastrulating\ngastrulation\ngastrulations\ngasts\ngasworks\ngat\ngate\ngateau\ngateaux\ngatecrash\ngatecrashed\ngatecrasher\ngatecrashers\ngatecrashes\ngatecrashing\ngated\ngatefold\ngatefolds\ngatehouse\ngatehouses\ngatekeeper\ngatekeepers\ngatepost\ngateposts\ngater\ngaters\ngates\ngateway\ngatewayed\ngatewaying\ngateways\ngather\ngathered\ngatherer\ngatherers\ngathering\ngatherings\ngathers\ngatherum\ngatherums\ngatineau\ngating\ngatling\ngatlings\ngator\ngatorade\ngators\ngats\ngatún\ngauche\ngauchely\ngaucheness\ngaucher\ngaucherie\ngaucheries\ngauchest\ngaucho\ngauchos\ngaud\ngaudeamus\ngauderies\ngaudery\ngaudier\ngaudies\ngaudiest\ngaudily\ngaudiness\ngauds\ngaudy\ngaufer\ngaufers\ngauffer\ngauffered\ngauffering\ngauffers\ngaugamela\ngauge\ngaugeable\ngauged\ngauger\ngaugers\ngauges\ngauging\ngauguin\ngaul\ngaulish\ngaulle\ngaullism\ngaullist\ngaullists\ngauls\ngault\ngaults\ngaum\ngaumed\ngauming\ngaumont\ngaums\ngaunt\ngaunter\ngauntest\ngauntlet\ngauntleted\ngauntlets\ngauntly\ngauntness\ngaur\ngaurs\ngauss\ngausses\ngaussian\ngautama\ngauze\ngauzelike\ngauzes\ngauzier\ngauziest\ngauzily\ngauziness\ngauzy\ngavage\ngavages\ngavarnie\ngave\ngavel\ngaveled\ngaveling\ngavelkind\ngavelled\ngavelling\ngavels\ngavial\ngavials\ngavotte\ngavotted\ngavottes\ngavotting\ngawain\ngawk\ngawked\ngawker\ngawkers\ngawkier\ngawkiest\ngawkily\ngawking\ngawkish\ngawkishly\ngawkishness\ngawks\ngawky\ngawp\ngawped\ngawper\ngawpers\ngawping\ngawps\ngay\ngayal\ngayals\ngayer\ngayest\ngayety\ngayly\ngayness\ngays\ngaza\ngazar\ngazars\ngaze\ngazebo\ngazeboes\ngazebos\ngazed\ngazehound\ngazehounds\ngazelle\ngazelles\ngazer\ngazers\ngazes\ngazette\ngazetted\ngazetteer\ngazetteers\ngazettes\ngazetting\ngaziantep\ngazillion\ngazillionaire\ngazillionaires\ngazillions\ngazing\ngazogene\ngazogenes\ngazpacho\ngazpachos\ngdansk\ngeanticlinal\ngeanticline\ngeanticlines\ngear\ngearbox\ngearboxes\ngeared\ngearing\ngearings\ngearless\ngears\ngearshift\ngearshifts\ngearwheel\ngearwheels\ngeat\ngeats\ngebel\ngeber\ngecko\ngeckoes\ngeckos\ngedankenexperiment\ngedankenexperiments\ngee\ngeechee\ngeechees\ngeed\ngeegaw\ngeegaws\ngeeing\ngeek\ngeekish\ngeeks\ngeeky\ngeelong\ngees\ngeese\ngeezer\ngeezers\ngefilte\ngegenschein\ngegenscheins\ngehenna\ngehennas\ngehrig\ngeiger\ngeisha\ngeishas\ngel\ngelable\ngelada\ngelate\ngelated\ngelates\ngelati\ngelatin\ngelatine\ngelatines\ngelating\ngelatinization\ngelatinizations\ngelatinize\ngelatinized\ngelatinizes\ngelatinizing\ngelatinous\ngelatinously\ngelatinousness\ngelatins\ngelation\ngelations\ngelato\ngeld\ngelded\ngelderland\ngelding\ngeldings\ngelds\ngelee\ngelees\ngelid\ngelidities\ngelidity\ngelidly\ngelidness\ngelignite\ngelignites\ngellant\ngellants\ngelled\ngelling\ngels\ngelsenkirchen\ngelt\ngelts\ngeländesprung\ngeländesprungs\ngem\ngemara\ngemaric\ngemarist\ngemarists\ngeminal\ngeminally\ngeminate\ngeminated\ngeminates\ngeminating\ngemination\ngeminations\ngemini\ngeminian\ngeminians\ngeminis\ngemlike\ngemma\ngemmae\ngemmate\ngemmated\ngemmates\ngemmating\ngemmation\ngemmations\ngemmed\ngemming\ngemmiparous\ngemmiparously\ngemmologist\ngemmologists\ngemmology\ngemmulation\ngemmulations\ngemmule\ngemmules\ngemmuliferous\ngemmy\ngemological\ngemologist\ngemologists\ngemology\ngemot\ngemote\ngemotes\ngemots\ngems\ngemsbok\ngemsboks\ngemstone\ngemstones\ngemütlich\ngemütlichkeit\ngendarme\ngendarmerie\ngendarmeries\ngendarmes\ngender\ngendered\ngendering\ngenderless\ngenders\ngene\ngenealogical\ngenealogically\ngenealogies\ngenealogist\ngenealogists\ngenealogize\ngenealogized\ngenealogizes\ngenealogizing\ngenealogy\ngenera\ngenerable\ngeneral\ngeneralcies\ngeneralcy\ngeneralissimo\ngeneralissimos\ngeneralist\ngeneralists\ngeneralities\ngenerality\ngeneralizability\ngeneralizable\ngeneralization\ngeneralizations\ngeneralize\ngeneralized\ngeneralizer\ngeneralizers\ngeneralizes\ngeneralizing\ngenerally\ngeneralness\ngenerals\ngeneralship\ngeneralships\ngenerate\ngenerated\ngenerates\ngenerating\ngeneration\ngenerational\ngenerations\ngenerative\ngeneratively\ngenerativeness\ngenerator\ngenerators\ngeneratrices\ngeneratrix\ngeneric\ngenerically\ngenericness\ngenerics\ngeneris\ngenerosities\ngenerosity\ngenerous\ngenerously\ngenerousness\ngenes\ngenesee\ngeneses\ngenesis\ngenet\ngenetic\ngenetical\ngenetically\ngeneticist\ngeneticists\ngenetics\ngenets\ngeneva\ngenevan\ngenevans\ngenevese\ngenghis\ngenial\ngeniality\ngenially\ngenialness\ngenials\ngenic\ngenically\ngeniculate\ngeniculated\ngeniculately\ngeniculation\ngeniculations\ngenie\ngenies\ngenii\ngenip\ngenipap\ngenipaps\ngenips\ngenital\ngenitalia\ngenitalic\ngenitally\ngenitals\ngenitival\ngenitivally\ngenitive\ngenitives\ngenitor\ngenitors\ngenitourinary\ngeniture\ngenitures\ngenius\ngeniuses\ngenoa\ngenoas\ngenocidal\ngenocidally\ngenocide\ngenocides\ngenoese\ngenoise\ngenoises\ngenom\ngenome\ngenomes\ngenomic\ngenomics\ngenoms\ngenotype\ngenotypes\ngenotypic\ngenotypical\ngenotypically\ngenotypicity\ngenova\ngenre\ngenres\ngenro\ngenros\ngens\ngenseric\ngent\ngentamicin\ngentamicins\ngenteel\ngenteelism\ngenteelisms\ngenteelly\ngenteelness\ngentes\ngentian\ngentians\ngentile\ngentiles\ngentilesse\ngentilesses\ngentilities\ngentility\ngentle\ngentled\ngentlefolk\ngentlefolks\ngentleman\ngentlemanlike\ngentlemanlikeness\ngentlemanliness\ngentlemanly\ngentlemen\ngentleness\ngentlepeople\ngentlepeoples\ngentleperson\ngentlepersons\ngentler\ngentles\ngentlest\ngentlewoman\ngentlewomen\ngentling\ngently\ngentrice\ngentrices\ngentries\ngentrification\ngentrifications\ngentrified\ngentrifier\ngentrifiers\ngentrifies\ngentrify\ngentrifying\ngentry\ngents\ngenuflect\ngenuflected\ngenuflecting\ngenuflection\ngenuflections\ngenuflects\ngenuflexion\ngenuine\ngenuinely\ngenuineness\ngenus\ngeobotanic\ngeobotanical\ngeobotanically\ngeobotanist\ngeobotanists\ngeobotany\ngeocentric\ngeocentrically\ngeocentricism\ngeochemical\ngeochemically\ngeochemist\ngeochemistry\ngeochemists\ngeochronologic\ngeochronological\ngeochronologically\ngeochronologist\ngeochronologists\ngeochronology\ngeochronometric\ngeochronometry\ngeocode\ngeocodes\ngeocorona\ngeocoronas\ngeode\ngeodes\ngeodesic\ngeodesics\ngeodesist\ngeodesists\ngeodesy\ngeodetic\ngeodetical\ngeodetically\ngeoduck\ngeoducks\ngeoeconomic\ngeoeconomically\ngeoeconomics\ngeoeconomist\ngeoeconomists\ngeographer\ngeographers\ngeographic\ngeographical\ngeographically\ngeographies\ngeography\ngeohydrologic\ngeohydrologist\ngeohydrologists\ngeohydrology\ngeoid\ngeoidal\ngeoids\ngeologic\ngeological\ngeologically\ngeologies\ngeologist\ngeologists\ngeologize\ngeologized\ngeologizes\ngeologizing\ngeology\ngeomagnetic\ngeomagnetically\ngeomagnetism\ngeomancer\ngeomancers\ngeomancy\ngeomantic\ngeometer\ngeometers\ngeometric\ngeometrical\ngeometrically\ngeometrician\ngeometricians\ngeometricize\ngeometricized\ngeometricizes\ngeometricizing\ngeometrics\ngeometrid\ngeometrids\ngeometries\ngeometrize\ngeometrized\ngeometrizes\ngeometrizing\ngeometry\ngeomorphic\ngeomorphologic\ngeomorphological\ngeomorphologically\ngeomorphologist\ngeomorphologists\ngeomorphology\ngeophagism\ngeophagist\ngeophagists\ngeophagy\ngeophone\ngeophones\ngeophysical\ngeophysically\ngeophysicist\ngeophysicists\ngeophysics\ngeophyte\ngeophytes\ngeopolitical\ngeopolitically\ngeopolitician\ngeopoliticians\ngeopolitics\ngeoponic\ngeoponics\ngeopressured\ngeopressurized\ngeordie\ngeordies\ngeorge\ngeorges\ngeorgetown\ngeorgette\ngeorgettes\ngeorgia\ngeorgian\ngeorgians\ngeorgic\ngeorgical\ngeorgics\ngeoscience\ngeosciences\ngeoscientist\ngeoscientists\ngeostationary\ngeostrategic\ngeostrategies\ngeostrategist\ngeostrategists\ngeostrategy\ngeostrophic\ngeostrophically\ngeosynchronous\ngeosynchronously\ngeosynclinal\ngeosyncline\ngeosynclines\ngeotactic\ngeotactically\ngeotaxes\ngeotaxis\ngeotectonic\ngeothermal\ngeothermally\ngeothermic\ngeotropic\ngeotropically\ngeotropism\ngerah\ngerahs\ngeraint\ngeranial\ngeranials\ngeraniol\ngeraniols\ngeranium\ngeraniums\ngerardia\ngerardias\ngerbera\ngerberas\ngerbil\ngerbille\ngerbilles\ngerbils\ngerent\ngerents\ngerenuk\ngerenuks\ngerfalcon\ngerfalcons\ngeriatric\ngeriatrician\ngeriatricians\ngeriatrics\ngeriatrist\ngeriatrists\ngerm\ngerman\ngermander\ngermanders\ngermane\ngermanely\ngermaneness\ngermania\ngermanic\ngermanicus\ngermanism\ngermanisms\ngermanist\ngermanists\ngermanium\ngermanization\ngermanizations\ngermanize\ngermanized\ngermanizer\ngermanizers\ngermanizes\ngermanizing\ngermanophile\ngermanophiles\ngermanophobe\ngermanophobes\ngermanophobia\ngermans\ngermantown\ngermany\ngermen\ngermens\ngermfree\ngermicidal\ngermicide\ngermicides\ngermier\ngermiest\ngerminability\ngerminal\ngerminally\ngerminate\ngerminated\ngerminates\ngerminating\ngermination\ngerminations\ngerminative\ngerminator\ngerminators\ngerminess\ngermproof\ngerms\ngermy\ngerodontic\ngerodontics\ngerona\ngeronimo\ngerontic\ngerontocracies\ngerontocracy\ngerontocrat\ngerontocratic\ngerontocrats\ngerontologic\ngerontological\ngerontologist\ngerontologists\ngerontology\ngerontomorphic\ngerrymander\ngerrymandered\ngerrymandering\ngerrymanders\ngershwin\ngertrude\ngertrudis\ngerund\ngerundial\ngerundive\ngerundives\ngerunds\ngeryon\ngesneriad\ngesneriads\ngesso\ngessoed\ngessoes\ngest\ngestalt\ngestalten\ngestaltist\ngestaltists\ngestalts\ngestapo\ngestapos\ngestate\ngestated\ngestates\ngestating\ngestation\ngestational\ngestations\ngestatory\ngeste\ngestes\ngestic\ngesticulate\ngesticulated\ngesticulates\ngesticulating\ngesticulation\ngesticulations\ngesticulative\ngesticulator\ngesticulators\ngesticulatory\ngests\ngestural\ngesturally\ngesture\ngestured\ngesturer\ngesturers\ngestures\ngesturing\ngesundheit\nget\ngeta\ngetable\ngetas\ngetatable\ngetaway\ngetaways\ngethsemane\ngethsemanes\ngets\ngettable\ngetter\ngetters\ngetting\ngetty\ngettysburg\ngetup\ngetups\ngeum\ngeums\ngewgaw\ngewgaws\ngewürztraminer\ngewürztraminers\ngey\ngeyser\ngeyserite\ngeyserites\ngeysers\nghaghara\nghaghra\nghana\nghanaian\nghanaians\ngharial\ngharials\ngharries\ngharry\nghast\nghastful\nghastfully\nghastlier\nghastliest\nghastliness\nghastly\nghat\nghats\nghaut\nghauts\nghazi\nghaziabad\nghazies\nghee\nghees\nghent\ngherkin\ngherkins\nghetto\nghettoed\nghettoes\nghettoing\nghettoization\nghettoizations\nghettoize\nghettoized\nghettoizes\nghettoizing\nghettos\nghi\nghibelline\nghibellines\nghibli\nghiblis\nghillie\nghillies\nghis\nghost\nghosted\nghosting\nghostings\nghostlier\nghostliest\nghostlike\nghostliness\nghostly\nghosts\nghostweed\nghostweeds\nghostwrite\nghostwriter\nghostwriters\nghostwrites\nghostwriting\nghostwritten\nghostwrote\nghosty\nghoul\nghoulish\nghoulishly\nghoulishness\nghouls\ngiant\ngiantess\ngiantesses\ngiantism\ngiantisms\ngiantlike\ngiants\ngiaour\ngiaours\ngiardia\ngiardias\ngiardiasis\ngib\ngibbed\ngibber\ngibbered\ngibberellic\ngibberellin\ngibberellins\ngibbering\ngibberish\ngibbers\ngibbet\ngibbeted\ngibbeting\ngibbets\ngibbetted\ngibbetting\ngibbing\ngibbon\ngibbons\ngibbosities\ngibbosity\ngibbous\ngibbously\ngibbousness\ngibe\ngibed\ngibeon\ngibeonite\ngibeonites\ngiber\ngibers\ngibes\ngibing\ngibingly\ngiblet\ngiblets\ngibraltar\ngibraltarian\ngibraltarians\ngibs\ngibson\ngibsons\ngid\ngiddap\ngiddied\ngiddier\ngiddies\ngiddiest\ngiddily\ngiddiness\ngiddy\ngiddyap\ngiddying\ngiddyup\ngideon\ngids\ngie\ngied\ngieing\ngies\ngift\ngiftable\ngiftables\ngifted\ngiftedly\ngiftedness\ngifting\ngifts\ngiftware\ngiftwares\ngig\ngigaampere\ngigaamperes\ngigabecquerel\ngigabecquerels\ngigabit\ngigabits\ngigabyte\ngigabytes\ngigacandela\ngigacandelas\ngigacoulomb\ngigacoulombs\ngigacycle\ngigacycles\ngigafarad\ngigafarads\ngigaflop\ngigaflops\ngigagram\ngigagrams\ngigahenries\ngigahenry\ngigahenrys\ngigahertz\ngigajoule\ngigajoules\ngigakelvin\ngigakelvins\ngigalumen\ngigalumens\ngigalux\ngigameter\ngigameters\ngigamole\ngigamoles\ngiganewton\ngiganewtons\ngigantesque\ngigantic\ngigantically\ngigantism\ngigantisms\ngigaohm\ngigaohms\ngigapascal\ngigapascals\ngigaradian\ngigaradians\ngigas\ngigasecond\ngigaseconds\ngigasiemens\ngigasievert\ngigasieverts\ngigasteradian\ngigasteradians\ngigatesla\ngigateslas\ngigaton\ngigatons\ngigavolt\ngigavolts\ngigawatt\ngigawatts\ngigaweber\ngigawebers\ngigged\ngigging\ngiggle\ngiggled\ngiggler\ngigglers\ngiggles\ngiggling\ngigglingly\ngiggly\ngigolo\ngigolos\ngigot\ngigots\ngigs\ngigue\ngigues\ngikuyu\ngikuyus\ngila\ngilbert\ngilbertian\ngilberts\ngilboa\ngild\ngildas\ngilded\ngilder\ngilders\ngilding\ngildings\ngilds\ngilead\ngiles\ngilgamesh\ngill\ngilled\ngiller\ngillers\ngillette\ngillie\ngillied\ngillies\ngilling\ngillnet\ngillnets\ngillnetted\ngillnetting\ngills\ngillyflower\ngillyflowers\ngillying\ngilsonite\ngilt\ngilts\ngimbal\ngimbaled\ngimbaling\ngimballed\ngimballing\ngimbals\ngimcrack\ngimcrackery\ngimcracks\ngimel\ngimels\ngimignano\ngimlet\ngimleted\ngimleting\ngimlets\ngimmal\ngimmals\ngimme\ngimmes\ngimmick\ngimmicked\ngimmicking\ngimmickries\ngimmickry\ngimmicks\ngimmicky\ngimp\ngimped\ngimping\ngimps\ngimpy\ngin\nginger\ngingerbread\ngingerbreaded\ngingerbreads\ngingerbready\ngingered\ngingering\ngingerliness\ngingerly\ngingerroot\ngingerroots\ngingers\ngingersnap\ngingersnaps\ngingery\ngingham\nginghams\ngingiva\ngingivae\ngingival\ngingivectomies\ngingivectomy\ngingivitis\ngingko\ngingkoes\ngink\nginkgo\nginkgoes\nginks\nginned\nginner\nginners\nginning\nginny\ngins\nginsberg\nginseng\nginsengs\nginzo\nginzoes\ngiorgione\ngiotto\ngiovanni\ngip\ngipped\ngipping\ngips\ngipsies\ngipsy\ngiraffe\ngiraffes\ngiraffish\ngirandole\ngirandoles\ngirasol\ngirasole\ngirasoles\ngirasols\ngird\ngirded\ngirder\ngirders\ngirding\ngirdle\ngirdled\ngirdler\ngirdlers\ngirdles\ngirdling\ngirds\ngirl\ngirlfriend\ngirlfriends\ngirlhood\ngirlie\ngirlies\ngirlish\ngirlishly\ngirlishness\ngirls\ngirly\ngirn\ngirned\ngirning\ngirns\ngiro\ngiroed\ngiroes\ngiroing\ngiron\ngironde\ngirondin\ngirondins\ngirondist\ngirondists\ngirons\ngiros\ngirosol\ngirosols\ngirt\ngirted\ngirth\ngirthed\ngirthing\ngirths\ngirting\ngirts\ngisarme\ngisarmes\ngismo\ngismos\ngist\ngists\ngit\ngite\ngites\ngittern\ngitterns\ngiulia\ngiuseppe\ngive\ngiveaway\ngiveaways\ngiveback\ngivebacks\ngiven\ngivens\ngiver\ngivers\ngives\ngiving\ngizmo\ngizmos\ngizzard\ngizzards\nglabella\nglabellae\nglabellar\nglabrate\nglabrescent\nglabrous\nglabrousness\nglacial\nglacially\nglaciate\nglaciated\nglaciates\nglaciating\nglaciation\nglaciations\nglacier\nglaciered\nglaciers\nglaciologic\nglaciological\nglaciologist\nglaciologists\nglaciology\nglacis\nglacé\nglacéed\nglacéing\nglacés\nglad\ngladded\ngladden\ngladdened\ngladdening\ngladdens\ngladder\ngladdest\ngladding\nglade\nglades\ngladiate\ngladiator\ngladiatorial\ngladiators\ngladiola\ngladiolas\ngladioli\ngladiolus\ngladioluses\ngladly\ngladness\nglads\ngladsome\ngladsomely\ngladsomeness\ngladstone\ngladstones\nglady\nglagolithic\nglagolitic\nglaiket\nglaikit\nglair\nglaire\nglaires\nglairier\nglairiest\nglairs\nglairy\nglaive\nglaives\nglamor\nglamored\nglamorgan\nglamoring\nglamorization\nglamorizations\nglamorize\nglamorized\nglamorizer\nglamorizers\nglamorizes\nglamorizing\nglamorless\nglamorous\nglamorously\nglamorousness\nglamors\nglamour\nglamoured\nglamouring\nglamourization\nglamourizations\nglamourize\nglamourized\nglamourizer\nglamourizers\nglamourizes\nglamourizing\nglamourous\nglamourously\nglamourousness\nglamours\nglance\nglanced\nglances\nglancing\nglancingly\ngland\nglandered\nglanderous\nglanders\nglandes\nglandless\nglands\nglandular\nglandularly\nglans\nglare\nglared\nglares\nglarier\nglariest\nglaring\nglaringly\nglaringness\nglary\nglasgow\nglasnost\nglass\nglassblower\nglassblowers\nglassblowing\nglassed\nglasses\nglassfish\nglassfishes\nglassful\nglassfuls\nglasshouse\nglasshouses\nglassie\nglassier\nglassies\nglassiest\nglassily\nglassine\nglassines\nglassiness\nglassing\nglassless\nglasslike\nglassmaker\nglassmakers\nglassmaking\nglassware\nglasswork\nglassworker\nglassworkers\nglassworks\nglasswort\nglassworts\nglassy\nglastonbury\nglaswegian\nglaswegians\nglauber\nglaucoma\nglaucomatous\nglauconite\nglauconites\nglauconitic\nglaucous\nglaucousness\nglaze\nglazed\nglazer\nglazers\nglazes\nglazier\nglazieries\nglaziers\nglaziery\nglazing\nglazings\ngleam\ngleamed\ngleamer\ngleamers\ngleaming\ngleams\ngleamy\nglean\ngleanable\ngleaned\ngleaner\ngleaners\ngleaning\ngleanings\ngleans\ngleba\nglebae\nglebe\nglebes\nglede\ngledes\nglee\ngleed\ngleeds\ngleeful\ngleefully\ngleefulness\ngleek\ngleeked\ngleeking\ngleeks\ngleeman\ngleemen\nglees\ngleesome\ngleet\ngleets\ngleety\ngleg\nglen\nglenda\nglendale\nglengarries\nglengarry\nglens\ngley\ngleys\nglia\ngliadin\ngliadins\nglial\nglias\nglib\nglibber\nglibbest\nglibly\nglibness\nglide\nglided\nglider\ngliders\nglides\ngliding\nglim\nglimmer\nglimmered\nglimmering\nglimmerings\nglimmers\nglimpse\nglimpsed\nglimpser\nglimpsers\nglimpses\nglimpsing\nglims\nglint\nglinted\nglintier\nglintiest\nglinting\nglints\nglinty\nglioma\ngliomas\ngliomata\nglissade\nglissaded\nglissader\nglissaders\nglissades\nglissading\nglissandi\nglissando\nglissandos\nglisten\nglistened\nglistening\nglistens\nglister\nglistered\nglistering\nglisters\nglitch\nglitches\nglitchy\nglitter\nglitterati\nglittered\nglittering\nglitteringly\nglitters\nglittertinden\nglittery\nglitz\nglitzed\nglitzes\nglitziness\nglitzing\nglitzy\ngloam\ngloaming\ngloams\ngloat\ngloated\ngloater\ngloaters\ngloating\ngloats\nglob\nglobal\nglobalism\nglobalisms\nglobalist\nglobalists\nglobalization\nglobalizations\nglobalize\nglobalized\nglobalizer\nglobalizers\nglobalizes\nglobalizing\nglobally\nglobals\nglobate\nglobe\nglobed\nglobefish\nglobefishes\nglobeflower\nglobeflowers\nglobes\nglobetrot\nglobetrots\nglobetrotted\nglobetrotter\nglobetrotters\nglobetrotting\nglobin\nglobing\nglobins\ngloboid\ngloboids\nglobose\nglobosely\ngloboseness\nglobosity\nglobous\nglobs\nglobular\nglobularly\nglobularness\nglobule\nglobules\nglobuliferous\nglobulin\nglobulins\nglochid\nglochidia\nglochidiate\nglochidium\nglochids\nglockenspiel\nglockenspiels\nglogg\ngloggs\nglom\nglomera\nglomerate\nglomerular\nglomerulate\nglomerule\nglomerules\nglomeruli\nglomerulus\nglomma\nglommed\nglomming\ngloms\nglomus\ngloom\ngloomed\ngloomier\ngloomiest\ngloomily\ngloominess\nglooming\nglooms\ngloomy\nglop\ngloped\ngloping\ngloppy\nglops\ngloria\ngloriam\ngloriana\nglorias\ngloried\nglories\nglorification\nglorifications\nglorified\nglorifier\nglorifiers\nglorifies\nglorify\nglorifying\ngloriole\nglorioles\ngloriosi\ngloriosus\nglorious\ngloriously\ngloriousness\nglory\nglorying\ngloss\nglossa\nglossae\nglossal\nglossarial\nglossaries\nglossarist\nglossarists\nglossary\nglossas\nglossed\nglosser\nglossers\nglosses\nglossier\nglossies\nglossiest\nglossily\nglossiness\nglossing\nglossitic\nglossitis\nglossographer\nglossographers\nglossography\nglossolalia\nglossolalias\nglossolalist\nglossolalists\nglossopharyngeal\nglossy\nglottal\nglottides\nglottis\nglottises\nglottochronological\nglottochronology\ngloucester\ngloucestershire\nglout\nglouted\nglouting\nglouts\nglove\ngloved\nglover\nglovers\ngloves\ngloving\nglow\nglowed\nglower\nglowered\nglowering\ngloweringly\nglowers\nglowing\nglowingly\nglows\nglowworm\nglowworms\ngloxinia\ngloxinias\ngloze\nglozed\nglozes\nglozing\nglucagon\ngluck\nglucocorticoid\nglucocorticoids\ngluconeogenesis\ngluconeogenetic\nglucose\nglucoside\nglucosides\nglucosidic\nglucosidically\nglue\nglued\nglueing\nglues\ngluey\ngluily\ngluiness\ngluing\nglum\nglumaceous\nglume\nglumes\nglumly\nglummer\nglummest\nglumness\nglums\ngluon\ngluons\nglut\nglutamate\nglutamates\nglutamic\nglutamine\nglutamines\nglutaraldehyde\nglutaraldehydes\ngluteal\nglutei\ngluten\nglutenous\nglutens\nglutethimide\nglutethimides\ngluteus\nglutinosity\nglutinous\nglutinously\nglutinousness\ngluts\nglutted\nglutting\nglutton\ngluttonies\ngluttonize\ngluttonized\ngluttonizes\ngluttonizing\ngluttonous\ngluttonously\ngluttonousness\ngluttons\ngluttony\nglycan\nglycans\nglyceraldehyde\nglyceraldehydes\nglyceric\nglyceride\nglycerides\nglycerin\nglycerinate\nglycerinated\nglycerinates\nglycerinating\nglycerine\nglycerines\nglycerins\nglycerol\nglycerolize\nglycerolized\nglycerolizes\nglycerolizing\nglycerols\nglyceryl\nglyceryls\nglycin\nglycine\nglycines\nglycins\nglycogen\nglycogenesis\nglycogenetic\nglycogenic\nglycogenolyses\nglycogenolysis\nglycogenolytic\nglycogens\nglycol\nglycolic\nglycolipid\nglycolipids\nglycols\nglycolyses\nglycolysis\nglycolytic\nglycopeptide\nglycopeptides\nglycoprotein\nglycoproteins\nglycosaminoglycan\nglycosaminoglycans\nglycosidase\nglycosidases\nglycoside\nglycosides\nglycosidic\nglycosidically\nglycosuria\nglycosuric\nglycosyl\nglycosylate\nglycosylated\nglycosylates\nglycosylating\nglycosylation\nglycosyls\nglycyl\nglycyls\nglyph\nglyphic\nglyphs\nglyptic\nglyptics\nglyptograph\nglyptographer\nglyptographers\nglyptographic\nglyptographical\nglyptographs\nglyptography\nglåma\nglögg\nglöggs\ngmelina\ngmelinas\ngnar\ngnarl\ngnarled\ngnarling\ngnarls\ngnarly\ngnarr\ngnarred\ngnarring\ngnarrs\ngnars\ngnash\ngnashed\ngnashes\ngnashing\ngnat\ngnatcatcher\ngnatcatchers\ngnathal\ngnathic\ngnathite\ngnathites\ngnats\ngnatty\ngnaw\ngnawed\ngnawer\ngnawers\ngnawing\ngnaws\ngneiss\ngneisses\ngneissic\ngneissoid\ngneissose\ngniezno\ngnocchi\ngnome\ngnomelike\ngnomes\ngnomic\ngnomish\ngnomon\ngnomonic\ngnomonical\ngnomons\ngnosis\ngnostic\ngnosticism\ngnostics\ngnotobiotic\ngnotobiotically\ngnu\ngnus\ngo\ngoa\ngoad\ngoaded\ngoading\ngoads\ngoal\ngoaled\ngoalie\ngoalies\ngoaling\ngoalkeeper\ngoalkeepers\ngoalless\ngoalpost\ngoalposts\ngoals\ngoaltender\ngoaltenders\ngoaltending\ngoaltendings\ngoanese\ngoas\ngoat\ngoatee\ngoateed\ngoatees\ngoatfish\ngoatfishes\ngoatherd\ngoatherds\ngoatish\ngoatlike\ngoats\ngoatsbeard\ngoatskin\ngoatskins\ngoatsucker\ngoatsuckers\ngob\ngobbet\ngobbets\ngobble\ngobbled\ngobbledegook\ngobbledygook\ngobbler\ngobblers\ngobbles\ngobbling\ngobelin\ngobelins\ngobi\ngobies\ngoblet\ngoblets\ngoblin\ngoblins\ngobo\ngoboes\ngobos\ngobs\ngoby\ngod\ngodalmighty\ngodavari\ngodchild\ngodchildren\ngoddam\ngoddamn\ngoddamned\ngoddamning\ngoddamns\ngoddams\ngoddard\ngoddaughter\ngoddaughters\ngodded\ngoddess\ngoddesses\ngodding\ngodfather\ngodfathered\ngodfathering\ngodfathers\ngodforsaken\ngodhead\ngodheads\ngodhood\ngodhoods\ngodiva\ngodless\ngodlessly\ngodlessness\ngodlier\ngodliest\ngodlike\ngodlikeness\ngodliness\ngodling\ngodlings\ngodly\ngodmother\ngodmothered\ngodmothering\ngodmothers\ngodown\ngodowns\ngodoxious\ngodparent\ngodparents\ngods\ngodsend\ngodsends\ngodson\ngodsons\ngodspeed\ngodspeeds\ngodthåb\ngodunov\ngodwit\ngodwits\ngoebbels\ngoer\ngoering\ngoers\ngoes\ngoethe\ngoethite\ngoethites\ngofer\ngofers\ngoffer\ngoffered\ngoffering\ngoffers\ngoggle\ngoggled\ngoggler\ngogglers\ngoggles\ngoggling\ngoggly\ngogh\ngogol\ngogra\ngoidelic\ngoing\ngoings\ngoiter\ngoiters\ngoitre\ngoitres\ngoitrogen\ngoitrogenic\ngoitrogenicity\ngoitrous\ngoiânia\ngolan\ngolconda\ngolcondas\ngold\ngoldbeater\ngoldbeaters\ngoldbeating\ngoldbeatings\ngoldberg\ngoldbergian\ngoldbrick\ngoldbricked\ngoldbricker\ngoldbrickers\ngoldbricking\ngoldbricks\ngoldbug\ngoldbugs\ngolden\ngoldeneye\ngoldeneyes\ngoldenly\ngoldenness\ngoldenrod\ngoldenrods\ngoldenseal\ngoldenseals\ngoldfield\ngoldfields\ngoldfinch\ngoldfinches\ngoldfish\ngoldfishes\ngoldilocks\ngolds\ngoldsmith\ngoldsmiths\ngoldstone\ngoldstones\ngoldthread\ngoldthreads\ngoldwyn\ngolem\ngolems\ngolf\ngolfed\ngolfer\ngolfers\ngolfing\ngolflinks\ngolfs\ngolgi\ngolgotha\ngolgothas\ngoliard\ngoliardic\ngoliards\ngoliath\ngoliaths\ngollancz\ngolliwog\ngolliwogg\ngolliwoggs\ngolliwogs\ngolly\ngombeen\ngombeens\ngomorrah\ngomorrahs\ngomphoses\ngomphosis\ngonad\ngonadal\ngonadectomies\ngonadectomized\ngonadectomy\ngonadic\ngonadotrophic\ngonadotrophin\ngonadotrophins\ngonadotropic\ngonadotropin\ngonadotropins\ngonads\ngond\ngondi\ngondola\ngondolas\ngondolier\ngondoliers\ngonds\ngondwana\ngondwanaland\ngondwanalands\ngone\ngoner\ngoneril\ngoners\ngonfalon\ngonfalonier\ngonfaloniers\ngonfalons\ngong\ngonged\ngonging\ngongorism\ngongorisms\ngongoristic\ngongs\ngonidia\ngonidial\ngonidium\ngonif\ngonifs\ngoniometer\ngoniometers\ngoniometric\ngoniometrical\ngoniometry\ngonion\ngonions\ngonococcal\ngonococci\ngonococcic\ngonococcus\ngonocyte\ngonocytes\ngonophore\ngonophores\ngonophoric\ngonophorous\ngonopore\ngonopores\ngonorrhea\ngonorrheal\ngonorrheic\ngonzo\ngoo\ngoober\ngoobers\ngood\ngoodbye\ngoodbyes\ngooder\ngooders\ngoodhearted\ngoodheartedly\ngoodheartedness\ngoodie\ngoodies\ngoodish\ngoodlier\ngoodliest\ngoodliness\ngoodly\ngoodman\ngoodmen\ngoodness\ngoodnight\ngoodnights\ngoods\ngoodwife\ngoodwill\ngoodwills\ngoodwin\ngoodwives\ngoody\ngoodyear\ngooey\ngoof\ngoofball\ngoofballs\ngoofed\ngoofier\ngoofiest\ngoofily\ngoofiness\ngoofing\ngoofproof\ngoofs\ngoofy\ngoogol\ngoogolplex\ngoogolplexes\ngoogols\ngooier\ngooiest\ngook\ngooks\ngoombah\ngoombahs\ngoon\ngooney\ngooneys\ngoonies\ngoons\ngoony\ngoop\ngoops\ngoopy\ngoos\ngoosander\ngoosanders\ngoose\ngooseberries\ngooseberry\ngoosed\ngoosefish\ngoosefishes\ngooseflesh\ngoosefoot\ngoosefoots\ngooseneck\ngoosenecked\ngoosenecks\ngooses\ngoosestep\ngoosestepped\ngoosestepping\ngoosesteps\ngoosey\ngoosier\ngoosiest\ngoosing\ngoosy\ngopher\ngophers\ngorbachev\ngordian\ngordon\ngordons\ngore\ngored\ngores\ngorge\ngorged\ngorgeous\ngorgeously\ngorgeousness\ngorger\ngorgerin\ngorgerins\ngorgers\ngorges\ngorget\ngorgets\ngorging\ngorgon\ngorgonian\ngorgonians\ngorgonize\ngorgonized\ngorgonizes\ngorgonizing\ngorgons\ngorgonzola\ngorier\ngoriest\ngorilla\ngorillas\ngorily\ngoriness\ngoring\ngorki\ngorky\ngormandize\ngormandized\ngormandizer\ngormandizers\ngormandizes\ngormandizing\ngormless\ngorp\ngorps\ngorse\ngorses\ngorsy\ngory\ngosh\ngoshawk\ngoshawks\ngoshen\ngosiute\ngosiutes\ngosling\ngoslings\ngospel\ngospeler\ngospelers\ngospeller\ngospellers\ngospels\ngosport\ngosports\ngossamer\ngossamers\ngossamery\ngossan\ngossans\ngossip\ngossiped\ngossiper\ngossipers\ngossiping\ngossipmonger\ngossipmongers\ngossipries\ngossipry\ngossips\ngossipy\ngossypol\ngossypols\ngot\ngoth\ngotha\ngotham\ngothamite\ngothamites\ngothenburg\ngothic\ngothically\ngothicism\ngothicisms\ngothicist\ngothicists\ngothicize\ngothicized\ngothicizes\ngothicizing\ngoths\ngotland\ngotten\ngotterdammerung\ngotterdämmerung\ngotthard\ngottwaldov\ngouache\ngouaches\ngouda\ngouge\ngouged\ngouger\ngougers\ngouges\ngouging\ngoulash\ngoulashes\ngounod\ngourami\ngouramis\ngourd\ngourde\ngourdes\ngourds\ngourmand\ngourmandise\ngourmandises\ngourmandism\ngourmandize\ngourmandized\ngourmandizes\ngourmandizing\ngourmandlike\ngourmands\ngourmet\ngourmets\ngout\ngoutiness\ngouts\ngoutweed\ngoutweeds\ngouty\ngovern\ngovernable\ngovernance\ngovernances\ngoverned\ngoverness\ngovernesses\ngovernessy\ngoverning\ngovernment\ngovernmental\ngovernmentalism\ngovernmentalist\ngovernmentalists\ngovernmentalize\ngovernmentalized\ngovernmentalizes\ngovernmentalizing\ngovernmentally\ngovernmentese\ngovernments\ngovernor\ngovernorate\ngovernorates\ngovernors\ngovernorship\ngovernorships\ngoverns\ngowan\ngowans\ngowany\ngown\ngowned\ngowning\ngowns\ngownsman\ngownsmen\ngoy\ngoya\ngoyim\ngoyish\ngoys\ngoût\ngraaff\ngraafian\ngrab\ngrabbed\ngrabber\ngrabbers\ngrabbier\ngrabbiest\ngrabbiness\ngrabbing\ngrabble\ngrabbled\ngrabbler\ngrabblers\ngrabbles\ngrabbling\ngrabby\ngraben\ngrabens\ngrabs\ngrace\ngraced\ngraceful\ngracefully\ngracefulness\ngraceless\ngracelessly\ngracelessness\ngraces\ngracile\ngracileness\ngracility\ngracing\ngracioso\ngraciosos\ngracious\ngraciously\ngraciousness\ngrackle\ngrackles\ngrad\ngradable\ngradate\ngradated\ngradates\ngradating\ngradation\ngradational\ngradationally\ngradations\ngrade\ngraded\ngradeless\ngrader\ngraders\ngrades\ngradient\ngradients\ngradin\ngradine\ngradines\ngrading\ngradings\ngradins\ngradiometer\ngradiometers\ngrads\ngradual\ngradualism\ngradualist\ngradualistic\ngradualists\ngradually\ngradualness\ngraduals\ngraduand\ngraduands\ngraduate\ngraduated\ngraduates\ngraduating\ngraduation\ngraduations\ngraduator\ngraduators\ngraffiti\ngraffitist\ngraffitists\ngraffito\ngraft\ngraftage\ngraftages\ngrafted\ngrafter\ngrafters\ngrafting\ngrafts\ngraham\ngrahams\ngrail\ngrails\ngrain\ngrained\ngrainer\ngrainers\ngrainfield\ngrainfields\ngrainier\ngrainiest\ngraininess\ngraining\ngrains\ngrainy\ngram\ngrama\ngramarye\ngramaryes\ngramas\ngramercy\ngramicidin\ngramineous\ngramineousness\ngraminivorous\ngramma\ngrammar\ngrammarian\ngrammarians\ngrammars\ngrammas\ngrammatical\ngrammaticality\ngrammatically\ngrammaticalness\ngrammatologic\ngrammatological\ngrammatologist\ngrammatologists\ngrammatology\ngramme\ngrammes\ngrammies\ngrammy\ngramophone\ngramophones\ngramp\ngrampian\ngramps\ngrampus\ngrampuses\ngrams\ngrana\ngranada\ngranadilla\ngranadillas\ngranaries\ngranary\ngrand\ngrandad\ngrandaddies\ngrandaddy\ngrandads\ngrandam\ngrandame\ngrandames\ngrandams\ngrandaunt\ngrandaunts\ngrandbabies\ngrandbaby\ngrandchild\ngrandchildren\ngranddad\ngranddaddies\ngranddaddy\ngranddads\ngranddaughter\ngranddaughters\ngrande\ngrandee\ngrandees\ngrander\ngrandest\ngrandeur\ngrandeurs\ngrandfather\ngrandfathered\ngrandfathering\ngrandfatherly\ngrandfathers\ngrandiloquence\ngrandiloquent\ngrandiloquently\ngrandiose\ngrandiosely\ngrandioseness\ngrandiosity\ngrandioso\ngrandkid\ngrandkids\ngrandly\ngrandma\ngrandmas\ngrandmaster\ngrandmasters\ngrandmother\ngrandmotherly\ngrandmothers\ngrandnephew\ngrandnephews\ngrandness\ngrandniece\ngrandnieces\ngrandpa\ngrandparent\ngrandparental\ngrandparenthood\ngrandparents\ngrandpas\ngrands\ngrandsir\ngrandsire\ngrandsires\ngrandsirs\ngrandson\ngrandsons\ngrandstand\ngrandstanded\ngrandstander\ngrandstanders\ngrandstanding\ngrandstands\ngranduncle\ngranduncles\ngrange\ngranger\ngrangerism\ngrangers\ngranges\ngranite\ngranites\ngraniteware\ngranitewares\ngranitic\ngranitoid\ngranivorous\ngrannie\ngrannies\ngranny\ngranola\ngranolas\ngranolith\ngranolithic\ngranoliths\ngranophyre\ngranophyres\ngranophyric\ngrant\ngrantable\ngranted\ngrantee\ngrantees\ngranter\ngranters\ngranting\ngrantor\ngrantors\ngrants\ngrantsman\ngrantsmanship\ngrantsmanships\ngrantsmen\ngranular\ngranularity\ngranularly\ngranulate\ngranulated\ngranulates\ngranulating\ngranulation\ngranulations\ngranulative\ngranulator\ngranulators\ngranule\ngranules\ngranulite\ngranulites\ngranulitic\ngranulize\ngranulized\ngranulizes\ngranulizing\ngranulocyte\ngranulocytes\ngranulocytic\ngranulocytopoiesis\ngranuloma\ngranulomas\ngranulomata\ngranulomatous\ngranulose\ngranum\ngrape\ngrapefruit\ngrapefruits\ngrapes\ngrapeshot\ngrapeshots\ngrapevine\ngrapevines\ngrapey\ngraph\ngraphed\ngrapheme\ngraphemes\ngraphemic\ngraphemically\ngraphemics\ngraphic\ngraphical\ngraphically\ngraphicness\ngraphics\ngraphing\ngraphite\ngraphites\ngraphitic\ngraphitizable\ngraphitization\ngraphitize\ngraphitized\ngraphitizes\ngraphitizing\ngraphological\ngraphologies\ngraphologist\ngraphologists\ngraphology\ngraphotype\ngraphotypes\ngraphs\ngrapier\ngrapiest\ngrapiness\ngrapnel\ngrapnels\ngrappa\ngrappas\ngrapple\ngrappled\ngrappler\ngrapplers\ngrapples\ngrappling\ngrapplings\ngraptolite\ngraptolites\ngrapy\ngras\ngrasp\ngraspable\ngrasped\ngrasper\ngraspers\ngrasping\ngraspingly\ngraspingness\ngrasps\ngrass\ngrassed\ngrasser\ngrassers\ngrasses\ngrassfire\ngrassfires\ngrasshopper\ngrasshoppers\ngrassier\ngrassiest\ngrassing\ngrassland\ngrasslands\ngrasslike\ngrassplot\ngrassplots\ngrassroots\ngrassy\ngrat\ngrata\ngrate\ngrated\ngrateful\ngratefully\ngratefulness\ngrater\ngraters\ngrates\ngratia\ngratian\ngratias\ngraticule\ngraticules\ngratification\ngratifications\ngratified\ngratifier\ngratifiers\ngratifies\ngratify\ngratifying\ngratifyingly\ngratin\ngrating\ngratingly\ngratings\ngratins\ngratis\ngratitude\ngratuities\ngratuitous\ngratuitously\ngratuitousness\ngratuity\ngratulate\ngratulated\ngratulates\ngratulating\ngratulation\ngratulations\ngratulatory\ngraupel\ngraupels\ngravamen\ngravamens\ngravamina\ngrave\ngraved\ngravedigger\ngravediggers\ngravel\ngraveled\ngraveless\ngraveling\ngravelled\ngravelling\ngravelly\ngravels\ngravely\ngraven\ngraveness\ngraver\ngravers\ngraves\ngraveside\ngravesides\ngravesite\ngravesites\ngravest\ngravestone\ngravestones\ngraveyard\ngraveyards\ngravid\ngravida\ngravidae\ngravidas\ngravidities\ngravidity\ngravidly\ngravidness\ngravies\ngravimeter\ngravimeters\ngravimetric\ngravimetrical\ngravimetrically\ngravimetry\ngraving\ngravis\ngravisphere\ngravispheres\ngravitas\ngravitate\ngravitated\ngravitater\ngravitaters\ngravitates\ngravitating\ngravitation\ngravitational\ngravitationally\ngravitations\ngravitative\ngravities\ngraviton\ngravitons\ngravity\ngravlax\ngravure\ngravures\ngravy\ngray\ngraybeard\ngraybeards\ngrayed\ngrayer\ngrayest\ngrayfish\ngrayfishes\ngraying\ngrayish\ngraylag\ngraylags\ngrayling\ngraylings\ngrayly\ngraymail\ngraymails\ngrayness\ngrays\ngraysbies\ngraysby\ngraywacke\ngraywackes\ngraz\ngrazable\ngraze\ngrazeable\ngrazed\ngrazer\ngrazers\ngrazes\ngrazier\ngraziers\ngrazing\ngrazings\ngrazioso\ngrease\ngreased\ngreaseless\ngreasepaint\ngreasepaints\ngreaseproof\ngreaser\ngreasers\ngreases\ngreasewood\ngreasier\ngreasiest\ngreasily\ngreasiness\ngreasing\ngreasy\ngreat\ngreatcoat\ngreatcoats\ngreaten\ngreatened\ngreatening\ngreatens\ngreater\ngreatest\ngreathearted\ngreatheartedly\ngreatheartedness\ngreatly\ngreatness\ngreats\ngreave\ngreaves\ngrebe\ngrebes\ngrecian\ngrecianize\ngrecianized\ngrecianizes\ngrecianizing\ngrecians\ngrecism\ngrecisms\ngrecize\ngrecized\ngrecizes\ngrecizing\ngreco\ngree\ngreece\ngreed\ngreedier\ngreediest\ngreedily\ngreediness\ngreedy\ngreeing\ngreek\ngreeks\ngreen\ngreenback\ngreenbacker\ngreenbackers\ngreenbackism\ngreenbacks\ngreenbelt\ngreenbelts\ngreenbrier\ngreenbriers\ngreenbug\ngreenbugs\ngreene\ngreened\ngreener\ngreeneries\ngreenery\ngreenest\ngreenfinch\ngreenfinches\ngreenflies\ngreenfly\ngreengage\ngreengages\ngreengrocer\ngreengroceries\ngreengrocers\ngreengrocery\ngreenhead\ngreenheads\ngreenheart\ngreenhearts\ngreenhorn\ngreenhorns\ngreenhouse\ngreenhouses\ngreenie\ngreenies\ngreening\ngreenings\ngreenish\ngreenishness\ngreenland\ngreenlander\ngreenlanders\ngreenlandic\ngreenlet\ngreenlets\ngreenling\ngreenlings\ngreenly\ngreenmail\ngreenmailer\ngreenmailers\ngreenmails\ngreenmarket\ngreenmarkets\ngreenness\ngreenockite\ngreenockites\ngreenroom\ngreenrooms\ngreens\ngreensand\ngreensands\ngreenshank\ngreenshanks\ngreensick\ngreensickness\ngreenside\ngreenskeeper\ngreenskeepers\ngreenstick\ngreenstone\ngreenstones\ngreensward\ngreenway\ngreenways\ngreenwich\ngreenwood\ngreenwoods\ngreeny\ngrees\ngreet\ngreeted\ngreeter\ngreeters\ngreeting\ngreetings\ngreets\ngregarine\ngregarines\ngregarinian\ngregarious\ngregariously\ngregariousness\ngregorian\ngregory\ngreige\ngreisen\ngreisens\ngremlin\ngremlins\ngrenada\ngrenade\ngrenades\ngrenadian\ngrenadians\ngrenadier\ngrenadiers\ngrenadine\ngrenadines\ngrendel\ngrenoble\ngresham\ngressorial\ngrew\ngrewsome\ngrex\ngrexs\ngrey\ngreyed\ngreyer\ngreyest\ngreyhen\ngreyhens\ngreyhound\ngreyhounds\ngreying\ngreyish\ngreylag\ngreylags\ngreyness\ngreys\ngribble\ngribbles\ngrid\ngridded\ngridder\ngridders\ngriddle\ngriddlecake\ngriddlecakes\ngriddled\ngriddles\ngriddling\ngridiron\ngridirons\ngridlock\ngridlocked\ngridlocking\ngridlocks\ngrids\ngrief\ngriefs\ngrieg\ngrievance\ngrievances\ngrievant\ngrievants\ngrieve\ngrieved\ngriever\ngrievers\ngrieves\ngrieving\ngrievingly\ngrievous\ngrievously\ngrievousness\ngriffin\ngriffins\ngriffon\ngriffons\ngrift\ngrifted\ngrifter\ngrifters\ngrifting\ngrifts\ngrig\ngrigri\ngrigris\ngrigs\ngrill\ngrillage\ngrillages\ngrille\ngrilled\ngriller\ngrilleries\ngrillers\ngrillery\ngrilles\ngrilling\ngrillroom\ngrillrooms\ngrills\ngrillwork\ngrilse\ngrim\ngrimace\ngrimaced\ngrimacer\ngrimacers\ngrimaces\ngrimacing\ngrimalkin\ngrimalkins\ngrime\ngrimed\ngrimes\ngrimier\ngrimiest\ngrimily\ngriminess\ngriming\ngrimly\ngrimm\ngrimmer\ngrimmest\ngrimness\ngrimsel\ngrimy\ngrin\ngrind\ngrinder\ngrinders\ngrinding\ngrindingly\ngrindings\ngrinds\ngrindstone\ngrindstones\ngringo\ngringos\ngrinned\ngrinner\ngrinners\ngrinning\ngrinningly\ngrins\ngriot\ngriots\ngrip\ngripe\ngriped\ngriper\ngripers\ngripes\ngriping\ngrippe\ngripped\ngripper\ngrippers\ngrippes\ngripping\ngrippingly\ngrippy\ngrips\ngripsack\ngripsacks\ngris\ngrisaille\ngrisailles\ngrise\ngriselda\ngriseofulvin\ngriseofulvins\ngriseous\ngrises\ngrisette\ngrisettes\ngrislier\ngrisliest\ngrisliness\ngrisly\ngrison\ngrisons\ngrist\ngristle\ngristles\ngristlier\ngristliest\ngristliness\ngristly\ngristmill\ngristmills\ngrit\ngrith\ngriths\ngrits\ngritted\ngrittier\ngrittiest\ngrittily\ngrittiness\ngritting\ngritty\ngrivet\ngrivets\ngrizzle\ngrizzled\ngrizzles\ngrizzlier\ngrizzlies\ngrizzliest\ngrizzling\ngrizzly\ngroan\ngroaned\ngroaner\ngroaners\ngroaning\ngroaningly\ngroans\ngroat\ngroats\ngroatss\ngrocer\ngroceries\ngrocers\ngrocery\ngrog\ngroggier\ngroggiest\ngroggily\ngrogginess\ngroggy\ngrogram\ngrograms\ngrogs\ngrogshop\ngrogshops\ngroin\ngroined\ngroining\ngroins\ngrok\ngrokked\ngrokking\ngroks\ngrolier\ngrommet\ngrommets\ngromwell\ngromwells\ngroom\ngroomed\ngroomer\ngroomers\ngrooming\ngrooms\ngroomsman\ngroomsmen\ngroove\ngrooved\ngroover\ngroovers\ngrooves\ngroovier\ngrooviest\ngrooviness\ngrooving\ngroovy\ngrope\ngroped\ngroper\ngropers\ngropes\ngroping\ngropingly\ngropings\ngrosbeak\ngrosbeaks\ngroschen\ngrosgrain\ngrosgrains\ngross\ngrossed\ngrosser\ngrossers\ngrosses\ngrossest\ngrossglockner\ngrossing\ngrossly\ngrossness\ngrossular\ngrossularite\ngrossularites\ngrossulars\ngrosz\ngroszy\ngrot\ngrotesque\ngrotesquely\ngrotesqueness\ngrotesquerie\ngrotesqueries\ngrotesquery\ngrotesques\ngrots\ngrottier\ngrottiest\ngrottiness\ngrotto\ngrottoes\ngrottos\ngrotty\ngrouch\ngrouched\ngrouches\ngrouchier\ngrouchiest\ngrouchily\ngrouchiness\ngrouching\ngrouchy\nground\ngroundbreaker\ngroundbreakers\ngroundbreaking\ngroundbreakings\ngrounded\ngrounder\ngrounders\ngroundhog\ngroundhogs\ngrounding\ngroundkeeper\ngroundkeepers\ngroundless\ngroundlessly\ngroundlessness\ngroundling\ngroundlings\ngroundmass\ngroundmasses\ngroundnut\ngroundnuts\ngroundout\ngroundouts\ngrounds\ngroundsel\ngroundsels\ngroundsheet\ngroundsheets\ngroundside\ngroundsides\ngroundsill\ngroundsills\ngroundskeeper\ngroundskeepers\ngroundskeeping\ngroundsman\ngroundsmen\ngroundstroke\ngroundstrokes\ngroundswell\ngroundswells\ngroundwater\ngroundwork\ngroup\ngroupable\ngrouped\ngrouper\ngroupers\ngroupie\ngroupies\ngrouping\ngroupings\ngroups\ngroupthink\ngroupthinks\ngrouse\ngroused\ngrouser\ngrousers\ngrouses\ngrousing\ngrout\ngrouted\ngrouter\ngrouters\ngrouting\ngrouts\ngrove\ngrovel\ngroveled\ngroveler\ngrovelers\ngroveling\ngrovelingly\ngrovelled\ngrovelling\ngrovels\ngroves\ngrow\ngrower\ngrowers\ngrowing\ngrowingly\ngrowl\ngrowled\ngrowler\ngrowlers\ngrowlier\ngrowliest\ngrowliness\ngrowling\ngrowlingly\ngrowls\ngrowly\ngrown\ngrownup\ngrownups\ngrows\ngrowth\ngrowths\ngroyne\ngroynes\ngrub\ngrubbed\ngrubber\ngrubbers\ngrubbier\ngrubbiest\ngrubbily\ngrubbiness\ngrubbing\ngrubby\ngrubs\ngrubstake\ngrubstaked\ngrubstaker\ngrubstakers\ngrubstakes\ngrubstaking\ngrudge\ngrudged\ngrudger\ngrudgers\ngrudges\ngrudging\ngrudgingly\ngrudziadz\ngruel\ngrueling\ngruelingly\ngruelling\ngruesome\ngruesomely\ngruesomeness\ngruff\ngruffer\ngruffest\ngruffly\ngruffness\ngrumble\ngrumbled\ngrumbler\ngrumblers\ngrumbles\ngrumbling\ngrumblingly\ngrumbly\ngrummet\ngrummets\ngrump\ngrumped\ngrumpier\ngrumpiest\ngrumpily\ngrumpiness\ngrumping\ngrumps\ngrumpy\ngrundy\ngrunge\ngrunges\ngrungier\ngrungiest\ngrungy\ngrunion\ngrunions\ngrunt\ngrunted\ngrunter\ngrunters\ngrunting\ngruntingly\ngruntle\ngruntled\ngruntles\ngruntling\ngrunts\ngrus\ngrutten\ngruyere\ngruyère\ngryphon\ngryphons\ngrâce\nguacamole\nguacharo\nguacharos\nguadalajara\nguadalcanal\nguadalquivir\nguadalupe\nguadeloupe\nguadeloupian\nguadeloupians\nguaiac\nguaiacol\nguaiacols\nguaiacs\nguaiacum\nguaiacums\nguam\nguamanian\nguamanians\nguan\nguanabara\nguanaco\nguanacos\nguanethidine\nguanethidines\nguangdong\nguangxi\nguangzhou\nguanidine\nguanine\nguanines\nguano\nguanos\nguanosine\nguanosines\nguans\nguantánamo\nguanylic\nguaporé\nguar\nguarani\nguaranies\nguaranis\nguarantee\nguaranteed\nguaranteeing\nguarantees\nguarantied\nguaranties\nguarantor\nguarantors\nguaranty\nguarantying\nguard\nguardant\nguardants\nguarded\nguardedly\nguardedness\nguarder\nguarders\nguardhouse\nguardhouses\nguardian\nguardians\nguardianship\nguardianships\nguarding\nguardmember\nguardmembers\nguardrail\nguardrails\nguardroom\nguardrooms\nguards\nguardsman\nguardsmen\nguarneri\nguarnerius\nguars\nguatemala\nguatemalan\nguatemalans\nguava\nguavas\nguayaquil\nguayule\nguayules\ngubernator\ngubernatorial\ngubernators\nguck\ngudgeon\ngudgeons\ngudrun\nguelder\nguelf\nguelfs\nguelph\nguelphs\nguenevere\nguenon\nguenons\nguerdon\nguerdoned\nguerdoning\nguerdons\ngueridon\ngueridons\nguerilla\nguerillas\nguernica\nguernsey\nguernseys\nguerre\nguerrilla\nguerrillas\nguess\nguessed\nguesser\nguessers\nguesses\nguessing\nguesstimate\nguesstimated\nguesstimates\nguesstimating\nguesswork\nguest\nguested\nguesthouse\nguesthouses\nguesting\nguestroom\nguestrooms\nguests\nguff\nguffaw\nguffawed\nguffawing\nguffaws\nguffs\nguggenheim\nguggle\nguggled\nguggles\nguggling\nguianese\nguidable\nguidance\nguide\nguideboard\nguideboards\nguidebook\nguidebooks\nguided\nguideline\nguidelines\nguidepost\nguideposts\nguider\nguiders\nguides\nguideway\nguideways\nguideword\nguidewords\nguiding\nguidon\nguidons\nguienne\nguignol\nguild\nguildenstern\nguilder\nguilders\nguildhall\nguildhalls\nguilds\nguildship\nguildsman\nguildsmen\nguile\nguiled\nguileful\nguilefully\nguilefulness\nguileless\nguilelessly\nguilelessness\nguiles\nguiling\nguillemot\nguillemots\nguilloche\nguilloches\nguillotine\nguillotined\nguillotines\nguillotining\nguilt\nguiltier\nguiltiest\nguiltily\nguiltiness\nguiltless\nguiltlessly\nguiltlessness\nguilty\nguimpe\nguimpes\nguinea\nguinean\nguineans\nguineas\nguinevere\nguinness\nguipure\nguipures\nguiro\nguisard\nguisards\nguise\nguises\nguitar\nguitarfish\nguitarfishes\nguitarist\nguitarists\nguitars\ngujarat\ngujarati\ngujaratis\ngujerati\ngujeratis\ngujranwala\ngul\ngulag\ngulags\ngular\ngulch\ngulches\ngulden\nguldens\ngules\nguleses\ngulf\ngulfed\ngulfing\ngulfs\ngulfweed\ngulfweeds\ngull\ngullability\ngullable\ngullably\ngullah\ngulled\ngullet\ngullets\ngulley\ngullibility\ngullible\ngullibly\ngullied\ngullies\ngulling\ngulliver\ngulls\ngullwing\ngully\ngullying\ngulosities\ngulosity\ngulp\ngulped\ngulper\ngulpers\ngulping\ngulpingly\ngulps\nguls\ngum\ngumball\ngumballs\ngumbo\ngumboil\ngumboils\ngumbos\ngumdrop\ngumdrops\ngumma\ngummas\ngummata\ngummatous\ngummed\ngummer\ngummers\ngummier\ngummiest\ngumminess\ngumming\ngummite\ngummites\ngummose\ngummoses\ngummosis\ngummous\ngummy\ngumption\ngums\ngumshoe\ngumshoed\ngumshoeing\ngumshoes\ngumwood\ngumwoods\ngun\ngunboat\ngunboats\nguncotton\ngundog\ngundogs\ngunfight\ngunfighter\ngunfighters\ngunfights\ngunfire\ngunflint\ngunflints\ngung\ngunite\ngunites\ngunk\ngunky\ngunlock\ngunlocks\ngunman\ngunmen\ngunmetal\ngunmetals\ngunnar\ngunnbjørn\ngunned\ngunnel\ngunnels\ngunner\ngunnera\ngunneras\ngunneries\ngunners\ngunnery\ngunnies\ngunning\ngunnings\ngunny\ngunnysack\ngunnysacks\ngunplay\ngunpoint\ngunpoints\ngunpowder\ngunpowders\ngunroom\ngunrooms\ngunrunner\ngunrunners\ngunrunning\nguns\ngunsel\ngunsels\ngunship\ngunships\ngunshot\ngunshots\ngunslinger\ngunslingers\ngunslinging\ngunsmith\ngunsmiths\ngunstock\ngunstocks\ngunther\ngunwale\ngunwales\nguoyu\nguoyus\nguppies\nguppy\ngurdies\ngurdy\ngurgitation\ngurgitations\ngurgle\ngurgled\ngurgles\ngurgling\ngurglingly\ngurkha\ngurkhas\ngurnard\ngurnards\ngurney\ngurneys\ngurries\ngurry\nguru\ngurus\ngush\ngushed\ngusher\ngushers\ngushes\ngushier\ngushiest\ngushily\ngushiness\ngushing\ngushingly\ngushy\ngusset\ngusseted\ngusseting\ngussets\ngussied\ngussies\ngussy\ngussying\ngust\ngustation\ngustations\ngustative\ngustatorily\ngustatory\ngustavus\ngusted\ngustier\ngustiest\ngustily\ngustiness\ngusting\ngusto\ngustoes\ngusts\ngusty\ngut\ngutbucket\ngutbuckets\ngutenberg\nguthrie\nguthrun\ngutless\ngutlessly\ngutlessness\nguts\ngutsier\ngutsiest\ngutsily\ngutsiness\ngutsy\ngutta\nguttae\nguttate\nguttated\nguttation\nguttations\ngutted\ngutter\nguttered\nguttering\ngutters\nguttersnipe\nguttersnipes\nguttersnipish\nguttier\nguttiest\ngutting\nguttural\ngutturalism\ngutturality\ngutturalization\ngutturalizations\ngutturalize\ngutturalized\ngutturalizes\ngutturalizing\ngutturally\ngutturalness\ngutturals\ngutty\nguy\nguyana\nguyanese\nguyed\nguyenne\nguying\nguyot\nguyots\nguys\nguzzle\nguzzled\nguzzler\nguzzlers\nguzzles\nguzzling\ngweduc\ngweducs\ngwent\ngwynedd\ngybe\ngybed\ngybes\ngybing\ngym\ngymkhana\ngymkhanas\ngymnasia\ngymnasium\ngymnasiums\ngymnast\ngymnastic\ngymnastically\ngymnastics\ngymnasts\ngymnosophist\ngymnosophists\ngymnosperm\ngymnospermous\ngymnosperms\ngymnospermy\ngyms\ngynandries\ngynandromorph\ngynandromorphic\ngynandromorphism\ngynandromorphous\ngynandromorphy\ngynandrous\ngynandry\ngynarchic\ngynarchies\ngynarchy\ngynecocracies\ngynecocracy\ngynecocratic\ngynecoid\ngynecologic\ngynecological\ngynecologist\ngynecologists\ngynecology\ngynecomastia\ngynecopathies\ngynecopathy\ngynocracies\ngynocracy\ngynodioecious\ngynodioecism\ngynoecia\ngynoecium\ngynogenesis\ngynophore\ngynophores\ngynophoric\ngyoza\ngyozas\ngyoár\ngyp\ngypped\ngypper\ngyppers\ngypping\ngyps\ngypseous\ngypsied\ngypsies\ngypsiferous\ngypsophila\ngypsophilas\ngypsophile\ngypsophiles\ngypsum\ngypsums\ngypsy\ngypsying\ngyral\ngyrally\ngyrate\ngyrated\ngyrates\ngyrating\ngyration\ngyrational\ngyrations\ngyrator\ngyrators\ngyratory\ngyre\ngyred\ngyrene\ngyrenes\ngyres\ngyrfalcon\ngyrfalcons\ngyri\ngyring\ngyro\ngyrocompass\ngyrocompasses\ngyrofrequency\ngyromagnetic\ngyron\ngyrons\ngyroplane\ngyroplanes\ngyros\ngyroscope\ngyroscopes\ngyroscopic\ngyroscopically\ngyrostabilizer\ngyrostabilizers\ngyrostat\ngyrostatic\ngyrostatically\ngyrostats\ngyrus\ngyve\ngyved\ngyves\ngyving\ngâteau\ngâteaux\ngît\ngöta\ngöteborg\ngötterdämmerung\ngötterdämmerungs\ngöttingen\ngütersloh\nh\nha\nhaakon\nhaarlem\nhaarlemmermeer\nhabakkuk\nhabanera\nhabaneras\nhabdalah\nhabdalahs\nhabeas\nhaber\nhaberdasher\nhaberdasheries\nhaberdashers\nhaberdashery\nhabergeon\nhabergeons\nhabile\nhabiliment\nhabiliments\nhabilitate\nhabilitated\nhabilitates\nhabilitating\nhabilitation\nhabilitations\nhabit\nhabitability\nhabitable\nhabitableness\nhabitably\nhabitan\nhabitans\nhabitant\nhabitants\nhabitat\nhabitation\nhabitations\nhabitats\nhabited\nhabiting\nhabits\nhabitual\nhabitually\nhabitualness\nhabituate\nhabituated\nhabituates\nhabituating\nhabituation\nhabituations\nhabitude\nhabitudes\nhabitus\nhabitué\nhabitués\nhaboob\nhaboobs\nhabsburg\nhabsburgs\nhacek\nhaceks\nhachinohe\nhachioji\nhachure\nhachured\nhachures\nhachuring\nhacienda\nhaciendas\nhack\nhackable\nhackamore\nhackamores\nhackberries\nhackberry\nhackbut\nhackbuteer\nhackbuteers\nhackbuts\nhackbutter\nhackbutters\nhacked\nhackensack\nhacker\nhackers\nhackie\nhackies\nhacking\nhackle\nhackleback\nhacklebacks\nhackled\nhackler\nhacklers\nhackles\nhackling\nhackly\nhackman\nhackmatack\nhackmatacks\nhackmen\nhackney\nhackneyed\nhackneying\nhackneys\nhacks\nhacksaw\nhacksawed\nhacksawing\nhacksaws\nhackwork\nhad\nhadal\nhaddie\nhaddock\nhaddocks\nhade\nhadean\nhades\nhadith\nhadj\nhadjes\nhadji\nhadjis\nhadley\nhadn\nhadn't\nhadrian\nhadron\nhadronic\nhadrons\nhadrosaur\nhadrosaurs\nhadst\nhae\nhaeckel\nhaed\nhaeing\nhaen\nhaes\nhaet\nhaets\nhafez\nhaffet\nhaffets\nhafiz\nhafizes\nhafnium\nhaft\nhaftarah\nhafted\nhafting\nhaftorah\nhafts\nhafun\nhag\nhagar\nhagen\nhagerstown\nhagfish\nhagfishes\nhaggada\nhaggadah\nhaggadic\nhaggadist\nhaggadistic\nhaggadists\nhaggadoth\nhaggai\nhaggard\nhaggardly\nhaggardness\nhaggards\nhaggis\nhaggises\nhaggish\nhaggishly\nhaggishness\nhaggle\nhaggled\nhaggler\nhagglers\nhaggles\nhaggling\nhagiarchies\nhagiarchy\nhagiocracies\nhagiocracy\nhagiographa\nhagiographer\nhagiographers\nhagiographic\nhagiographical\nhagiographies\nhagiography\nhagiolatries\nhagiolatry\nhagiologic\nhagiological\nhagiologies\nhagiologist\nhagiologists\nhagiology\nhagioscope\nhagioscopes\nhagioscopic\nhagridden\nhagride\nhagrides\nhagriding\nhagrode\nhags\nhague\nhah\nhahn\nhahnemann\nhahnium\nhaick\nhaida\nhaidan\nhaidas\nhaifa\nhaig\nhaighthaicks\nhaik\nhaikou\nhaiks\nhaiku\nhaikus\nhail\nhaile\nhailed\nhailer\nhailers\nhailing\nhails\nhailstone\nhailstones\nhailstorm\nhailstorms\nhaimish\nhainan\nhainault\nhainaut\nhaiphong\nhair\nhairball\nhairballs\nhairbreadth\nhairbreadths\nhairbrush\nhairbrushes\nhaircloth\nhaircloths\nhaircut\nhaircuts\nhaircutter\nhaircutters\nhaircutting\nhaircuttings\nhairdo\nhairdos\nhairdresser\nhairdressers\nhairdressing\nhairdressings\nhairdryer\nhairdryers\nhaired\nhairier\nhairiest\nhairiness\nhairless\nhairlessness\nhairlike\nhairline\nhairlines\nhairnet\nhairnets\nhairpiece\nhairpieces\nhairpin\nhairpins\nhairs\nhairsbreadth\nhairsbreadths\nhairsplitter\nhairsplitters\nhairsplitting\nhairsplittings\nhairspray\nhairsprays\nhairspring\nhairsprings\nhairstreak\nhairstreaks\nhairstyle\nhairstyles\nhairstyling\nhairstylings\nhairstylist\nhairstylists\nhairweave\nhairweaver\nhairweavers\nhairweaves\nhairweaving\nhairweavings\nhairworm\nhairworms\nhairwove\nhairwoven\nhairy\nhaiti\nhaitian\nhaitians\nhaj\nhajes\nhaji\nhajis\nhajj\nhajjes\nhajji\nhajjis\nhaka\nhakas\nhake\nhakeem\nhakeems\nhakenkreuz\nhakenkreuzes\nhakes\nhakim\nhakims\nhakluyt\nhakodate\nhaku\nhakus\nhalacha\nhalachas\nhalakah\nhalakahs\nhalakic\nhalal\nhalala\nhalalas\nhalals\nhalation\nhalations\nhalavah\nhalavahs\nhalberd\nhalberdier\nhalberdiers\nhalberds\nhalbert\nhalberts\nhalcyon\nhalcyons\nhaldane\nhale\nhaleakala\nhaled\nhaleness\nhaler\nhalers\nhaleru\nhales\nhalest\nhalethorpe\nhaley\nhalf\nhalfback\nhalfbacks\nhalfbeak\nhalfbeaks\nhalfcocked\nhalfhearted\nhalfheartedly\nhalfheartedness\nhalfness\nhalfpence\nhalfpennies\nhalfpenny\nhalfpennyworth\nhalftime\nhalftimes\nhalftone\nhalftones\nhalftoning\nhalfway\nhalfwit\nhalfwits\nhalfword\nhalfwords\nhalibut\nhalibuts\nhalicarnassus\nhalide\nhalides\nhalidom\nhalidome\nhalidomes\nhalidoms\nhalifax\nhaling\nhalite\nhalitosis\nhall\nhallah\nhallahs\nhallandale\nhallel\nhallels\nhallelujah\nhallelujahs\nhalley\nhalliard\nhalliards\nhallmark\nhallmarked\nhallmarking\nhallmarks\nhallo\nhalloa\nhalloaed\nhalloaing\nhalloas\nhalloed\nhalloo\nhallooed\nhallooing\nhalloos\nhallos\nhallow\nhallowe\nhallowe'en\nhallowe'ens\nhallowed\nhalloween\nhalloweens\nhallowing\nhallowmas\nhallowmases\nhallowmass\nhallows\nhalls\nhallstatt\nhalluces\nhallucinate\nhallucinated\nhallucinates\nhallucinating\nhallucination\nhallucinational\nhallucinations\nhallucinative\nhallucinator\nhallucinators\nhallucinatory\nhallucinogen\nhallucinogenic\nhallucinogens\nhallucinosis\nhallux\nhallway\nhallways\nhalma\nhalmahera\nhalo\nhalobiont\nhalobionts\nhalocarbon\nhalocarbons\nhalocline\nhaloclines\nhaloed\nhaloes\nhalogen\nhalogenate\nhalogenated\nhalogenates\nhalogenating\nhalogenation\nhalogenations\nhalogenous\nhalogens\nhaloing\nhalomorphic\nhalon\nhalons\nhaloperidol\nhalophile\nhalophiles\nhalophilic\nhalophilous\nhalophyte\nhalophytes\nhalophytic\nhalos\nhalothane\nhalothanes\nhalsted\nhalt\nhalted\nhaltemprice\nhalter\nhalterbreak\nhalterbreaking\nhalterbreaks\nhalterbroke\nhalterbroken\nhaltere\nhaltered\nhalteres\nhaltering\nhalters\nhalting\nhaltingly\nhalts\nhalva\nhalvah\nhalvahs\nhalvas\nhalve\nhalved\nhalvers\nhalves\nhalving\nhalyard\nhalyards\nhalévy\nham\nhama\nhamadan\nhamadryad\nhamadryades\nhamadryads\nhamadryas\nhamadryases\nhamah\nhamal\nhamals\nhamamatsu\nhaman\nhamartia\nhamartias\nhamate\nhamates\nhamburg\nhamburger\nhamburgers\nhamburgs\nhamden\nhame\nhamelin\nhameln\nhames\nhamilcar\nhamilton\nhamiltonian\nhamiltonians\nhamite\nhamites\nhamitic\nhamitics\nhamito\nhamlet\nhamlets\nhamlin\nhammal\nhammals\nhammarskjöld\nhammed\nhammer\nhammered\nhammerer\nhammerers\nhammerfest\nhammerhead\nhammerheads\nhammering\nhammerkop\nhammerkops\nhammerless\nhammerlock\nhammerlocks\nhammers\nhammerstein\nhammertoe\nhammertoes\nhammier\nhammiest\nhammily\nhamminess\nhamming\nhammock\nhammocks\nhammond\nhammurabi\nhammy\nhamper\nhampered\nhampering\nhampers\nhampshire\nhampton\nhams\nhamster\nhamsters\nhamstring\nhamstringing\nhamstrings\nhamstrung\nhamtramck\nhamuli\nhamulus\nhamza\nhamzah\nhamzahs\nhamzas\nhan\nhanau\nhancock\nhand\nhandan\nhandbag\nhandbags\nhandball\nhandballs\nhandbarrow\nhandbarrows\nhandbill\nhandbills\nhandblown\nhandbook\nhandbooks\nhandbrake\nhandbrakes\nhandbreadth\nhandbreadths\nhandcar\nhandcars\nhandcart\nhandcarts\nhandclap\nhandclaps\nhandclasp\nhandclasps\nhandcraft\nhandcrafted\nhandcrafter\nhandcrafters\nhandcrafting\nhandcraftmanship\nhandcrafts\nhandcraftsman\nhandcraftsmanship\nhandcraftsmen\nhandcuff\nhandcuffed\nhandcuffing\nhandcuffs\nhanded\nhandedly\nhandedness\nhandel\nhandelian\nhander\nhanders\nhandfast\nhandfasts\nhandful\nhandfuls\nhandgrip\nhandgrips\nhandgun\nhandguns\nhandheld\nhandhelds\nhandhold\nhandholding\nhandholdings\nhandholds\nhandicap\nhandicapped\nhandicapper\nhandicappers\nhandicapping\nhandicaps\nhandicraft\nhandicrafter\nhandicrafters\nhandicrafts\nhandicraftsman\nhandicraftsmen\nhandicraftswoman\nhandicraftswomen\nhandier\nhandies\nhandiest\nhandily\nhandiness\nhanding\nhandiwork\nhandkerchief\nhandkerchiefs\nhandkerchieves\nhandle\nhandleable\nhandlebar\nhandlebars\nhandled\nhandleless\nhandler\nhandlers\nhandles\nhandless\nhandlin\nhandling\nhandlings\nhandlist\nhandlists\nhandloom\nhandlooms\nhandmade\nhandmaid\nhandmaiden\nhandmaidens\nhandmaids\nhandoff\nhandoffs\nhandout\nhandouts\nhandpick\nhandpicked\nhandpicking\nhandpicks\nhandpress\nhandpresses\nhandprint\nhandprints\nhandrail\nhandrails\nhands\nhandsaw\nhandsaws\nhandsbreadth\nhandsel\nhandseled\nhandseling\nhandselled\nhandselling\nhandsels\nhandset\nhandsets\nhandsful\nhandshake\nhandshakes\nhandshaking\nhandsome\nhandsomely\nhandsomeness\nhandsomer\nhandsomest\nhandspike\nhandspikes\nhandspring\nhandsprings\nhandstand\nhandstands\nhandwheel\nhandwheels\nhandwork\nhandworker\nhandworkers\nhandwoven\nhandwringer\nhandwringers\nhandwringing\nhandwringings\nhandwrite\nhandwrites\nhandwriting\nhandwritings\nhandwritten\nhandwrote\nhandwrought\nhandy\nhandyman\nhandymen\nhang\nhangable\nhangar\nhangars\nhangchou\nhangchow\nhangdog\nhangdogs\nhanged\nhanger\nhangers\nhanging\nhangings\nhangman\nhangmen\nhangnail\nhangnails\nhangout\nhangouts\nhangover\nhangovers\nhangs\nhangtag\nhangtags\nhangzhou\nhank\nhanker\nhankered\nhankerer\nhankerers\nhankering\nhankerings\nhankers\nhankie\nhankies\nhanks\nhanky\nhannibal\nhanno\nhannover\nhanoi\nhanover\nhanoverian\nhanoverians\nhans\nhansa\nhansard\nhansards\nhanse\nhanseatic\nhansel\nhanseled\nhanseling\nhanselled\nhanselling\nhansels\nhansen\nhansen's\nhanses\nhansom\nhansoms\nhantan\nhantavirus\nhanukah\nhanukkah\nhanukkahs\nhanuman\nhanumans\nhao\nhaole\nhaoles\nhaos\nhap\nhapax\nhaphazard\nhaphazardly\nhaphazardness\nhaphazardry\nhaphtarah\nhaphtaroth\nhaphtoros\nhaphtorot\nhaphtoroth\nhapless\nhaplessly\nhaplessness\nhaplite\nhaplites\nhaploid\nhaploidies\nhaploids\nhaploidy\nhaplology\nhaplont\nhaplonts\nhaplosis\nhaply\nhapped\nhappen\nhappenchance\nhappenchances\nhappened\nhappening\nhappenings\nhappens\nhappenstance\nhappenstances\nhappi\nhappier\nhappiest\nhappily\nhappiness\nhappinesses\nhapping\nhappy\nhaps\nhapsburg\nhapsburgs\nhapten\nhaptene\nhaptenes\nhaptenic\nhaptens\nhaptic\nhaptoglobin\nhaptoglobins\nhara\nharan\nharangue\nharangued\nharanguer\nharanguers\nharangues\nharanguing\nharappa\nharare\nharass\nharassed\nharasser\nharassers\nharasses\nharassing\nharassment\nharassments\nharbinger\nharbingered\nharbingering\nharbingers\nharbor\nharborage\nharborages\nharbored\nharborer\nharborers\nharborful\nharboring\nharborless\nharbormaster\nharbormasters\nharbors\nharbour\nharboured\nharbourer\nharbourers\nharbouring\nharbours\nhard\nhardback\nhardbacks\nhardball\nhardballs\nhardboard\nhardboards\nhardboiled\nhardboot\nhardboots\nhardbound\nhardbounds\nhardcase\nhardcopies\nhardcopy\nhardcore\nhardcover\nhardcovers\nhardecanute\nhardedge\nhardedges\nharden\nhardened\nhardener\nhardeners\nhardening\nhardenings\nhardens\nharder\nhardest\nhardfisted\nhardhack\nhardhacks\nhardhanded\nhardhandedness\nhardhat\nhardhats\nhardhead\nhardheaded\nhardheadedly\nhardheadedness\nhardheads\nhardhearted\nhardheartedly\nhardheartedness\nhardicanute\nhardier\nhardies\nhardiest\nhardihood\nhardily\nhardiment\nhardiness\nhardly\nhardmouthed\nhardness\nhardnesses\nhardpan\nhardpans\nhardscrabble\nhardscrabbles\nhardship\nhardships\nhardstand\nhardstanding\nhardstands\nhardtack\nhardtacks\nhardtop\nhardtops\nhardware\nhardwire\nhardwired\nhardwires\nhardwiring\nhardwood\nhardwoods\nhardworking\nhardy\nhare\nharebell\nharebells\nharebrain\nharebrained\nharebrains\nhared\nharelip\nharelipped\nharelips\nharem\nharems\nhares\nharicot\nharicots\nharijan\nharijans\nharing\nhark\nharked\nharken\nharkened\nharkening\nharkens\nharking\nharks\nharlem\nharlemite\nharlemites\nharlequin\nharlequinade\nharlequinades\nharlequins\nharlot\nharlotries\nharlotry\nharlots\nharlow\nharm\nharmattan\nharmattans\nharmed\nharmer\nharmers\nharmful\nharmfully\nharmfulness\nharming\nharmless\nharmlessly\nharmlessness\nharmolodic\nharmonic\nharmonica\nharmonically\nharmonicas\nharmonics\nharmonies\nharmonious\nharmoniously\nharmoniousness\nharmonist\nharmonistic\nharmonistically\nharmonists\nharmonium\nharmoniums\nharmonization\nharmonizations\nharmonize\nharmonized\nharmonizer\nharmonizers\nharmonizes\nharmonizing\nharmony\nharms\nharness\nharnessed\nharnesser\nharnessers\nharnesses\nharnessing\nharney\nharold\nharp\nharped\nharper\nharpers\nharpies\nharping\nharpist\nharpists\nharpoon\nharpooned\nharpooner\nharpooners\nharpooning\nharpoons\nharps\nharpsichord\nharpsichordist\nharpsichordists\nharpsichords\nharpy\nharquebus\nharquebuses\nharquebusier\nharquebusiers\nharran\nharridan\nharridans\nharried\nharrier\nharriers\nharries\nharriman\nharrington\nharris\nharrisburg\nharrison\nharrisonburg\nharrow\nharrowed\nharrower\nharrowers\nharrowing\nharrows\nharrumph\nharrumphed\nharrumphing\nharrumphs\nharry\nharrying\nharsh\nharshen\nharshened\nharshening\nharshens\nharsher\nharshest\nharshly\nharshness\nharslet\nharslets\nhart\nhartebeest\nhartebeests\nhartford\nharts\nhartshorn\nhartshorns\nharum\nharuspex\nharuspication\nharuspications\nharuspices\nharvard\nharvest\nharvestability\nharvestable\nharvested\nharvester\nharvesters\nharvesting\nharvestman\nharvestmen\nharvests\nharvesttime\nharvesttimes\nharvey\nharyana\nharz\nhas\nhasdrubal\nhasenpfeffer\nhasenpfeffers\nhash\nhashana\nhashanah\nhashed\nhasheesh\nhashemite\nhashemites\nhasher\nhashers\nhashes\nhashimite\nhashimites\nhashing\nhashish\nhashishes\nhashona\nhashonah\nhasid\nhasidic\nhasidim\nhasidism\nhaslet\nhaslets\nhasmonaean\nhasmonean\nhasn\nhasn't\nhasp\nhasped\nhasping\nhasps\nhassid\nhassium\nhassle\nhassled\nhassles\nhassling\nhassock\nhassocks\nhast\nhasta\nhastate\nhastately\nhaste\nhasted\nhasten\nhastened\nhastener\nhasteners\nhastening\nhastens\nhastes\nhastier\nhastiest\nhastily\nhastiness\nhasting\nhastings\nhasty\nhat\nhatband\nhatbands\nhatbox\nhatboxes\nhatch\nhatchability\nhatchable\nhatchback\nhatchbacks\nhatcheck\nhatchecks\nhatched\nhatchel\nhatcheled\nhatcheling\nhatchelled\nhatchelling\nhatchels\nhatcher\nhatcheries\nhatchers\nhatchery\nhatches\nhatchet\nhatchets\nhatching\nhatchings\nhatchling\nhatchlings\nhatchment\nhatchments\nhatchway\nhatchways\nhate\nhated\nhateful\nhatefully\nhatefulness\nhater\nhaters\nhates\nhath\nhating\nhatless\nhatmaker\nhatmakers\nhatpin\nhatpins\nhatred\nhatreds\nhats\nhatshepsut\nhatted\nhatter\nhatteras\nhatters\nhattiesburg\nhatting\nhaubergeon\nhaubergeons\nhauberk\nhauberks\nhaugh\nhaughs\nhaughtier\nhaughtiest\nhaughtily\nhaughtiness\nhaughty\nhaul\nhaulage\nhaulages\nhauled\nhauler\nhaulers\nhauling\nhaulm\nhaulms\nhauls\nhaunch\nhaunches\nhaunt\nhaunted\nhaunter\nhaunters\nhaunting\nhauntingly\nhaunts\nhauraki\nhausa\nhausas\nhausfrau\nhausfraus\nhaustella\nhaustellate\nhaustellum\nhaustoria\nhaustorial\nhaustorium\nhaut\nhautbois\nhautboy\nhautboys\nhaute\nhauteur\nhavana\nhavanan\nhavanans\nhavant\nhavasupai\nhavasupais\nhavdalah\nhavdalahs\nhave\nhaveli\nhavelock\nhavelocks\nhaven\nhaven't\nhavened\nhavening\nhavens\nhaver\nhavered\nhavering\nhavers\nhaversack\nhaversacks\nhaversian\nhaves\nhaving\nhavoc\nhavocked\nhavocking\nhavocs\nhavre\nhaw\nhawaii\nhawaiian\nhawaiians\nhawed\nhawfinch\nhawfinches\nhawing\nhawk\nhawked\nhawker\nhawkers\nhawkeye\nhawkeyes\nhawking\nhawkins\nhawkish\nhawkishly\nhawkishness\nhawkmoth\nhawkmoths\nhawks\nhawksbill\nhawksbills\nhawkshaw\nhawkshaws\nhawkweed\nhawkweeds\nhaworthia\nhaworthias\nhaws\nhawse\nhawsehole\nhawseholes\nhawser\nhawsers\nhawses\nhawthorn\nhawthorne\nhawthorns\nhay\nhaycock\nhaycocks\nhaydn\nhayed\nhayer\nhayers\nhayes\nhayfield\nhayfields\nhayfork\nhayforks\nhaying\nhaylage\nhaylages\nhayloft\nhaylofts\nhaymaker\nhaymakers\nhaymaking\nhaymow\nhaymows\nhayrack\nhayracks\nhayrick\nhayricks\nhayride\nhayrides\nhays\nhayseed\nhayseeds\nhaystack\nhaystacks\nhaywire\nhazan\nhazanim\nhazard\nhazarded\nhazarding\nhazardous\nhazardously\nhazardousness\nhazards\nhaze\nhazed\nhazel\nhazelnut\nhazelnuts\nhazels\nhazer\nhazers\nhazes\nhazier\nhaziest\nhazily\nhaziness\nhazing\nhazings\nhazleton\nhazlitt\nhazy\nhazzan\nhazzans\nhe\nhe'd\nhe'll\nhe's\nhead\nheadache\nheadaches\nheadachy\nheadband\nheadbands\nheadboard\nheadboards\nheadcheese\nheadcount\nheadcounter\nheadcounters\nheadcounts\nheaddress\nheaddresses\nheaded\nheadedness\nheader\nheaders\nheadfast\nheadfasts\nheadfirst\nheadforemost\nheadful\nheadfuls\nheadgate\nheadgates\nheadgear\nheadhunt\nheadhunted\nheadhunter\nheadhunters\nheadhunting\nheadhunts\nheadier\nheadiest\nheadily\nheadiness\nheading\nheadings\nheadlamp\nheadlamps\nheadland\nheadlands\nheadless\nheadlessness\nheadlight\nheadlights\nheadline\nheadlined\nheadliner\nheadliners\nheadlines\nheadlining\nheadlock\nheadlocks\nheadlong\nheadman\nheadmaster\nheadmasters\nheadmastership\nheadmen\nheadmistress\nheadmistresses\nheadmost\nheadnote\nheadnotes\nheadphone\nheadphones\nheadpiece\nheadpieces\nheadpin\nheadpins\nheadquarter\nheadquartered\nheadquartering\nheadquarters\nheadrace\nheadraces\nheadrest\nheadrests\nheadroom\nheads\nheadsail\nheadsails\nheadscarf\nheadscarfs\nheadscarves\nheadset\nheadsets\nheadshake\nheadshakes\nheadshaking\nheadship\nheadships\nheadshot\nheadshots\nheadshrinker\nheadshrinkers\nheadsman\nheadsmen\nheadspace\nheadspaces\nheadspring\nheadsprings\nheadstall\nheadstalls\nheadstand\nheadstands\nheadstock\nheadstocks\nheadstone\nheadstones\nheadstream\nheadstreams\nheadstrong\nheadwaiter\nheadwaiters\nheadwall\nheadwalls\nheadwater\nheadwaters\nheadway\nheadwear\nheadwears\nheadwind\nheadwinds\nheadword\nheadwords\nheadwork\nheadworker\nheadworkers\nheady\nheal\nhealable\nhealed\nhealer\nhealers\nhealing\nheals\nhealth\nhealthful\nhealthfully\nhealthfulness\nhealthier\nhealthiest\nhealthily\nhealthiness\nhealths\nhealthy\nheap\nheaped\nheaping\nheaps\nheapsort\nhear\nhearable\nheard\nhearer\nhearers\nhearing\nhearings\nhearken\nhearkened\nhearkening\nhearkens\nhears\nhearsay\nhearse\nhearsed\nhearses\nhearsing\nheart\nheartache\nheartaches\nheartbeat\nheartbeats\nheartbreak\nheartbreaker\nheartbreakers\nheartbreaking\nheartbreakingly\nheartbreaks\nheartbroken\nheartbrokenly\nheartbrokenness\nheartburn\nheartburning\nhearted\nheartedly\nheartedness\nhearten\nheartened\nheartening\nhearteningly\nheartens\nheartfelt\nhearth\nhearthrug\nhearthrugs\nhearths\nhearthside\nhearthsides\nhearthstone\nhearthstones\nheartier\nhearties\nheartiest\nheartily\nheartiness\nhearting\nheartland\nheartlands\nheartleaf\nheartleafs\nheartless\nheartlessly\nheartlessness\nheartrending\nheartrendingly\nhearts\nheartsease\nheartseases\nheartsick\nheartsickness\nheartsome\nheartsomely\nheartsore\nheartstring\nheartstrings\nheartthrob\nheartthrobs\nheartwarming\nheartwarmingly\nheartwood\nheartworm\nheartworms\nhearty\nheat\nheatable\nheated\nheatedly\nheater\nheaters\nheath\nheathen\nheathendom\nheathenish\nheathenishly\nheathenishness\nheathenism\nheathenize\nheathenized\nheathenizes\nheathenizing\nheathenry\nheathens\nheather\nheathers\nheathery\nheathless\nheathlike\nheathrow\nheaths\nheathy\nheating\nheatless\nheatproof\nheats\nheatstroke\nheatstrokes\nheave\nheaved\nheaven\nheavenliness\nheavenly\nheavens\nheavenward\nheavenwards\nheaver\nheavers\nheaves\nheavier\nheavies\nheaviest\nheavily\nheaviness\nheaving\nheaviside\nheavy\nheavyhearted\nheavyheartedly\nheavyheartedness\nheavyset\nheavyweight\nheavyweights\nhebdomad\nhebdomadal\nhebdomadally\nhebdomads\nhebe\nhebei\nhebephrenia\nhebephrenias\nhebephrenic\nhebetate\nhebetated\nhebetates\nhebetating\nhebetation\nhebetations\nhebetative\nhebetude\nhebetudes\nhebetudinous\nhebraic\nhebraical\nhebraically\nhebraism\nhebraist\nhebraistic\nhebraistical\nhebraistically\nhebraists\nhebraization\nhebraizations\nhebraize\nhebraized\nhebraizes\nhebraizing\nhebrew\nhebrews\nhebridean\nhebrideans\nhebrides\nhebron\nhecate\nhecatomb\nhecatombs\nheck\nheckelphone\nheckelphones\nheckle\nheckled\nheckler\nhecklers\nheckles\nheckling\nheckuva\nhectare\nhectares\nhectic\nhectically\nhectoampere\nhectoamperes\nhectobecquerel\nhectobecquerels\nhectocandela\nhectocandelas\nhectocotyli\nhectocotylus\nhectocoulomb\nhectocoulombs\nhectofarad\nhectofarads\nhectogram\nhectograms\nhectograph\nhectographed\nhectographic\nhectographically\nhectographing\nhectographs\nhectohenries\nhectohenry\nhectohenrys\nhectohertz\nhectojoule\nhectojoules\nhectokelvin\nhectokelvins\nhectoliter\nhectoliters\nhectolumen\nhectolumens\nhectolux\nhectometer\nhectometers\nhectomole\nhectomoles\nhectonewton\nhectonewtons\nhectoohm\nhectoohms\nhectopascal\nhectopascals\nhector\nhectoradian\nhectoradians\nhectored\nhectoring\nhectors\nhectosecond\nhectoseconds\nhectosiemens\nhectosievert\nhectosieverts\nhectosteradian\nhectosteradians\nhectotesla\nhectoteslas\nhectovolt\nhectovolts\nhectowatt\nhectowatts\nhectoweber\nhectowebers\nhecuba\nhedda\nheddle\nheddles\nheder\nheders\nhedge\nhedged\nhedgehog\nhedgehogs\nhedgehop\nhedgehopped\nhedgehopper\nhedgehoppers\nhedgehopping\nhedgehops\nhedgepig\nhedgepigs\nhedger\nhedgerow\nhedgerows\nhedgers\nhedges\nhedging\nhedgingly\nhedgy\nhedjaz\nhedonic\nhedonically\nhedonics\nhedonism\nhedonist\nhedonistic\nhedonistically\nhedonists\nhee\nheebie\nheed\nheeded\nheedful\nheedfully\nheedfulness\nheeding\nheedless\nheedlessly\nheedlessness\nheeds\nheehaw\nheehawed\nheehawing\nheehaws\nheel\nheelball\nheelballs\nheeled\nheeler\nheelers\nheeling\nheelless\nheelpiece\nheelpieces\nheelpost\nheelposts\nheels\nheeltap\nheeltaps\nheelwork\nheelworks\nheft\nhefted\nheftier\nheftiest\nheftily\nheftiness\nhefting\nhefts\nhefty\nhegang\nhegari\nhegaris\nhegel\nhegelian\nhegelianism\nhegelians\nhegemonic\nhegemonies\nhegemonism\nhegemonist\nhegemonists\nhegemony\nhegira\nhegiras\nheidelberg\nheifer\nheifers\nheigh\nheight\nheighten\nheightened\nheightener\nheighteners\nheightening\nheightens\nheights\nheilbronn\nheilongjiang\nheilungkiang\nheimish\nheimlich\nheinie\nheinies\nheinous\nheinously\nheinousness\nheir\nheirdom\nheirdoms\nheiress\nheiresses\nheirless\nheirloom\nheirlooms\nheirs\nheirship\nheirships\nheisenberg\nheist\nheisted\nheisting\nheists\nhejaz\nhejira\nhejiras\nhekate\nhekla\nheld\nheldentenor\nheldentenors\nhelen\nhelena\nhelens\nhelgoland\nheliacal\nheliacally\nheliborne\nhelical\nhelically\nhelices\nhelicoid\nhelicoidal\nhelicoids\nhelicon\nhelicons\nhelicopter\nhelicoptered\nhelicoptering\nhelicopters\nhelicultural\nheliculturalist\nheliculturalists\nheliculture\nheligoland\nheliocentric\nheliocentrical\nheliocentricity\nheliogabalus\nheliograph\nheliographed\nheliographer\nheliographers\nheliographic\nheliographing\nheliographs\nheliography\nheliolatrous\nheliolatry\nheliometer\nheliometers\nheliometric\nheliometrical\nheliometrically\nheliometry\nheliopolis\nhelios\nhelioseismology\nheliosphere\nheliospheres\nheliostat\nheliostats\nheliotactic\nheliotaxis\nheliotaxises\nheliotherapies\nheliotherapy\nheliotrope\nheliotropes\nheliotropic\nheliotropically\nheliotropin\nheliotropins\nheliotropism\nheliotype\nheliotyped\nheliotypes\nheliotypic\nheliotyping\nheliotypy\nheliozoan\nheliozoans\nheliozoic\nhelipad\nhelipads\nheliport\nheliports\nhelistop\nhelistops\nhelium\nhelix\nhelixes\nhell\nhellacious\nhelladic\nhellas\nhellbender\nhellbenders\nhellbox\nhellboxes\nhellbroth\nhellcat\nhellcats\nhelldiver\nhelldivers\nhellebore\nhellebores\nhelled\nhellene\nhellenes\nhellenian\nhellenians\nhellenic\nhellenism\nhellenist\nhellenistic\nhellenistical\nhellenists\nhellenization\nhellenizations\nhellenize\nhellenized\nhellenizer\nhellenizers\nhellenizes\nhellenizing\nheller\nhelleri\nhelleries\nhellers\nhellespont\nhellfire\nhellfires\nhellgrammite\nhellgrammites\nhellhole\nhellholes\nhellhound\nhellhounds\nhelling\nhellion\nhellions\nhellish\nhellishly\nhellishness\nhello\nhelloed\nhelloes\nhelloing\nhellos\nhells\nhelluva\nhelm\nhelmed\nhelmet\nhelmeted\nhelmeting\nhelmetlike\nhelmets\nhelming\nhelminth\nhelminthiases\nhelminthiasis\nhelminthic\nhelminthics\nhelminthologist\nhelminthologists\nhelminthology\nhelminths\nhelms\nhelmsman\nhelmsmanship\nhelmsmen\nhelo\nhelos\nhelot\nhelotism\nhelotisms\nhelotries\nhelotry\nhelots\nhelp\nhelped\nhelper\nhelpers\nhelpful\nhelpfully\nhelpfulness\nhelping\nhelpings\nhelpless\nhelplessly\nhelplessness\nhelpmate\nhelpmates\nhelpmeet\nhelpmeets\nhelps\nhelsingborg\nhelsingør\nhelsinki\nhelter\nhelve\nhelves\nhelvetia\nhelvetian\nhelvetians\nhelvetic\nhelvetica\nhelvetii\nhem\nhemacytometer\nhemacytometers\nhemagglutinate\nhemagglutinated\nhemagglutinates\nhemagglutinating\nhemagglutination\nhemagglutinations\nhemagglutinin\nhemagglutinins\nhemal\nhemangioma\nhemangiomas\nhemangiomata\nhemaphereses\nhemapheresis\nhematein\nhemateins\nhematic\nhematics\nhematin\nhematinic\nhematinics\nhematins\nhematite\nhematites\nhematitic\nhematoblast\nhematoblastic\nhematoblasts\nhematocrit\nhematocrits\nhematogenesis\nhematogenetic\nhematogenic\nhematogenous\nhematologic\nhematological\nhematologically\nhematologist\nhematologists\nhematology\nhematolysis\nhematoma\nhematomas\nhematomata\nhematophagous\nhematopoiesis\nhematopoietic\nhematoporphyrin\nhematoporphyrins\nhematothermia\nhematoxylin\nhematoxylins\nhematozoa\nhematozoal\nhematozoic\nhematozoon\nhematuria\nhematurias\nhematuric\nheme\nhemelytra\nhemelytron\nhemeralopia\nhemeralopias\nhemeralopic\nhemerocallis\nhemerocallises\nhemes\nhemialgia\nhemialgias\nhemic\nhemicellulose\nhemicelluloses\nhemichordate\nhemichordates\nhemicycle\nhemicycles\nhemidemisemiquaver\nhemidemisemiquavers\nhemihedral\nhemihydrate\nhemihydrated\nhemihydrates\nhemimetabolic\nhemimetabolism\nhemimetabolous\nhemimorphic\nhemimorphism\nhemimorphite\nhemimorphites\nhemin\nhemingway\nhemins\nhemiola\nhemiolas\nhemiparasite\nhemiparasites\nhemiparasitic\nhemiplegia\nhemiplegias\nhemiplegic\nhemiplegics\nhemipteran\nhemipterans\nhemipterous\nhemisphere\nhemispheres\nhemispheric\nhemispherical\nhemispherically\nhemistich\nhemistichs\nhemline\nhemlines\nhemlock\nhemlocks\nhemmed\nhemmer\nhemmers\nhemming\nhemochromatosis\nhemocoel\nhemocoels\nhemocyanin\nhemocyanins\nhemocyte\nhemocytes\nhemodialyses\nhemodialysis\nhemodynamic\nhemodynamically\nhemodynamics\nhemoflagellate\nhemoflagellates\nhemoglobin\nhemoglobinopathies\nhemoglobinopathy\nhemoglobins\nhemoglobinuria\nhemoglobinurias\nhemoglobinuric\nhemolymph\nhemolymphatic\nhemolymphs\nhemolysin\nhemolysins\nhemolysis\nhemolytic\nhemolyze\nhemolyzed\nhemolyzes\nhemolyzing\nhemophilia\nhemophiliac\nhemophiliacs\nhemophilic\nhemophobia\nhemophobic\nhemopoiesis\nhemopoietic\nhemoprotein\nhemoproteins\nhemoptysis\nhemorrhage\nhemorrhaged\nhemorrhages\nhemorrhagic\nhemorrhaging\nhemorrhoid\nhemorrhoidal\nhemorrhoidectomies\nhemorrhoidectomy\nhemorrhoids\nhemosiderin\nhemosiderins\nhemostasia\nhemostasis\nhemostat\nhemostatic\nhemostatics\nhemostats\nhemp\nhempen\nhemps\nhems\nhemstitch\nhemstitched\nhemstitcher\nhemstitchers\nhemstitches\nhemstitching\nhen\nhenbane\nhenbanes\nhenbit\nhenbits\nhence\nhenceforth\nhenceforward\nhenchman\nhenchmen\nhencoop\nhencoops\nhendecasyllabic\nhendecasyllabics\nhendecasyllable\nhendecasyllables\nhendiadys\nhendiadyses\nhendrix\nhenequen\nhenequens\nhenequin\nhenequins\nhengist\nhenhouse\nhenhouses\nhenna\nhennaed\nhennaing\nhennas\nhenneries\nhennery\nhennish\nhennishly\nhennishness\nhenotheism\nhenotheist\nhenotheistic\nhenotheists\nhenpeck\nhenpecked\nhenpecking\nhenpecks\nhenries\nhenry\nhenrys\nhens\nhent\nhented\nhenting\nhents\nhep\nheparin\nheparinize\nheparinized\nheparinizes\nheparinizing\nhepatic\nhepatica\nhepaticas\nhepatics\nhepatitides\nhepatitis\nhepatocellular\nhepatocyte\nhepatocytes\nhepatoma\nhepatomas\nhepatomata\nhepatomegalies\nhepatomegaly\nhepatotoxic\nhepatotoxicity\nhepatotoxin\nhepatotoxins\nhepcat\nhepcats\nhephaestos\nhephaestus\nhepper\nheppest\nhepplewhite\nheptachlor\nheptachlors\nheptad\nheptads\nheptagon\nheptagonal\nheptagons\nheptahedra\nheptahedral\nheptahedron\nheptahedrons\nheptameter\nheptameters\nheptane\nheptanes\nheptarchic\nheptarchical\nheptarchies\nheptarchy\nheptastich\nheptastiches\nheptateuch\nheptathlon\nheptathlons\nheptavalent\nheptose\nheptoses\nher\nhera\nheraclea\nheracles\nheraclitean\nheraclitus\nheraclius\nherakles\nherald\nheralded\nheraldic\nheraldically\nheralding\nheraldist\nheraldists\nheraldries\nheraldry\nheralds\nherb\nherbaceous\nherbage\nherbal\nherbalist\nherbalists\nherbals\nherbaria\nherbarium\nherbariums\nherbed\nherbert\nherbicidal\nherbicidally\nherbicide\nherbicides\nherbivore\nherbivores\nherbivorous\nherbivorously\nherblike\nherbs\nherby\nherculaneum\nherculean\nhercules\nhercynian\nherd\nherded\nherder\nherders\nherdic\nherdics\nherding\nherdlike\nherds\nherdsman\nherdsmen\nhere\nhereabout\nhereabouts\nhereafter\nhereaway\nhereaways\nhereby\nhereditament\nhereditaments\nhereditarian\nhereditarianism\nhereditarians\nhereditarily\nhereditariness\nhereditary\nheredities\nhereditist\nhereditists\nheredity\nhereford\nherefords\nherein\nhereinabove\nhereinafter\nhereinbefore\nhereinbelow\nhereinto\nhereof\nhereon\nherero\nhereros\nheresiarch\nheresiarchs\nheresies\nheresy\nheretic\nheretical\nheretically\nhereticalness\nheretics\nhereto\nheretofore\nhereunder\nhereunto\nhereupon\nhereward\nherewith\nheriot\nheriots\nheritabilities\nheritability\nheritable\nheritably\nheritage\nheritages\nheritor\nheritors\nheriz\nherizes\nherky\nherl\nherls\nherm\nherma\nhermae\nhermai\nherman\nhermaphrodism\nhermaphrodite\nhermaphrodites\nhermaphroditic\nhermaphroditically\nhermaphroditism\nhermaphroditus\nhermas\nhermatypic\nhermeneutic\nhermeneutical\nhermeneutically\nhermeneutics\nhermeneutist\nhermeneutists\nhermes\nhermetic\nhermetical\nhermetically\nhermeticism\nhermetism\nhermetist\nhermetists\nhermit\nhermitage\nhermitages\nhermitian\nhermitic\nhermitical\nhermitically\nhermitism\nhermits\nhermon\nhermosillo\nherms\nhern\nhernia\nherniae\nhernial\nhernias\nherniate\nherniated\nherniates\nherniating\nherniation\nherniations\nherns\nhero\nherod\nherodas\nherodian\nherodias\nherodotus\nheroes\nheroic\nheroical\nheroically\nheroicalness\nheroicomic\nheroicomical\nheroics\nheroin\nheroine\nheroines\nheroinism\nheroinisms\nheroism\nheron\nheronries\nheronry\nherons\nheros\nherpes\nherpesvirus\nherpesviruses\nherpetic\nherpetologic\nherpetological\nherpetologically\nherpetologist\nherpetologists\nherpetology\nherr\nherren\nherrenvolk\nherrenvolks\nherrick\nherring\nherringbone\nherringboned\nherringbones\nherringboning\nherrings\nhers\nherschel\nherself\nhershey\nherstories\nherstory\nhertfordshire\nhertz\nhertzian\nhertzsprung\nherzegovina\nherzegovinian\nherzegovinians\nheshvan\nheshvans\nheshwan\nheshwans\nhesiod\nhesitance\nhesitancies\nhesitancy\nhesitant\nhesitantly\nhesitate\nhesitated\nhesitater\nhesitaters\nhesitates\nhesitating\nhesitatingly\nhesitation\nhesitations\nhesperian\nhesperidean\nhesperides\nhesperidia\nhesperidian\nhesperidin\nhesperidins\nhesperidium\nhesperus\nhess\nhesse\nhessian\nhessians\nhessite\nhessites\nhessonite\nhessonites\nhest\nhestia\nhests\nhet\nhetaera\nhetaerae\nhetaeras\nhetaeric\nhetaira\nhetairai\nhetairas\nhetero\nheteroatom\nheteroatoms\nheterocarpies\nheterocarpous\nheterocarpy\nheterocercal\nheterochromatic\nheterochromatin\nheterochromatins\nheterochromatism\nheterochromatisms\nheterochromosome\nheterochromosomes\nheterocycle\nheterocycles\nheterocyclic\nheterocyst\nheterocysts\nheterodox\nheterodoxies\nheterodoxy\nheterodyne\nheterodyned\nheterodynes\nheterodyning\nheteroecious\nheteroecism\nheterogamete\nheterogametes\nheterogametic\nheterogamic\nheterogamies\nheterogamous\nheterogamy\nheterogeneity\nheterogeneous\nheterogeneously\nheterogeneousness\nheterogenic\nheterogenous\nheterogeny\nheterogonic\nheterogonous\nheterogony\nheterograft\nheterografts\nheterogynous\nheterokaryon\nheterokaryons\nheterokaryotic\nheterolecithal\nheterologous\nheterologously\nheterology\nheterolyses\nheterolysis\nheterolytic\nheteromerous\nheteromorphic\nheteromorphism\nheteronomous\nheteronomously\nheteronomy\nheteronym\nheteronymous\nheteronyms\nheteroousian\nheterophil\nheterophile\nheterophonic\nheterophony\nheterophyllous\nheterophylly\nheterophyte\nheterophytes\nheterophytic\nheteroplastic\nheteroplasties\nheteroplasty\nheteroploid\nheteroploids\nheteroploidy\nheteropterous\nheteros\nheterosexism\nheterosexual\nheterosexuality\nheterosexually\nheterosexuals\nheterosis\nheterosporous\nheterospory\nheterostyled\nheterostylous\nheterostyly\nheterotactic\nheterotactous\nheterotaxes\nheterotaxia\nheterotaxias\nheterotaxies\nheterotaxis\nheterotaxy\nheterothallic\nheterothallism\nheterotic\nheterotopia\nheterotopias\nheterotopic\nheterotopies\nheterotopy\nheterotroph\nheterotrophic\nheterotrophically\nheterotrophs\nheterotrophy\nheterotypic\nheterotypical\nheterousian\nheterozygosis\nheterozygosity\nheterozygote\nheterozygotes\nheterozygous\nheth\nhetman\nhetmans\nheulandite\nheulandites\nheuristic\nheuristically\nheuristics\nhew\nhewed\nhewer\nhewers\nhewing\nhewn\nhews\nhex\nhexachlorethane\nhexachlorethanes\nhexachloride\nhexachloroethane\nhexachloroethanes\nhexachlorophene\nhexachord\nhexachords\nhexad\nhexadecimal\nhexadecimally\nhexadecimals\nhexadic\nhexads\nhexafluoride\nhexagon\nhexagonal\nhexagonally\nhexagons\nhexagram\nhexagrams\nhexahedra\nhexahedral\nhexahedron\nhexahedrons\nhexahydrate\nhexamerism\nhexamerous\nhexameter\nhexameters\nhexamethonium\nhexamethylenetetramine\nhexamethylenetetramines\nhexametric\nhexametrical\nhexane\nhexaploid\nhexaploids\nhexaploidy\nhexapod\nhexapodous\nhexapods\nhexastyle\nhexateuch\nhexavalent\nhexed\nhexer\nhexerei\nhexereis\nhexers\nhexes\nhexing\nhexosan\nhexosans\nhexose\nhexoses\nhexyl\nhexylresorcinol\nhexylresorcinols\nhexyls\nhey\nheyday\nheydays\nheywood\nhezekiah\nhi\nhialeah\nhiatal\nhiatus\nhiatuses\nhiawatha\nhibachi\nhibachis\nhibernacula\nhibernaculum\nhibernal\nhibernate\nhibernated\nhibernates\nhibernating\nhibernation\nhibernations\nhibernator\nhibernators\nhibernia\nhibernian\nhibernians\nhiberno\nhibiscus\nhibiscuses\nhic\nhiccough\nhiccoughed\nhiccoughing\nhiccoughs\nhiccup\nhiccuped\nhiccuping\nhiccupped\nhiccupping\nhiccups\nhick\nhickey\nhickeys\nhickories\nhickory\nhicks\nhid\nhidalgo\nhidalgos\nhidatsa\nhidatsas\nhidden\nhiddenite\nhiddenites\nhiddenness\nhide\nhideaway\nhideaways\nhidebound\nhided\nhideosity\nhideous\nhideously\nhideousness\nhideout\nhideouts\nhider\nhiders\nhides\nhiding\nhidings\nhidroses\nhidrosis\nhidrotic\nhie\nhied\nhieing\nhiemal\nhierapolis\nhierarch\nhierarchal\nhierarchic\nhierarchical\nhierarchically\nhierarchies\nhierarchization\nhierarchizations\nhierarchize\nhierarchized\nhierarchizes\nhierarchizing\nhierarchs\nhierarchy\nhieratic\nhieratically\nhierocracies\nhierocracy\nhierocratic\nhierocratical\nhierodule\nhierodules\nhierodulic\nhieroglyph\nhieroglyphic\nhieroglyphical\nhieroglyphically\nhieroglyphics\nhieroglyphs\nhierologies\nhierologist\nhierologists\nhierology\nhierophant\nhierophantic\nhierophants\nhies\nhifalutin\nhigashiosaka\nhiggle\nhiggled\nhiggledy\nhiggler\nhigglers\nhiggles\nhiggling\nhigh\nhighball\nhighballed\nhighballing\nhighballs\nhighbinder\nhighbinders\nhighborn\nhighboy\nhighboys\nhighbred\nhighbrow\nhighbrowed\nhighbrowism\nhighbrows\nhighbush\nhighchair\nhighchairs\nhigher\nhighest\nhighfalutin\nhighfaluting\nhighflier\nhighfliers\nhighflyer\nhighflyers\nhighflying\nhighhanded\nhighhandedly\nhighhandedness\nhighjack\nhighjacked\nhighjacker\nhighjackers\nhighjacking\nhighjacks\nhighland\nhighlander\nhighlanders\nhighlands\nhighlife\nhighlifer\nhighlifers\nhighlifes\nhighlight\nhighlighted\nhighlighter\nhighlighters\nhighlighting\nhighlights\nhighline\nhighly\nhighness\nhighnesses\nhighroad\nhighroads\nhighs\nhight\nhightail\nhightailed\nhightailing\nhightails\nhighway\nhighwayman\nhighwaymen\nhighways\nhijack\nhijacked\nhijacker\nhijackers\nhijacking\nhijackings\nhijacks\nhijiki\nhijikis\nhijinks\nhike\nhiked\nhiker\nhikers\nhikes\nhiking\nhila\nhilar\nhilarious\nhilariously\nhilariousness\nhilarities\nhilarity\nhilary\nhilbert\nhildebrand\nhildesheim\nhilding\nhildings\nhill\nhillbillies\nhillbilly\nhillcrest\nhillcrests\nhilled\nhillel\nhiller\nhillers\nhilliard\nhillier\nhilliest\nhilliness\nhilling\nhillock\nhillocks\nhillocky\nhills\nhillscape\nhillside\nhillsides\nhilltop\nhilltops\nhilly\nhilo\nhilt\nhilted\nhilton\nhilts\nhilum\nhilversum\nhim\nhimachal\nhimalaya\nhimalayan\nhimalayans\nhimalayas\nhimalia\nhimatia\nhimation\nhimations\nhimmler\nhimself\nhimyarite\nhimyarites\nhimyaritic\nhin\nhinayana\nhinayanist\nhinayanistic\nhinayanists\nhind\nhindbrain\nhindbrains\nhindemith\nhindenburg\nhinder\nhindered\nhinderer\nhinderers\nhindering\nhindermost\nhinders\nhindgut\nhindguts\nhindi\nhindmost\nhindoo\nhindquarter\nhindquarters\nhindrance\nhindrances\nhinds\nhindsight\nhindu\nhinduism\nhindus\nhindustan\nhindustani\nhinge\nhinged\nhinges\nhinging\nhinnies\nhinny\nhins\nhint\nhinted\nhinter\nhinterland\nhinterlands\nhinters\nhinting\nhints\nhip\nhipbone\nhipbones\nhipline\nhiplines\nhiply\nhipness\nhipparchus\nhipped\nhipper\nhippest\nhippias\nhippie\nhippiedom\nhippiehood\nhippies\nhipping\nhippo\nhippocampal\nhippocampi\nhippocampus\nhippocras\nhippocrases\nhippocrates\nhippocratic\nhippocrene\nhippodrome\nhippodromes\nhippogriff\nhippogriffs\nhippogryph\nhippolyta\nhippolytus\nhippomenes\nhippopotami\nhippopotamus\nhippopotamuses\nhippos\nhippy\nhips\nhipster\nhipsterism\nhipsters\nhirable\nhiragana\nhircine\nhire\nhireable\nhired\nhireling\nhirelings\nhirer\nhirers\nhires\nhiring\nhirohito\nhiroshima\nhirsute\nhirsuteness\nhirsutism\nhirudin\nhirudins\nhis\nhispanic\nhispanicism\nhispanicisms\nhispanicization\nhispanicizations\nhispanicize\nhispanicized\nhispanicizes\nhispanicizing\nhispanics\nhispaniola\nhispanism\nhispanisms\nhispanist\nhispanists\nhispano\nhispanophile\nhispanophiles\nhispanophilia\nhispanophobe\nhispanophobes\nhispanophobia\nhispanos\nhispid\nhispidity\nhiss\nhissarlik\nhissed\nhisself\nhisser\nhissers\nhisses\nhissing\nhissingly\nhissy\nhist\nhistaminase\nhistaminases\nhistamine\nhistaminergic\nhistamines\nhistaminic\nhistidine\nhistidines\nhistiocyte\nhistiocytes\nhistiocytic\nhistiocytoses\nhistiocytosis\nhistochemical\nhistochemically\nhistochemistry\nhistocompatibilities\nhistocompatibility\nhistocompatible\nhistodialyses\nhistodialysis\nhistogenesis\nhistogenetic\nhistogenetically\nhistogenic\nhistogenically\nhistogram\nhistograms\nhistologic\nhistological\nhistologically\nhistologies\nhistologist\nhistologists\nhistology\nhistolysis\nhistolytic\nhistolytically\nhistomoniases\nhistomoniasis\nhistone\nhistones\nhistopathologic\nhistopathological\nhistopathologically\nhistopathologist\nhistopathologists\nhistopathology\nhistophysiologic\nhistophysiological\nhistophysiology\nhistoplasmoses\nhistoplasmosis\nhistorian\nhistorians\nhistoriated\nhistoric\nhistorical\nhistorically\nhistoricalness\nhistoricism\nhistoricist\nhistoricists\nhistoricity\nhistoricization\nhistoricizations\nhistoricize\nhistoricized\nhistoricizes\nhistoricizing\nhistoried\nhistories\nhistoriographer\nhistoriographers\nhistoriographic\nhistoriographical\nhistoriographically\nhistoriography\nhistory\nhistrionic\nhistrionical\nhistrionically\nhistrionics\nhit\nhitachi\nhitch\nhitched\nhitcher\nhitchers\nhitches\nhitchhike\nhitchhiked\nhitchhiker\nhitchhikers\nhitchhikes\nhitchhiking\nhitching\nhither\nhithermost\nhitherto\nhitherward\nhitherwards\nhitler\nhitlerism\nhitlerite\nhitlerites\nhitless\nhits\nhittable\nhitter\nhitters\nhitting\nhittite\nhittites\nhive\nhived\nhiveless\nhives\nhiving\nhiwassee\nhkakabo\nhmm\nhmong\nhmongs\nho\nhoagie\nhoagies\nhoagy\nhoar\nhoard\nhoarded\nhoarder\nhoarders\nhoarding\nhoardings\nhoards\nhoarfrost\nhoarfrosts\nhoarier\nhoariest\nhoarily\nhoariness\nhoars\nhoarse\nhoarsely\nhoarsen\nhoarsened\nhoarseness\nhoarsening\nhoarsens\nhoarser\nhoarsest\nhoary\nhoatzin\nhoatzins\nhoax\nhoaxed\nhoaxer\nhoaxers\nhoaxes\nhoaxing\nhob\nhobart\nhobbed\nhobbes\nhobbesian\nhobbies\nhobbing\nhobbism\nhobbist\nhobbists\nhobbit\nhobbits\nhobble\nhobblebush\nhobblebushes\nhobbled\nhobbledehoy\nhobbledehoys\nhobbler\nhobblers\nhobbles\nhobbling\nhobby\nhobbyhorse\nhobbyhorses\nhobbyist\nhobbyists\nhobgoblin\nhobgoblins\nhobnail\nhobnailed\nhobnails\nhobnob\nhobnobbed\nhobnobber\nhobnobbers\nhobnobbing\nhobnobs\nhobo\nhoboed\nhoboes\nhoboing\nhoboism\nhoboken\nhobos\nhobs\nhoc\nhock\nhocked\nhocker\nhockers\nhockey\nhocking\nhocks\nhockshop\nhockshops\nhocus\nhocused\nhocuses\nhocusing\nhocussed\nhocusses\nhocussing\nhod\nhodgepodge\nhodgepodges\nhodgkin\nhodoscope\nhodoscopes\nhods\nhoe\nhoecake\nhoecakes\nhoed\nhoedown\nhoedowns\nhoeing\nhoer\nhoers\nhoes\nhog\nhogan\nhogans\nhogarth\nhogback\nhogbacks\nhogfish\nhogfishes\nhogg\nhogged\nhogging\nhoggish\nhoggishly\nhoggishness\nhoggs\nhogmanay\nhogmanays\nhognose\nhogs\nhogshead\nhogsheads\nhogwash\nhogweed\nhogweeds\nhohenlohe\nhohenstaufen\nhohenstaufens\nhohenzollern\nhohenzollerns\nhoi\nhoick\nhoicked\nhoicking\nhoicks\nhoise\nhoised\nhoises\nhoisin\nhoising\nhoist\nhoisted\nhoister\nhoisters\nhoisting\nhoists\nhoity\nhokan\nhokang\nhoke\nhoked\nhokes\nhokey\nhokeyness\nhokeypokey\nhokeypokeys\nhokier\nhokiest\nhokily\nhokiness\nhoking\nhokkaido\nhokku\nhokum\nhokums\nhokusai\nhokypokies\nholandric\nholarctic\nholbein\nhold\nholdall\nholdalls\nholdback\nholdbacks\nholden\nholder\nholders\nholdfast\nholdfasts\nholding\nholdings\nholdout\nholdouts\nholdover\nholdovers\nholds\nholdup\nholdups\nhole\nholed\nholes\nholey\nholiday\nholidayed\nholidayer\nholidayers\nholidaying\nholidaymaker\nholidaymakers\nholidays\nholier\nholies\nholiest\nholily\nholiness\nholing\nholinshed\nholism\nholisms\nholist\nholistic\nholistically\nholists\nholla\nhollaed\nhollaing\nholland\nhollandaise\nhollander\nhollanders\nhollas\nholler\nhollered\nhollering\nhollerith\nhollers\nhollies\nhollo\nholloa\nholloaed\nholloaing\nholloas\nholloed\nholloes\nholloing\nhollos\nhollow\nholloware\nhollowed\nhollower\nhollowest\nhollowing\nhollowly\nhollowness\nhollows\nhollowware\nholly\nhollyhock\nhollyhocks\nhollywood\nholm\nholmes\nholmic\nholmium\nholms\nholoblastic\nholoblastically\nholocaust\nholocaustal\nholocaustic\nholocausts\nholocene\nholocrine\nholoenzyme\nholoenzymes\nholofernes\nhologamous\nhologram\nholograms\nholograph\nholographic\nholographical\nholographically\nholographs\nholography\nhologynic\nholohedral\nholometabolism\nholometabolous\nholophrastic\nholophytic\nholoplankton\nholoplanktons\nholothurian\nholothurians\nholotype\nholotypes\nholotypic\nholozoic\nholp\nholpen\nholst\nholstein\nholsteins\nholster\nholstered\nholstering\nholsters\nholt\nholts\nholy\nholyoke\nholystone\nholystoned\nholystones\nholystoning\nhomage\nhomager\nhomagers\nhombre\nhombres\nhomburg\nhomburgs\nhome\nhomebodies\nhomebody\nhomebound\nhomeboy\nhomeboys\nhomebred\nhomebuilder\nhomebuilders\nhomebuilding\nhomebuilt\nhomebuyer\nhomebuyers\nhomecoming\nhomecomings\nhomed\nhomefolk\nhomefolks\nhomegrown\nhomeland\nhomelands\nhomeless\nhomelessness\nhomelier\nhomeliest\nhomelike\nhomeliness\nhomely\nhomemade\nhomemaker\nhomemakers\nhomemaking\nhomeobox\nhomeoboxes\nhomeomorphic\nhomeomorphism\nhomeomorphisms\nhomeomorphous\nhomeopath\nhomeopathic\nhomeopathically\nhomeopathies\nhomeopathist\nhomeopathists\nhomeopaths\nhomeopathy\nhomeostasis\nhomeostatic\nhomeotherm\nhomeothermal\nhomeothermic\nhomeothermous\nhomeotherms\nhomeowner\nhomeowners\nhomeownership\nhomer\nhomered\nhomeric\nhomerically\nhomering\nhomeroom\nhomerooms\nhomers\nhomes\nhomesick\nhomesickness\nhomesite\nhomesites\nhomespun\nhomestead\nhomesteaded\nhomesteader\nhomesteaders\nhomesteading\nhomesteads\nhomestretch\nhomestretches\nhometown\nhometowns\nhomeward\nhomewards\nhomework\nhomey\nhomeyness\nhomicidal\nhomicidally\nhomicide\nhomicides\nhomier\nhomiest\nhomiletic\nhomiletical\nhomiletically\nhomiletics\nhomilies\nhomilist\nhomilists\nhomily\nhominem\nhominess\nhoming\nhominid\nhominidae\nhominids\nhominization\nhominizations\nhominoid\nhominoids\nhominy\nhommos\nhomo\nhomocentric\nhomocercal\nhomochirality\nhomochromatic\nhomochromatism\nhomoecious\nhomoerotic\nhomoeroticism\nhomoerotism\nhomogametic\nhomogamous\nhomogamy\nhomogenate\nhomogenates\nhomogeneities\nhomogeneity\nhomogeneous\nhomogeneously\nhomogeneousness\nhomogenies\nhomogenization\nhomogenizations\nhomogenize\nhomogenized\nhomogenizer\nhomogenizers\nhomogenizes\nhomogenizing\nhomogenous\nhomogeny\nhomograft\nhomografts\nhomograph\nhomographic\nhomographs\nhomoiotherm\nhomoiothermal\nhomoiothermic\nhomoiothermous\nhomoiotherms\nhomoiousian\nhomoiousians\nhomolecithal\nhomolog\nhomologate\nhomologated\nhomologates\nhomologating\nhomologation\nhomologic\nhomological\nhomologically\nhomologies\nhomologize\nhomologized\nhomologizer\nhomologizers\nhomologizes\nhomologizing\nhomologous\nhomolographic\nhomologs\nhomologue\nhomologues\nhomology\nhomolosine\nhomolysis\nhomolytic\nhomomorphic\nhomomorphism\nhomomorphisms\nhomomorphous\nhomonuclear\nhomonym\nhomonymic\nhomonymies\nhomonymous\nhomonymously\nhomonyms\nhomonymy\nhomoousian\nhomoousians\nhomophile\nhomophiles\nhomophobe\nhomophobes\nhomophobia\nhomophobic\nhomophone\nhomophones\nhomophonic\nhomophonies\nhomophonous\nhomophony\nhomophylic\nhomophylies\nhomophyly\nhomoplasies\nhomoplastic\nhomoplastically\nhomoplasy\nhomopolar\nhomopolymer\nhomopolymers\nhomopteran\nhomopterans\nhomopterous\nhomos\nhomoscedastic\nhomoscedasticity\nhomosexual\nhomosexuality\nhomosexually\nhomosexuals\nhomosporous\nhomospory\nhomostyled\nhomostylous\nhomostyly\nhomotaxial\nhomotaxic\nhomotaxis\nhomotaxises\nhomothallic\nhomothallism\nhomotransplant\nhomotransplantation\nhomozygosis\nhomozygosity\nhomozygote\nhomozygotes\nhomozygotic\nhomozygous\nhomozygously\nhomunculi\nhomunculus\nhomy\nhon\nhonan\nhonans\nhoncho\nhonchoed\nhonchoing\nhonchos\nhonduran\nhondurans\nhonduras\nhone\nhoned\nhoner\nhoners\nhones\nhonest\nhonesties\nhonestly\nhonesty\nhonewort\nhoneworts\nhoney\nhoneybee\nhoneybees\nhoneyberries\nhoneyberry\nhoneybunch\nhoneybunches\nhoneycomb\nhoneycombed\nhoneycombing\nhoneycombs\nhoneycreeper\nhoneycreepers\nhoneydew\nhoneydews\nhoneyeater\nhoneyeaters\nhoneyed\nhoneying\nhoneymoon\nhoneymooned\nhoneymooner\nhoneymooners\nhoneymooning\nhoneymoons\nhoneys\nhoneysuckle\nhoneysuckles\nhoneywell\nhonfleur\nhong\nhongs\nhoniara\nhonied\nhoning\nhonk\nhonked\nhonker\nhonkers\nhonkey\nhonkeys\nhonkie\nhonkies\nhonking\nhonks\nhonky\nhonkytonks\nhonolulu\nhonor\nhonorabilities\nhonorability\nhonorable\nhonorableness\nhonorably\nhonoraria\nhonorarily\nhonorarium\nhonorariums\nhonorary\nhonored\nhonoree\nhonorees\nhonorer\nhonorers\nhonorific\nhonorifically\nhonorifics\nhonoring\nhonors\nhonshu\nhoo\nhooch\nhooches\nhood\nhooded\nhoodedness\nhooding\nhoodlike\nhoodlum\nhoodlumish\nhoodlumism\nhoodlums\nhoodmold\nhoodmolds\nhoodoo\nhoodooed\nhoodooing\nhoodooism\nhoodoos\nhoods\nhoodwink\nhoodwinked\nhoodwinker\nhoodwinkers\nhoodwinking\nhoodwinks\nhooey\nhoof\nhoofbeat\nhoofbeats\nhoofbound\nhoofed\nhoofer\nhoofers\nhoofing\nhoofprint\nhoofprints\nhoofs\nhook\nhookah\nhookahs\nhooked\nhookedness\nhooker\nhookers\nhookey\nhookeys\nhookies\nhooking\nhooklet\nhooklets\nhooknose\nhooknosed\nhooknoses\nhooks\nhookup\nhookups\nhookworm\nhookworms\nhooky\nhooligan\nhooliganism\nhooligans\nhoop\nhooped\nhooper\nhoopers\nhooping\nhoopla\nhooplike\nhoopoe\nhoopoes\nhoops\nhoopskirt\nhoopskirts\nhoorah\nhoorahs\nhooray\nhoorayed\nhooraying\nhoorays\nhoosegow\nhoosegows\nhoosier\nhoosiers\nhoot\nhootch\nhootches\nhootchy\nhooted\nhootenannies\nhootenanny\nhooter\nhooters\nhooting\nhoots\nhooved\nhooverville\nhoovervilles\nhooves\nhop\nhopatcong\nhope\nhoped\nhopeful\nhopefully\nhopefulness\nhopefuls\nhopeh\nhopei\nhopeless\nhopelessly\nhopelessness\nhoper\nhopers\nhopes\nhopewell\nhophead\nhopheads\nhopi\nhoping\nhopis\nhoplite\nhoplites\nhoplitic\nhopped\nhopper\nhoppergrass\nhoppergrasses\nhoppers\nhopping\nhops\nhopsack\nhopsacking\nhopsacks\nhopscotch\nhopscotched\nhopscotches\nhopscotching\nhora\nhorace\nhorah\nhorahs\nhorary\nhoras\nhoratian\nhoratio\nhorde\nhordes\nhorehound\nhorehounds\nhorizon\nhorizonal\nhorizons\nhorizontal\nhorizontally\nhorizontals\nhormogonia\nhormogonium\nhormonal\nhormonally\nhormone\nhormonelike\nhormones\nhormonic\nhorn\nhornbeam\nhornbeams\nhornbill\nhornbills\nhornblende\nhornblower\nhornbook\nhornbooks\nhorned\nhornedness\nhorner\nhornet\nhornets\nhornfels\nhornier\nhorniest\nhorniness\nhorning\nhornist\nhornists\nhornito\nhornitos\nhornless\nhornlessness\nhornlike\nhornpipe\nhornpipes\nhornpout\nhornpouts\nhorns\nhornswoggle\nhornswoggled\nhornswoggles\nhornswoggling\nhorntail\nhorntails\nhornworm\nhornworms\nhornwort\nhornworts\nhorny\nhorologe\nhorologer\nhorologers\nhorologes\nhorologic\nhorological\nhorologist\nhorologists\nhorologium\nhorology\nhorometrical\nhoroscope\nhoroscopes\nhorrendous\nhorrendously\nhorrent\nhorrible\nhorribleness\nhorribly\nhorrid\nhorridly\nhorridness\nhorrific\nhorrifically\nhorrification\nhorrified\nhorrifiedly\nhorrifies\nhorrify\nhorrifying\nhorrifyingly\nhorripilate\nhorripilated\nhorripilates\nhorripilating\nhorripilation\nhorripilations\nhorror\nhorrors\nhorrorstricken\nhorrorstruck\nhors\nhorsa\nhorse\nhorseback\nhorsebacks\nhorsecar\nhorsecars\nhorsed\nhorsefeathers\nhorseflesh\nhorseflies\nhorsefly\nhorsehair\nhorsehide\nhorsehides\nhorselaugh\nhorselaughs\nhorseleech\nhorseleeches\nhorseless\nhorselike\nhorseman\nhorsemanship\nhorsemeat\nhorsemen\nhorsemint\nhorsemints\nhorseplay\nhorseplayer\nhorseplayers\nhorsepower\nhorserace\nhorseraces\nhorseracing\nhorseradish\nhorseradishes\nhorses\nhorseshit\nhorseshits\nhorseshoe\nhorseshoed\nhorseshoeing\nhorseshoer\nhorseshoers\nhorseshoes\nhorsetail\nhorsetails\nhorseweed\nhorseweeds\nhorsewhip\nhorsewhipped\nhorsewhipping\nhorsewhips\nhorsewoman\nhorsewomen\nhorsey\nhorsier\nhorsiest\nhorsily\nhorsiness\nhorsing\nhorst\nhorsts\nhorsy\nhortative\nhortatively\nhortatory\nhorticultural\nhorticulturalist\nhorticulturalists\nhorticulturally\nhorticulture\nhorticulturist\nhorticulturists\nhorus\nhosanna\nhosannah\nhosannahs\nhosannas\nhose\nhosea\nhosed\nhosel\nhosels\nhoses\nhosey\nhoseyed\nhoseying\nhoseys\nhosiery\nhosing\nhospice\nhospices\nhospitable\nhospitably\nhospital\nhospitaler\nhospitalers\nhospitalities\nhospitality\nhospitalization\nhospitalizations\nhospitalize\nhospitalized\nhospitalizes\nhospitalizing\nhospitaller\nhospitallers\nhospitals\nhost\nhosta\nhostage\nhostages\nhostas\nhosted\nhostel\nhosteled\nhosteler\nhostelers\nhosteling\nhostelries\nhostelry\nhostels\nhostess\nhostesses\nhostile\nhostilely\nhostiles\nhostilities\nhostility\nhosting\nhostler\nhostlers\nhostly\nhosts\nhot\nhotbed\nhotbeds\nhotblood\nhotbloods\nhotbox\nhotboxes\nhotcake\nhotcakes\nhotch\nhotched\nhotches\nhotching\nhotchpot\nhotchpotch\nhotchpotches\nhotchpots\nhotdog\nhotdogged\nhotdogging\nhotdogs\nhotel\nhotelier\nhoteliers\nhotelkeeper\nhotelkeepers\nhotelman\nhotelmen\nhotels\nhotfoot\nhotfooted\nhotfooting\nhotfoots\nhothead\nhotheaded\nhotheadedly\nhotheadedness\nhotheads\nhothouse\nhothouses\nhotkey\nhotline\nhotlines\nhotly\nhotness\nhotplate\nhotplates\nhotpot\nhotpots\nhotrod\nhotrods\nhots\nhotshot\nhotshots\nhotspot\nhotspots\nhotspur\nhotted\nhottentot\nhottentots\nhotter\nhottest\nhotting\nhottish\nhoudah\nhoudahs\nhoudan\nhoudans\nhoudini\nhound\nhounded\nhounder\nhounders\nhounding\nhounds\nhoundstooth\nhour\nhourglass\nhourglasses\nhouri\nhouris\nhourlies\nhourlong\nhourly\nhours\nhousatonic\nhouse\nhouseboat\nhouseboats\nhousebound\nhouseboy\nhouseboys\nhousebreak\nhousebreaker\nhousebreakers\nhousebreaking\nhousebreaks\nhousebroke\nhousebroken\nhousecarl\nhousecarls\nhouseclean\nhousecleaned\nhousecleaner\nhousecleaners\nhousecleaning\nhousecleans\nhousecoat\nhousecoats\nhoused\nhousedog\nhousedogs\nhousedress\nhousedresses\nhousefather\nhousefathers\nhouseflies\nhousefly\nhousefront\nhousefronts\nhouseful\nhousefuls\nhouseguest\nhouseguests\nhousehold\nhouseholder\nhouseholders\nhouseholds\nhousehusband\nhousehusbands\nhousekeep\nhousekeeper\nhousekeepers\nhousekeeping\nhousekeeps\nhousekept\nhousel\nhouseled\nhouseleek\nhouseleeks\nhouseless\nhouselessness\nhouselights\nhouseling\nhousels\nhousemaid\nhousemaids\nhouseman\nhousemaster\nhousemasters\nhousemate\nhousemates\nhousemen\nhousemother\nhousemothers\nhousepainter\nhousepainters\nhouseparent\nhouseparents\nhouseperson\nhousepersons\nhouseplant\nhouseplants\nhouseroom\nhouserooms\nhousers\nhouses\nhousesat\nhousesit\nhousesits\nhousesitting\nhousetop\nhousetops\nhousetrain\nhousetrained\nhousetraining\nhousetrains\nhousewares\nhousewarming\nhousewarmings\nhousewife\nhousewifeliness\nhousewifely\nhousewifery\nhousewives\nhousework\nhouseworker\nhouseworkers\nhousing\nhousings\nhouston\nhoustonian\nhoustonians\nhove\nhovel\nhovels\nhover\nhovercraft\nhovercrafts\nhovered\nhoverer\nhoverers\nhovering\nhoveringly\nhovers\nhow\nhoward\nhowards\nhowbeit\nhowdah\nhowdahs\nhowdy\nhowe\nhowes\nhowever\nhowf\nhowff\nhowffs\nhowfs\nhowitzer\nhowitzers\nhowl\nhowled\nhowler\nhowlers\nhowling\nhowls\nhows\nhowsoever\nhoy\nhoya\nhoyas\nhoyden\nhoydenish\nhoydens\nhoyle\nhoys\nhtml\nhualapai\nhualapais\nhuang\nhuarache\nhuaraches\nhuascarán\nhub\nhubba\nhubbard\nhubbies\nhubble\nhubbub\nhubbubs\nhubby\nhubcap\nhubcaps\nhubris\nhubristic\nhubristically\nhubs\nhuck\nhuckaback\nhuckabacks\nhuckleberries\nhuckleberry\nhucks\nhuckster\nhuckstered\nhuckstering\nhucksterism\nhucksters\nhuddle\nhuddled\nhuddler\nhuddlers\nhuddles\nhuddling\nhudibras\nhudibrastic\nhudson\nhue\nhued\nhues\nhuevos\nhuff\nhuffed\nhuffier\nhuffiest\nhuffily\nhuffiness\nhuffing\nhuffish\nhuffishly\nhuffishness\nhuffs\nhuffy\nhug\nhuge\nhugely\nhugeness\nhugeous\nhugeously\nhugeousness\nhuger\nhugest\nhuggable\nhugged\nhugger\nhuggermugger\nhuggermuggered\nhuggermuggering\nhuggermuggers\nhuggermuggery\nhuggers\nhugging\nhugo\nhugs\nhuguenot\nhuguenotic\nhuguenotism\nhuguenots\nhuh\nhui\nhuipil\nhuipils\nhuis\nhula\nhulas\nhulk\nhulked\nhulking\nhulks\nhulky\nhull\nhullaballoo\nhullaballoos\nhullabaloo\nhullabaloos\nhulled\nhuller\nhullers\nhulling\nhullo\nhulls\nhum\nhuman\nhumane\nhumanely\nhumaneness\nhumanhood\nhumanism\nhumanist\nhumanistic\nhumanistically\nhumanists\nhumanitarian\nhumanitarianism\nhumanitarians\nhumanities\nhumanity\nhumanization\nhumanize\nhumanized\nhumanizer\nhumanizers\nhumanizes\nhumanizing\nhumankind\nhumanlike\nhumanly\nhumanness\nhumanoid\nhumanoids\nhumans\nhumate\nhumates\nhumberside\nhumble\nhumblebee\nhumblebees\nhumbled\nhumbleness\nhumbler\nhumblers\nhumbles\nhumblest\nhumbling\nhumbly\nhumboldt\nhumbug\nhumbugged\nhumbugger\nhumbuggers\nhumbuggery\nhumbugging\nhumbugs\nhumdinger\nhumdingers\nhumdrum\nhume\nhumectant\nhumectants\nhumectation\nhumeral\nhumerals\nhumeri\nhumerus\nhumic\nhumid\nhumidification\nhumidifications\nhumidified\nhumidifier\nhumidifiers\nhumidifies\nhumidify\nhumidifying\nhumidistat\nhumidistats\nhumidity\nhumidly\nhumidor\nhumidors\nhumification\nhumifications\nhumified\nhumiliate\nhumiliated\nhumiliates\nhumiliating\nhumiliatingly\nhumiliation\nhumiliations\nhumilities\nhumility\nhummable\nhummed\nhummer\nhummers\nhumming\nhummingbird\nhummingbirds\nhummock\nhummocks\nhummocky\nhummus\nhumongous\nhumor\nhumoral\nhumored\nhumoredly\nhumoresque\nhumoresques\nhumoring\nhumorist\nhumoristic\nhumorists\nhumorless\nhumorlessly\nhumorlessness\nhumorous\nhumorously\nhumorousness\nhumors\nhump\nhumpback\nhumpbacked\nhumpbacks\nhumped\nhumperdinck\nhumph\nhumphed\nhumphing\nhumphrey\nhumphreys\nhumphs\nhumpier\nhumpiest\nhumping\nhumps\nhumpty\nhumpy\nhums\nhumungous\nhumus\nhumuses\nhun\nhunan\nhunch\nhunchback\nhunchbacked\nhunchbacks\nhunched\nhunches\nhunching\nhundred\nhundredfold\nhundreds\nhundredth\nhundredths\nhundredweight\nhundredweights\nhung\nhungarian\nhungarians\nhungary\nhunger\nhungered\nhungering\nhungers\nhungrier\nhungriest\nhungrily\nhungriness\nhungry\nhunk\nhunker\nhunkered\nhunkering\nhunkers\nhunkies\nhunkpapa\nhunkpapas\nhunks\nhunky\nhunnish\nhunnishness\nhuns\nhunt\nhunted\nhunter\nhunters\nhunting\nhuntings\nhuntington\nhuntress\nhuntresses\nhunts\nhuntsman\nhuntsmen\nhuntsville\nhup\nhurdle\nhurdled\nhurdler\nhurdlers\nhurdles\nhurdling\nhurdy\nhurl\nhurled\nhurler\nhurlers\nhurlies\nhurling\nhurlings\nhurls\nhurly\nhuron\nhurons\nhurrah\nhurrahed\nhurrahing\nhurrahs\nhurray\nhurricane\nhurricanes\nhurried\nhurriedly\nhurriedness\nhurrier\nhurriers\nhurries\nhurry\nhurrying\nhurt\nhurter\nhurters\nhurtful\nhurtfully\nhurtfulness\nhurting\nhurtle\nhurtled\nhurtles\nhurtless\nhurtling\nhurts\nhusband\nhusbanded\nhusbander\nhusbanders\nhusbanding\nhusbandly\nhusbandman\nhusbandmen\nhusbandry\nhusbands\nhush\nhushed\nhushes\nhushing\nhushpuppies\nhushpuppy\nhusk\nhusked\nhusker\nhuskers\nhuskier\nhuskies\nhuskiest\nhuskily\nhuskiness\nhusking\nhuskings\nhusks\nhusky\nhuss\nhussar\nhussars\nhussies\nhussite\nhussites\nhussitism\nhussy\nhustings\nhustle\nhustled\nhustler\nhustlers\nhustles\nhustling\nhut\nhutch\nhutches\nhutment\nhuts\nhutted\nhutterite\nhutterites\nhutting\nhutu\nhutus\nhutzpa\nhutzpah\nhuxley\nhuygens\nhuzza\nhuzzah\nhuzzahs\nhuzzas\nhuáscar\nhwang\nhwei\nhweis\nhyacinth\nhyacinthine\nhyacinths\nhyacinthus\nhyades\nhyaena\nhyaenas\nhyalin\nhyaline\nhyalines\nhyalinization\nhyalins\nhyalite\nhyalites\nhyaloid\nhyaloplasm\nhyaloplasms\nhyaluronic\nhyaluronidase\nhyaluronidases\nhyannis\nhybrid\nhybridism\nhybridist\nhybridists\nhybridity\nhybridization\nhybridizations\nhybridize\nhybridized\nhybridizer\nhybridizers\nhybridizes\nhybridizing\nhybridoma\nhybridomas\nhybrids\nhybris\nhydathode\nhydathodes\nhydatid\nhydatids\nhyde\nhyderabad\nhydra\nhydrae\nhydralazine\nhydralazines\nhydramine\nhydramines\nhydrangea\nhydrangeas\nhydrant\nhydranth\nhydranths\nhydrants\nhydrarch\nhydras\nhydrase\nhydrases\nhydrastine\nhydrastines\nhydrate\nhydrated\nhydrates\nhydrating\nhydration\nhydrations\nhydrator\nhydrators\nhydraulic\nhydraulically\nhydraulics\nhydrazide\nhydrazides\nhydrazine\nhydric\nhydride\nhydrides\nhydrilla\nhydrillas\nhydriodic\nhydro\nhydrobiological\nhydrobiologist\nhydrobiologists\nhydrobiology\nhydrobromic\nhydrocarbon\nhydrocarbonaceous\nhydrocarbonic\nhydrocarbonous\nhydrocarbons\nhydrocele\nhydroceles\nhydrocephalic\nhydrocephaloid\nhydrocephalous\nhydrocephalus\nhydrocephaly\nhydrochemistry\nhydrochloric\nhydrochloride\nhydrochlorides\nhydrochlorothiazide\nhydrochlorothiazides\nhydrocolloid\nhydrocolloidal\nhydrocolloids\nhydrocoral\nhydrocorals\nhydrocortisone\nhydrocrack\nhydrocracked\nhydrocracker\nhydrocrackers\nhydrocracking\nhydrocrackings\nhydrocracks\nhydrocyanic\nhydrodynamic\nhydrodynamical\nhydrodynamically\nhydrodynamicist\nhydrodynamicists\nhydrodynamics\nhydroelectric\nhydroelectrically\nhydroelectricity\nhydrofluoric\nhydrofoil\nhydrofoils\nhydroformer\nhydroformers\nhydroforming\nhydroformings\nhydrogen\nhydrogenase\nhydrogenases\nhydrogenate\nhydrogenated\nhydrogenates\nhydrogenating\nhydrogenation\nhydrogenations\nhydrogenolysis\nhydrogenous\nhydrogeologic\nhydrogeological\nhydrogeologist\nhydrogeologists\nhydrogeology\nhydrographer\nhydrographers\nhydrographic\nhydrographically\nhydrographies\nhydrography\nhydroid\nhydroids\nhydrokinetic\nhydrokinetical\nhydrokinetics\nhydrolase\nhydrolases\nhydrologic\nhydrological\nhydrologically\nhydrologist\nhydrologists\nhydrology\nhydrolysate\nhydrolysates\nhydrolysis\nhydrolyte\nhydrolytic\nhydrolytically\nhydrolyzable\nhydrolyzate\nhydrolyzates\nhydrolyzation\nhydrolyze\nhydrolyzed\nhydrolyzes\nhydrolyzing\nhydromagnetic\nhydromagnetics\nhydromancy\nhydromechanical\nhydromechanics\nhydromedusa\nhydromedusae\nhydromedusas\nhydromel\nhydromels\nhydrometallurgical\nhydrometallurgy\nhydrometeor\nhydrometeorological\nhydrometeorologist\nhydrometeorologists\nhydrometeorology\nhydrometeors\nhydrometer\nhydrometers\nhydrometric\nhydrometrical\nhydrometrically\nhydrometry\nhydromorphic\nhydronic\nhydronically\nhydronium\nhydroniums\nhydropath\nhydropathic\nhydropathical\nhydropathies\nhydropathist\nhydropathists\nhydropaths\nhydropathy\nhydroperoxide\nhydrophane\nhydrophanes\nhydrophanous\nhydrophile\nhydrophiles\nhydrophilic\nhydrophilicity\nhydrophilous\nhydrophily\nhydrophobia\nhydrophobias\nhydrophobic\nhydrophobicity\nhydrophone\nhydrophones\nhydrophyte\nhydrophytes\nhydrophytic\nhydroplane\nhydroplaned\nhydroplanes\nhydroplaning\nhydroponic\nhydroponically\nhydroponicist\nhydroponicists\nhydroponics\nhydroponist\nhydroponists\nhydropower\nhydroquinol\nhydroquinols\nhydroquinone\nhydroquinones\nhydros\nhydroscope\nhydroscopes\nhydroscopic\nhydrosere\nhydrosol\nhydrosolic\nhydrosols\nhydrospace\nhydrospaces\nhydrosphere\nhydrospheres\nhydrospheric\nhydrostatic\nhydrostatical\nhydrostatically\nhydrostatics\nhydrosulfate\nhydrosulfates\nhydrosulfide\nhydrosulfides\nhydrosulfite\nhydrosulfites\nhydrosulfurous\nhydrotactic\nhydrotaxis\nhydrotaxises\nhydrotherapeutic\nhydrotherapeutics\nhydrotherapies\nhydrotherapy\nhydrothermal\nhydrothermally\nhydrothorax\nhydrothoraxes\nhydrotropic\nhydrotropically\nhydrotropism\nhydrous\nhydroxide\nhydroxides\nhydroxy\nhydroxyapatite\nhydroxyapatites\nhydroxyl\nhydroxylamine\nhydroxylamines\nhydroxylate\nhydroxylated\nhydroxylates\nhydroxylating\nhydroxylation\nhydroxylic\nhydroxyls\nhydroxyproline\nhydroxyzine\nhydrozoa\nhydrozoan\nhydrozoans\nhydrus\nhyena\nhyenas\nhyenic\nhyetal\nhyetometer\nhyetometers\nhyetometrograph\nhyetometrographs\nhygeia\nhygiene\nhygienic\nhygienically\nhygienics\nhygienist\nhygienists\nhygrograph\nhygrographs\nhygrometer\nhygrometers\nhygrometric\nhygrometry\nhygrophyte\nhygrophytes\nhygrophytic\nhygroscope\nhygroscopes\nhygroscopic\nhygroscopically\nhygroscopicity\nhygrostat\nhygrostats\nhying\nhyla\nhylas\nhylozoic\nhylozoism\nhylozoist\nhylozoistic\nhylozoists\nhymen\nhymenal\nhymeneal\nhymeneally\nhymeneals\nhymenia\nhymenial\nhymenium\nhymeniums\nhymenopteran\nhymenopterans\nhymenopteron\nhymenopterons\nhymenopterous\nhymens\nhymettus\nhymie\nhymies\nhymn\nhymnal\nhymnals\nhymnaries\nhymnary\nhymnbook\nhymnbooks\nhymned\nhymning\nhymnodies\nhymnodist\nhymnodists\nhymnody\nhymnography\nhymnologic\nhymnological\nhymnologist\nhymnologists\nhymnology\nhymns\nhyoid\nhyoids\nhyoscine\nhyoscines\nhyoscyamine\nhyoscyamines\nhypabyssal\nhypabyssally\nhypaethral\nhypanthia\nhypanthial\nhypanthium\nhype\nhyped\nhyper\nhyperacid\nhyperacidity\nhyperactive\nhyperactively\nhyperactivity\nhyperacuity\nhyperacute\nhyperaesthesia\nhyperaesthesias\nhyperaesthetic\nhyperaggressive\nhyperalert\nhyperarid\nhyperarousal\nhyperaware\nhyperawareness\nhyperbaric\nhyperbarically\nhyperbaton\nhyperbatons\nhyperbola\nhyperbolae\nhyperbolas\nhyperbole\nhyperbolic\nhyperbolical\nhyperbolically\nhyperbolism\nhyperbolisms\nhyperbolist\nhyperbolists\nhyperbolize\nhyperbolized\nhyperbolizes\nhyperbolizing\nhyperboloid\nhyperboloidal\nhyperboloids\nhyperborean\nhyperboreans\nhypercalcemia\nhypercalcemias\nhypercapnia\nhypercapnias\nhypercatabolism\nhypercatalectic\nhypercatalexis\nhypercautious\nhypercharge\nhypercharged\nhypercharges\nhypercholesterolemia\nhypercholesterolemias\nhypercivilized\nhypercoagulability\nhypercoagulable\nhypercompetitive\nhyperconcentration\nhyperconscious\nhyperconsciousness\nhypercorrect\nhypercorrection\nhypercorrections\nhypercorrectly\nhypercorrectness\nhypercritic\nhypercritical\nhypercritically\nhypercriticism\nhypercriticisms\nhypercriticize\nhypercriticizes\nhypercritics\nhypercube\nhypercubes\nhyperdense\nhyperdevelopment\nhyperefficient\nhyperemia\nhyperemic\nhyperemotional\nhyperemotionality\nhyperendemic\nhyperenergetic\nhyperesthesia\nhyperesthesias\nhyperesthetic\nhypereutectic\nhyperexcitability\nhyperexcitable\nhyperexcited\nhyperexcitement\nhyperexcretion\nhyperextend\nhyperextended\nhyperextending\nhyperextends\nhyperextension\nhyperextensions\nhyperfastidious\nhyperfine\nhyperfunction\nhyperfunctional\nhyperfunctioning\nhypergamies\nhypergamy\nhypergeometric\nhyperglycemia\nhyperglycemic\nhypergol\nhypergolic\nhypergolically\nhyperimmune\nhyperimmunization\nhyperimmunize\nhyperimmunized\nhyperimmunizes\nhyperimmunizing\nhyperinflated\nhyperinflation\nhyperinflationary\nhyperinflations\nhyperinnervation\nhyperinsulinism\nhyperinsulinisms\nhyperintellectual\nhyperintelligent\nhyperintense\nhyperinvolution\nhyperion\nhyperirritability\nhyperirritable\nhyperkeratoses\nhyperkeratosis\nhyperkeratotic\nhyperkinesia\nhyperkinesis\nhyperkinetic\nhyperlink\nhyperlinks\nhyperlipemia\nhyperlipemias\nhyperlipidemia\nhyperlipidemias\nhypermania\nhypermanic\nhypermarket\nhypermarkets\nhypermasculine\nhypermedia\nhypermetabolic\nhypermetabolism\nhypermeter\nhypermeters\nhypermetric\nhypermetrical\nhypermetropia\nhypermetropias\nhypermetropic\nhypermetropical\nhypermetropy\nhypermnesia\nhypermnesias\nhypermnesic\nhypermobility\nhypermodern\nhypermodernist\nhypermutability\nhypermutable\nhypernationalistic\nhyperon\nhyperons\nhyperope\nhyperopia\nhyperopias\nhyperopic\nhyperostoses\nhyperostosis\nhyperostotic\nhyperparasite\nhyperparasites\nhyperparasitic\nhyperparasitism\nhyperparathyroidism\nhyperphagia\nhyperphagic\nhyperphysical\nhyperpigmentation\nhyperpigmented\nhyperpituitarism\nhyperpituitarisms\nhyperpituitary\nhyperplane\nhyperplanes\nhyperplasia\nhyperplasias\nhyperplastic\nhyperploid\nhyperploidy\nhyperpnea\nhyperpneas\nhyperpneic\nhyperpolarize\nhyperpolarized\nhyperpolarizes\nhyperpolarizing\nhyperproducer\nhyperproducers\nhyperproduction\nhyperpure\nhyperpyretic\nhyperpyrexia\nhyperpyrexial\nhyperpyrexias\nhyperrational\nhyperrationality\nhyperreactive\nhyperreactivity\nhyperreactor\nhyperreactors\nhyperrealism\nhyperrealisms\nhyperrealist\nhyperrealistic\nhyperrealists\nhyperresponsive\nhyperromantic\nhypersaline\nhypersalinity\nhypersalivation\nhypersecretion\nhypersensitive\nhypersensitiveness\nhypersensitivities\nhypersensitivity\nhypersensitization\nhypersensitize\nhypersensitized\nhypersensitizes\nhypersensitizing\nhypersexual\nhypersexuality\nhypersomnolence\nhypersonic\nhypersonically\nhyperspace\nhyperspaces\nhyperstatic\nhypersthene\nhypersthenes\nhypersthenic\nhyperstimulate\nhyperstimulated\nhyperstimulates\nhyperstimulating\nhyperstimulation\nhypersurface\nhypersurfaces\nhypersusceptibility\nhypersusceptible\nhypertense\nhypertension\nhypertensive\nhypertext\nhypertexts\nhyperthermal\nhyperthermia\nhyperthermias\nhyperthermic\nhyperthyroid\nhyperthyroidism\nhypertonia\nhypertonias\nhypertonic\nhypertonicity\nhypertrophic\nhypertrophied\nhypertrophies\nhypertrophy\nhypertrophying\nhypertypical\nhypervelocity\nhyperventilate\nhyperventilated\nhyperventilates\nhyperventilating\nhyperventilation\nhypervigilance\nhypervigilant\nhypervirulent\nhyperviscosity\nhypervitaminoses\nhypervitaminosis\nhypes\nhypesthesia\nhypesthesias\nhypethral\nhypha\nhyphae\nhyphal\nhyphen\nhyphenate\nhyphenated\nhyphenates\nhyphenating\nhyphenation\nhyphenations\nhyphened\nhyphening\nhyphenless\nhyphens\nhyping\nhypnagogic\nhypnoanalyses\nhypnoanalysis\nhypnogenesis\nhypnogenetic\nhypnogenetically\nhypnogogic\nhypnoid\nhypnoidal\nhypnopedia\nhypnopedias\nhypnophobia\nhypnophobias\nhypnophobic\nhypnopompic\nhypnos\nhypnoses\nhypnosis\nhypnotherapies\nhypnotherapy\nhypnotic\nhypnotically\nhypnotics\nhypnotism\nhypnotist\nhypnotists\nhypnotizability\nhypnotizable\nhypnotization\nhypnotize\nhypnotized\nhypnotizer\nhypnotizers\nhypnotizes\nhypnotizing\nhypo\nhypoacidities\nhypoacidity\nhypoactive\nhypoallergenic\nhypobaric\nhypobarism\nhypoblast\nhypoblastic\nhypoblasts\nhypocaust\nhypocausts\nhypocenter\nhypocenters\nhypocentral\nhypochlorite\nhypochlorites\nhypochlorous\nhypochondria\nhypochondriac\nhypochondriacal\nhypochondriacally\nhypochondriacs\nhypochondriases\nhypochondriasis\nhypochondrium\nhypocorism\nhypocorisms\nhypocoristic\nhypocoristical\nhypocoristically\nhypocotyl\nhypocotyls\nhypocrisies\nhypocrisy\nhypocrite\nhypocrites\nhypocritical\nhypocritically\nhypocycloid\nhypocycloids\nhypoderm\nhypodermal\nhypodermic\nhypodermically\nhypodermics\nhypodermis\nhypodermises\nhypoderms\nhypoed\nhypoesthesia\nhypoesthesias\nhypoeutectic\nhypogastria\nhypogastric\nhypogastrium\nhypogea\nhypogeal\nhypogeally\nhypogean\nhypogene\nhypogenous\nhypogeous\nhypogeum\nhypoglossal\nhypoglycemia\nhypoglycemic\nhypogynous\nhypogyny\nhypoing\nhypolimnetic\nhypolimnial\nhypolimnion\nhypolimnions\nhypomania\nhypomanias\nhypomanic\nhypomorphic\nhyponastic\nhyponasties\nhyponasty\nhypophosphite\nhypophosphites\nhypophosphorous\nhypophyseal\nhypophyses\nhypophysial\nhypophysis\nhypopituitarism\nhypopituitarisms\nhypopituitary\nhypoplasia\nhypoplasias\nhypoplastic\nhypoploid\nhypoploidy\nhypopnea\nhypopneas\nhypopneic\nhypos\nhyposensitive\nhyposensitivities\nhyposensitivity\nhyposensitization\nhyposensitizations\nhyposensitize\nhyposensitized\nhyposensitizes\nhyposensitizing\nhypostases\nhypostasis\nhypostatic\nhypostatical\nhypostatically\nhypostatization\nhypostatize\nhypostatized\nhypostatizes\nhypostatizing\nhyposthenia\nhyposthenias\nhyposthenic\nhypostyle\nhypostyles\nhyposulfite\nhyposulfites\nhyposulfurous\nhypotactic\nhypotaxis\nhypotaxises\nhypotension\nhypotensions\nhypotensive\nhypotensives\nhypotenuse\nhypotenuses\nhypothalamic\nhypothalamus\nhypothalamuses\nhypothecate\nhypothecated\nhypothecates\nhypothecating\nhypothecation\nhypothecations\nhypothecator\nhypothecators\nhypothenuse\nhypothermal\nhypothermia\nhypothermic\nhypotheses\nhypothesi\nhypothesis\nhypothesize\nhypothesized\nhypothesizer\nhypothesizers\nhypothesizes\nhypothesizing\nhypothetic\nhypothetical\nhypothetically\nhypothyroid\nhypothyroidism\nhypotonic\nhypotonicity\nhypotrophic\nhypotrophies\nhypotrophy\nhypoventilation\nhypoventilations\nhypoxanthine\nhypoxanthines\nhypoxemia\nhypoxemias\nhypoxemic\nhypoxia\nhypoxias\nhypoxic\nhypsographic\nhypsographical\nhypsographies\nhypsography\nhypsometer\nhypsometers\nhypsometric\nhypsometrical\nhypsometrically\nhypsometrist\nhypsometrists\nhypsometry\nhyraces\nhyrax\nhyraxes\nhyson\nhysons\nhyssop\nhyssops\nhysterectomies\nhysterectomize\nhysterectomized\nhysterectomizes\nhysterectomizing\nhysterectomy\nhystereses\nhysteresis\nhysteretic\nhysteria\nhysterias\nhysteric\nhysterical\nhysterically\nhysterics\nhysterogenic\nhysteroid\nhysteron\nhysterotomies\nhysterotomy\nhälsingborg\nhéloise\nhôte\nhôtel\ni\ni'd\ni'll\ni'm\ni've\niago\niamb\niambi\niambic\niambics\niambs\niambus\niambuses\niapetus\niatrogenic\niatrogenically\niberia\niberian\niberians\nibex\nibexes\nibibio\nibibios\nibid\nibidem\nibis\nibises\nibiza\nibizan\nibo\nibos\nibsen\nibsenian\nibsenism\nibsenite\nibsenites\nibuprofen\nicaria\nicarus\nice\niceball\niceballs\niceberg\nicebergs\niceblink\niceblinks\niceboat\niceboater\niceboaters\niceboating\niceboats\nicebound\nicebox\niceboxes\nicebreaker\nicebreakers\nicebreaking\nicecap\nicecaps\niced\nicefall\nicefalls\nicehouse\nicehouses\niceland\nicelander\nicelanders\nicelandic\niceless\nicelike\nicemaker\nicemakers\niceman\nicemen\niceni\nicenian\nicenic\nicepack\nicepacks\nices\nicescape\nicescapes\nich\nichihara\nichikawa\nichinomiya\nichneumon\nichneumons\nichnite\nichnites\nichnographies\nichnography\nichnolite\nichnolites\nichor\nichorous\nichors\nichthyic\nichthyofauna\nichthyofaunal\nichthyofaunas\nichthyoid\nichthyoids\nichthyologic\nichthyological\nichthyologically\nichthyologist\nichthyologists\nichthyology\nichthyophagous\nichthyornis\nichthyornises\nichthyosaur\nichthyosauri\nichthyosaurian\nichthyosaurs\nichthyosaurus\nichthyosis\nici\nicicle\nicicles\nicier\niciest\nicily\niciness\nicing\nicings\nickier\nickiest\nickiness\nicky\nicon\niconic\niconically\niconicity\niconified\niconifies\niconify\niconifying\niconoclasm\niconoclast\niconoclastic\niconoclastically\niconoclasts\niconographer\niconographers\niconographic\niconographical\niconographically\niconographies\niconography\niconolater\niconolaters\niconolatric\niconolatry\niconological\niconologist\niconologists\niconology\niconoscope\niconoscopes\niconostases\niconostasis\nicons\nicosahedra\nicosahedral\nicosahedron\nicosahedrons\nicteric\nicterics\nicterus\nictinus\nictus\nictuses\nicy\nid\nida\nidaho\nidahoan\nidahoans\nidahoes\nidahos\nidea\nideal\nidealess\nidealism\nidealist\nidealistic\nidealistically\nidealists\nidealities\nideality\nidealization\nidealizations\nidealize\nidealized\nidealizer\nidealizers\nidealizes\nidealizing\nidealless\nideally\nidealogue\nidealogy\nideals\nideas\nideate\nideated\nideates\nideating\nideation\nideational\nideationally\nideations\nidem\nidempotent\nidentic\nidentical\nidentically\nidenticalness\nidentics\nidentifiable\nidentifiably\nidentification\nidentifications\nidentified\nidentifier\nidentifiers\nidentifies\nidentify\nidentifying\nidentities\nidentity\nidentité\nideogram\nideogramic\nideogrammatic\nideogrammatically\nideogrammic\nideograms\nideograph\nideographic\nideographically\nideographs\nideography\nideologic\nideological\nideologically\nideologies\nideologist\nideologists\nideologize\nideologized\nideologizes\nideologizing\nideologue\nideologues\nideology\nideomotor\nides\nidioblast\nidioblastic\nidioblasts\nidiocies\nidiocy\nidiographic\nidiolect\nidiolectal\nidiolectic\nidiolects\nidiom\nidiomatic\nidiomatically\nidiomaticness\nidiomorphic\nidioms\nidiopathic\nidiopathically\nidiopathies\nidiopathy\nidiosyncrasies\nidiosyncrasy\nidiosyncratic\nidiosyncratically\nidiot\nidiotic\nidiotical\nidiotically\nidiotism\nidiots\nidiotype\nidiotypic\nidle\nidled\nidleness\nidler\nidlers\nidles\nidlesse\nidlest\nidling\nidly\nidocrase\nidocrases\nidol\nidolater\nidolaters\nidolator\nidolators\nidolatries\nidolatrous\nidolatrously\nidolatrousness\nidolatry\nidolization\nidolizations\nidolize\nidolized\nidolizer\nidolizers\nidolizes\nidolizing\nidols\nids\nidyl\nidyll\nidyllic\nidyllically\nidyllist\nidyllists\nidylls\nidyls\nidée\nidées\nif\niffier\niffiest\niffiness\niffy\nifni\nifs\nigbo\nigbos\nigg\nigged\nigging\niggs\nigitur\nigloo\nigloos\nignatius\nigneous\nignes\nignescent\nigni\nignimbrite\nignimbrites\nignis\nignitability\nignitable\nignite\nignited\nigniter\nigniters\nignites\nignitible\nigniting\nignition\nignitions\nignitor\nignitors\nignitron\nignitrons\nignobility\nignoble\nignobleness\nignobly\nignominies\nignominious\nignominiously\nignominiousness\nignominy\nignorable\nignoramus\nignoramuses\nignorance\nignorant\nignorantia\nignorantly\nignorantness\nignoratio\nignore\nignored\nignorer\nignorers\nignores\nignoring\nignotius\nignotum\nigorot\nigorots\nigraine\niguana\niguanas\niguanodon\niguanodons\niguassú\niguaçú\nihram\nihrams\nijmuiden\nijsselmeer\nikaria\nikat\nikebana\nikhnaton\nikon\nikons\nil\nilang\nilea\nileac\nileal\nileitis\nileostomies\nileostomy\nileum\nileus\nilex\nilexes\nilia\niliac\niliad\niliadic\nilial\niliamna\nilion\nilium\nilk\nilka\nill\nillae\nillampu\nillation\nillations\nillative\nillatively\nillatives\nillaudable\nillaudably\nillegal\nillegalities\nillegality\nillegalization\nillegalize\nillegalized\nillegalizes\nillegalizing\nillegally\nillegals\nillegibility\nillegible\nillegibleness\nillegibly\nillegitimacies\nillegitimacy\nillegitimate\nillegitimated\nillegitimately\nillegitimates\nillegitimating\nillegitimatize\nillegitimatizes\niller\nilliberal\nilliberalism\nilliberality\nilliberally\nilliberalness\nillicit\nillicitly\nillicitness\nillimani\nillimitability\nillimitable\nillimitableness\nillimitably\nillinoian\nillinois\nillinoisan\nillinoisans\nilliquid\nilliquidity\nillis\nillite\nilliteracies\nilliteracy\nilliterate\nilliterately\nilliterateness\nilliterates\nillitic\nillness\nillnesses\nillocutionary\nillogic\nillogical\nillogicalities\nillogicality\nillogically\nillogicalness\nills\nillume\nillumed\nillumes\nilluminable\nilluminance\nilluminances\nilluminant\nilluminants\nilluminate\nilluminated\nilluminates\nilluminati\nilluminating\nilluminatingly\nillumination\nilluminations\nilluminative\nilluminator\nilluminators\nillumine\nillumined\nillumines\nilluming\nillumining\nilluminism\nilluminist\nilluminists\nillusion\nillusional\nillusionary\nillusionism\nillusionist\nillusionistic\nillusionistically\nillusionists\nillusionless\nillusions\nillusive\nillusively\nillusiveness\nillusorily\nillusoriness\nillusory\nillustratable\nillustrate\nillustrated\nillustrates\nillustrating\nillustration\nillustrational\nillustrations\nillustrative\nillustratively\nillustrator\nillustrators\nillustrious\nillustriously\nillustriousness\nilluvial\nilluviate\nilluviated\nilluviates\nilluviating\nilluviation\nilluviations\nilly\nillyria\nillyrian\nillyrians\nillyricums\nilmenite\nilmenites\nilocano\nilocanos\niloilo\nilokano\nilokanos\nilorin\nils\nimage\nimaged\nimageless\nimager\nimageries\nimagers\nimagery\nimages\nimaginability\nimaginable\nimaginableness\nimaginably\nimaginaire\nimaginal\nimaginaries\nimaginarily\nimaginariness\nimaginary\nimagination\nimaginational\nimaginations\nimaginative\nimaginatively\nimaginativeness\nimagine\nimagined\nimaginer\nimaginers\nimagines\nimaging\nimagings\nimagining\nimaginings\nimagism\nimagist\nimagistic\nimagistically\nimagists\nimago\nimagoes\nimam\nimamate\nimamates\nimams\nimaret\nimarets\nimari\nimbalance\nimbalanced\nimbalances\nimbecile\nimbecilely\nimbeciles\nimbecilic\nimbecilities\nimbecility\nimbed\nimbedded\nimbedding\nimbedment\nimbeds\nimbibe\nimbibed\nimbiber\nimbibers\nimbibes\nimbibing\nimbibition\nimbibitional\nimbibitions\nimbitter\nimbosom\nimbricate\nimbricated\nimbricates\nimbricating\nimbrication\nimbrications\nimbroglio\nimbroglios\nimbrown\nimbrue\nimbrued\nimbrues\nimbruing\nimbrute\nimbruted\nimbrutes\nimbruting\nimbue\nimbued\nimbues\nimbuing\nimidazole\nimidazoles\nimide\nimides\nimidic\nimido\nimine\nimines\nimino\nimipramine\nimipramines\nimitable\nimitate\nimitated\nimitates\nimitating\nimitation\nimitational\nimitations\nimitative\nimitatively\nimitativeness\nimitator\nimitators\nimmaculacies\nimmaculacy\nimmaculate\nimmaculately\nimmaculateness\nimmane\nimmanence\nimmanency\nimmanent\nimmanentism\nimmanentist\nimmanentistic\nimmanentists\nimmanently\nimmanuel\nimmaterial\nimmaterialism\nimmaterialist\nimmaterialists\nimmaterialities\nimmateriality\nimmaterialize\nimmaterialized\nimmaterializes\nimmaterializing\nimmaterially\nimmaterialness\nimmature\nimmaturely\nimmatureness\nimmaturity\nimmeasurability\nimmeasurable\nimmeasurableness\nimmeasurably\nimmediacies\nimmediacy\nimmediate\nimmediately\nimmediateness\nimmedicable\nimmedicably\nimmelmann\nimmemorial\nimmemorially\nimmense\nimmensely\nimmenseness\nimmensities\nimmensity\nimmensurable\nimmerge\nimmerged\nimmergence\nimmergences\nimmerges\nimmerging\nimmerse\nimmersed\nimmerses\nimmersible\nimmersing\nimmersion\nimmersions\nimmesh\nimmeshed\nimmeshes\nimmeshing\nimmethodical\nimmethodically\nimmigrant\nimmigrants\nimmigrate\nimmigrated\nimmigrates\nimmigrating\nimmigration\nimmigrational\nimmigrations\nimminence\nimminencies\nimminency\nimminent\nimminently\nimminentness\nimmingle\nimmiscibility\nimmiscible\nimmiscibly\nimmitigability\nimmitigable\nimmitigableness\nimmitigably\nimmittance\nimmittances\nimmix\nimmixed\nimmixes\nimmixing\nimmixture\nimmixtures\nimmobile\nimmobilism\nimmobility\nimmobilization\nimmobilizations\nimmobilize\nimmobilized\nimmobilizer\nimmobilizers\nimmobilizes\nimmobilizing\nimmoderacies\nimmoderacy\nimmoderate\nimmoderately\nimmoderateness\nimmoderation\nimmodest\nimmodestly\nimmodesty\nimmolate\nimmolated\nimmolates\nimmolating\nimmolation\nimmolations\nimmolator\nimmolators\nimmoral\nimmoralism\nimmoralist\nimmoralists\nimmoralities\nimmorality\nimmorally\nimmortal\nimmortality\nimmortalization\nimmortalize\nimmortalized\nimmortalizer\nimmortalizers\nimmortalizes\nimmortalizing\nimmortally\nimmortals\nimmortelle\nimmortelles\nimmotile\nimmotility\nimmovability\nimmovable\nimmovableness\nimmovables\nimmovably\nimmune\nimmunes\nimmunities\nimmunity\nimmunization\nimmunizations\nimmunize\nimmunized\nimmunizes\nimmunizing\nimmunoassay\nimmunoassayable\nimmunoassays\nimmunoblot\nimmunoblotting\nimmunochemical\nimmunochemically\nimmunochemist\nimmunochemistry\nimmunochemists\nimmunocompetence\nimmunocompetent\nimmunocompromised\nimmunocytochemical\nimmunocytochemically\nimmunocytochemistry\nimmunodeficiencies\nimmunodeficiency\nimmunodeficient\nimmunodepressant\nimmunodepressants\nimmunodepression\nimmunodepressive\nimmunodiagnosis\nimmunodiagnostic\nimmunodiffusion\nimmunoelectrophoresis\nimmunoelectrophoretic\nimmunoelectrophoretically\nimmunofluorescence\nimmunofluorescences\nimmunofluorescent\nimmunogen\nimmunogenesis\nimmunogenetic\nimmunogenetically\nimmunogeneticist\nimmunogeneticists\nimmunogenetics\nimmunogenic\nimmunogenicity\nimmunogens\nimmunoglobulin\nimmunoglobulins\nimmunohematologic\nimmunohematological\nimmunohematologist\nimmunohematologists\nimmunohematology\nimmunohistochemical\nimmunohistochemistry\nimmunologic\nimmunological\nimmunologically\nimmunologist\nimmunologists\nimmunology\nimmunomodulator\nimmunomodulators\nimmunomodulatory\nimmunopathologic\nimmunopathological\nimmunopathologist\nimmunopathologists\nimmunopathology\nimmunoprecipitate\nimmunoprecipitated\nimmunoprecipitates\nimmunoprecipitating\nimmunoprecipitation\nimmunoreaction\nimmunoreactions\nimmunoreactive\nimmunoreactivity\nimmunoregulation\nimmunoregulatory\nimmunosorbent\nimmunosuppress\nimmunosuppressant\nimmunosuppressants\nimmunosuppressed\nimmunosuppresses\nimmunosuppressing\nimmunosuppression\nimmunosuppressive\nimmunotherapeutic\nimmunotherapies\nimmunotherapist\nimmunotherapists\nimmunotherapy\nimmure\nimmured\nimmurement\nimmurements\nimmures\nimmuring\nimmutability\nimmutable\nimmutableness\nimmutably\nimogen\nimp\nimpact\nimpacted\nimpacter\nimpacters\nimpacting\nimpaction\nimpactions\nimpactive\nimpactor\nimpactors\nimpacts\nimpaint\nimpainted\nimpainting\nimpaints\nimpair\nimpaired\nimpairer\nimpairers\nimpairing\nimpairment\nimpairments\nimpairs\nimpala\nimpalas\nimpale\nimpaled\nimpalement\nimpalements\nimpaler\nimpalers\nimpales\nimpaling\nimpalpability\nimpalpable\nimpalpably\nimpanel\nimpaneled\nimpaneling\nimpanelled\nimpanelling\nimpanelment\nimpanelments\nimpanels\nimparadise\nimparadised\nimparadises\nimparadising\nimparities\nimparity\nimpart\nimpartation\nimparted\nimpartial\nimpartiality\nimpartially\nimpartialness\nimpartibility\nimpartible\nimpartibly\nimparting\nimpartment\nimparts\nimpassability\nimpassable\nimpassableness\nimpassably\nimpasse\nimpasses\nimpassibility\nimpassible\nimpassibleness\nimpassibly\nimpassion\nimpassioned\nimpassioning\nimpassions\nimpassive\nimpassively\nimpassiveness\nimpassivity\nimpaste\nimpasted\nimpastes\nimpasting\nimpasto\nimpastoed\nimpastos\nimpatience\nimpatiens\nimpatient\nimpatiently\nimpawn\nimpawned\nimpawning\nimpawns\nimpeach\nimpeachability\nimpeachable\nimpeached\nimpeachers\nimpeaches\nimpeaching\nimpeachment\nimpeachments\nimpearl\nimpearled\nimpearling\nimpearls\nimpeccability\nimpeccable\nimpeccably\nimpecuniosity\nimpecunious\nimpecuniously\nimpecuniousness\nimped\nimpedance\nimpede\nimpeded\nimpeder\nimpeders\nimpedes\nimpediment\nimpedimenta\nimpedimental\nimpedimentary\nimpediments\nimpeding\nimpel\nimpelled\nimpeller\nimpellers\nimpelling\nimpellor\nimpellors\nimpels\nimpend\nimpended\nimpendent\nimpending\nimpends\nimpenetrability\nimpenetrable\nimpenetrableness\nimpenetrably\nimpenetrate\nimpenitence\nimpenitent\nimpenitently\nimpenitents\nimpera\nimperative\nimperatively\nimperativeness\nimperatives\nimperator\nimperatorial\nimperators\nimperatriz\nimperceivable\nimperceptibility\nimperceptible\nimperceptibleness\nimperceptibly\nimperceptive\nimperceptiveness\nimperceptivity\nimpercipience\nimpercipient\nimperfect\nimperfecta\nimperfectability\nimperfection\nimperfections\nimperfective\nimperfectly\nimperfectness\nimperfects\nimperforate\nimperforates\nimperia\nimperial\nimperialism\nimperialist\nimperialistic\nimperialistically\nimperialists\nimperially\nimperials\nimperil\nimperiled\nimperiling\nimperilled\nimperilling\nimperilment\nimperilments\nimperils\nimperious\nimperiously\nimperiousness\nimperishability\nimperishable\nimperishableness\nimperishably\nimperium\nimpermanence\nimpermanency\nimpermanent\nimpermanently\nimpermeabilities\nimpermeability\nimpermeable\nimpermeableness\nimpermeably\nimpermissibility\nimpermissible\nimpermissibly\nimpersonal\nimpersonality\nimpersonalization\nimpersonalize\nimpersonalized\nimpersonalizes\nimpersonalizing\nimpersonally\nimpersonate\nimpersonated\nimpersonates\nimpersonating\nimpersonation\nimpersonations\nimpersonator\nimpersonators\nimpertinence\nimpertinencies\nimpertinency\nimpertinent\nimpertinently\nimperturbability\nimperturbable\nimperturbableness\nimperturbably\nimpervious\nimperviously\nimperviousness\nimpetiginous\nimpetigo\nimpetigos\nimpetrate\nimpetrated\nimpetrates\nimpetrating\nimpetration\nimpetrations\nimpetuosities\nimpetuosity\nimpetuous\nimpetuously\nimpetuousness\nimpetus\nimpetuses\nimpieties\nimpiety\nimping\nimpinge\nimpinged\nimpingement\nimpingements\nimpinger\nimpingers\nimpinges\nimpinging\nimpious\nimpiously\nimpiousness\nimpish\nimpishly\nimpishness\nimpitoyable\nimpitoyables\nimplacability\nimplacable\nimplacableness\nimplacably\nimplant\nimplantable\nimplantation\nimplantations\nimplanted\nimplanter\nimplanters\nimplanting\nimplants\nimplausibility\nimplausible\nimplausibleness\nimplausibly\nimplead\nimpleaded\nimpleading\nimpleads\nimplement\nimplementation\nimplementations\nimplemented\nimplementer\nimplementers\nimplementing\nimplementor\nimplementors\nimplements\nimplicate\nimplicated\nimplicates\nimplicating\nimplication\nimplications\nimplicative\nimplicatively\nimplicativeness\nimplicit\nimplicitly\nimplicitness\nimplied\nimplies\nimplode\nimploded\nimplodes\nimploding\nimploration\nimplorations\nimplore\nimplored\nimplorer\nimplorers\nimplores\nimploring\nimploringly\nimplosion\nimplosions\nimplosive\nimplosives\nimplume\nimply\nimplying\nimpolite\nimpolitely\nimpoliteness\nimpolitic\nimpolitical\nimpolitically\nimpoliticly\nimponderability\nimponderable\nimponderableness\nimponderables\nimponderably\nimpone\nimponed\nimpones\nimponing\nimport\nimportability\nimportable\nimportance\nimportancy\nimportant\nimportantly\nimportation\nimportations\nimported\nimporter\nimporters\nimporting\nimports\nimportunate\nimportunately\nimportunateness\nimportune\nimportuned\nimportunely\nimportuner\nimportuners\nimportunes\nimportuning\nimportunities\nimportunity\nimpose\nimposed\nimposer\nimposers\nimposes\nimposing\nimposingly\nimposition\nimpositions\nimpossibilities\nimpossibility\nimpossible\nimpossibleness\nimpossibly\nimpost\nimposter\nimposters\nimposthume\nimpostor\nimpostors\nimposts\nimpostume\nimposture\nimpostures\nimpotence\nimpotencies\nimpotency\nimpotent\nimpotently\nimpound\nimpoundage\nimpoundages\nimpounded\nimpounder\nimpounders\nimpounding\nimpoundment\nimpoundments\nimpounds\nimpoverish\nimpoverished\nimpoverisher\nimpoverishers\nimpoverishes\nimpoverishing\nimpoverishment\nimpoverishments\nimpracticability\nimpracticable\nimpracticableness\nimpracticably\nimpractical\nimpracticalities\nimpracticality\nimpractically\nimpracticalness\nimprecate\nimprecated\nimprecates\nimprecating\nimprecation\nimprecations\nimprecator\nimprecators\nimprecatory\nimprecise\nimprecisely\nimpreciseness\nimprecision\nimprecisions\nimpregnability\nimpregnable\nimpregnableness\nimpregnably\nimpregnant\nimpregnants\nimpregnate\nimpregnated\nimpregnates\nimpregnating\nimpregnation\nimpregnations\nimpregnator\nimpregnators\nimpresa\nimpresario\nimpresarios\nimpresas\nimpress\nimpressed\nimpresser\nimpressers\nimpresses\nimpressibility\nimpressible\nimpressibly\nimpressing\nimpression\nimpressionability\nimpressionable\nimpressionableness\nimpressionably\nimpressionism\nimpressionist\nimpressionistic\nimpressionistically\nimpressionists\nimpressions\nimpressive\nimpressively\nimpressiveness\nimpressment\nimpressments\nimpressure\nimpressures\nimprest\nimprests\nimprimatur\nimprimaturs\nimprimis\nimprint\nimprinted\nimprinter\nimprinters\nimprinting\nimprintings\nimprints\nimprison\nimprisonable\nimprisoned\nimprisoning\nimprisonment\nimprisonments\nimprisons\nimprobabilist\nimprobabilists\nimprobabilities\nimprobability\nimprobable\nimprobableness\nimprobably\nimprobity\nimpromptu\nimpromptus\nimproper\nimproperly\nimproperness\nimpropriate\nimpropriated\nimpropriates\nimpropriating\nimpropriation\nimproprieties\nimpropriety\nimprovability\nimprovable\nimprove\nimproved\nimprovement\nimprovements\nimprover\nimprovers\nimproves\nimprovidence\nimprovident\nimprovidently\nimproving\nimprovisation\nimprovisational\nimprovisationally\nimprovisations\nimprovisator\nimprovisatore\nimprovisatores\nimprovisatori\nimprovisatorial\nimprovisators\nimprovisatory\nimprovise\nimprovised\nimproviser\nimprovisers\nimprovises\nimprovising\nimprovisor\nimprovisors\nimproviste\nimprudence\nimprudent\nimprudently\nimps\nimpudence\nimpudences\nimpudencies\nimpudency\nimpudent\nimpudently\nimpudicity\nimpugn\nimpugnable\nimpugned\nimpugner\nimpugners\nimpugning\nimpugns\nimpuissance\nimpuissances\nimpuissant\nimpulse\nimpulsed\nimpulses\nimpulsing\nimpulsion\nimpulsive\nimpulsively\nimpulsiveness\nimpulsivity\nimpunities\nimpunity\nimpure\nimpurely\nimpureness\nimpurer\nimpurest\nimpurities\nimpurity\nimputability\nimputable\nimputably\nimputation\nimputations\nimputative\nimputatively\nimpute\nimputed\nimputes\nimputing\nin\ninability\ninaccessibility\ninaccessible\ninaccessibly\ninaccuracies\ninaccuracy\ninaccurate\ninaccurately\ninaccurateness\ninaction\ninactivate\ninactivated\ninactivates\ninactivating\ninactivation\ninactivations\ninactive\ninactively\ninactiveness\ninactivity\ninadequacies\ninadequacy\ninadequate\ninadequately\ninadequateness\ninadmissibility\ninadmissible\ninadmissibly\ninadvertence\ninadvertencies\ninadvertency\ninadvertent\ninadvertently\ninadvisability\ninadvisable\ninadvisably\ninalienability\ninalienable\ninalienably\ninalterability\ninalterable\ninalterableness\ninalterably\ninamorata\ninamoratas\ninamorato\ninamoratos\ninane\ninanely\ninaneness\ninaner\ninanest\ninanimate\ninanimately\ninanimateness\ninanities\ninanition\ninanity\ninapparent\ninapparently\ninappeasable\ninappetence\ninappetences\ninappetencies\ninappetency\ninappetent\ninapplicability\ninapplicable\ninapplicably\ninapposite\ninappositely\ninappositeness\ninappreciable\ninappreciably\ninappreciative\ninappreciatively\ninappreciativeness\ninapproachability\ninapproachable\ninapproachably\ninappropriate\ninappropriately\ninappropriateness\ninapt\ninaptitude\ninaptly\ninaptness\ninarguable\ninarguably\ninarticulacy\ninarticulate\ninarticulately\ninarticulateness\ninartistic\ninartistically\ninasmuch\ninassimilable\ninattention\ninattentive\ninattentively\ninattentiveness\ninaudibility\ninaudible\ninaudibly\ninaugural\ninaugurals\ninaugurate\ninaugurated\ninaugurates\ninaugurating\ninauguration\ninaugurations\ninaugurator\ninaugurators\ninauguratory\ninauspicious\ninauspiciously\ninauspiciousness\ninauthentic\ninauthenticity\ninboard\ninboards\ninborn\ninbound\ninbounded\ninbounding\ninbounds\ninbreathe\ninbreathed\ninbreathes\ninbreathing\ninbred\ninbreed\ninbreeder\ninbreeders\ninbreeding\ninbreedings\ninbreeds\ninbuilt\ninca\nincaic\nincalculability\nincalculable\nincalculableness\nincalculably\nincalescence\nincalescent\nincan\nincandesce\nincandesced\nincandescence\nincandescent\nincandescently\nincandesces\nincandescing\nincans\nincantation\nincantational\nincantations\nincantatory\nincapability\nincapable\nincapableness\nincapably\nincapacitant\nincapacitants\nincapacitate\nincapacitated\nincapacitates\nincapacitating\nincapacitation\nincapacitations\nincapacities\nincapacity\nincapsulate\nincapsulated\nincapsulates\nincapsulating\nincapsulation\nincapsulations\nincapsulator\nincapsulators\nincarcerate\nincarcerated\nincarcerates\nincarcerating\nincarceration\nincarcerations\nincarcerator\nincarcerators\nincarnadine\nincarnadined\nincarnadines\nincarnadining\nincarnate\nincarnated\nincarnates\nincarnating\nincarnation\nincarnations\nincarnator\nincarnators\nincas\nincase\nincased\nincasement\nincasements\nincases\nincasing\nincautious\nincautiously\nincautiousness\nincendiaries\nincendiarism\nincendiary\nincense\nincensed\nincenses\nincensing\nincentive\nincentives\nincentivize\nincentivized\nincentivizes\nincentivizing\nincept\nincepted\nincepting\ninception\ninceptions\ninceptive\ninceptives\ninceptor\ninceptors\nincepts\nincertitude\nincessancy\nincessant\nincessantly\nincest\nincestuous\nincestuously\nincestuousness\ninch\ninched\nincher\ninchers\ninches\ninching\ninchmeal\ninchoate\ninchoately\ninchoateness\ninchoative\ninchoatively\ninchoatives\ninchworm\ninchworms\nincidence\nincidences\nincident\nincidental\nincidentally\nincidentals\nincidents\nincinerate\nincinerated\nincinerates\nincinerating\nincineration\nincinerations\nincinerator\nincinerators\nincipience\nincipiency\nincipient\nincipiently\nincipit\nincipits\nincise\nincised\nincises\nincising\nincision\nincisions\nincisive\nincisively\nincisiveness\nincisor\nincisors\nincitation\nincitations\nincite\nincited\nincitement\nincitements\ninciter\ninciters\nincites\ninciting\nincivilities\nincivility\ninclasp\ninclasped\ninclasping\ninclasps\ninclemency\ninclement\ninclemently\ninclinable\ninclination\ninclinations\nincline\ninclined\nincliner\nincliners\ninclines\ninclining\ninclinometer\ninclinometers\ninclose\ninclosed\nincloses\ninclosing\nincludable\ninclude\nincluded\nincludes\nincludible\nincluding\ninclusion\ninclusionary\ninclusions\ninclusive\ninclusively\ninclusiveness\nincoercible\nincogitant\nincognita\nincognitas\nincognito\nincognitos\nincognitum\nincognizance\nincognizant\nincoherence\nincoherencies\nincoherency\nincoherent\nincoherently\nincoherentness\nincombustibility\nincombustible\nincombustibles\nincombustibly\nincome\nincomes\nincoming\nincomings\nincommensurability\nincommensurable\nincommensurables\nincommensurably\nincommensurate\nincommensurately\nincommensurateness\nincommode\nincommoded\nincommodes\nincommoding\nincommodious\nincommodiously\nincommodiousness\nincommodities\nincommodity\nincommunicability\nincommunicable\nincommunicably\nincommunicado\nincommunicative\nincommunicatively\nincommunicativeness\nincommutability\nincommutable\nincommutableness\nincommutably\nincomparability\nincomparable\nincomparableness\nincomparably\nincompatibilities\nincompatibility\nincompatible\nincompatibleness\nincompatibles\nincompatibly\nincompetence\nincompetency\nincompetent\nincompetently\nincompetents\nincomplete\nincompletely\nincompleteness\nincompletion\nincompletions\nincompliance\nincompliancy\nincompliant\nincompliantly\nincomprehensibility\nincomprehensible\nincomprehensibleness\nincomprehensibly\nincomprehension\nincomprehensive\nincomprehensively\nincomprehensiveness\nincompressibility\nincompressible\nincomputability\nincomputable\ninconceivability\ninconceivable\ninconceivableness\ninconceivably\ninconcinnity\ninconclusive\ninconclusively\ninconclusiveness\nincondensability\nincondensable\nincondensible\nincondite\ninconditely\ninconformity\nincongruence\nincongruences\nincongruent\nincongruently\nincongruities\nincongruity\nincongruous\nincongruously\nincongruousness\ninconsequence\ninconsequent\ninconsequential\ninconsequentiality\ninconsequentially\ninconsequentialness\ninconsequently\ninconsiderable\ninconsiderableness\ninconsiderably\ninconsiderate\ninconsiderately\ninconsiderateness\ninconsideration\ninconsistence\ninconsistences\ninconsistencies\ninconsistency\ninconsistent\ninconsistently\ninconsolability\ninconsolable\ninconsolableness\ninconsolably\ninconsonance\ninconsonant\ninconsonantly\ninconspicuous\ninconspicuously\ninconspicuousness\ninconstancies\ninconstancy\ninconstant\ninconstantly\ninconsumable\ninconsumably\nincontestability\nincontestable\nincontestableness\nincontestably\nincontinence\nincontinent\nincontinently\nincontrollable\nincontrovertibility\nincontrovertible\nincontrovertibleness\nincontrovertibly\ninconvenience\ninconvenienced\ninconveniences\ninconveniencing\ninconvenient\ninconveniently\ninconvertibility\ninconvertible\ninconvertibleness\ninconvertibly\ninconvincible\nincoordinate\nincoordinately\nincoordination\nincoordinations\nincorporable\nincorporate\nincorporated\nincorporates\nincorporating\nincorporation\nincorporations\nincorporative\nincorporator\nincorporators\nincorporeal\nincorporeality\nincorporeally\nincorporeity\nincorrect\nincorrectly\nincorrectness\nincorrigibility\nincorrigible\nincorrigibleness\nincorrigibles\nincorrigibly\nincorrupt\nincorruptibility\nincorruptible\nincorruptibly\nincorruption\nincorruptly\nincorruptness\nincreasable\nincrease\nincreased\nincreaser\nincreasers\nincreases\nincreasing\nincreasingly\nincreate\nincreately\nincredibility\nincredible\nincredibleness\nincredibly\nincredulity\nincredulous\nincredulously\nincredulousness\nincrement\nincremental\nincrementalism\nincrementalist\nincrementalists\nincrementally\nincremented\nincrementing\nincrements\nincrescent\nincretion\nincretions\nincriminate\nincriminated\nincriminates\nincriminating\nincrimination\nincriminations\nincriminator\nincriminators\nincriminatory\nincrust\nincrustation\nincrustations\nincrusted\nincrusting\nincrusts\nincubate\nincubated\nincubates\nincubating\nincubation\nincubational\nincubations\nincubative\nincubator\nincubators\nincubi\nincubus\nincubuses\nincudes\ninculcate\ninculcated\ninculcates\ninculcating\ninculcation\ninculcations\ninculcator\ninculcators\ninculpable\ninculpate\ninculpated\ninculpates\ninculpating\ninculpation\ninculpations\ninculpatory\nincult\nincumbencies\nincumbency\nincumbent\nincumbently\nincumbents\nincunable\nincunables\nincunabula\nincunabular\nincunabulars\nincunabulis\nincunabulum\nincur\nincurability\nincurable\nincurableness\nincurables\nincurably\nincuriosity\nincurious\nincuriously\nincuriousness\nincurred\nincurrence\nincurrences\nincurrent\nincurring\nincurs\nincursion\nincursions\nincurvate\nincurvated\nincurvates\nincurvating\nincurvation\nincurvations\nincurvature\nincurve\nincurved\nincurves\nincurving\nincus\nincuse\nincused\nincuses\nincusing\nindaba\nindabas\nindagate\nindagated\nindagates\nindagating\nindagation\nindagator\nindagators\nindamine\nindamines\nindebted\nindebtedness\nindecencies\nindecency\nindecent\nindecently\nindecipherability\nindecipherable\nindecipherableness\nindecipherably\nindecision\nindecisive\nindecisively\nindecisiveness\nindeclinable\nindecomposable\nindecorous\nindecorously\nindecorousness\nindecorum\nindecorums\nindeed\nindefatigability\nindefatigable\nindefatigableness\nindefatigably\nindefeasibility\nindefeasible\nindefeasibly\nindefectibility\nindefectible\nindefectibly\nindefensibility\nindefensible\nindefensibleness\nindefensibly\nindefinability\nindefinable\nindefinableness\nindefinables\nindefinably\nindefinite\nindefinitely\nindefiniteness\nindehiscence\nindehiscent\nindelibility\nindelible\nindelibleness\nindelibly\nindelicacies\nindelicacy\nindelicate\nindelicately\nindelicateness\nindemnification\nindemnifications\nindemnificatory\nindemnified\nindemnifier\nindemnifiers\nindemnifies\nindemnify\nindemnifying\nindemnities\nindemnity\nindemonstrability\nindemonstrable\nindemonstrableness\nindemonstrably\nindene\nindenes\nindent\nindentation\nindentations\nindented\nindenter\nindenters\nindenting\nindention\nindents\nindenture\nindentured\nindentures\nindenturing\nindependence\nindependencies\nindependency\nindependent\nindependently\nindependents\ninderal\nindescribability\nindescribable\nindescribableness\nindescribably\nindestructibility\nindestructible\nindestructibleness\nindestructibly\nindeterminable\nindeterminably\nindeterminacy\nindeterminate\nindeterminately\nindeterminateness\nindetermination\nindeterminations\nindeterminism\nindeterminist\nindeterministic\nindeterminists\nindex\nindexation\nindexed\nindexer\nindexers\nindexes\nindexical\nindexing\nindia\nindiaman\nindian\nindiana\nindianapolis\nindianism\nindianist\nindianists\nindianization\nindianize\nindianized\nindianizes\nindianizing\nindianness\nindians\nindic\nindican\nindicans\nindicant\nindicants\nindicate\nindicated\nindicates\nindicating\nindication\nindicational\nindications\nindicative\nindicatively\nindicatives\nindicator\nindicators\nindicatory\nindices\nindicia\nindicium\nindics\nindict\nindictable\nindicted\nindictee\nindictees\nindicter\nindicters\nindicting\nindiction\nindictions\nindictment\nindictments\nindictor\nindictors\nindicts\nindie\nindies\nindifference\nindifferency\nindifferent\nindifferentism\nindifferentist\nindifferentists\nindifferently\nindigen\nindigence\nindigene\nindigenes\nindigenization\nindigenizations\nindigenize\nindigenized\nindigenizes\nindigenizing\nindigenous\nindigenously\nindigenousness\nindigens\nindigent\nindigently\nindigents\nindigested\nindigestibility\nindigestible\nindigestibly\nindigestion\nindigirka\nindign\nindignant\nindignantly\nindignation\nindignities\nindignity\nindigo\nindigoes\nindigos\nindigotin\nindigotins\nindirect\nindirection\nindirectly\nindirectness\nindiscernible\nindiscernibly\nindisciplinable\nindiscipline\nindisciplined\nindisciplines\nindiscoverable\nindiscreet\nindiscreetly\nindiscreetness\nindiscrete\nindiscretion\nindiscretions\nindiscriminate\nindiscriminately\nindiscriminateness\nindiscriminating\nindiscriminatingly\nindiscrimination\nindiscriminations\nindiscriminative\nindispensability\nindispensable\nindispensableness\nindispensables\nindispensably\nindispose\nindisposed\nindisposes\nindisposing\nindisposition\nindispositions\nindisputable\nindisputableness\nindisputably\nindissociable\nindissociably\nindissolubility\nindissoluble\nindissolubleness\nindissolubly\nindistinct\nindistinctive\nindistinctively\nindistinctiveness\nindistinctly\nindistinctness\nindistinguishability\nindistinguishable\nindistinguishableness\nindistinguishably\nindite\nindited\ninditement\ninditements\ninditer\ninditers\nindites\ninditing\nindium\nindiums\nindividual\nindividualism\nindividualist\nindividualistic\nindividualistically\nindividualists\nindividualities\nindividuality\nindividualization\nindividualizations\nindividualize\nindividualized\nindividualizes\nindividualizing\nindividually\nindividuals\nindividuate\nindividuated\nindividuates\nindividuating\nindividuation\nindivisibility\nindivisible\nindivisibleness\nindivisibly\nindo\nindochina\nindochinese\nindocile\nindocility\nindocin\nindoctrinate\nindoctrinated\nindoctrinates\nindoctrinating\nindoctrination\nindoctrinations\nindoctrinator\nindoctrinators\nindole\nindoleacetic\nindoleamine\nindoleamines\nindolebutyric\nindolence\nindolent\nindolently\nindoles\nindologist\nindologists\nindology\nindomethacin\nindomethacins\nindomitability\nindomitable\nindomitableness\nindomitably\nindonesia\nindonesian\nindonesians\nindoor\nindoors\nindophenol\nindophenols\nindorsable\nindorse\nindorsed\nindorsement\nindorsements\nindorser\nindorsers\nindorses\nindorsing\nindorsor\nindorsors\nindoxyl\nindoxyls\nindra\nindraft\nindrafts\nindrawn\nindri\nindris\nindubitability\nindubitable\nindubitableness\nindubitably\ninduce\ninduced\ninducement\ninducements\ninducer\ninducers\ninduces\ninducibility\ninducible\ninducing\ninduct\ninductance\ninducted\ninductee\ninductees\ninducting\ninduction\ninductions\ninductive\ninductively\ninductiveness\ninductor\ninductors\ninducts\nindue\nindued\nindues\ninduing\nindulge\nindulged\nindulgence\nindulgenced\nindulgences\nindulgencing\nindulgent\nindulgently\nindulger\nindulgers\nindulges\nindulging\nindult\nindults\nindument\nindumenta\ninduments\nindumentum\ninduplicate\nindurate\nindurated\nindurates\nindurating\ninduration\nindurations\nindurative\nindus\nindusia\nindusium\nindustrial\nindustrialism\nindustrialist\nindustrialists\nindustrialization\nindustrializations\nindustrialize\nindustrialized\nindustrializes\nindustrializing\nindustrially\nindustrials\nindustries\nindustrious\nindustriously\nindustriousness\nindustry\nindustrywide\nindwell\nindweller\nindwellers\nindwelling\nindwells\nindwelt\ninebriant\ninebriants\ninebriate\ninebriated\ninebriates\ninebriating\ninebriation\ninebriations\ninebriety\ninedibility\ninedible\ninedibly\ninedited\nineducability\nineducable\nineffability\nineffable\nineffableness\nineffably\nineffaceability\nineffaceable\nineffaceably\nineffective\nineffectively\nineffectiveness\nineffectual\nineffectuality\nineffectually\nineffectualness\ninefficacious\ninefficaciously\ninefficaciousness\ninefficacy\ninefficiencies\ninefficiency\ninefficient\ninefficiently\ninegalitarian\ninelastic\ninelasticity\ninelegance\ninelegant\ninelegantly\nineligibility\nineligible\nineligibles\nineligibly\nineloquence\nineloquent\nineloquently\nineluctability\nineluctable\nineluctably\nineludible\ninenarrable\ninept\nineptitude\nineptly\nineptness\ninequalities\ninequality\ninequitable\ninequitableness\ninequitably\ninequities\ninequity\ninequivalve\ninequivalved\nineradicability\nineradicable\nineradicably\ninerrancy\ninerrant\ninerrantism\ninerrantist\ninerrantists\ninert\ninertia\ninertial\ninertially\ninertly\ninertness\ninescapable\ninescapably\ninessential\ninessentiality\ninessentials\ninestimable\ninestimably\ninevitabilist\ninevitabilists\ninevitabilities\ninevitability\ninevitable\ninevitableness\ninevitably\ninexact\ninexactitude\ninexactitudes\ninexactly\ninexactness\ninexcusable\ninexcusableness\ninexcusably\ninexhaustibility\ninexhaustible\ninexhaustibleness\ninexhaustibly\ninexistence\ninexistent\ninexorability\ninexorable\ninexorableness\ninexorably\ninexpedience\ninexpediency\ninexpedient\ninexpediently\ninexpensive\ninexpensively\ninexpensiveness\ninexperience\ninexperienced\ninexpert\ninexpertly\ninexpertness\ninexpiable\ninexpiably\ninexplainable\ninexplainably\ninexplicability\ninexplicable\ninexplicableness\ninexplicably\ninexplicit\ninexpressibility\ninexpressible\ninexpressibleness\ninexpressibly\ninexpressive\ninexpressively\ninexpressiveness\ninexpugnability\ninexpugnable\ninexpugnableness\ninexpugnably\ninexpungible\ninextensible\ninextinguishable\ninextinguishably\ninextirpable\ninextricability\ninextricable\ninextricableness\ninextricably\ninfall\ninfallibility\ninfallible\ninfallibleness\ninfallibly\ninfalling\ninfalls\ninfamies\ninfamous\ninfamously\ninfamousness\ninfamy\ninfancies\ninfancy\ninfant\ninfanta\ninfantas\ninfante\ninfantes\ninfanticidal\ninfanticide\ninfanticides\ninfantile\ninfantilism\ninfantility\ninfantilization\ninfantilizations\ninfantilize\ninfantilized\ninfantilizes\ninfantilizing\ninfantine\ninfantries\ninfantry\ninfantryman\ninfantrymen\ninfants\ninfantum\ninfarct\ninfarcted\ninfarction\ninfarctions\ninfarcts\ninfare\ninfares\ninfatuate\ninfatuated\ninfatuatedly\ninfatuates\ninfatuating\ninfatuation\ninfatuations\ninfauna\ninfaunal\ninfaunas\ninfaustus\ninfeasibility\ninfeasible\ninfect\ninfecta\ninfected\ninfecting\ninfection\ninfections\ninfectious\ninfectiously\ninfectiousness\ninfective\ninfectiveness\ninfectivity\ninfector\ninfectors\ninfects\ninfecundity\ninfelicities\ninfelicitous\ninfelicitously\ninfelicity\ninfer\ninferable\ninferably\ninference\ninferences\ninferential\ninferentially\ninferior\ninferiority\ninferiorly\ninferiors\ninfernal\ninfernally\ninferno\ninfernos\ninferred\ninferrer\ninferrers\ninferrible\ninferring\ninfers\ninfertile\ninfertility\ninfest\ninfestant\ninfestants\ninfestation\ninfestations\ninfested\ninfester\ninfesters\ninfesting\ninfests\ninfidel\ninfidelities\ninfidelity\ninfidelium\ninfidels\ninfield\ninfielder\ninfielders\ninfields\ninfight\ninfighter\ninfighters\ninfighting\ninfights\ninfill\ninfills\ninfiltrate\ninfiltrated\ninfiltrates\ninfiltrating\ninfiltration\ninfiltrations\ninfiltrative\ninfiltrator\ninfiltrators\ninfinite\ninfinitely\ninfiniteness\ninfinitesimal\ninfinitesimally\ninfinitesimals\ninfinities\ninfinitival\ninfinitive\ninfinitively\ninfinitives\ninfinitude\ninfinitudes\ninfinitum\ninfinity\ninfirm\ninfirmaries\ninfirmary\ninfirmities\ninfirmity\ninfirmly\ninfix\ninfixation\ninfixations\ninfixed\ninfixes\ninfixing\ninflame\ninflamed\ninflamer\ninflamers\ninflames\ninflaming\ninflammability\ninflammable\ninflammableness\ninflammably\ninflammation\ninflammations\ninflammatorily\ninflammatory\ninflatable\ninflatables\ninflate\ninflated\ninflater\ninflaters\ninflates\ninflating\ninflation\ninflationary\ninflationism\ninflationist\ninflationists\ninflations\ninflator\ninflators\ninflect\ninflectable\ninflected\ninflecting\ninflection\ninflectional\ninflectionally\ninflections\ninflective\ninflector\ninflectors\ninflects\ninflexed\ninflexibility\ninflexible\ninflexibleness\ninflexibly\ninflexion\ninflexions\ninflict\ninflicted\ninflicter\ninflicters\ninflicting\ninfliction\ninflictions\ninflictive\ninflictor\ninflictors\ninflicts\ninflorescence\ninflorescences\ninflorescent\ninflow\ninflows\ninfluence\ninfluenceable\ninfluenced\ninfluencer\ninfluencers\ninfluences\ninfluencing\ninfluent\ninfluential\ninfluentially\ninfluentials\ninfluents\ninfluenza\ninfluenzal\ninflux\ninfluxes\ninfo\ninfobahn\ninfold\ninfolded\ninfolder\ninfolders\ninfolding\ninfoldment\ninfoldments\ninfolds\ninfomercial\ninfomercials\ninform\ninformal\ninformalities\ninformality\ninformally\ninformant\ninformants\ninformatics\ninformation\ninformational\ninformationally\ninformative\ninformatively\ninformativeness\ninformatorily\ninformatory\ninformed\ninformedly\ninformer\ninformercial\ninformercials\ninformers\ninforming\ninforms\ninfotainment\ninfotainments\ninfra\ninfraclass\ninfraclasses\ninfract\ninfracted\ninfracting\ninfraction\ninfractions\ninfractor\ninfractors\ninfracts\ninfrahuman\ninfrahumans\ninfrangibility\ninfrangible\ninfrangibly\ninfrared\ninfrareds\ninfrasonic\ninfrasound\ninfrasounds\ninfraspecific\ninfrastructure\ninfrastructures\ninfrequence\ninfrequency\ninfrequent\ninfrequently\ninfringe\ninfringed\ninfringement\ninfringements\ninfringer\ninfringers\ninfringes\ninfringing\ninfructescence\ninfructescences\ninfundibula\ninfundibular\ninfundibulate\ninfundibuliform\ninfundibulum\ninfuriate\ninfuriated\ninfuriates\ninfuriating\ninfuriatingly\ninfuriation\ninfuriations\ninfuse\ninfused\ninfuser\ninfusers\ninfuses\ninfusibility\ninfusible\ninfusibleness\ninfusing\ninfusion\ninfusions\ninfusorial\ninfusorian\ninfusorians\ninfâme\ning\ningather\ningathered\ningathering\ningathers\ningeminate\ningeminated\ningeminates\ningeminating\ningenious\ningeniously\ningeniousness\ningenue\ningenues\ningenuities\ningenuity\ningenuous\ningenuously\ningenuousness\ningest\ningesta\ningested\ningestible\ningesting\ningestion\ningestions\ningestive\ningests\ningle\ninglenook\ninglenooks\ningles\ninglese\ninglorious\ningloriously\ningloriousness\ningoing\ningot\ningots\ningrain\ningrained\ningrainedly\ningraining\ningrains\ningrate\ningrates\ningratiate\ningratiated\ningratiates\ningratiating\ningratiatingly\ningratiation\ningratiations\ningratiatory\ningratitude\ningredient\ningredients\ningres\ningress\ningression\ningressions\ningressive\ningressiveness\ningrowing\ningrown\ningrownness\ningrowth\ningrowths\ninguinal\ninguinale\ningurgitate\ningurgitated\ningurgitates\ningurgitating\ningurgitation\ningurgitations\ningénue\ningénues\ninhabit\ninhabitability\ninhabitable\ninhabitancies\ninhabitancy\ninhabitant\ninhabitants\ninhabitation\ninhabitations\ninhabited\ninhabiter\ninhabiters\ninhabiting\ninhabits\ninhalant\ninhalants\ninhalation\ninhalational\ninhalations\ninhalator\ninhalators\ninhale\ninhaled\ninhaler\ninhalers\ninhales\ninhaling\ninharmonic\ninharmonies\ninharmonious\ninharmoniously\ninharmoniousness\ninharmony\ninhere\ninhered\ninherence\ninherency\ninherent\ninherently\ninheres\ninhering\ninherit\ninheritability\ninheritable\ninheritableness\ninheritance\ninheritances\ninherited\ninheriting\ninheritor\ninheritors\ninheritress\ninheritresses\ninheritrix\ninheritrixes\ninherits\ninhibin\ninhibins\ninhibit\ninhibitable\ninhibited\ninhibiter\ninhibiters\ninhibiting\ninhibition\ninhibitions\ninhibitive\ninhibitor\ninhibitors\ninhibitory\ninhibits\ninholder\ninholders\ninholding\ninholdings\ninhomogeneities\ninhomogeneity\ninhomogeneous\ninhospitable\ninhospitableness\ninhospitably\ninhospitality\ninhuman\ninhumane\ninhumanely\ninhumanities\ninhumanity\ninhumanly\ninhumanness\ninhumation\ninhumations\ninhume\ninhumed\ninhumer\ninhumers\ninhumes\ninhuming\ninigo\ninimical\ninimically\ninimitability\ninimitable\ninimitableness\ninimitably\ninion\ninions\niniquities\niniquitous\niniquitously\niniquitousness\niniquity\ninitial\ninitialed\ninitialing\ninitialism\ninitialization\ninitializations\ninitialize\ninitialized\ninitializer\ninitializers\ninitializes\ninitializing\ninitialled\ninitialling\ninitially\ninitialness\ninitials\ninitiate\ninitiated\ninitiates\ninitiating\ninitiation\ninitiations\ninitiative\ninitiatively\ninitiatives\ninitiator\ninitiators\ninitiatory\ninitio\ninject\ninjectable\ninjectables\ninjectant\ninjectants\ninjected\ninjecting\ninjection\ninjections\ninjective\ninjector\ninjectors\ninjects\ninjudicious\ninjudiciously\ninjudiciousness\ninjunction\ninjunctions\ninjunctive\ninjure\ninjured\ninjurer\ninjurers\ninjures\ninjuries\ninjuring\ninjurious\ninjuriously\ninjuriousness\ninjury\ninjustice\ninjustices\nink\ninkberries\ninkberry\ninkblot\ninkblots\ninked\ninker\ninkers\ninkhorn\ninkhorns\ninkier\ninkiest\ninkiness\ninking\ninkle\ninkles\ninkling\ninklings\ninkpot\ninkpots\ninks\ninkstand\ninkstands\ninkstone\ninkstones\ninkwell\ninkwells\ninky\ninlace\ninlaced\ninlacement\ninlacements\ninlaces\ninlacing\ninlaid\ninland\ninlander\ninlanders\ninlay\ninlayer\ninlayers\ninlaying\ninlays\ninlet\ninlets\ninlier\ninliers\ninly\ninlying\ninmate\ninmates\ninmesh\ninmeshed\ninmeshes\ninmeshing\ninmeshment\ninmeshments\ninmost\ninn\ninnards\ninnate\ninnately\ninnateness\ninner\ninnerly\ninnermost\ninnerness\ninnersole\ninnersoles\ninnerspring\ninnersprings\ninnervate\ninnervated\ninnervates\ninnervating\ninnervation\ninnervational\ninnervations\ninnerve\ninnerved\ninnerves\ninnerving\ninnerwear\ninnigkeit\ninning\ninnings\ninnkeeper\ninnkeepers\ninnocence\ninnocencies\ninnocency\ninnocent\ninnocently\ninnocents\ninnocuous\ninnocuously\ninnocuousness\ninnominate\ninnovate\ninnovated\ninnovates\ninnovating\ninnovation\ninnovational\ninnovations\ninnovative\ninnovatively\ninnovativeness\ninnovator\ninnovators\ninnovatory\ninns\ninnsbruck\ninnuendo\ninnuendoes\ninnuit\ninnuits\ninnumerable\ninnumerableness\ninnumerably\ninnumeracy\ninnumerate\ninnumerates\ninnumerous\ninnutrition\ninnutritious\ninobservance\ninobservant\ninobtrusive\ninocula\ninoculability\ninoculable\ninoculant\ninoculants\ninoculate\ninoculated\ninoculates\ninoculating\ninoculation\ninoculations\ninoculative\ninoculator\ninoculators\ninoculum\ninoculums\ninodorous\ninoffensive\ninoffensively\ninoffensiveness\ninofficious\ninoperable\ninoperably\ninoperative\ninoperativeness\ninoperculate\ninopportune\ninopportunely\ninopportuneness\ninordinacy\ninordinate\ninordinately\ninordinateness\ninorganic\ninorganically\ninosculate\ninosculated\ninosculates\ninosculating\ninosculation\ninosculations\ninositol\ninositols\ninotropic\ninpatient\ninpatients\ninphase\ninpouring\ninpourings\ninput\ninputs\ninputted\ninputting\ninquest\ninquests\ninquietude\ninquietudes\ninquiline\ninquilines\ninquilinism\ninquilinity\ninquilinous\ninquire\ninquired\ninquirer\ninquirers\ninquires\ninquiries\ninquiring\ninquiringly\ninquiry\ninquisition\ninquisitional\ninquisitions\ninquisitive\ninquisitively\ninquisitiveness\ninquisitor\ninquisitorial\ninquisitorially\ninquisitors\ninro\ninroad\ninroads\ninrush\ninrushes\nins\ninsalivate\ninsalivated\ninsalivates\ninsalivating\ninsalivation\ninsalivations\ninsalubrious\ninsalubriously\ninsalubrity\ninsane\ninsanely\ninsaneness\ninsanitary\ninsanitation\ninsanities\ninsanity\ninsatiability\ninsatiable\ninsatiableness\ninsatiably\ninsatiate\ninsatiately\ninsatiateness\ninscape\ninscapes\ninscribe\ninscribed\ninscriber\ninscribers\ninscribes\ninscribing\ninscription\ninscriptional\ninscriptions\ninscriptive\ninscriptively\ninscroll\ninscrolled\ninscrolling\ninscrolls\ninscrutability\ninscrutable\ninscrutableness\ninscrutably\ninsculp\ninsculped\ninsculping\ninsculps\ninseam\ninseams\ninsect\ninsectaria\ninsectaries\ninsectarium\ninsectary\ninsecticidal\ninsecticidally\ninsecticide\ninsecticides\ninsectile\ninsectival\ninsectivore\ninsectivores\ninsectivorous\ninsects\ninsecure\ninsecurely\ninsecureness\ninsecurities\ninsecurity\ninselberg\ninselberge\ninselberges\ninselbergs\ninseminate\ninseminated\ninseminates\ninseminating\ninsemination\ninseminations\ninseminator\ninseminators\ninsensate\ninsensately\ninsensateness\ninsensibility\ninsensible\ninsensibleness\ninsensibly\ninsensitive\ninsensitively\ninsensitiveness\ninsensitivity\ninsentience\ninsentient\ninseparability\ninseparable\ninseparableness\ninseparably\ninsert\ninserted\ninserter\ninserters\ninserting\ninsertion\ninsertional\ninsertions\ninserts\ninsessorial\ninset\ninsets\ninsetted\ninsetting\ninshallah\ninshore\ninshrine\ninshrined\ninshrinement\ninshrinements\ninshrines\ninshrining\ninside\ninsider\ninsiders\ninsides\ninsidious\ninsidiously\ninsidiousness\ninsight\ninsightful\ninsightfully\ninsightfulness\ninsights\ninsigne\ninsignia\ninsignias\ninsignificance\ninsignificancies\ninsignificancy\ninsignificant\ninsignificantly\ninsincere\ninsincerely\ninsincerity\ninsinuate\ninsinuated\ninsinuates\ninsinuating\ninsinuatingly\ninsinuation\ninsinuations\ninsinuative\ninsinuator\ninsinuators\ninsinuatory\ninsipid\ninsipidities\ninsipidity\ninsipidly\ninsipidness\ninsipidus\ninsipience\ninsist\ninsisted\ninsistence\ninsistency\ninsistent\ninsistently\ninsister\ninsisters\ninsisting\ninsistingly\ninsists\ninsnare\ninsnared\ninsnarement\ninsnarements\ninsnarer\ninsnarers\ninsnares\ninsnaring\ninsobriety\ninsociability\ninsociable\ninsociably\ninsofar\ninsolate\ninsolated\ninsolates\ninsolating\ninsolation\ninsolations\ninsole\ninsolence\ninsolent\ninsolently\ninsolents\ninsoles\ninsolubility\ninsolubilization\ninsolubilizations\ninsolubilize\ninsolubilized\ninsolubilizes\ninsolubilizing\ninsoluble\ninsolubleness\ninsolubles\ninsolubly\ninsolvability\ninsolvable\ninsolvably\ninsolvencies\ninsolvency\ninsolvent\ninsolvents\ninsomnia\ninsomniac\ninsomniacs\ninsomuch\ninsouciance\ninsouciant\ninsouciantly\ninsoul\ninsouled\ninsouling\ninsouls\ninspan\ninspanned\ninspanning\ninspans\ninspect\ninspected\ninspecting\ninspection\ninspectional\ninspections\ninspective\ninspector\ninspectoral\ninspectorate\ninspectorates\ninspectorial\ninspectors\ninspectorship\ninspectorships\ninspects\ninsphere\ninsphered\ninspheres\ninsphering\ninspiration\ninspirational\ninspirationally\ninspirations\ninspirator\ninspirators\ninspiratory\ninspire\ninspired\ninspiredly\ninspirer\ninspirers\ninspires\ninspiring\ninspiringly\ninspirit\ninspirited\ninspiriting\ninspiritingly\ninspirits\ninspissate\ninspissated\ninspissates\ninspissating\ninspissation\ninspissations\ninspissator\ninspissators\ninstabilities\ninstability\ninstal\ninstall\ninstallation\ninstallations\ninstalled\ninstaller\ninstallers\ninstalling\ninstallment\ninstallments\ninstalls\ninstalment\ninstalments\ninstals\ninstance\ninstanced\ninstances\ninstancies\ninstancing\ninstancy\ninstant\ninstantaneity\ninstantaneous\ninstantaneously\ninstantaneousness\ninstanter\ninstantiate\ninstantiated\ninstantiates\ninstantiating\ninstantiation\ninstantiations\ninstantly\ninstantness\ninstants\ninstar\ninstarred\ninstarring\ninstars\ninstate\ninstated\ninstatement\ninstates\ninstating\ninstauration\ninstaurations\ninstead\ninstep\ninsteps\ninstigate\ninstigated\ninstigates\ninstigating\ninstigation\ninstigations\ninstigative\ninstigator\ninstigators\ninstil\ninstill\ninstillation\ninstillations\ninstilled\ninstiller\ninstillers\ninstilling\ninstillment\ninstills\ninstils\ninstinct\ninstinctive\ninstinctively\ninstincts\ninstinctual\ninstinctually\ninstitute\ninstituted\ninstituter\ninstituters\ninstitutes\ninstituting\ninstitution\ninstitutional\ninstitutionalism\ninstitutionalist\ninstitutionalists\ninstitutionalization\ninstitutionalizations\ninstitutionalize\ninstitutionalized\ninstitutionalizes\ninstitutionalizing\ninstitutionally\ninstitutions\ninstitutor\ninstitutors\ninstroke\ninstrokes\ninstruct\ninstructed\ninstructing\ninstruction\ninstructional\ninstructions\ninstructive\ninstructively\ninstructiveness\ninstructor\ninstructors\ninstructorship\ninstructorships\ninstructress\ninstructresses\ninstructs\ninstrument\ninstrumental\ninstrumentalism\ninstrumentalist\ninstrumentalists\ninstrumentalities\ninstrumentality\ninstrumentally\ninstrumentals\ninstrumentation\ninstrumented\ninstrumenting\ninstruments\ninsubordinate\ninsubordinately\ninsubordinates\ninsubordination\ninsubordinations\ninsubstantial\ninsubstantiality\ninsufferable\ninsufferableness\ninsufferably\ninsufficiencies\ninsufficiency\ninsufficient\ninsufficiently\ninsufflate\ninsufflated\ninsufflates\ninsufflating\ninsufflation\ninsufflations\ninsufflator\ninsufflators\ninsulant\ninsulants\ninsular\ninsularism\ninsularity\ninsularly\ninsulate\ninsulated\ninsulates\ninsulating\ninsulation\ninsulations\ninsulative\ninsulator\ninsulators\ninsulin\ninsult\ninsulted\ninsulter\ninsulters\ninsulting\ninsultingly\ninsults\ninsuperability\ninsuperable\ninsuperableness\ninsuperably\ninsupportable\ninsupportableness\ninsupportably\ninsuppressible\ninsuppressibly\ninsurability\ninsurable\ninsurance\ninsurances\ninsure\ninsured\ninsureds\ninsurer\ninsurers\ninsures\ninsurgence\ninsurgencies\ninsurgency\ninsurgent\ninsurgently\ninsurgents\ninsuring\ninsurmountability\ninsurmountable\ninsurmountableness\ninsurmountably\ninsurrection\ninsurrectional\ninsurrectionary\ninsurrectionism\ninsurrectionist\ninsurrectionists\ninsurrections\ninsusceptibility\ninsusceptible\ninsusceptibly\nintact\nintactly\nintactness\nintaglio\nintaglios\nintake\nintakes\nintangibility\nintangible\nintangibleness\nintangibles\nintangibly\nintarsia\nintarsias\ninteger\nintegers\nintegrability\nintegrable\nintegral\nintegrality\nintegrally\nintegrals\nintegrand\nintegrands\nintegrant\nintegrate\nintegrated\nintegrates\nintegrating\nintegration\nintegrationist\nintegrationists\nintegrations\nintegrative\nintegrator\nintegrators\nintegrity\nintegro\nintegument\nintegumentary\nintellect\nintellection\nintellections\nintellective\nintellectively\nintellectronics\nintellects\nintellectual\nintellectualism\nintellectualist\nintellectualistic\nintellectualists\nintellectuality\nintellectualization\nintellectualizations\nintellectualize\nintellectualized\nintellectualizer\nintellectualizers\nintellectualizes\nintellectualizing\nintellectually\nintellectualness\nintellectuals\nintelligam\nintelligence\nintelligencer\nintelligencers\nintelligences\nintelligent\nintelligential\nintelligently\nintelligentsia\nintelligibility\nintelligible\nintelligibleness\nintelligibly\nintelligunt\nintelsat\nintemperance\nintemperate\nintemperately\nintemperateness\nintend\nintendance\nintendances\nintendancies\nintendancy\nintendant\nintendants\nintended\nintendedly\nintender\nintenders\nintending\nintendment\nintendments\nintends\nintenerate\nintenerated\nintenerates\nintenerating\ninteneration\nintenerations\nintense\nintensely\nintenseness\nintenser\nintensest\nintensification\nintensifications\nintensified\nintensifier\nintensifiers\nintensifies\nintensify\nintensifying\nintension\nintensional\nintensionality\nintensionally\nintensions\nintensities\nintensity\nintensive\nintensively\nintensiveness\nintensives\nintent\nintention\nintentional\nintentionality\nintentionally\nintentioned\nintentions\nintently\nintentness\nintents\ninter\ninterabang\ninterabangs\ninteract\ninteractant\ninteractants\ninteracted\ninteracting\ninteraction\ninteractional\ninteractions\ninteractive\ninteractively\ninteractivity\ninteracts\ninteragency\ninterallelic\ninterallied\ninteranimation\ninteranimations\ninterannual\ninterassociation\ninterassociations\ninteratomic\ninteravailability\ninterbank\ninterbasin\ninterbed\ninterbehavior\ninterbehavioral\ninterborough\ninterbrain\ninterbrains\ninterbranch\ninterbred\ninterbreed\ninterbreeding\ninterbreeds\nintercalary\nintercalate\nintercalated\nintercalates\nintercalating\nintercalation\nintercalations\nintercalative\nintercalibration\nintercampus\nintercaste\nintercede\ninterceded\ninterceder\ninterceders\nintercedes\ninterceding\nintercell\nintercellular\nintercensal\nintercept\nintercepted\nintercepter\nintercepters\nintercepting\ninterception\ninterceptions\ninterceptive\ninterceptor\ninterceptors\nintercepts\nintercession\nintercessional\nintercessions\nintercessor\nintercessors\nintercessory\ninterchain\ninterchange\ninterchangeability\ninterchangeable\ninterchangeableness\ninterchangeably\ninterchanged\ninterchanger\ninterchangers\ninterchanges\ninterchanging\ninterchannel\ninterchromosomal\ninterchurch\nintercity\ninterclan\ninterclass\ninterclavicle\ninterclavicles\ninterclavicular\ninterclub\nintercluster\nintercoastal\nintercollegiate\nintercolonial\nintercolumniation\nintercolumniations\nintercom\nintercommunal\nintercommunicate\nintercommunicated\nintercommunicates\nintercommunicating\nintercommunication\nintercommunications\nintercommunicative\nintercommunion\nintercommunions\nintercommunity\nintercompany\nintercomparable\nintercompare\nintercomparison\nintercomprehensibility\nintercoms\ninterconnect\ninterconnectable\ninterconnected\ninterconnectedness\ninterconnectible\ninterconnecting\ninterconnection\ninterconnections\ninterconnectivity\ninterconnects\nintercontinental\ninterconversion\ninterconvert\ninterconverted\ninterconvertibility\ninterconvertible\ninterconverting\ninterconverts\nintercool\nintercooled\nintercooler\nintercoolers\nintercooling\nintercools\nintercorporate\nintercorrelate\nintercorrelation\nintercortical\nintercostal\nintercostals\nintercountry\nintercounty\nintercouple\nintercourse\nintercrater\nintercrop\nintercropped\nintercropping\nintercrops\nintercross\nintercrystalline\nintercultural\ninterculturally\ninterculture\nintercurrent\nintercut\nintercuts\nintercutting\ninterdealer\ninterdenominational\ninterdental\ninterdentally\ninterdentals\ninterdepartmental\ninterdepartmentally\ninterdepend\ninterdependence\ninterdependencies\ninterdependency\ninterdependent\ninterdependently\ninterdialectal\ninterdict\ninterdicted\ninterdicting\ninterdiction\ninterdictions\ninterdictive\ninterdictively\ninterdictor\ninterdictors\ninterdictory\ninterdicts\ninterdictus\ninterdiffuse\ninterdiffusion\ninterdigitate\ninterdigitated\ninterdigitates\ninterdigitating\ninterdigitation\ninterdisciplinary\ninterdistrict\ninterdivisional\ninterdominion\ninterelectrode\ninterelectron\ninterelectronic\ninterepidemic\ninterest\ninterested\ninterestedly\ninterestedness\ninteresting\ninterestingly\ninterestingness\ninterests\ninterethnic\ninterface\ninterfaced\ninterfaces\ninterfacial\ninterfacing\ninterfacings\ninterfaculty\ninterfaith\ninterfamilial\ninterfamily\ninterfascicular\ninterfere\ninterfered\ninterference\ninterferences\ninterferential\ninterferer\ninterferers\ninterferes\ninterfering\ninterferingly\ninterferogram\ninterferograms\ninterferometer\ninterferometers\ninterferometric\ninterferometrically\ninterferometry\ninterferon\ninterfertile\ninterfertility\ninterfiber\ninterfile\ninterfirm\ninterflow\ninterfluve\ninterfluves\ninterfluvial\ninterfold\ninterfraternity\ninterfuse\ninterfused\ninterfuses\ninterfusing\ninterfusion\nintergalactic\nintergalactically\nintergang\nintergeneration\nintergenerational\nintergeneric\ninterglacial\ninterglacials\nintergovernmental\nintergovernmentally\nintergradation\nintergradational\nintergradations\nintergrade\nintergraded\nintergrades\nintergrading\nintergraft\nintergranular\nintergroup\nintergrowth\ninterhemispheric\ninterim\ninterindividual\ninterindustry\ninterinfluence\ninterinstitutional\ninterinvolve\ninterionic\ninterior\ninteriority\ninteriorization\ninteriorizations\ninteriorize\ninteriorized\ninteriorizes\ninteriorizing\ninteriorly\ninteriors\ninterisland\ninterject\ninterjected\ninterjecting\ninterjection\ninterjectional\ninterjectionally\ninterjections\ninterjector\ninterjectors\ninterjectory\ninterjects\ninterjurisdictional\ninterlace\ninterlaced\ninterlacement\ninterlaces\ninterlacing\ninterlacustrine\ninterlaken\ninterlaminar\ninterlaminate\ninterlaminated\ninterlaminates\ninterlaminating\ninterlamination\ninterlaminations\ninterlanguage\ninterlanguages\ninterlard\ninterlarded\ninterlarding\ninterlards\ninterlay\ninterlayer\ninterleaf\ninterleave\ninterleaved\ninterleaves\ninterleaving\ninterlend\ninterleukin\ninterleukins\ninterlibrary\ninterline\ninterlinear\ninterlinearly\ninterlineation\ninterlined\ninterliner\ninterlines\ninterlingua\ninterlining\ninterlinings\ninterlink\ninterlinked\ninterlinking\ninterlinks\ninterlobular\ninterlocal\ninterlock\ninterlocked\ninterlocking\ninterlocks\ninterlocution\ninterlocutions\ninterlocutor\ninterlocutors\ninterlocutory\ninterlope\ninterloped\ninterloper\ninterlopers\ninterlopes\ninterloping\ninterlude\ninterludes\ninterlunar\ninterlunary\nintermale\nintermarginal\nintermarriage\nintermarriages\nintermarried\nintermarries\nintermarry\nintermarrying\nintermeddle\nintermeddled\nintermeddler\nintermeddlers\nintermeddles\nintermeddling\nintermediacy\nintermediaries\nintermediary\nintermediate\nintermediated\nintermediately\nintermediateness\nintermediates\nintermediating\nintermediation\nintermediations\nintermediator\nintermediators\nintermedin\nintermedins\nintermembrane\nintermenstrual\ninterment\ninterments\nintermesh\nintermeshed\nintermeshes\nintermeshing\nintermetallic\nintermezzi\nintermezzo\nintermezzos\ninterminability\ninterminable\ninterminableness\ninterminably\nintermingle\nintermingled\nintermingles\nintermingling\ninterministerial\nintermission\nintermissionless\nintermissions\nintermit\nintermitotic\nintermits\nintermitted\nintermittence\nintermittency\nintermittent\nintermittently\nintermitter\nintermitters\nintermitting\nintermix\nintermixed\nintermixes\nintermixing\nintermixture\nintermixtures\nintermodal\nintermodulation\nintermodulations\nintermolecular\nintermolecularly\nintermont\nintermontane\nintermountain\nintern\ninternal\ninternality\ninternalization\ninternalizations\ninternalize\ninternalized\ninternalizes\ninternalizing\ninternally\ninternals\ninternational\ninternationale\ninternationalism\ninternationalist\ninternationalists\ninternationality\ninternationalization\ninternationalizations\ninternationalize\ninternationalized\ninternationalizes\ninternationalizing\ninternationally\ninternationals\ninterne\ninternecine\ninterned\ninternee\ninternees\ninternet\ninterneuron\ninterneuronal\ninterneurons\ninterning\ninternist\ninternists\ninternment\ninternodal\ninternode\ninternodes\ninterns\ninternship\ninternships\ninternuclear\ninternucleon\ninternucleonic\ninternucleotide\ninternuncial\ninternuncially\ninternuncio\ninternuncios\ninterobserver\ninterocean\ninteroceanic\ninteroceptive\ninteroceptor\ninteroceptors\ninteroffice\ninteroperability\ninteroperable\ninteroperative\ninterorbital\ninterorgan\ninterorganizational\ninterosculate\ninterosculated\ninterosculates\ninterosculating\ninterpandemic\ninterparish\ninterparochial\ninterparoxysmal\ninterparticle\ninterparty\ninterpellate\ninterpellated\ninterpellates\ninterpellating\ninterpellation\ninterpellations\ninterpellator\ninterpellators\ninterpenetrate\ninterpenetrated\ninterpenetrates\ninterpenetrating\ninterpenetration\ninterpenetrations\ninterperceptual\ninterpermeate\ninterpersonal\ninterpersonally\ninterphalangeal\ninterphase\ninterphased\ninterphases\ninterphasing\ninterplanetary\ninterplant\ninterplanted\ninterplanting\ninterplants\ninterplay\ninterplayed\ninterplaying\ninterplays\ninterplead\ninterpleaded\ninterpleader\ninterpleaders\ninterpleading\ninterpleads\ninterpluvial\ninterpoint\ninterpol\ninterpolate\ninterpolated\ninterpolates\ninterpolating\ninterpolation\ninterpolations\ninterpolative\ninterpolator\ninterpolators\ninterpopulation\ninterpopulational\ninterposal\ninterpose\ninterposed\ninterposer\ninterposers\ninterposes\ninterposing\ninterposition\ninterpositions\ninterpret\ninterpretability\ninterpretable\ninterpretableness\ninterpretably\ninterpretation\ninterpretational\ninterpretations\ninterpretative\ninterpretatively\ninterpreted\ninterpreter\ninterpreters\ninterpreting\ninterpretive\ninterpretively\ninterprets\ninterprofessional\ninterprovincial\ninterproximal\ninterpsychic\ninterpupillary\ninterracial\ninterracially\ninterred\ninterregional\ninterregna\ninterregnal\ninterregnum\ninterregnums\ninterrelate\ninterrelated\ninterrelatedly\ninterrelatedness\ninterrelates\ninterrelating\ninterrelation\ninterrelations\ninterrelationship\ninterrelationships\ninterreligious\ninterrenal\ninterring\ninterrobang\ninterrobangs\ninterrogate\ninterrogated\ninterrogatee\ninterrogatees\ninterrogates\ninterrogating\ninterrogation\ninterrogational\ninterrogations\ninterrogative\ninterrogatively\ninterrogatives\ninterrogator\ninterrogatories\ninterrogatorily\ninterrogators\ninterrogatory\ninterrogee\ninterrogees\ninterrow\ninterrupt\ninterrupted\ninterrupter\ninterrupters\ninterruptible\ninterrupting\ninterruption\ninterruptions\ninterruptive\ninterruptor\ninterruptors\ninterrupts\ninterruptus\ninters\ninterscholastic\ninterscholastically\ninterschool\nintersect\nintersected\nintersecting\nintersection\nintersectional\nintersections\nintersects\nintersegment\nintersegmental\nintersensory\ninterservice\nintersession\nintersessional\nintersessions\nintersex\nintersexes\nintersexual\nintersexuality\nintersexually\nintersocietal\nintersociety\ninterspace\ninterspaced\ninterspaces\ninterspacing\ninterspatial\ninterspecies\ninterspecific\nintersperse\ninterspersed\ninterspersedly\nintersperses\ninterspersing\ninterspersion\ninterspersions\ninterstadial\ninterstage\ninterstate\ninterstates\ninterstation\ninterstellar\nintersterile\nintersterility\ninterstice\ninterstices\ninterstimulation\ninterstimulus\ninterstitial\ninterstitially\ninterstrain\ninterstrand\ninterstratification\ninterstratify\nintersubjective\nintersubjectively\nintersubjectivity\nintersubstitutability\nintersubstitutable\nintersystem\ninterterm\ninterterminal\ninterterritorial\nintertestamental\nintertexture\nintertextures\nintertidal\nintertidally\nintertie\ninterties\nintertill\nintertillage\nintertilled\nintertilling\nintertills\nintertranslatable\nintertransmutation\nintertrial\nintertribal\nintertroop\nintertropical\nintertwine\nintertwined\nintertwinement\nintertwinements\nintertwines\nintertwining\nintertwist\nintertwisted\nintertwisting\nintertwists\ninterunion\ninterunit\ninteruniversity\ninterurban\ninterval\nintervale\nintervales\nintervalic\nintervalley\nintervallic\nintervalometer\nintervalometers\nintervals\nintervene\nintervened\nintervener\ninterveners\nintervenes\nintervening\nintervenor\nintervenors\nintervention\ninterventional\ninterventionism\ninterventionist\ninterventionists\ninterventions\ninterventricular\nintervertebral\nintervertebrally\ninterview\ninterviewable\ninterviewed\ninterviewee\ninterviewees\ninterviewer\ninterviewers\ninterviewing\ninterviews\nintervillage\nintervisibility\nintervisible\nintervisitation\nintervocalic\nintervocalically\ninterwar\ninterweave\ninterweaves\ninterweaving\ninterwired\ninterwork\ninterworking\ninterwove\ninterwoven\ninterzonal\ninterzone\nintestacies\nintestacy\nintestate\nintestates\nintestinal\nintestinally\nintestine\nintestines\ninthrall\ninthralled\ninthralling\ninthrallingly\ninthrallment\ninthralls\ninthrone\ninthroned\ninthronement\ninthronements\ninthrones\ninthroning\ninti\nintima\nintimacies\nintimacy\nintimae\nintimal\nintimas\nintimate\nintimated\nintimately\nintimateness\nintimater\nintimaters\nintimates\nintimating\nintimation\nintimations\nintime\nintimidate\nintimidated\nintimidates\nintimidating\nintimidatingly\nintimidation\nintimidations\nintimidator\nintimidators\nintimidatory\nintinction\nintinctions\nintine\nintines\nintis\nintitule\nintituled\nintitules\nintituling\ninto\nintolerability\nintolerable\nintolerableness\nintolerably\nintolerance\nintolerant\nintolerantly\nintolerantness\nintonate\nintonated\nintonates\nintonating\nintonation\nintonational\nintonations\nintone\nintoned\nintonement\nintonements\nintoner\nintoners\nintones\nintoning\nintoxicant\nintoxicants\nintoxicate\nintoxicated\nintoxicatedly\nintoxicates\nintoxicating\nintoxicatingly\nintoxication\nintoxications\nintoxicative\nintoxicator\nintoxicators\nintra\nintracardiac\nintracardial\nintracardially\nintracellular\nintracellularly\nintracerebral\nintracerebrally\nintracoastal\nintracompany\nintracranial\nintracranially\nintractability\nintractable\nintractableness\nintractably\nintracutaneous\nintracutaneously\nintracytoplasmic\nintraday\nintradepartmental\nintradermal\nintradermally\nintrados\nintradoses\nintraepithelial\nintragalactic\nintragenic\nintralingual\nintramolecular\nintramolecularly\nintramural\nintramurally\nintramuscular\nintramuscularly\nintranasal\nintranasally\nintransigeance\nintransigeant\nintransigeantly\nintransigence\nintransigency\nintransigent\nintransigently\nintransigents\nintransitive\nintransitively\nintransitiveness\nintransitives\nintransitivity\nintranuclear\nintraocular\nintraocularly\nintraperitoneal\nintraperitoneally\nintrapersonal\nintrapersonally\nintraplate\nintrapopulation\nintrapreneur\nintrapreneurial\nintrapreneurialism\nintrapreneurially\nintrapreneurs\nintrapsychic\nintrapsychically\nintrapulmonary\nintraspecies\nintraspecific\nintrastate\nintrathecal\nintrathecally\nintrathoracic\nintrathoracically\nintrauterine\nintravasation\nintravasations\nintravascular\nintravascularly\nintravenous\nintravenouses\nintravenously\nintraventricular\nintraventricularly\nintravital\nintravitally\nintravitam\nintrazonal\nintreat\nintreated\nintreating\nintreatingly\nintreatment\nintreats\nintrench\nintrenched\nintrenches\nintrenching\nintrenchment\nintrenchments\nintrepid\nintrepidity\nintrepidly\nintrepidness\nintricacies\nintricacy\nintricate\nintricately\nintricateness\nintrigant\nintrigants\nintriguant\nintriguants\nintrigue\nintrigued\nintriguer\nintriguers\nintrigues\nintriguing\nintriguingly\nintrinsic\nintrinsical\nintrinsically\nintro\nintroduce\nintroduced\nintroducer\nintroducers\nintroduces\nintroducible\nintroducing\nintroduction\nintroductions\nintroductorily\nintroductory\nintrogressant\nintrogressants\nintrogression\nintrogressions\nintrogressive\nintroit\nintroits\nintroject\nintrojected\nintrojecting\nintrojection\nintrojections\nintrojects\nintromission\nintromissions\nintromissive\nintromit\nintromits\nintromitted\nintromittent\nintromitter\nintromitters\nintromitting\nintron\nintrons\nintrorse\nintros\nintrospect\nintrospected\nintrospecting\nintrospection\nintrospectional\nintrospectionism\nintrospectionist\nintrospectionistic\nintrospectionists\nintrospective\nintrospectively\nintrospectiveness\nintrospects\nintroversion\nintroversions\nintroversive\nintroversively\nintrovert\nintroverted\nintroverting\nintroverts\nintrude\nintruded\nintruder\nintruders\nintrudes\nintruding\nintrusion\nintrusions\nintrusive\nintrusively\nintrusiveness\nintrust\nintrusted\nintrusting\nintrusts\nintubate\nintubated\nintubates\nintubating\nintubation\nintubational\nintubationally\nintubations\nintuit\nintuitable\nintuited\nintuiting\nintuition\nintuitional\nintuitionally\nintuitionism\nintuitionist\nintuitionists\nintuitions\nintuitive\nintuitively\nintuitiveness\nintuits\nintumesce\nintumesced\nintumescence\nintumescences\nintumescent\nintumesces\nintumescing\nintussuscept\nintussuscepted\nintussuscepting\nintussusception\nintussusceptions\nintussusceptive\nintussuscepts\nintwine\nintwined\nintwinement\nintwinements\nintwines\nintwining\nintwist\nintwisted\nintwisting\nintwists\ninuit\ninuits\ninuktitut\ninulase\ninulases\ninulin\ninulins\ninunction\ninunctions\ninundate\ninundated\ninundates\ninundating\ninundation\ninundations\ninundator\ninundators\ninundatory\ninupiaq\ninupiaqs\ninupiat\ninupiats\ninure\ninured\ninurement\ninurements\ninures\ninuring\ninurn\ninurned\ninurning\ninurns\ninutile\ninutilely\ninutility\ninuvik\ninvade\ninvaded\ninvader\ninvaders\ninvades\ninvading\ninvaginate\ninvaginated\ninvaginates\ninvaginating\ninvagination\ninvaginations\ninvalid\ninvalidate\ninvalidated\ninvalidates\ninvalidating\ninvalidation\ninvalidations\ninvalidator\ninvalidators\ninvalided\ninvaliding\ninvalidism\ninvalidity\ninvalidly\ninvalids\ninvaluable\ninvaluableness\ninvaluably\ninvariability\ninvariable\ninvariableness\ninvariably\ninvariance\ninvariant\ninvariantly\ninvariants\ninvasion\ninvasions\ninvasive\ninvasively\ninvasiveness\ninvective\ninvectively\ninvectiveness\ninvectives\ninveigh\ninveighed\ninveigher\ninveighers\ninveighing\ninveighs\ninveigle\ninveigled\ninveiglement\ninveiglements\ninveigler\ninveiglers\ninveigles\ninveigling\ninvenient\ninvenit\ninvent\ninvented\ninventible\ninventing\ninvention\ninventional\ninventions\ninventive\ninventively\ninventiveness\ninventor\ninventorial\ninventorially\ninventoried\ninventories\ninventors\ninventory\ninventorying\ninventress\ninventresses\ninvents\ninveracities\ninveracity\ninvercargill\ninverness\ninvernesses\ninverse\ninversely\ninverses\ninversion\ninversions\ninversive\ninvert\ninvertase\ninvertases\ninvertebrate\ninvertebrates\ninverted\ninverter\ninverters\ninvertible\ninverting\ninverts\ninvest\ninvestable\ninvested\ninvestigable\ninvestigate\ninvestigated\ninvestigates\ninvestigating\ninvestigation\ninvestigational\ninvestigations\ninvestigative\ninvestigator\ninvestigatorial\ninvestigators\ninvestigatory\ninvesting\ninvestiture\ninvestitures\ninvestment\ninvestments\ninvestor\ninvestors\ninvests\ninveteracy\ninveterate\ninveterately\ninveterateness\ninviability\ninviable\ninvidia\ninvidious\ninvidiously\ninvidiousness\ninvigilate\ninvigilated\ninvigilates\ninvigilating\ninvigilation\ninvigilations\ninvigilator\ninvigilators\ninvigorant\ninvigorants\ninvigorate\ninvigorated\ninvigorates\ninvigorating\ninvigoratingly\ninvigoration\ninvigorations\ninvigorative\ninvigorator\ninvigorators\ninvincibility\ninvincible\ninvincibleness\ninvincibly\ninviolability\ninviolable\ninviolableness\ninviolably\ninviolacy\ninviolate\ninviolately\ninviolateness\ninviscid\ninvisibility\ninvisible\ninvisibleness\ninvisibles\ninvisibly\ninvita\ninvitation\ninvitational\ninvitationals\ninvitations\ninvitatories\ninvitatory\ninvite\ninvited\ninvitee\ninvitees\ninviter\ninviters\ninvites\ninviting\ninvitingly\ninvocate\ninvocated\ninvocates\ninvocating\ninvocation\ninvocational\ninvocations\ninvocatory\ninvoice\ninvoiced\ninvoices\ninvoicing\ninvoke\ninvoked\ninvoker\ninvokers\ninvokes\ninvoking\ninvolucel\ninvolucels\ninvolucra\ninvolucral\ninvolucrate\ninvolucre\ninvolucres\ninvolucrum\ninvoluntarily\ninvoluntariness\ninvoluntary\ninvolute\ninvoluted\ninvolutely\ninvolutes\ninvoluting\ninvolution\ninvolutional\ninvolutions\ninvolve\ninvolved\ninvolvedly\ninvolvement\ninvolvements\ninvolver\ninvolvers\ninvolves\ninvolving\ninvulnerability\ninvulnerable\ninvulnerableness\ninvulnerably\ninward\ninwardly\ninwardness\ninwards\ninweave\ninweaved\ninweaves\ninweaving\ninwind\ninwinding\ninwinds\ninwound\ninwove\ninwoven\ninwrap\ninwrapped\ninwrapping\ninwraps\ninwreathe\ninwreathed\ninwreathes\ninwreathing\ninwrought\nio\niodate\niodated\niodates\niodating\niodation\niodations\niodic\niodide\niodides\niodinate\niodinated\niodinates\niodinating\niodination\niodinations\niodine\niodization\niodizations\niodize\niodized\niodizes\niodizing\niodoform\niodoforms\niodophor\niodophors\niodopsin\niodopsins\nion\niona\nionia\nionian\nionians\nionic\nionicity\nionics\nionium\nionizable\nionization\nionize\nionized\nionizer\nionizers\nionizes\nionizing\nionone\nionones\nionophore\nionophores\nionosphere\nionospheric\nionospherically\nions\niontophoreses\niontophoresis\niontophoretic\niontophoretically\niota\niotacism\niowa\niowan\niowans\niowas\nipecac\nipecacuanha\niphigenia\niproniazid\niproniazids\nipse\nipsilateral\nipsilaterally\nipsissima\nipso\nipsos\nipsum\niran\niranian\niranians\niraq\niraqi\niraqis\nirascibility\nirascible\nirascibleness\nirascibly\nirate\nirately\nirateness\nire\nireful\nirefully\nireland\nirelands\nirenic\nirenical\nirenically\nireton\niridaceous\niridectomies\niridectomy\nirides\niridescence\niridescent\niridescently\niridic\niridium\niridologist\niridologists\niridology\niridosmine\niridosmines\niris\nirises\nirish\nirishism\nirishisms\nirishman\nirishmen\nirishness\nirishries\nirishry\nirishwoman\nirishwomen\niritic\niritis\nirk\nirked\nirking\nirks\nirksome\nirksomely\nirksomeness\nirkutsk\niroko\nirokos\niron\nironbark\nironbarks\nironbound\nironclad\nironclads\nirondequoit\nironed\nironer\nironers\nironfisted\nironhanded\nironhandedness\nironhearted\nironic\nironical\nironically\nironicalness\nironies\nironing\nironings\nironist\nironists\nironize\nironized\nironizes\nironizing\nironmaster\nironmasters\nironmonger\nironmongeries\nironmongers\nironmongery\nironness\nirons\nironside\nironsides\nironsmith\nironsmiths\nironstone\nironstones\nironware\nironweed\nironweeds\nironwood\nironwoods\nironwork\nironworker\nironworkers\nironworks\nirony\niroquoian\niroquoians\niroquois\nirradiance\nirradiances\nirradiancy\nirradiant\nirradiate\nirradiated\nirradiates\nirradiating\nirradiation\nirradiations\nirradiative\nirradiator\nirradiators\nirradicable\nirradicably\nirrational\nirrationalism\nirrationalist\nirrationalistic\nirrationalists\nirrationalities\nirrationality\nirrationalize\nirrationalized\nirrationalizes\nirrationalizing\nirrationally\nirrationalness\nirrawaddy\nirreal\nirreality\nirreclaimability\nirreclaimable\nirreclaimableness\nirreclaimably\nirreconcilability\nirreconcilable\nirreconcilableness\nirreconcilables\nirreconcilably\nirrecoverable\nirrecoverableness\nirrecoverably\nirrecusable\nirrecusably\nirredeemable\nirredeemably\nirredenta\nirredentism\nirredentist\nirredentists\nirreducibility\nirreducible\nirreducibleness\nirreducibly\nirreflexive\nirreformability\nirreformable\nirrefragability\nirrefragable\nirrefragably\nirrefrangible\nirrefrangibly\nirrefutability\nirrefutable\nirrefutably\nirregardless\nirregular\nirregularities\nirregularity\nirregularly\nirregulars\nirrelative\nirrelatively\nirrelevance\nirrelevancies\nirrelevancy\nirrelevant\nirrelevantly\nirreligion\nirreligionist\nirreligionists\nirreligions\nirreligious\nirreligiously\nirreligiousness\nirremeable\nirremediable\nirremediableness\nirremediably\nirremissibility\nirremissible\nirremissibly\nirremovability\nirremovable\nirremovably\nirreparability\nirreparable\nirreparableness\nirreparably\nirrepealability\nirrepealable\nirreplaceability\nirreplaceable\nirreplaceableness\nirreplaceably\nirrepressibility\nirrepressible\nirrepressibleness\nirrepressibly\nirreproachability\nirreproachable\nirreproachableness\nirreproachably\nirreproducibility\nirreproducible\nirresistibility\nirresistible\nirresistibleness\nirresistibly\nirresoluble\nirresolute\nirresolutely\nirresoluteness\nirresolution\nirresolvable\nirrespective\nirrespectively\nirrespirable\nirresponsibility\nirresponsible\nirresponsibleness\nirresponsibles\nirresponsibly\nirresponsive\nirresponsively\nirresponsiveness\nirretrievability\nirretrievable\nirretrievableness\nirretrievably\nirreverence\nirreverences\nirreverent\nirreverently\nirreversibility\nirreversible\nirreversibleness\nirreversibly\nirrevocability\nirrevocable\nirrevocableness\nirrevocably\nirridenta\nirrigable\nirrigate\nirrigated\nirrigates\nirrigating\nirrigation\nirrigational\nirrigations\nirrigator\nirrigators\nirritabilities\nirritability\nirritable\nirritableness\nirritably\nirritant\nirritants\nirritate\nirritated\nirritatedly\nirritates\nirritating\nirritatingly\nirritation\nirritations\nirritative\nirritator\nirritators\nirrotational\nirrupt\nirrupted\nirrupting\nirruption\nirruptions\nirruptive\nirruptively\nirrupts\nirving\niráklion\nis\nisaac\nisabella\nisaiah\nisaias\nisallobar\nisallobaric\nisallobars\niscariot\nischaemia\nischemia\nischemic\nischia\nischial\nischium\nisentropic\nisentropically\niseult\nisfahan\nishmael\nishmaelite\nishmaelites\nishmaelitish\nishmaelitism\nishmaels\nishtar\nisinglass\nisis\niskenderun\nislam\nislamabad\nislamic\nislamics\nislamism\nislamist\nislamists\nislamization\nislamize\nislamized\nislamizes\nislamizing\nisland\nislanded\nislander\nislanders\nislanding\nislands\nislay\nisle\nisled\nisles\nislet\nislets\nisling\nism\nismaili\nismailian\nismailians\nismailis\nismene\nisms\nisn\nisn't\nisoagglutination\nisoagglutinations\nisoagglutinin\nisoagglutinins\nisoagglutinogen\nisoagglutinogens\nisoalloxazine\nisoantibodies\nisoantibody\nisoantigen\nisoantigenic\nisoantigenicity\nisoantigens\nisobar\nisobaric\nisobars\nisobutane\nisobutanes\nisobutylene\nisobutylenes\nisocaloric\nisocarboxazid\nisocarboxazids\nisochromatic\nisochromosome\nisochromosomes\nisochron\nisochronal\nisochronally\nisochrone\nisochrones\nisochronism\nisochronize\nisochronized\nisochronizes\nisochronizing\nisochronous\nisochronously\nisochrons\nisochroous\nisocitric\nisoclinal\nisoclinally\nisoclinals\nisoclinic\nisocrates\nisocyanate\nisocyanates\nisocyclic\nisodiametric\nisodimorphism\nisodose\nisodynamic\nisoelectric\nisoelectronic\nisoelectronically\nisoenzymatic\nisoenzyme\nisoenzymes\nisoenzymic\nisogamete\nisogametes\nisogametic\nisogamies\nisogamous\nisogamy\nisogeneic\nisogenic\nisogenous\nisogeny\nisogloss\nisoglossal\nisoglosses\nisoglossic\nisogon\nisogonal\nisogonic\nisogons\nisogony\nisograft\nisografts\nisogram\nisograms\nisohel\nisohels\nisohyet\nisohyetal\nisohyets\nisokinetic\nisolable\nisolatable\nisolate\nisolated\nisolates\nisolating\nisolation\nisolationism\nisolationist\nisolationistic\nisolationists\nisolations\nisolator\nisolators\nisolde\nisolecithal\nisoleucine\nisoleucines\nisoline\nisolines\nisomagnetic\nisomer\nisomerase\nisomerases\nisomeric\nisomerism\nisomerisms\nisomerization\nisomerizations\nisomerize\nisomerized\nisomerizes\nisomerizing\nisomerous\nisomers\nisometric\nisometrical\nisometrically\nisometrics\nisometropia\nisometropias\nisometry\nisomorph\nisomorphic\nisomorphically\nisomorphism\nisomorphous\nisomorphs\nisoniazid\nisoniazids\nisooctane\nisopach\nisophotal\nisophote\nisophotes\nisopiestic\nisopiestics\nisopleth\nisoplethic\nisopleths\nisopod\nisopods\nisoprenaline\nisoprenalines\nisoprene\nisoprenoid\nisopropyl\nisoproterenol\nisopycnic\nisosceles\nisoseismal\nisoseismic\nisosmotic\nisosmotically\nisospin\nisospins\nisostasy\nisostatic\nisostatically\nisotach\nisotactic\nisotherm\nisothermal\nisothermally\nisothermals\nisotherms\nisotone\nisotones\nisotonic\nisotonically\nisotonicity\nisotope\nisotopes\nisotopic\nisotopically\nisotretinoin\nisotretinoins\nisotropic\nisotropism\nisotropy\nisozyme\nisozymes\nisozymic\nispahan\nisrael\nisraeli\nisraelis\nisraelite\nisraelites\nisraelitic\nissachar\nissei\nisseis\nissuable\nissuably\nissuance\nissuant\nissue\nissued\nissueless\nissuer\nissuers\nissues\nissuing\nistanbul\nisthmi\nisthmian\nisthmic\nisthmus\nisthmuses\nistle\nistles\nistria\nistrian\nistrians\nit\nit'd\nit'll\nit's\nitacolumite\nitacolumites\nitaconic\nitalian\nitalianate\nitalianism\nitalianisms\nitalianization\nitalianizations\nitalianize\nitalianized\nitalianizes\nitalianizing\nitalians\nitalic\nitalicism\nitalicisms\nitalicization\nitalicizations\nitalicize\nitalicized\nitalicizes\nitalicizing\nitalics\nitalophile\nitalophiles\nitalophilia\nitalophobe\nitalophobes\nitalophobia\nitaly\nitasca\nitch\nitched\nitches\nitchier\nitchiest\nitchiness\nitching\nitchy\nitem\nitemed\niteming\nitemization\nitemizations\nitemize\nitemized\nitemizer\nitemizers\nitemizes\nitemizing\nitems\niterance\niterances\niterant\niterate\niterated\niterates\niterating\niteration\niterations\niterative\niteratively\nithaca\nithaka\nithyphallic\nitháki\nitineracy\nitinerancies\nitinerancy\nitinerant\nitinerantly\nitinerants\nitineraries\nitinerary\nitinerate\nitinerated\nitinerates\nitinerating\nitineration\nitinerations\nits\nitself\nitsukushima\nitsy\nitty\nituraea\nituraean\nituraeans\nivanhoe\nivermectin\nivermectins\nivied\nivies\niviza\nivories\nivory\nivorybill\nivorybills\nivy\niwis\nixion\nixodid\nixtle\nixtles\niyar\niyyar\nizalco\nizar\nizars\nizzard\nj\njab\njabbed\njabber\njabbered\njabberer\njabberers\njabbering\njabbers\njabberwocky\njabbing\njabiru\njabirus\njaborandi\njaborandis\njabot\njaboticaba\njabots\njabs\njacal\njacales\njacals\njacamar\njacamars\njacana\njacanas\njacaranda\njacarandas\njacinth\njacinths\njacinto\njack\njackal\njackals\njackanapes\njackanapeses\njackass\njackassery\njackasses\njackboot\njackbooted\njackboots\njackdaw\njackdaws\njacked\njacker\njackers\njacket\njacketed\njacketing\njacketless\njackets\njackfruit\njackfruits\njackhammer\njackhammered\njackhammering\njackhammers\njacking\njackknife\njackknifed\njackknifes\njackknifing\njackknives\njackleg\njacklegs\njacklight\njacklighted\njacklighting\njacklights\njackplane\njackplanes\njackpot\njackpots\njackrabbit\njackrabbited\njackrabbiting\njackrabbits\njacks\njackscrew\njackscrews\njackshaft\njackshafts\njacksmelt\njacksnipe\njacksnipes\njackson\njacksonian\njacksonianism\njacksonians\njackstay\njackstays\njackstone\njackstones\njackstraw\njackstraws\njacob\njacobean\njacobeans\njacobian\njacobians\njacobin\njacobinic\njacobinical\njacobinism\njacobinize\njacobinized\njacobinizes\njacobinizing\njacobins\njacobite\njacobites\njacobitical\njacobitism\njacobus\njaconet\njaconets\njacquard\njacquards\njacquerie\njacqueries\njactitation\njactitations\njacuzzi\njade\njaded\njadedly\njadedness\njadeite\njadeites\njades\njadestone\njadestones\njading\njaditic\njaeger\njaegers\njaffa\njaffas\njag\njagatai\njagged\njaggedly\njaggedness\njagger\njaggeries\njaggers\njaggery\njaggier\njaggiest\njagging\njaggy\njagless\njags\njaguar\njaguarondi\njaguarondis\njaguars\njaguarundi\njaguarundis\njah\njahveh\njahweh\njai\njail\njailbait\njailbird\njailbirds\njailbreak\njailbreaks\njailed\njailer\njailers\njailhouse\njailhouses\njailing\njailor\njailors\njails\njain\njaina\njainas\njainism\njainisms\njains\njaipur\njakarta\njake\njakes\njakob\njalalabad\njalap\njalapeño\njalapeños\njalaps\njalopies\njalopy\njalousie\njalousies\njam\njamaica\njamaican\njamaicans\njamb\njambalaya\njambe\njambeau\njambeaux\njambes\njamboree\njamborees\njambs\njames\njamesian\njammable\njammed\njammer\njammers\njammies\njamming\njammu\njammy\njams\njamshid\njamshyd\njane\njaneiro\njaneite\njaneites\njangle\njangled\njangler\njanglers\njangles\njangling\njangly\njanissaries\njanissary\njanitor\njanitorial\njanitors\njanizaries\njanizary\njansenism\njansenist\njansenistic\njansenists\njanuaries\njanuary\njanuarys\njanus\njap\njapan\njapanese\njapanization\njapanize\njapanized\njapanizes\njapanizing\njapanned\njapanner\njapanners\njapanning\njapans\njape\njaped\njaper\njapers\njapery\njapes\njapheth\njaphetic\njaping\njaplish\njaponaiserie\njaponaiseries\njaponica\njaponicas\njaponism\njaponisms\njaps\njapurá\njar\njardiniere\njardinieres\njardinière\njardinières\njarful\njarfuls\njargon\njargoned\njargoneer\njargoneers\njargoning\njargonish\njargonist\njargonistic\njargonists\njargonize\njargonized\njargonizes\njargonizing\njargons\njargoon\njargoons\njarhead\njarheads\njarl\njarls\njarlsberg\njarrah\njarrahs\njarred\njarring\njarringly\njars\njasmine\njasmines\njason\njasper\njaspers\njasperware\njaspery\njassid\njassids\njat\njato\njatos\njats\njaunce\njaunced\njaunces\njauncing\njaundice\njaundiced\njaundices\njaundicing\njaunt\njaunted\njauntier\njauntiest\njauntily\njauntiness\njaunting\njaunts\njaunty\njava\njavanese\njavarí\njavas\njavelin\njavelina\njavelinas\njavelins\njavelle\njaw\njawbone\njawboned\njawboner\njawboners\njawbones\njawboning\njawbreaker\njawbreakers\njawbreaking\njawbreakingly\njawed\njawing\njawless\njawline\njawlines\njaws\njay\njaybird\njaybirds\njaycee\njaycees\njaygee\njaygees\njayhawker\njayhawkers\njays\njayvee\njayvees\njaywalk\njaywalked\njaywalker\njaywalkers\njaywalking\njaywalks\njazz\njazzed\njazzer\njazzers\njazzes\njazzier\njazziest\njazzily\njazziness\njazzing\njazzish\njazzlike\njazzman\njazzmen\njazzy\njaçana\njaçanas\nje\njealous\njealousies\njealously\njealousness\njealousy\njean\njeaned\njeans\njeddah\njee\njeebies\njeep\njeepers\njeepney\njeepneys\njeeps\njeer\njeered\njeerer\njeerers\njeering\njeeringly\njeers\njeez\njefe\njefes\njefferson\njeffersonian\njeffersonianism\njeffersonians\njeffrey\njehad\njehads\njehoshaphat\njehovah\njehu\njehus\njejuna\njejunal\njejune\njejunely\njejuneness\njejunum\njekyll\njell\njellaba\njellabas\njelled\njellicoe\njellied\njellies\njellified\njellifies\njellify\njellifying\njelling\njells\njelly\njellybean\njellybeans\njellyfish\njellyfishes\njellying\njellylike\njellyroll\njellyrolls\njelutong\njemmied\njemmies\njemmy\njemmying\njena\njenner\njennet\njennets\njennies\njenny\njeon\njeopard\njeoparded\njeopardies\njeoparding\njeopardize\njeopardized\njeopardizes\njeopardizing\njeopardous\njeopards\njeopardy\njequirity\njequitinhonha\njerboa\njerboas\njeremiad\njeremiads\njeremiah\njeremiahs\njeremias\njerez\njericho\njerk\njerked\njerker\njerkers\njerkier\njerkiest\njerkily\njerkin\njerkiness\njerking\njerkingly\njerkins\njerks\njerkwater\njerky\njeroboam\njeroboams\njerome\njerrican\njerricans\njerries\njerry\njerrybuild\njerrybuilder\njerrybuilders\njerrybuilding\njerrybuilds\njerrybuilt\njersey\njerseys\njerusalem\njess\njessamine\njessamines\njesse\njessed\njesses\njessing\njest\njested\njester\njesters\njesting\njestingly\njests\njesuit\njesuitic\njesuitical\njesuitically\njesuitism\njesuitry\njesuits\njesus\njet\njetavator\njetavators\njetbead\njetbeads\njetfighter\njetfighters\njetfoil\njetfoils\njetful\njetlike\njetliner\njetliners\njetpack\njetpacks\njetport\njetports\njets\njetsam\njetted\njettied\njetties\njettiness\njetting\njettison\njettisonable\njettisoned\njettisoning\njettisons\njetty\njettying\njetway\njeté\njeu\njeunesse\njeux\njew\njewel\njeweled\njeweler\njewelers\njewelfish\njewelfishes\njeweling\njewelled\njeweller\njewellers\njewellery\njewellike\njewelling\njewelry\njewels\njewelweed\njewelweeds\njewess\njewesses\njewfish\njewfishes\njewish\njewishly\njewishness\njewries\njewry\njews\njezebel\njezebels\njiao\njib\njibaro\njibaros\njibbed\njibber\njibbers\njibbing\njibboom\njibbooms\njibe\njibed\njibes\njibing\njibs\njicama\njicamas\njicarilla\njicarillas\njiff\njiffies\njiffs\njiffy\njig\njigged\njigger\njiggers\njiggery\njigging\njiggle\njiggled\njiggles\njiggling\njiggly\njigs\njigsaw\njigsaws\njihad\njihads\njill\njillion\njillionaire\njillionaires\njillions\njillionth\njillionths\njills\njilt\njilted\njilter\njilters\njilting\njilts\njim\njimjams\njimmied\njimmies\njimmy\njimmying\njimsonweed\njimsonweeds\njingle\njingled\njingler\njinglers\njingles\njingling\njingly\njingo\njingoes\njingoish\njingoism\njingoist\njingoistic\njingoistically\njingoists\njink\njinked\njinking\njinks\njinmen\njinn\njinnee\njinni\njinns\njinricksha\njinrickshas\njinrikisha\njinrikishas\njinriksha\njinrikshas\njinx\njinxed\njinxes\njinxing\njipijapa\njipijapas\njitney\njitneys\njitter\njitterbug\njitterbugged\njitterbugging\njitterbugs\njittered\njitterier\njitteriest\njitteriness\njittering\njitters\njittery\njiujitsu\njiujutsu\njivaro\njivaros\njive\njived\njiver\njivers\njives\njivey\njiving\njivy\njo\njoan\njob\njobbed\njobber\njobbers\njobbery\njobbing\njobholder\njobholders\njobless\njoblessness\njobs\njocasta\njock\njockey\njockeyed\njockeying\njockeys\njocks\njockstrap\njockstraps\njocose\njocosely\njocoseness\njocosity\njocular\njocularity\njocularly\njocund\njocundity\njocundly\njodhpur\njodhpurs\njodrell\njoe\njoel\njoes\njoey\njoeys\njog\njogged\njogger\njoggers\njogging\njoggle\njoggled\njoggles\njoggling\njogjakarta\njogs\njohannesburg\njohn\njohnboat\njohnboats\njohnnies\njohnny\njohnnycake\njohnnycakes\njohns\njohnson\njohnsonian\njohnsonians\njohnstone\njohnstown\njoie\njoin\njoinder\njoinders\njoined\njoiner\njoineries\njoiners\njoinery\njoining\njoins\njoint\njointed\njointer\njointers\njointing\njointly\njoints\njointure\njointures\njointworm\njointworms\njoist\njoisted\njoisting\njoists\njojoba\njojobas\njoke\njoked\njoker\njokers\njokes\njokester\njokesters\njokey\njokier\njokiest\njokily\njokiness\njoking\njokingly\njoky\njolie\njollied\njollier\njollies\njolliest\njollification\njollifications\njollily\njolliness\njollities\njollity\njolly\njollyboat\njollyboats\njollying\njolt\njolted\njolter\njolters\njoltily\njoltiness\njolting\njolts\njolty\njomada\njonah\njonahs\njonathan\njones\njongleur\njongleurs\njonnycake\njonnycakes\njonquil\njonquils\njonson\njooal\njordan\njordanian\njordanians\njorum\njorums\njoseph\njosephs\njosephus\njosh\njoshed\njosher\njoshers\njoshes\njoshing\njoshingly\njoshua\njosiah\njoss\njosses\njostle\njostled\njostler\njostlers\njostles\njostling\njosé\njot\njots\njotted\njotting\njottings\njoual\njoule\njoules\njounce\njounced\njounces\njouncing\njour\njournal\njournalese\njournalism\njournalist\njournalistic\njournalistically\njournalists\njournalize\njournalized\njournalizer\njournalizers\njournalizes\njournalizing\njournals\njourney\njourneyed\njourneyer\njourneyers\njourneying\njourneyman\njourneymen\njourneys\njourneywork\njoust\njousted\njouster\njousters\njousting\njousts\njove\njovial\njoviality\njovially\njovian\njowett\njowl\njowlier\njowliest\njowliness\njowls\njowly\njoy\njoyance\njoyce\njoyed\njoyful\njoyfully\njoyfulness\njoying\njoyless\njoylessly\njoylessness\njoyous\njoyously\njoyousness\njoypop\njoypopped\njoypopper\njoypoppers\njoypopping\njoypops\njoyride\njoyrider\njoyriders\njoyrides\njoyriding\njoys\njoystick\njoysticks\njoão\njuan\njuanism\njuans\njuba\njubal\njubas\njubilance\njubilant\njubilantly\njubilarian\njubilarians\njubilate\njubilated\njubilates\njubilating\njubilation\njubilee\njubilees\njudaea\njudah\njudaic\njudaica\njudaical\njudaically\njudaism\njudaist\njudaistic\njudaists\njudaization\njudaizations\njudaize\njudaized\njudaizer\njudaizers\njudaizes\njudaizing\njudas\njudases\njudder\njuddered\njuddering\njudders\njude\njudea\njudean\njudeans\njudeo\njudge\njudged\njudgement\njudgements\njudger\njudgers\njudges\njudgeship\njudgeships\njudging\njudgmatic\njudgmatical\njudgmatically\njudgment\njudgmental\njudgmentally\njudgments\njudicable\njudicata\njudicator\njudicatories\njudicators\njudicatory\njudicature\njudicatures\njudice\njudicial\njudicially\njudiciaries\njudiciary\njudicious\njudiciously\njudiciousness\njudith\njudo\njudoist\njudoists\njudos\njudy\njug\njuga\njugate\njugful\njugfuls\njugged\njuggernaut\njuggernauts\njugging\njuggle\njuggled\njuggler\njuggleries\njugglers\njugglery\njuggles\njuggling\njugoslav\njugoslavs\njugs\njugular\njugulars\njugulate\njugulated\njugulates\njugulating\njugum\njugums\njuice\njuiced\njuicehead\njuiceheads\njuiceless\njuicer\njuicers\njuices\njuicier\njuiciest\njuicily\njuiciness\njuicing\njuicy\njujitsu\njuju\njujube\njujubes\njujuism\njujus\njujutsu\njuke\njukebox\njukeboxes\njuked\njukes\njuking\njulep\njuleps\njulian\njulienne\njulienned\njuliet\njuliett\njulius\njuly\njulys\njumada\njumble\njumbled\njumbles\njumbling\njumbo\njumbos\njumbuck\njumbucks\njump\njumped\njumper\njumpers\njumpier\njumpiest\njumpily\njumpiness\njumping\njumpmaster\njumpmasters\njumps\njumpsuit\njumpsuits\njumpy\njunco\njuncoes\njuncos\njunction\njunctional\njunctions\njunctural\njuncture\njunctures\njune\njuneau\njuneberries\njuneberry\njunes\njung\njungfrau\njungian\njungians\njungle\njungled\njunglelike\njungles\njungly\njunior\njuniorate\njuniors\njuniper\njunipers\njunius\njunk\njunked\njunker\njunkerdom\njunkerism\njunkers\njunket\njunketed\njunketeer\njunketeered\njunketeering\njunketeers\njunketer\njunketers\njunketing\njunkets\njunkie\njunkier\njunkies\njunkiest\njunking\njunkman\njunkmen\njunks\njunky\njunkyard\njunkyards\njuno\njunoesque\njunta\njuntas\njunto\njuntos\njupiter\njura\njural\njurally\njurassic\njurat\njurats\njure\njureipswich\njurel\njurels\njuridic\njuridical\njuridically\njuried\njuries\njuris\njurisconsult\njurisconsults\njurisdiction\njurisdictional\njurisdictionally\njurisdictions\njurisprudence\njurisprudent\njurisprudential\njurisprudentially\njurisprudents\njurist\njuristic\njuristical\njuristically\njurists\njuror\njurors\njury\njurying\njuryman\njurymen\njurywoman\njurywomen\njus\njussive\njussives\njust\njuste\njusted\njustes\njustice\njustices\njusticiability\njusticiable\njusticiar\njusticiaries\njusticiars\njusticiary\njustifiability\njustifiable\njustifiableness\njustifiably\njustification\njustifications\njustificative\njustificatory\njustified\njustifier\njustifiers\njustifies\njustify\njustifying\njusting\njustinian\njustly\njustness\njusts\njut\njute\njutish\njutland\njuts\njutted\njuttied\njutties\njutting\njutty\njuttying\njuvenal\njuvenescence\njuvenescent\njuvenile\njuvenilely\njuvenileness\njuveniles\njuvenilia\njuvenilities\njuvenility\njuxtapose\njuxtaposed\njuxtaposes\njuxtaposing\njuxtaposition\njuxtapositional\njuxtapositions\njuárez\njyväskylä\nk\nkaaba\nkab\nkabala\nkabalas\nkabbala\nkabbalah\nkabbalas\nkabob\nkabobs\nkabs\nkabuki\nkabukis\nkabul\nkabyle\nkabyles\nkachina\nkachinas\nkaddish\nkaffeeklatsch\nkaffeeklatsches\nkaffir\nkaffirs\nkaffiyeh\nkaffiyehs\nkafir\nkafiri\nkafirs\nkafka\nkafkaesque\nkaftan\nkaftans\nkagoshima\nkahn\nkahoolawe\nkahuna\nkaiak\nkaiaked\nkaiaker\nkaiakers\nkaiaking\nkaiaks\nkailas\nkailyard\nkainit\nkainite\nkainites\nkainits\nkaiser\nkaiserdom\nkaiserdoms\nkaiserin\nkaiserins\nkaiserism\nkaisers\nkaka\nkakapo\nkakapos\nkakas\nkakemono\nkakemonos\nkaki\nkakiemon\nkakis\nkakistocracies\nkakistocracy\nkalahari\nkalamazoo\nkalanchoe\nkalashnikov\nkalashnikovs\nkale\nkaleidoscope\nkaleidoscopes\nkaleidoscopic\nkaleidoscopical\nkaleidoscopically\nkalends\nkalgoorlie\nkalimantan\nkalimba\nkalimbas\nkaliningrad\nkallidin\nkallidins\nkallikrein\nkallikreins\nkalmar\nkalmuck\nkalmucks\nkalmuk\nkalmuks\nkalmyk\nkalmyks\nkalpac\nkalpacs\nkalsomine\nkalsomines\nkama\nkamaaina\nkamala\nkamalas\nkamasutra\nkamchatka\nkame\nkamehameha\nkames\nkamet\nkamikaze\nkamikazes\nkampala\nkampong\nkampongs\nkampuchea\nkampuchean\nkampucheans\nkana\nkanak\nkanaka\nkanakas\nkanaks\nkanamycin\nkanamycins\nkanarese\nkanas\nkanban\nkanchenjunga\nkandy\nkangaroo\nkangaroos\nkangchenjunga\nkaniapiskau\nkanji\nkanjis\nkankakee\nkannada\nkano\nkansa\nkansan\nkansans\nkansas\nkansu\nkant\nkantele\nkanteles\nkantian\nkantians\nkanuri\nkanuris\nkanzu\nkanzus\nkaolin\nkaoline\nkaolines\nkaolinite\nkaolinites\nkaolinitic\nkaolinize\nkaolinized\nkaolinizes\nkaolinizing\nkaolins\nkaon\nkaons\nkapellmeister\nkaph\nkapok\nkaposi\nkaposi's\nkappa\nkaput\nkaputt\nkara\nkarabiner\nkarabiners\nkarachi\nkaraism\nkaraite\nkaraites\nkarakoram\nkarakorum\nkarakul\nkarakuls\nkaraoke\nkaraokes\nkarat\nkarate\nkarateist\nkarateists\nkarats\nkaraya\nkarelia\nkarelian\nkarelians\nkaren\nkarenina\nkarens\nkari\nkariba\nkarma\nkarmic\nkarnak\nkarnataka\nkarok\nkaroks\nkaroo\nkaroos\nkaross\nkarroo\nkarroos\nkarst\nkarstic\nkarsts\nkart\nkarting\nkartings\nkarts\nkaryogamies\nkaryogamy\nkaryokinesis\nkaryokinetic\nkaryologic\nkaryological\nkaryology\nkaryolymph\nkaryolymphs\nkaryoplasm\nkaryoplasms\nkaryosome\nkaryosomes\nkaryotype\nkaryotyped\nkaryotypes\nkaryotypic\nkaryotypical\nkaryotypically\nkaryotyping\nkasbah\nkasha\nkashan\nkashans\nkasher\nkashered\nkashering\nkashers\nkashmir\nkashmiri\nkashmiris\nkashrut\nkashruth\nkashubian\nkaskaskia\nkaskaskias\nkata\nkatabatic\nkatahdin\nkatakana\nkatakanas\nkatanga\nkatangese\nkatas\nkatchina\nkatcina\nkatharevusa\nkatharsis\nkathiawar\nkathmandu\nkatmai\nkatmandu\nkattegat\nkatydid\nkatydids\nkatzenjammer\nkatzenjammers\nkauai\nkauri\nkauris\nkava\nkavas\nkaw\nkawartha\nkaws\nkay\nkayak\nkayaked\nkayaker\nkayakers\nkayaking\nkayaks\nkaybecker\nkaybeckers\nkayo\nkayoed\nkayoing\nkayos\nkazak\nkazakh\nkazakhs\nkazakhstan\nkazaks\nkazbek\nkazoo\nkazoos\nkea\nkealakekua\nkean\nkeas\nkeats\nkeatsian\nkebab\nkebabs\nkebbock\nkebbocks\nkebbuck\nkebbucks\nkeble\nkebob\nkebobs\nkechua\nkechuas\nked\nkedge\nkedged\nkedgeree\nkedges\nkedging\nkeek\nkeeked\nkeeking\nkeeks\nkeel\nkeelboat\nkeelboats\nkeeled\nkeelhaul\nkeelhauled\nkeelhauling\nkeelhauls\nkeeling\nkeelless\nkeels\nkeelson\nkeelsons\nkeen\nkeened\nkeener\nkeeners\nkeenest\nkeening\nkeenly\nkeenness\nkeens\nkeep\nkeeper\nkeepers\nkeeping\nkeeps\nkeepsake\nkeepsakes\nkeeshond\nkeeshonden\nkeeshonds\nkeester\nkeesters\nkeewatin\nkef\nkefallinía\nkeffiyeh\nkefir\nkefirs\nkeflavík\nkefs\nkeg\nkegged\nkegging\nkegler\nkeglers\nkegling\nkegs\nkeister\nkeisters\nkelim\nkelims\nkelly\nkeloid\nkeloidal\nkeloids\nkelp\nkelpie\nkelpies\nkelps\nkelpy\nkelson\nkelsons\nkelt\nkeltic\nkelts\nkelvin\nkelvins\nkemijoki\nkemp\nkempis\nkempt\nken\nkenaf\nkenai\nkendal\nkendo\nkendos\nkenilworth\nkennebec\nkenned\nkennedy\nkennel\nkenneled\nkenneling\nkennelled\nkennelling\nkennels\nkenning\nkennings\nkeno\nkenos\nkenosis\nkenotic\nkens\nkenspeckle\nkent\nkentish\nkentledge\nkentledges\nkentuckian\nkentuckians\nkentucky\nkenya\nkenyan\nkenyans\nkeogh\nkephalin\nkephalins\nkepi\nkepis\nkepler\nkept\nkerala\nkeratectomies\nkeratectomy\nkeratin\nkeratinization\nkeratinizations\nkeratinize\nkeratinized\nkeratinizes\nkeratinizing\nkeratinophilic\nkeratinous\nkeratitides\nkeratitis\nkeratoconjunctivitis\nkeratoplasties\nkeratoplasty\nkeratoses\nkeratosis\nkeratotic\nkeratotomies\nkeratotomy\nkerb\nkerbs\nkerch\nkerchief\nkerchiefed\nkerchiefs\nkerchieves\nkeresan\nkeresans\nkerf\nkerfs\nkerfuffle\nkerfuffles\nkerguelen\nkerman\nkermans\nkermes\nkermess\nkermesse\nkermesses\nkermis\nkermises\nkern\nkerne\nkerned\nkernel\nkerneled\nkernels\nkernes\nkerning\nkernite\nkernites\nkerns\nkerogen\nkerogens\nkerosene\nkerosenes\nkerosine\nkerosines\nkerria\nkerrias\nkerries\nkerry\nkersey\nkerseymere\nkerseymeres\nkerseys\nkerygma\nkerygmas\nkerygmatic\nkestrel\nkestrels\nketch\nketches\nketchup\nketene\nketenes\nketoacidosis\nketogenesis\nketogenic\nketoglutaric\nketone\nketones\nketonic\nketose\nketoses\nketosis\nketosteroid\nketosteroids\nketotic\nkettle\nkettledrum\nkettledrums\nkettles\nkevel\nkevels\nkeweenaw\nkewpie\nkewpies\nkey\nkeyboard\nkeyboarded\nkeyboarder\nkeyboarders\nkeyboarding\nkeyboardist\nkeyboardists\nkeyboards\nkeybutton\nkeybuttons\nkeycard\nkeycards\nkeyed\nkeyhole\nkeyholes\nkeying\nkeyless\nkeynes\nkeynesian\nkeynesianism\nkeynesians\nkeynote\nkeynoted\nkeynoter\nkeynoters\nkeynotes\nkeynoting\nkeypad\nkeypads\nkeypunch\nkeypunched\nkeypuncher\nkeypunchers\nkeypunches\nkeypunching\nkeys\nkeystone\nkeystones\nkeystroke\nkeystroked\nkeystrokes\nkeystroking\nkeyway\nkeyways\nkeyword\nkeywords\nkg\nkhaddar\nkhaddars\nkhadi\nkhaki\nkhakis\nkhalif\nkhalifs\nkhalkha\nkhalkidhikí\nkhamsin\nkhamsins\nkhan\nkhanate\nkhanates\nkhans\nkhapra\nkhartoum\nkhartum\nkhat\nkhatanga\nkhats\nkhedival\nkhedive\nkhedives\nkhedivial\nkhi\nkhmer\nkhmerian\nkhmers\nkhoikhoi\nkhoikhoin\nkhoikhoins\nkhoikhois\nkhoisan\nkhoisans\nkhoum\nkhowar\nkhwarizmi\nkhyber\nkhíos\nkiang\nkiangs\nkiangsi\nkiangsu\nkiaugh\nkiaughs\nkibbe\nkibbi\nkibbitz\nkibbitzer\nkibbitzers\nkibble\nkibbled\nkibbles\nkibbling\nkibbutz\nkibbutzim\nkibbutznik\nkibbutzniks\nkibe\nkibei\nkibeis\nkibes\nkibitz\nkibitzed\nkibitzer\nkibitzers\nkibitzes\nkibitzing\nkiblah\nkiblahs\nkibosh\nkiboshed\nkiboshes\nkiboshing\nkick\nkickable\nkickapoo\nkickapoos\nkickback\nkickbacks\nkickboard\nkickboards\nkickboxer\nkickboxers\nkickboxing\nkicked\nkicker\nkickers\nkickier\nkickiest\nkicking\nkickoff\nkickoffs\nkicks\nkickshaw\nkickshaws\nkickstand\nkickstands\nkickup\nkickups\nkicky\nkid\nkidcom\nkidcoms\nkidded\nkidder\nkidderminster\nkidderminsters\nkidders\nkiddie\nkiddies\nkidding\nkiddingly\nkiddish\nkiddo\nkiddos\nkiddush\nkiddushes\nkiddy\nkideo\nkideos\nkidnap\nkidnaped\nkidnapee\nkidnapees\nkidnaper\nkidnapers\nkidnaping\nkidnapped\nkidnappee\nkidnappees\nkidnapper\nkidnappers\nkidnapping\nkidnappings\nkidnaps\nkidney\nkidneys\nkids\nkidskin\nkidvid\nkidvids\nkielbasa\nkierkegaard\nkieselguhr\nkieselguhrs\nkieserite\nkieserites\nkiev\nkif\nkifs\nkigali\nkike\nkikes\nkikládhes\nkikongo\nkikongos\nkikuyu\nkikuyus\nkilauea\nkilderkin\nkilderkins\nkilim\nkilimanjaro\nkilims\nkill\nkillable\nkillarney\nkilldeer\nkilldeers\nkilled\nkiller\nkillers\nkillersat\nkillersats\nkillick\nkillicks\nkillie\nkillies\nkillifish\nkillifishes\nkilling\nkillingly\nkillings\nkilljoy\nkilljoys\nkillock\nkillocks\nkills\nkiln\nkilned\nkilning\nkilns\nkilo\nkiloampere\nkiloamperes\nkilobar\nkilobars\nkilobase\nkilobases\nkilobecquerel\nkilobecquerels\nkilobit\nkilobits\nkilobyte\nkilobytes\nkilocalorie\nkilocalories\nkilocandela\nkilocandelas\nkilocoulomb\nkilocoulombs\nkilocurie\nkilocuries\nkilocycle\nkilocycles\nkilofarad\nkilofarads\nkilogauss\nkilogausses\nkilogram\nkilograms\nkilohenries\nkilohenry\nkilohenrys\nkilohertz\nkilojoule\nkilojoules\nkilokelvin\nkilokelvins\nkiloliter\nkiloliters\nkilolumen\nkilolumens\nkilolux\nkilomegacycle\nkilomegacycles\nkilometer\nkilometers\nkilometric\nkilomole\nkilomoles\nkilonewton\nkilonewtons\nkilooersted\nkilooersteds\nkiloohm\nkiloohms\nkiloparsec\nkiloparsecs\nkilopascal\nkilopascals\nkilorad\nkiloradian\nkiloradians\nkilorads\nkilos\nkilosecond\nkiloseconds\nkilosiemens\nkilosievert\nkilosieverts\nkilosteradian\nkilosteradians\nkilotesla\nkiloteslas\nkiloton\nkilotons\nkilovolt\nkilovolts\nkilowatt\nkilowatts\nkiloweber\nkilowebers\nkilt\nkilted\nkilter\nkiltie\nkilties\nkilting\nkilts\nkilty\nkimberley\nkimberlite\nkimberlites\nkimberlitic\nkimbundu\nkimbundus\nkimchee\nkimchees\nkimchi\nkimchis\nkimono\nkimonoed\nkimonos\nkin\nkina\nkinas\nkinase\nkinases\nkind\nkinder\nkindergarten\nkindergartener\nkindergarteners\nkindergartens\nkindergartner\nkindergartners\nkindersley\nkindest\nkindhearted\nkindheartedly\nkindheartedness\nkindle\nkindled\nkindler\nkindlers\nkindles\nkindless\nkindlessly\nkindlier\nkindliest\nkindliness\nkindling\nkindlings\nkindly\nkindness\nkindnesses\nkindred\nkindredness\nkinds\nkine\nkinema\nkinematic\nkinematical\nkinematically\nkinematics\nkinescope\nkinescoped\nkinescopes\nkinescoping\nkineses\nkinesic\nkinesics\nkinesiologist\nkinesiologists\nkinesiology\nkinesis\nkinestheses\nkinesthesia\nkinesthesias\nkinesthesis\nkinesthetic\nkinesthetically\nkinetic\nkinetically\nkineticism\nkineticist\nkineticists\nkinetics\nkinetin\nkinetins\nkinetochore\nkinetochores\nkinetoplast\nkinetoplasts\nkinetoscope\nkinetoscopes\nkinetosome\nkinetosomes\nkinfolk\nkinfolks\nking\nking's\nkingbird\nkingbirds\nkingbolt\nkingbolts\nkingcraft\nkingcrafts\nkingcup\nkingcups\nkingdom\nkingdoms\nkinged\nkingfish\nkingfisher\nkingfishers\nkingfishes\nkinging\nkinglet\nkinglets\nkinglier\nkingliest\nkingliness\nkingly\nkingmaker\nkingmakers\nkingmaking\nkingpin\nkingpins\nkings\nkingship\nkingships\nkingside\nkingsides\nkingsley\nkingstown\nkingwood\nkingwoods\nkinin\nkinins\nkink\nkinkajou\nkinkajous\nkinked\nkinkier\nkinkiest\nkinkily\nkinkiness\nkinking\nkinks\nkinky\nkinnikinnic\nkinnikinnick\nkinnikinnicks\nkinnikinnics\nkino\nkinos\nkinsfolk\nkinshasa\nkinship\nkinsman\nkinsmen\nkinswoman\nkinswomen\nkinyarwanda\nkioga\nkiosk\nkiosks\nkiowa\nkiowas\nkip\nkipling\nkipped\nkipper\nkippered\nkipperer\nkipperers\nkippering\nkippers\nkipping\nkippur\nkips\nkir\nkirche\nkirchhoff\nkirghiz\nkirghizes\nkirghizia\nkirghizstan\nkirgiz\nkirgizes\nkirgizia\nkirgizstan\nkiri\nkiribati\nkirigami\nkirin\nkirk\nkirkpatrick\nkirks\nkirlian\nkirman\nkirmans\nkirmess\nkirmesses\nkirs\nkirsch\nkirschwasser\nkirschwassers\nkirtland\nkirtle\nkirtles\nkirundi\nkirundis\nkishka\nkishkas\nkishke\nkishkes\nkiska\nkislev\nkismet\nkiss\nkissable\nkissed\nkisser\nkissers\nkisses\nkissimmee\nkissing\nkist\nkists\nkiswahili\nkit\nkitchen\nkitchenette\nkitchenettes\nkitchens\nkitchenware\nkite\nkited\nkitelike\nkites\nkith\nkithara\nkitharas\nkithe\nkithed\nkithing\nkitikmeot\nkiting\nkits\nkitsch\nkitschified\nkitschifies\nkitschifing\nkitschify\nkitschy\nkitted\nkitten\nkittened\nkittening\nkittenish\nkittenishly\nkittenishness\nkittens\nkitties\nkitting\nkittiwake\nkittiwakes\nkittle\nkittled\nkittles\nkittling\nkitts\nkitty\nkiva\nkivas\nkiwanian\nkiwanians\nkiwi\nkiwifruit\nkiwis\nklagenfurt\nklamath\nklamaths\nklan\nklanism\nklansman\nklansmen\nklatch\nklatches\nklatsch\nklavern\nklaverns\nklaxon\nklaxons\nklebsiella\nklebsiellas\nklee\nkleenex\nkleenexes\nkleig\nklein\nklemperer\nklepht\nklephtic\nklephts\nkleptocracies\nkleptocracy\nkleptocratic\nkleptomania\nkleptomaniac\nkleptomaniacal\nkleptomaniacs\nklezmer\nklezmorim\nklieg\nkliegs\nklinefelter\nklingon\nklingons\nklipspringer\nklipspringers\nklister\nklisters\nklondike\nkloof\nkloofs\nklosters\nkludge\nkludged\nkludges\nkludging\nkludgy\nkluge\nkluged\nkluges\nkluging\nklugy\nklutz\nklutzes\nklutziness\nklutzy\nklux\nkluxer\nkluxism\nklystron\nklystrons\nkm\nknack\nknacker\nknackered\nknackers\nknackery\nknacks\nknackwurst\nknackwursts\nknap\nknapped\nknapper\nknappers\nknapping\nknaps\nknapsack\nknapsacked\nknapsacks\nknapweed\nknapweeds\nknar\nknars\nknaur\nknaurs\nknave\nknaveries\nknavery\nknaves\nknavish\nknavishly\nknavishness\nknawe\nknawel\nknawels\nknawes\nknead\nkneadable\nkneaded\nkneader\nkneaders\nkneading\nkneads\nknee\nkneeboard\nkneeboarded\nkneeboarding\nkneeboards\nkneecap\nkneecapped\nkneecapping\nkneecaps\nkneed\nkneehole\nkneeholes\nkneeing\nkneel\nkneeled\nkneeler\nkneelers\nkneeling\nkneels\nkneepad\nkneepads\nkneepan\nkneepans\nknees\nkneesock\nkneesocks\nknell\nknelled\nknelling\nknells\nknelt\nknesset\nknessets\nknew\nknickerbocker\nknickerbockers\nknickers\nknickknack\nknickknacks\nknife\nknifed\nknifelike\nknifeman\nknifemen\nknifepoint\nknifepoints\nknifer\nknifers\nknifes\nknifing\nknifings\nknight\nknighted\nknighthood\nknighting\nknightliness\nknightly\nknights\nknish\nknishes\nknit\nknits\nknitted\nknitter\nknitters\nknitting\nknitwear\nknives\nknob\nknobbed\nknobbier\nknobbiest\nknobblier\nknobbliest\nknobbly\nknobby\nknobkerrie\nknobkerries\nknobs\nknock\nknockabout\nknockabouts\nknockdown\nknockdowns\nknocked\nknocker\nknockers\nknocking\nknockings\nknockoff\nknockoffs\nknockout\nknockouts\nknocks\nknockwurst\nknockwursts\nknoll\nknolled\nknolling\nknolls\nknop\nknopped\nknops\nknossos\nknot\nknotgrass\nknotgrasses\nknothole\nknotholes\nknots\nknotted\nknotter\nknotters\nknottier\nknottiest\nknottiness\nknotting\nknotty\nknotweed\nknotweeds\nknout\nknouted\nknouting\nknouts\nknow\nknowable\nknower\nknowers\nknowing\nknowingly\nknowingness\nknowledge\nknowledgeability\nknowledgeable\nknowledgeableness\nknowledgeably\nknown\nknows\nknox\nknoxville\nknubby\nknuckle\nknuckleball\nknuckleballer\nknuckleballers\nknuckleballs\nknucklebone\nknucklebones\nknuckled\nknucklehead\nknuckleheaded\nknuckleheads\nknuckler\nknucklers\nknuckles\nknuckling\nknur\nknurl\nknurled\nknurling\nknurls\nknurly\nknurs\nko\nkoa\nkoala\nkoalas\nkoan\nkoans\nkoas\nkob\nkobo\nkobold\nkobolds\nkobs\nkoch\nkodak\nkodiak\nkohl\nkohlrabi\nkohlrabies\nkoi\nkoine\nkoines\nkokanee\nkokanees\nkola\nkolache\nkolacky\nkolas\nkolinskies\nkolinsky\nkolkhoz\nkolkhozes\nkolkhoznik\nkolkhozniki\nkolkhozniks\nkolkhozy\nkolo\nkolos\nkolyma\nkomandorski\nkomati\nkomatik\nkomatiks\nkombu\nkombus\nkomodo\nkomondor\nkomondorok\nkomondors\nkomsomol\nkong\nkongo\nkongos\nkonkani\nkoodoo\nkoodoos\nkook\nkookaburra\nkookaburras\nkookie\nkookier\nkookiest\nkookiness\nkooks\nkooky\nkootchy\nkootenay\nkopeck\nkopecks\nkopek\nkopeks\nkoph\nkopje\nkopjes\nkoppie\nkoppies\nkor\nkorai\nkoran\nkoranic\nkorat\nkorats\nkordofanian\nkordofanians\nkore\nkorea\nkorean\nkoreans\nkors\nkorsakoff\nkorsakov\nkorun\nkoruna\nkorunas\nkoruny\nkos\nkosciusko\nkosher\nkoshered\nkoshering\nkoshers\nkosovo\nkoto\nkotos\nkoumiss\nkoumisses\nkouprey\nkouroi\nkouros\nkowloon\nkowtow\nkowtowed\nkowtowing\nkowtows\nkra\nkraal\nkraals\nkraft\nkrait\nkraits\nkrakatau\nkrakatoa\nkraken\nkrakens\nkraków\nkrater\nkraters\nkraut\nkrauts\nkrebs\nkremlin\nkremlinological\nkremlinologist\nkremlinologists\nkremlinology\nkreplach\nkreutzer\nkreutzers\nkreuzer\nkreuzers\nkrewe\nkrewes\nkriemhild\nkriemhilde\nkrill\nkrimmer\nkrimmers\nkringle\nkrio\nkris\nkrises\nkrishna\nkrishnaism\nkrishnas\nkriss\nkroenecker\nkrona\nkrone\nkronecker\nkronen\nkroner\nkronor\nkronos\nkronur\nkrugerrand\nkrugerrands\nkrumhorn\nkrumhorns\nkrummholz\nkrummhorn\nkrummhorns\nkrummkake\nkrummkakes\nkrypton\nkshatriya\nkshatriyas\nku\nkuala\nkublai\nkuchean\nkuchen\nkuchens\nkudo\nkudos\nkudu\nkudus\nkudzu\nkufic\nkugel\nkugels\nkulak\nkulaks\nkultur\nkulturkampf\nkulturkampfs\nkulturs\nkumiss\nkumisses\nkumquat\nkumquats\nkundalini\nkung\nkunlun\nkunming\nkunzite\nkunzites\nkuoyu\nkuoyus\nkurchatovium\nkurd\nkurdish\nkurdistan\nkurds\nkurgan\nkurgans\nkuril\nkurile\nkurilian\nkurilians\nkurland\nkuroshio\nkurrajong\nkurrajongs\nkurtoses\nkurtosis\nkuru\nkurus\nkush\nkuskokwim\nkutch\nkutenai\nkutenais\nkuwait\nkuwaiti\nkuwaitis\nkvass\nkvasses\nkvetch\nkvetched\nkvetches\nkvetching\nkvetchy\nkwa\nkwacha\nkwachas\nkwajalein\nkwakiutl\nkwakiutls\nkwangtung\nkwantung\nkwanza\nkwanzaa\nkwanzas\nkwas\nkwashiorkor\nkweichow\nkyack\nkyacks\nkyanite\nkyanites\nkyanize\nkyanized\nkyanizes\nkyanizing\nkyat\nkyats\nkybosh\nkylikes\nkylix\nkymogram\nkymograms\nkymograph\nkymographic\nkymographs\nkymography\nkymric\nkyoga\nkyoto\nkyphosis\nkyphotic\nkyrgyz\nkyrgyzstan\nkyrie\nkyries\nkyte\nkythe\nkyushu\nkárpathos\nkérkira\nkíthira\nkórinthos\nköln\nkönigsberg\nküche\nkümmel\nkümmelweck\nl\nl'oeil\nl'oeils\nl'évêque\nla\nlaager\nlaagered\nlaagering\nlaagers\nlaari\nlab\nlaban\nlabanotation\nlabanotations\nlabara\nlabarum\nlabdanum\nlabdanums\nlabel\nlabelable\nlabeled\nlabeler\nlabelers\nlabeling\nlabella\nlabellate\nlabelled\nlabeller\nlabellers\nlabelling\nlabellum\nlabels\nlabia\nlabial\nlabialization\nlabializations\nlabialize\nlabialized\nlabializes\nlabializing\nlabially\nlabials\nlabiate\nlabiates\nlabile\nlability\nlabiodental\nlabiodentals\nlabionasal\nlabionasals\nlabiovelar\nlabiovelars\nlabium\nlablab\nlablabs\nlabor\nlaboratories\nlaboratory\nlabored\nlaborer\nlaborers\nlaboring\nlaborious\nlaboriously\nlaboriousness\nlaborite\nlaborites\nlabors\nlaborsaving\nlabour\nlabourite\nlabourites\nlabours\nlabra\nlabrador\nlabradorean\nlabradoreans\nlabradorian\nlabradorians\nlabradorite\nlabradorites\nlabradors\nlabret\nlabrets\nlabrum\nlabs\nlabuan\nlaburnum\nlaburnums\nlabyrinth\nlabyrinthian\nlabyrinthine\nlabyrinthodont\nlabyrinthodonts\nlabyrinths\nlac\nlaccadive\nlaccolith\nlaccolithic\nlaccoliths\nlace\nlaced\nlacedaemon\nlacedaemonian\nlaceless\nlacelike\nlacer\nlacerate\nlacerated\nlacerates\nlacerating\nlaceration\nlacerations\nlacerative\nlacers\nlacerta\nlacertilian\nlaces\nlacewing\nlacewings\nlacework\nlacey\nlaches\nlachesis\nlachrymal\nlachrymation\nlachrymations\nlachrymator\nlachrymators\nlachrymatory\nlachrymose\nlachrymosely\nlachrymosity\nlacier\nlaciest\nlaciness\nlacing\nlacings\nlacinia\nlacinias\nlaciniate\nlaciniation\nlaciniations\nlack\nlackadaisical\nlackadaisically\nlackadaisicalness\nlackaday\nlacked\nlackey\nlackeyed\nlackeying\nlackeys\nlacking\nlackluster\nlacks\nlaconia\nlaconic\nlaconically\nlaconism\nlaconisms\nlacquer\nlacquered\nlacquerer\nlacquerers\nlacquering\nlacquers\nlacquerware\nlacquerwork\nlacrimal\nlacrimation\nlacrimations\nlacrimator\nlacrimators\nlacrosse\nlacs\nlactalbumin\nlactalbumins\nlactamase\nlactase\nlactate\nlactated\nlactates\nlactating\nlactation\nlactational\nlactations\nlacteal\nlacteally\nlactescence\nlactescent\nlactic\nlactiferous\nlactiferousness\nlactobacilli\nlactobacillus\nlactoflavin\nlactoflavins\nlactogenic\nlactoglobulin\nlactoglobulins\nlactometer\nlactometers\nlactone\nlactones\nlactonic\nlactoprotein\nlactoproteins\nlactose\nlacuna\nlacunae\nlacunal\nlacunar\nlacunaria\nlacunars\nlacunas\nlacunate\nlacustrine\nlacy\nlad\nladanum\nladanums\nladder\nladdered\nladdering\nladderlike\nladders\nladdie\nladdies\nlade\nladed\nladen\nladened\nladening\nladens\nlades\nladies\nladin\nlading\nladino\nladinos\nladins\nladle\nladled\nladler\nladlers\nladles\nladling\nladoga\nlads\nlady\nladybird\nladybirds\nladybug\nladybugs\nladyfinger\nladyfingers\nladyfish\nladyfishes\nladykin\nladykins\nladylike\nladylikeness\nladylove\nladyloves\nladysfinger\nladysfingers\nladyship\nladyships\nladysmith\nlaertes\nlaetare\nlaetrile\nlafayette\nlag\nlagan\nlagans\nlagend\nlagends\nlager\nlagers\nlaggard\nlaggardly\nlaggardness\nlaggards\nlagged\nlagger\nlaggers\nlagging\nlaggings\nlagniappe\nlagniappes\nlagomorph\nlagomorphic\nlagomorphous\nlagomorphs\nlagoon\nlagoonal\nlagoons\nlagos\nlagrangian\nlagrangians\nlags\nlahar\nlahars\nlahnda\nlahontan\nlahore\nlaic\nlaical\nlaically\nlaicals\nlaicism\nlaicization\nlaicizations\nlaicize\nlaicized\nlaicizes\nlaicizing\nlaics\nlaid\nlaide\nlain\nlair\nlaird\nlairdly\nlairds\nlairs\nlaisser\nlaissez\nlait\nlaitance\nlaity\nlaius\nlake\nlakebed\nlakebeds\nlaked\nlakefront\nlakefronts\nlakeland\nlakelike\nlaker\nlakers\nlakes\nlakeshore\nlakeshores\nlakeside\nlakesides\nlakh\nlaking\nlakota\nlakotas\nlakshadweep\nlakshmi\nlaky\nlalapalooza\nlalapaloozas\nlallan\nlalland\nlallands\nlallans\nlallapalooza\nlallapaloozas\nlallation\nlallations\nlally\nlallygag\nlallygagged\nlallygagging\nlallygags\nlam\nlama\nlamaism\nlamaist\nlamaistic\nlamaists\nlamarck\nlamarckian\nlamarckianism\nlamarckians\nlamarckism\nlamas\nlamaseries\nlamasery\nlamaze\nlamb\nlambast\nlambaste\nlambasted\nlambastes\nlambasting\nlambasts\nlambda\nlambdoid\nlambed\nlambency\nlambent\nlambently\nlamber\nlambers\nlambert\nlamberts\nlambing\nlambkill\nlambkills\nlamblike\nlambrequin\nlambrequins\nlambrusco\nlambs\nlambskin\nlamby\nlame\nlamebrain\nlamebrained\nlamebrains\nlamed\nlamedh\nlamella\nlamellae\nlamellar\nlamellarly\nlamellas\nlamellate\nlamellated\nlamellately\nlamellation\nlamellations\nlamellibranch\nlamellibranchs\nlamellicorn\nlamellicorns\nlamelliform\nlamely\nlameness\nlament\nlamentable\nlamentableness\nlamentably\nlamentation\nlamentations\nlamented\nlamentedly\nlamenter\nlamenters\nlamenting\nlaments\nlamer\nlames\nlamest\nlamia\nlamiae\nlamian\nlamians\nlamias\nlamina\nlaminae\nlaminal\nlaminar\nlaminaria\nlaminarian\nlaminarians\nlaminarin\nlaminarins\nlaminas\nlaminate\nlaminated\nlaminates\nlaminating\nlamination\nlaminations\nlaminator\nlaminators\nlaminectomies\nlaminectomy\nlaming\nlaminitis\nlamister\nlamisters\nlammas\nlammases\nlammastide\nlammed\nlammergeier\nlammergeiers\nlammergeyer\nlammergeyers\nlammermoor\nlamming\nlamp\nlampblack\nlampbrush\nlamper\nlampion\nlampions\nlamplight\nlamplighter\nlamplighters\nlampoon\nlampooned\nlampooner\nlampooners\nlampoonery\nlampooning\nlampoonist\nlampoonists\nlampoons\nlamppost\nlampposts\nlamprey\nlampreys\nlamprophyre\nlamprophyres\nlamps\nlampshade\nlampshades\nlampshell\nlampshells\nlampworking\nlampworkings\nlams\nlamster\nlamsters\nlamé\nlamés\nlanai\nlanais\nlanate\nlancashire\nlancaster\nlancasters\nlancastrian\nlancastrians\nlance\nlanced\nlancelet\nlancelets\nlancelot\nlanceolate\nlanceolately\nlancer\nlancers\nlances\nlancet\nlanceted\nlancets\nlancewood\nlancewoods\nlancinating\nlancing\nland\nlandau\nlandaulet\nlandaulets\nlandaus\nlanded\nlander\nlanders\nlandes\nlandfall\nlandfalls\nlandfill\nlandfilled\nlandfilling\nlandfills\nlandform\nlandforms\nlandgrab\nlandgrabs\nlandgrave\nlandgraves\nlandgraviate\nlandgraviates\nlandgravine\nlandgravines\nlandholder\nlandholders\nlandholding\nlandholdings\nlanding\nlandings\nlandladies\nlandlady\nlandless\nlandlessness\nlandline\nlandlines\nlandlocked\nlandlord\nlandlordism\nlandlords\nlandlubber\nlandlubberliness\nlandlubberly\nlandlubbers\nlandlubbing\nlandmark\nlandmarks\nlandmass\nlandmasses\nlandmine\nlandmines\nlandowner\nlandowners\nlandownership\nlandowning\nlandrace\nlandraces\nlands\nlandscape\nlandscaped\nlandscaper\nlandscapers\nlandscapes\nlandscaping\nlandscapist\nlandscapists\nlandseer\nlandside\nlandsides\nlandsleit\nlandslide\nlandslides\nlandslip\nlandslips\nlandsmaal\nlandsmal\nlandsman\nlandsmen\nlandsmål\nlandtag\nlandtags\nlandward\nlandwards\nlane\nlanes\nlaneway\nlaneways\nlanfranc\nlang\nlangbeinite\nlangbeinites\nlangerhans\nlanglauf\nlanglaufer\nlanglaufers\nlanglaufs\nlangley\nlangleys\nlangobard\nlangobardic\nlangobards\nlangostino\nlangostinos\nlangouste\nlangoustes\nlangoustine\nlangoustines\nlangrage\nlangrages\nlangsyne\nlanguage\nlanguages\nlangue\nlanguedoc\nlangues\nlanguet\nlanguets\nlanguid\nlanguidly\nlanguidness\nlanguish\nlanguished\nlanguisher\nlanguishers\nlanguishes\nlanguishing\nlanguishingly\nlanguishment\nlanguishments\nlanguor\nlanguorous\nlanguorously\nlanguorousness\nlangur\nlangurs\nlaniard\nlaniards\nlaniferous\nlank\nlanka\nlankan\nlankans\nlanker\nlankest\nlankier\nlankiest\nlankily\nlankiness\nlankly\nlankness\nlanky\nlanner\nlanneret\nlannerets\nlanners\nlanolin\nlanose\nlanosity\nlansing\nlantana\nlantanas\nlantern\nlanterns\nlanthanide\nlanthanum\nlanthorn\nlanthorns\nlanuginose\nlanuginous\nlanuginousness\nlanugo\nlanugos\nlanyard\nlanyards\nlanzarote\nlao\nlaocoon\nlaodicea\nlaodicean\nlaodiceans\nlaomedon\nlaos\nlaotian\nlaotians\nlap\nlaparoscope\nlaparoscopes\nlaparoscopic\nlaparoscopies\nlaparoscopist\nlaparoscopists\nlaparoscopy\nlaparotomies\nlaparotomy\nlapboard\nlapboards\nlapdog\nlapdogs\nlapel\nlapeled\nlapelled\nlapels\nlapful\nlapfuls\nlapidarian\nlapidaries\nlapidary\nlapilli\nlapillus\nlapin\nlapis\nlapith\nlapiths\nlaplace\nlapland\nlaplander\nlaplanders\nlapp\nlapped\nlapper\nlappers\nlappet\nlappets\nlapping\nlappish\nlapps\nlaps\nlapsang\nlapse\nlapsed\nlapser\nlapsers\nlapses\nlapsing\nlapstrake\nlapstreak\nlaptev\nlaptop\nlaptops\nlaputa\nlaputan\nlaputans\nlapwing\nlapwings\nlar\nlaramie\nlarboard\nlarboards\nlarcener\nlarceners\nlarcenies\nlarcenist\nlarcenists\nlarcenous\nlarcenously\nlarceny\nlarch\nlarches\nlard\nlarded\nlarder\nlarders\nlarding\nlardon\nlardons\nlardoon\nlardoons\nlards\nlardy\nlaree\nlarees\nlares\nlarge\nlargehearted\nlargeheartedness\nlargely\nlargemouth\nlargeness\nlarger\nlargess\nlargesse\nlargesses\nlargest\nlarghetto\nlarghettos\nlargish\nlargo\nlargos\nlariat\nlariats\nlark\nlarked\nlarker\nlarkers\nlarkier\nlarkiest\nlarkiness\nlarking\nlarkish\nlarks\nlarkspur\nlarkspurs\nlarky\nlarmoyante\nlarnaca\nlarrigan\nlarrigans\nlarrikin\nlarrikins\nlarrup\nlarruped\nlarruping\nlarrups\nlarum\nlarums\nlarva\nlarvae\nlarval\nlarvas\nlarvicidal\nlarvicide\nlarvicides\nlaryngal\nlaryngals\nlaryngeal\nlaryngeals\nlaryngectomies\nlaryngectomized\nlaryngectomy\nlarynges\nlaryngitic\nlaryngitis\nlaryngologist\nlaryngologists\nlaryngology\nlaryngopharynx\nlaryngopharynxs\nlaryngoscope\nlaryngoscopes\nlaryngoscopic\nlaryngoscopical\nlaryngoscopically\nlaryngoscopy\nlarynx\nlarynxes\nlasagna\nlasagnas\nlasagne\nlascar\nlascars\nlascivious\nlasciviously\nlasciviousness\nlase\nlased\nlaser\nlaserlike\nlasers\nlases\nlash\nlashed\nlasher\nlashers\nlashes\nlashing\nlashings\nlashins\nlasing\nlass\nlassa\nlassen\nlasses\nlassie\nlassies\nlassitude\nlasso\nlassoed\nlassoer\nlassoers\nlassoes\nlassoing\nlassos\nlast\nlasted\nlaster\nlasters\nlastex\nlasting\nlastingly\nlastingness\nlastly\nlasts\nlatakia\nlatch\nlatched\nlatches\nlatchet\nlatchets\nlatching\nlatchkey\nlatchkeys\nlatchstring\nlatchstrings\nlate\nlatecomer\nlatecomers\nlated\nlateen\nlateener\nlateeners\nlateens\nlatelies\nlately\nlaten\nlatencies\nlatency\nlatened\nlateness\nlatening\nlatens\nlatensification\nlatensifications\nlatent\nlatently\nlater\nlaterad\nlateral\nlateraled\nlateraling\nlaterality\nlateralization\nlateralizations\nlateralize\nlateralized\nlateralizes\nlateralizing\nlateralled\nlateralling\nlaterally\nlaterals\nlaterite\nlaterites\nlateritic\nlaterization\nlaterizations\nlatest\nlatests\nlatewood\nlatewoods\nlatex\nlatexes\nlath\nlathe\nlathed\nlather\nlathered\nlatherer\nlatherers\nlathering\nlathers\nlathery\nlathes\nlathing\nlathings\nlaths\nlathyrism\nlathyrisms\nlathyritic\nlatices\nlaticifer\nlaticiferous\nlaticifers\nlatifundia\nlatifundio\nlatifundios\nlatifundium\nlatigo\nlatigoes\nlatigos\nlatimer\nlatin\nlatina\nlatinate\nlatinism\nlatinisms\nlatinist\nlatinists\nlatinity\nlatinization\nlatinizations\nlatinize\nlatinized\nlatinizer\nlatinizers\nlatinizes\nlatinizing\nlatino\nlatinos\nlatins\nlatish\nlatissimi\nlatissimus\nlatitude\nlatitudes\nlatitudinal\nlatitudinally\nlatitudinarian\nlatitudinarianism\nlatitudinarians\nlatium\nlatke\nlatkes\nlatosol\nlatosolic\nlatosols\nlatrine\nlatrines\nlatten\nlattens\nlatter\nlatterly\nlattermost\nlattice\nlatticed\nlattices\nlatticework\nlatticing\nlatus\nlatvia\nlatvian\nlatvians\nlauan\nlauans\nlaud\nlaudability\nlaudable\nlaudableness\nlaudably\nlaudanum\nlaudation\nlaudations\nlaudative\nlaudatory\nlaude\nlauded\nlauder\nlauderdale\nlauders\nlauding\nlauds\nlaugh\nlaughable\nlaughableness\nlaughably\nlaughed\nlaugher\nlaughers\nlaughing\nlaughingly\nlaughingstock\nlaughingstocks\nlaughs\nlaughter\nlaunce\nlaunces\nlaunch\nlaunched\nlauncher\nlaunchers\nlaunches\nlaunching\nlaunchings\nlaunchpad\nlaunchpads\nlaunder\nlaundered\nlaunderer\nlaunderers\nlaunderette\nlaunderettes\nlaundering\nlaunderings\nlaunders\nlaundress\nlaundresses\nlaundrette\nlaundrettes\nlaundries\nlaundromat\nlaundromats\nlaundry\nlaundryman\nlaundrymen\nlaunfal\nlaura\nlauras\nlaurasia\nlaureate\nlaureates\nlaureateship\nlaureateships\nlaureation\nlaureations\nlaurel\nlaureled\nlaureling\nlaurelled\nlaurelling\nlaurels\nlaurent\nlaurentian\nlauric\nlauryl\nlausanne\nlautrec\nlava\nlavabo\nlavaboes\nlavage\nlavages\nlavalava\nlavalavas\nlavalier\nlavaliere\nlavalieres\nlavalike\nlavallière\nlavallières\nlavas\nlavation\nlavations\nlavatories\nlavatory\nlave\nlaved\nlavender\nlavendered\nlavendering\nlavenders\nlaver\nlaverock\nlaverocks\nlavers\nlaves\nlaving\nlavinia\nlavish\nlavished\nlavisher\nlavishers\nlavishes\nlavishing\nlavishly\nlavishness\nlavoisier\nlavrock\nlavrocks\nlaw\nlawbreaker\nlawbreakers\nlawbreaking\nlawed\nlawful\nlawfully\nlawfulness\nlawgiver\nlawgivers\nlawing\nlawless\nlawlessly\nlawlessness\nlawmaker\nlawmakers\nlawmaking\nlawman\nlawmen\nlawn\nlawnmower\nlawnmowers\nlawns\nlawny\nlawrence\nlawrencian\nlawrencium\nlawrentian\nlaws\nlawsuit\nlawsuits\nlawyer\nlawyering\nlawyerings\nlawyerlike\nlawyerly\nlawyers\nlax\nlaxation\nlaxations\nlaxative\nlaxatives\nlaxer\nlaxest\nlaxities\nlaxity\nlaxly\nlaxness\nlay\nlayabout\nlayabouts\nlayaway\nlayaways\nlayback\nlaybacks\nlayer\nlayerage\nlayerages\nlayered\nlayering\nlayerings\nlayers\nlayette\nlayettes\nlaying\nlayman\nlaymen\nlayoff\nlayoffs\nlayout\nlayouts\nlayover\nlayovers\nlaypeople\nlayperson\nlaypersons\nlays\nlayup\nlayups\nlaywoman\nlaywomen\nlazar\nlazaret\nlazarets\nlazarette\nlazarettes\nlazaretto\nlazarettos\nlazarist\nlazarists\nlazars\nlazarus\nlaze\nlazed\nlazes\nlazied\nlazier\nlazies\nlaziest\nlazily\nlaziness\nlazing\nlazuli\nlazulite\nlazulites\nlazurite\nlazurites\nlazy\nlazybones\nlazying\nlazyish\nlb\nlea\nleach\nleachability\nleachable\nleachate\nleachates\nleached\nleacher\nleachers\nleaches\nleaching\nlead\nleaded\nleaden\nleadenly\nleadenness\nleader\nleaderless\nleaders\nleadership\nleaderships\nleadier\nleadiest\nleading\nleadingly\nleadless\nleadman\nleadmen\nleadoff\nleadoffs\nleadplant\nleadplants\nleads\nleadscrew\nleadscrews\nleadsman\nleadsmen\nleadwork\nleadwort\nleadworts\nleady\nleaf\nleafage\nleafed\nleafhopper\nleafhoppers\nleafier\nleafiest\nleafiness\nleafing\nleafless\nleaflet\nleafleted\nleafleteer\nleafleteers\nleafleting\nleaflets\nleafletted\nleafletting\nleaflike\nleafs\nleafstalk\nleafstalks\nleafy\nleague\nleagued\nleaguer\nleaguered\nleaguering\nleaguers\nleagues\nleaguing\nleah\nleak\nleakage\nleakages\nleaked\nleaker\nleakers\nleakier\nleakiest\nleakily\nleakiness\nleaking\nleakproof\nleaks\nleaky\nleal\nleally\nlean\nleander\nleaned\nleaner\nleanest\nleaning\nleanings\nleanly\nleanness\nleans\nleant\nleap\nleaped\nleaper\nleapers\nleapfrog\nleapfrogged\nleapfrogging\nleapfrogs\nleaping\nleaps\nleapt\nlear\nlearn\nlearnable\nlearned\nlearnedly\nlearnedness\nlearner\nlearners\nlearning\nlearns\nlearnt\nleary\nleas\nleasable\nlease\nleaseback\nleased\nleasehold\nleaseholder\nleaseholders\nleaseholds\nleaser\nleasers\nleases\nleash\nleashed\nleashes\nleashing\nleasing\nleasings\nleast\nleastways\nleastwise\nleather\nleatherback\nleatherbacks\nleathered\nleatherette\nleatherettes\nleatherhead\nleatherheads\nleatheriness\nleathering\nleatherjacket\nleatherjackets\nleatherleaf\nleatherlike\nleathern\nleatherneck\nleathernecks\nleathers\nleatherwear\nleatherwood\nleatherwoods\nleatherwork\nleatherworker\nleatherworkers\nleatherworking\nleatherworks\nleathery\nleave\nleaved\nleaven\nleavened\nleavening\nleavenings\nleavens\nleaver\nleavers\nleaves\nleaving\nleavings\nleavis\nleavisite\nlebanese\nlebanon\nlebensraum\nlebenswelt\nlebkuchen\nlecce\nlech\nleched\nlecher\nlecheries\nlecherous\nlecherously\nlecherousness\nlechers\nlechery\nleches\nleching\nlechwe\nlechwes\nlecithin\nlecithinase\nlecithinases\nlectern\nlecterns\nlectin\nlectins\nlection\nlectionaries\nlectionary\nlections\nlector\nlectors\nlectotype\nlectotypes\nlecture\nlectured\nlecturer\nlecturers\nlectures\nlectureship\nlectureships\nlecturing\nled\nleda\nlederhosen\nledge\nledger\nledgers\nledges\nledgy\nlee\nleeboard\nleeboards\nleech\nleeched\nleeches\nleeching\nleechlike\nleek\nleeks\nleer\nleered\nleerier\nleeriest\nleerily\nleeriness\nleering\nleeringly\nleers\nleery\nlees\nleeuwenhoek\nleeward\nleeway\nleft\nlefties\nleftish\nleftism\nleftist\nleftists\nleftmost\nleftover\nleftovers\nlefts\nleftward\nleftwards\nleftwing\nlefty\nleg\nlegacies\nlegacy\nlegal\nlegalese\nlegaleses\nlegalism\nlegalisms\nlegalist\nlegalistic\nlegalistically\nlegalists\nlegalities\nlegality\nlegalization\nlegalizations\nlegalize\nlegalized\nlegalizer\nlegalizers\nlegalizes\nlegalizing\nlegally\nlegals\nlegate\nlegated\nlegatee\nlegatees\nlegates\nlegateship\nlegateships\nlegatine\nlegating\nlegation\nlegationary\nlegations\nlegato\nlegator\nlegators\nlegatos\nlegend\nlegendarily\nlegendary\nlegendries\nlegendry\nlegends\nleger\nlegerdemain\nlegerdemains\nlegerity\nlegers\nleges\nlegged\nlegger\nleggers\nleggier\nleggiest\nleggin\nlegginess\nlegging\nleggings\nleggins\nleggy\nleghold\nleghorn\nleghorns\nlegibility\nlegible\nlegibleness\nlegibly\nlegion\nlegionaries\nlegionary\nlegionella\nlegionellae\nlegionnaire\nlegionnaires\nlegions\nlegislate\nlegislated\nlegislates\nlegislating\nlegislation\nlegislative\nlegislatively\nlegislatives\nlegislator\nlegislatorial\nlegislators\nlegislatorship\nlegislatorships\nlegislature\nlegislatures\nlegist\nlegists\nlegit\nlegitimacy\nlegitimate\nlegitimated\nlegitimately\nlegitimateness\nlegitimates\nlegitimating\nlegitimation\nlegitimations\nlegitimatize\nlegitimatized\nlegitimatizes\nlegitimatizing\nlegitimator\nlegitimators\nlegitimism\nlegitimist\nlegitimists\nlegitimization\nlegitimizations\nlegitimize\nlegitimized\nlegitimizer\nlegitimizers\nlegitimizes\nlegitimizing\nlegless\nlegman\nlegmen\nlegomena\nlegomenon\nlegroom\nlegs\nlegume\nlegumes\nleguminous\nlegwork\nlehar\nlehigh\nlehua\nlehuas\nlei\nleibnitz\nleicester\nleicesters\nleicestershire\nleiden\nleipzig\nleis\nleishmania\nleishmanial\nleishmanias\nleishmaniasis\nleister\nleistered\nleistering\nleisters\nleisure\nleisured\nleisureliness\nleisurely\nleisurewear\nleitmotif\nleitmotifs\nleitmotiv\nleitmotivs\nlek\nleke\nleks\nleku\nlekvar\nlekvars\nlely\nleman\nlemans\nlemma\nlemmas\nlemmata\nlemming\nlemminglike\nlemmings\nlemniscal\nlemniscate\nlemnisci\nlemniscus\nlemnos\nlemon\nlemonade\nlemonades\nlemongrass\nlemongrasses\nlemons\nlemony\nlempira\nlempiras\nlemur\nlemures\nlemurlike\nlemurs\nlenape\nlenapes\nlend\nlendable\nlender\nlenders\nlending\nlends\nlength\nlengthen\nlengthened\nlengthener\nlengtheners\nlengthening\nlengthens\nlengthier\nlengthiest\nlengthily\nlengthiness\nlengths\nlengthways\nlengthwise\nlengthy\nlenience\nleniencies\nleniency\nlenient\nleniently\nlenin\nleningrad\nleninism\nleninist\nleninists\nleninite\nleninites\nlenis\nlenition\nlenitions\nlenitive\nlenitively\nlenitives\nlenity\nlennon\nlennox\nleno\nlenos\nlens\nlense\nlensed\nlenses\nlensing\nlensless\nlensman\nlensmen\nlent\nlentamente\nlentando\nlenten\nlentic\nlenticel\nlenticellate\nlenticels\nlenticular\nlenticule\nlenticules\nlentigines\nlentiginose\nlentiginous\nlentigo\nlentil\nlentils\nlentisk\nlentisks\nlentissimo\nlentivirus\nlentiviruses\nlento\nlentos\nlents\nleo\nleonardo\nleone\nleones\nleonian\nleonians\nleonid\nleonides\nleonids\nleonine\nleopard\nleopardess\nleopardesses\nleopardi\nleopards\nleopold\nleos\nleotard\nleotarded\nleotards\nlepanto\nlepcha\nlepchas\nleper\nlepers\nlepidolite\nlepidolites\nlepidoptera\nlepidopteran\nlepidopterans\nlepidopterist\nlepidopterists\nlepidopterological\nlepidopterologist\nlepidopterologists\nlepidopterology\nlepidopterous\nlepidote\nlepontic\nlepontine\nleporine\nleprechaun\nleprechaunish\nleprechauns\nlepromatous\nleprosaria\nleprosarium\nleprosariums\nleprose\nleprosy\nleprotic\nleprous\nleprously\nleprousness\nlepta\nleptocephali\nleptocephalus\nlepton\nleptonic\nleptons\nleptosomatic\nleptosome\nleptosomes\nleptospiral\nleptospire\nleptospires\nleptospirosis\nleptotene\nleptotenes\nlepus\nlerici\nlesbian\nlesbianism\nlesbians\nlesbos\nlese\nlesion\nlesioned\nlesions\nlesotho\nlespedeza\nlespedezas\nless\nlessee\nlessees\nlessen\nlessened\nlessening\nlessens\nlesser\nlesson\nlessoned\nlessoning\nlessons\nlessor\nlessors\nlest\nlet\nlet's\nletch\nletches\nletdown\nletdowns\nlethal\nlethality\nlethally\nlethalness\nlethargic\nlethargically\nlethargies\nlethargy\nlethe\nlethean\nleto\nlets\nlett\nletted\nletter\nletterbox\nletterboxed\nletterboxes\nletterboxing\nlettered\nletterer\nletterers\nletterform\nletterforms\nlettergram\nlettergrams\nletterhead\nletterheads\nlettering\nletterings\nletterman\nlettermen\nletterpress\nletterpresses\nletters\nletterspacing\nlettic\nletting\nlettings\nlettish\nletts\nlettuce\nlettuces\nletup\nletups\nleu\nleucine\nleucines\nleucite\nleucites\nleucitic\nleucocidin\nleucocidins\nleucocyte\nleucocytes\nleucocytic\nleucocytoid\nleucocytoses\nleucocytosis\nleucocytotic\nleucoderma\nleucodermal\nleucodermas\nleucodermic\nleucopenia\nleucopenias\nleucopenic\nleucoplast\nleucoplastid\nleucoplastids\nleucoplasts\nleucorrhea\nleucorrheal\nleucorrheas\nleucotomies\nleucotomy\nleukemia\nleukemic\nleukemics\nleukemogenesis\nleukemogenic\nleukemoid\nleukocyte\nleukocytes\nleukocytic\nleukocytoid\nleukocytoses\nleukocytosis\nleukocytotic\nleukoderma\nleukodermal\nleukodermas\nleukodermic\nleukodystrophy\nleukopenia\nleukopenias\nleukopenic\nleukoplakia\nleukoplakias\nleukoplakic\nleukoplasia\nleukoplasias\nleukopoiesis\nleukopoietic\nleukorrhea\nleukorrheal\nleukorrheas\nleukoses\nleukosis\nleukotomies\nleukotomy\nleukotriene\nleukotrienes\nlev\nleva\nlevalloisian\nlevant\nlevanted\nlevanter\nlevanters\nlevantine\nlevantines\nlevanting\nlevants\nlevas\nlevator\nlevatores\nlevators\nlevee\nleveed\nleveeing\nlevees\nlevel\nleveled\nleveler\nlevelers\nlevelheaded\nlevelheadedly\nlevelheadedness\nleveling\nlevelled\nleveller\nlevellers\nlevelling\nlevelly\nlevelness\nlevels\nlever\nleverage\nleveraged\nleverages\nleveraging\nlevered\nleveret\nleverets\nleverhulme\nlevering\nleverkusen\nlevers\nlevi\nlevi's\nleviable\nleviathan\nleviathans\nlevied\nlevier\nleviers\nlevies\nlevigate\nlevigated\nlevigates\nlevigating\nlevigation\nlevigations\nlevin\nlevins\nlevirate\nlevirates\nleviratic\nleviratical\nlevis\nlevitate\nlevitated\nlevitates\nlevitating\nlevitation\nlevitational\nlevitations\nlevitator\nlevitators\nlevite\nlevites\nlevitic\nlevitical\nleviticus\nlevities\nlevity\nlevo\nlevodopa\nlevodopas\nlevorotary\nlevorotation\nlevorotations\nlevorotatory\nlevs\nlevulose\nlevuloses\nlevy\nlevying\nlewd\nlewder\nlewdest\nlewdly\nlewdness\nlewis\nlewises\nlewisite\nlewisites\nlewisson\nlewissons\nlex\nlexeme\nlexemes\nlexemic\nlexes\nlexica\nlexical\nlexicality\nlexicalization\nlexicalizations\nlexicalize\nlexicalized\nlexicalizes\nlexicalizing\nlexically\nlexicographer\nlexicographers\nlexicographic\nlexicographical\nlexicographically\nlexicography\nlexicological\nlexicologically\nlexicologist\nlexicologists\nlexicology\nlexicon\nlexicons\nlexington\nlexis\nlexises\nley\nleyden\nleón\nlhasa\nlhotse\nli\nliabilities\nliability\nliable\nliaise\nliaised\nliaises\nliaising\nliaison\nliaisons\nliana\nlianas\nliane\nlianes\nliang\nliao\nliaodong\nliaoning\nliaotung\nliar\nliars\nliassic\nlib\nlibation\nlibationary\nlibations\nlibbed\nlibber\nlibbers\nlibbing\nlibecchio\nlibeccio\nlibel\nlibelant\nlibelants\nlibeled\nlibelee\nlibelees\nlibeler\nlibelers\nlibeling\nlibelist\nlibelists\nlibellant\nlibellants\nlibelled\nlibellee\nlibellees\nlibelling\nlibellous\nlibelous\nlibelously\nlibels\nlibera\nliberace\nliberal\nliberalism\nliberalist\nliberalistic\nliberalists\nliberalities\nliberality\nliberalization\nliberalizations\nliberalize\nliberalized\nliberalizer\nliberalizers\nliberalizes\nliberalizing\nliberally\nliberalness\nliberals\nliberate\nliberated\nliberates\nliberating\nliberatingly\nliberation\nliberationist\nliberationists\nliberations\nliberator\nliberators\nliberia\nliberian\nliberians\nlibertarian\nlibertarianism\nlibertarians\nliberties\nlibertinage\nlibertinages\nlibertine\nlibertines\nlibertinism\nliberty\nlibidinal\nlibidinally\nlibidinous\nlibidinously\nlibidinousness\nlibido\nlibidos\nlibitum\nlibra\nlibrae\nlibran\nlibrans\nlibrarian\nlibrarians\nlibrarianship\nlibrarianships\nlibraries\nlibrary\nlibration\nlibrational\nlibrations\nlibratory\nlibre\nlibres\nlibretti\nlibrettist\nlibrettists\nlibretto\nlibrettos\nlibriform\nlibris\nlibrist\nlibrists\nlibrium\nlibs\nlibya\nlibyan\nlibyans\nlice\nlicence\nlicenced\nlicences\nlicencing\nlicensable\nlicense\nlicensed\nlicensee\nlicensees\nlicenser\nlicensers\nlicenses\nlicensing\nlicensor\nlicensors\nlicensure\nlicensures\nlicente\nlicentiate\nlicentiates\nlicentious\nlicentiously\nlicentiousness\nlich\nlichee\nlichees\nlichen\nlichened\nlichening\nlichenological\nlichenologist\nlichenologists\nlichenology\nlichenous\nlichens\nlicit\nlicitly\nlicitness\nlick\nlicked\nlicker\nlickerish\nlickerishly\nlickerishness\nlickers\nlickety\nlicking\nlickings\nlicks\nlickspittle\nlickspittles\nlicorice\nlictor\nlictors\nlid\nlidar\nlidded\nlidding\nlidless\nlido\nlidocaine\nlidos\nlids\nlie\nliebfraumilch\nliebig\nliechtenstein\nliechtensteiner\nliechtensteiners\nlied\nlieder\nliederkranz\nlief\nliefer\nliefest\nliege\nliegeman\nliegemen\nlieges\nlien\nliens\nlier\nlierne\nliernes\nliers\nlies\nlieu\nlieutenancies\nlieutenancy\nlieutenant\nlieutenants\nlife\nlifeblood\nlifeboat\nlifeboats\nlifeful\nlifeguard\nlifeguarded\nlifeguarding\nlifeguards\nlifejacket\nlifejackets\nlifeless\nlifelessly\nlifelessness\nlifelike\nlifelikeness\nlifeline\nlifelines\nlifelong\nlifer\nlifers\nlifes\nlifesaver\nlifesavers\nlifesaving\nlifestyle\nlifestyles\nlifetime\nlifetimes\nlifeway\nlifework\nlifo\nlift\nliftable\nlifted\nlifter\nlifters\nliftgate\nliftgates\nlifting\nliftman\nliftmen\nliftoff\nliftoffs\nlifts\nligament\nligamental\nligamentary\nligamentous\nligaments\nligan\nligand\nligands\nligans\nligase\nligases\nligate\nligated\nligates\nligating\nligation\nligations\nligature\nligatured\nligatures\nligaturing\nliger\nligers\nlight\nlightbulb\nlightbulbs\nlighted\nlighten\nlightened\nlightener\nlighteners\nlightening\nlightens\nlighter\nlighterage\nlighterages\nlighters\nlightest\nlightface\nlightfaced\nlightfast\nlightfastness\nlightheaded\nlightheadedly\nlightheadedness\nlighthearted\nlightheartedly\nlightheartedness\nlighthouse\nlighthouses\nlighting\nlightings\nlightish\nlightless\nlightlessness\nlightly\nlightness\nlightning\nlightninged\nlightninglike\nlightnings\nlightplane\nlightplanes\nlightproof\nlights\nlightship\nlightships\nlightsome\nlightsomely\nlightsomeness\nlighttight\nlightweight\nlightweights\nlightwood\nlightwoods\nligneous\nlignification\nlignifications\nlignified\nlignifies\nlignify\nlignifying\nlignin\nlignite\nlignitic\nlignocellulose\nlignocelluloses\nlignocellulosic\nlignosulfonate\nlignosulfonates\nlignum\nligroin\nligula\nligulae\nligulas\nligulate\nligule\nligules\nligure\nligures\nliguria\nligurian\nligurians\nlikability\nlikable\nlikableness\nlike\nlikeable\nlikeableness\nliked\nlikelier\nlikeliest\nlikelihood\nlikeliness\nlikely\nliken\nlikened\nlikeness\nlikenesses\nlikening\nlikens\nlikes\nlikewise\nliking\nlikings\nlikker\nlikuta\nlilac\nlilacs\nlilangeni\nlilied\nlilies\nlilith\nlille\nlilliput\nlilliputian\nlilliputians\nlilt\nlilted\nlilting\nliltingly\nliltingness\nlilts\nlily\nlima\nlimacine\nlimacon\nlimacons\nlimas\nlimassol\nlimb\nlimba\nlimbas\nlimbate\nlimbeck\nlimbecks\nlimbed\nlimber\nlimbered\nlimbering\nlimberly\nlimberness\nlimbers\nlimbi\nlimbic\nlimbing\nlimbless\nlimbo\nlimbos\nlimbs\nlimburg\nlimburger\nlimburgers\nlimbus\nlimby\nlime\nlimeade\nlimeades\nlimed\nlimekiln\nlimekilns\nlimelight\nlimen\nlimens\nlimerick\nlimericks\nlimes\nlimestone\nlimewater\nlimewaters\nlimey\nlimeys\nlimicoline\nlimicolous\nlimier\nlimiest\nlimina\nliminal\nliming\nlimit\nlimitability\nlimitable\nlimitary\nlimitation\nlimitational\nlimitations\nlimitative\nlimited\nlimitedly\nlimitedness\nlimiteds\nlimiter\nlimiters\nlimites\nlimiting\nlimitingly\nlimitless\nlimitlessly\nlimitlessness\nlimitrophe\nlimits\nlimmer\nlimmers\nlimn\nlimned\nlimner\nlimners\nlimnetic\nlimning\nlimnologic\nlimnological\nlimnologically\nlimnologist\nlimnologists\nlimnology\nlimns\nlimo\nlimoges\nlimonene\nlimonenes\nlimonite\nlimonitic\nlimos\nlimousin\nlimousine\nlimousines\nlimp\nlimpa\nlimped\nlimper\nlimpest\nlimpet\nlimpets\nlimpid\nlimpidity\nlimpidly\nlimpidness\nlimping\nlimpkin\nlimpkins\nlimply\nlimpness\nlimpopo\nlimps\nlimuli\nlimulus\nlimy\nlinac\nlinacs\nlinage\nlinages\nlinalool\nlinalools\nlinchpin\nlinchpins\nlincoln\nlincolnesque\nlincolniana\nlincolnshire\nlincomycin\nlincomycins\nlindane\nlindanes\nlindbergh\nlindemann\nlinden\nlindens\nlindesnes\nlindies\nlindisfarne\nlindy\nline\nlineage\nlineages\nlineal\nlineality\nlineally\nlineament\nlineamental\nlineaments\nlinear\nlinearity\nlinearization\nlinearizations\nlinearize\nlinearized\nlinearizes\nlinearizing\nlinearly\nlineation\nlineations\nlinebacker\nlinebackers\nlinebacking\nlinebred\nlinebreeding\nlinecaster\nlinecasters\nlinecasting\nlinecut\nlinecuts\nlined\nlinefeed\nlinefeeds\nlineman\nlinemen\nlinen\nlinens\nlineolate\nliner\nlinerboard\nlinerboards\nlinerless\nliners\nlines\nlinesman\nlinesmen\nlineswoman\nlineswomen\nlineup\nlineups\nliney\nling\nlinga\nlingala\nlingalas\nlingam\nlingams\nlingas\nlingayat\nlingayats\nlingayen\nlingberries\nlingberry\nlingcod\nlingcods\nlinger\nlingered\nlingerer\nlingerers\nlingerie\nlingering\nlingeringly\nlingers\nlingo\nlingoes\nlingonberries\nlingonberry\nlings\nlingua\nlinguae\nlingual\nlingually\nlinguals\nlinguine\nlinguini\nlinguist\nlinguistic\nlinguistical\nlinguistically\nlinguistician\nlinguisticians\nlinguistics\nlinguists\nlingulate\nliniment\nliniments\nlinin\nlining\nlinings\nlinins\nlink\nlinkage\nlinkages\nlinkboy\nlinkboys\nlinked\nlinker\nlinkers\nlinking\nlinkings\nlinkman\nlinkmen\nlinks\nlinksman\nlinksmen\nlinkup\nlinkups\nlinn\nlinnaean\nlinnaeus\nlinnean\nlinnet\nlinnets\nlinnhe\nlinns\nlinocut\nlinocuts\nlinoleate\nlinoleates\nlinoleic\nlinolenic\nlinoleum\nlinotype\nlinotypes\nlinsang\nlinsangs\nlinseed\nlinseeds\nlinsey\nlinstock\nlinstocks\nlint\nlintel\nlintels\nlinter\nlinters\nlintless\nlintwhite\nlintwhites\nlinty\nlinuron\nlinurons\nlion\nlioness\nlionesses\nlionfish\nlionfishes\nlionheart\nlionhearted\nlionization\nlionizations\nlionize\nlionized\nlionizer\nlionizers\nlionizes\nlionizing\nlionlike\nlions\nlip\nlipan\nlipans\nlipari\nlipase\nlipases\nlipectomies\nlipectomy\nlipid\nlipide\nlipides\nlipidic\nlipids\nlipizzan\nlipizzaner\nlipizzaners\nlipizzans\nlipless\nliplike\nlipogenesis\nlipoic\nlipoid\nlipoidal\nlipoids\nlipolyses\nlipolysis\nlipolytic\nlipoma\nlipomas\nlipomata\nlipomatous\nlipophilic\nlipopolysaccharide\nlipopolysaccharides\nlipoprotein\nlipoproteins\nliposomal\nliposome\nliposomes\nliposuction\nliposuctions\nlipotropic\nlipotropin\nlipotropins\nlipotropism\nlipotropy\nlipped\nlippes\nlippi\nlippier\nlippiest\nlipping\nlippizan\nlippizaner\nlippizaners\nlippizans\nlippy\nlipreading\nlips\nlipstick\nlipsticked\nlipsticks\nliptauer\nliptauers\nlipton\nliquate\nliquated\nliquates\nliquating\nliquation\nliquations\nliquefacient\nliquefaction\nliquefactions\nliquefactive\nliquefiable\nliquefied\nliquefier\nliquefiers\nliquefies\nliquefy\nliquefying\nliquescence\nliquescency\nliquescent\nliqueur\nliqueurs\nliquid\nliquidambar\nliquidambars\nliquidate\nliquidated\nliquidates\nliquidating\nliquidation\nliquidations\nliquidator\nliquidators\nliquidity\nliquidize\nliquidized\nliquidizes\nliquidizing\nliquidly\nliquidness\nliquids\nliquified\nliquifies\nliquify\nliquifying\nliquor\nliquored\nliquorice\nliquoring\nliquors\nlira\nliras\nlire\nliri\nliripipe\nliripipes\nlirot\nliroth\nlisbon\nlisente\nlisle\nlisp\nlisped\nlisper\nlispers\nlisping\nlisps\nlissom\nlissome\nlissomely\nlissomeness\nlist\nlisted\nlistee\nlistees\nlistel\nlistels\nlisten\nlistenability\nlistenable\nlistened\nlistener\nlisteners\nlistenership\nlistenerships\nlistening\nlistens\nlister\nlisteria\nlisterias\nlisteriosis\nlisters\nlisting\nlistings\nlistless\nlistlessly\nlistlessness\nlists\nliszt\nlit\nlitanies\nlitany\nlitchi\nlitchis\nlite\nliter\nliteracy\nliteral\nliteralism\nliteralist\nliteralistic\nliteralists\nliterality\nliteralization\nliteralizations\nliteralize\nliteralized\nliteralizes\nliteralizing\nliterally\nliteralness\nliterals\nliterarily\nliterariness\nliterary\nliterate\nliterately\nliterateness\nliterates\nliterati\nliteratim\nliteration\nliterations\nliterator\nliterators\nliterature\nliteratures\nliteratus\nliters\nlitharge\nlitharges\nlithe\nlithely\nlitheness\nlither\nlithesome\nlithest\nlithia\nlithias\nlithiases\nlithiasis\nlithic\nlithification\nlithifications\nlithified\nlithifies\nlithify\nlithifying\nlithium\nlitho\nlithoed\nlithoes\nlithograph\nlithographed\nlithographer\nlithographers\nlithographic\nlithographical\nlithographically\nlithographing\nlithographs\nlithography\nlithoing\nlithologic\nlithological\nlithologically\nlithologist\nlithologists\nlithology\nlithophane\nlithophanes\nlithophyte\nlithophytes\nlithophytic\nlithopone\nlithopones\nlithos\nlithosol\nlithosols\nlithosphere\nlithospheres\nlithospheric\nlithostratigraphic\nlithostratigraphy\nlithotomies\nlithotomy\nlithotripsies\nlithotripsy\nlithotripter\nlithotripters\nlithotriptor\nlithotriptors\nlithotrities\nlithotrity\nlithuania\nlithuanian\nlithuanians\nlitigable\nlitigant\nlitigants\nlitigate\nlitigated\nlitigates\nlitigating\nlitigation\nlitigations\nlitigator\nlitigators\nlitigious\nlitigiously\nlitigiousness\nlitmus\nlitotes\nlitre\nlitres\nlitten\nlitter\nlitterateur\nlitterateurs\nlitterbag\nlitterbags\nlitterbug\nlitterbugs\nlittered\nlitterer\nlitterers\nlittering\nlittermate\nlittermates\nlitters\nlittery\nlittle\nlittleneck\nlittlenecks\nlittleness\nlittler\nlittlest\nlittoral\nlittorals\nlittérateur\nlittérateurs\nliturgic\nliturgical\nliturgically\nliturgics\nliturgies\nliturgiologist\nliturgiologists\nliturgiology\nliturgist\nliturgists\nliturgy\nlivability\nlivable\nlivableness\nlive\nliveability\nliveable\nlivebearer\nlivebearers\nlived\nlivelier\nliveliest\nlivelihood\nlivelihoods\nlivelily\nliveliness\nlivelong\nlively\nliven\nlivened\nliveness\nlivening\nlivens\nliver\nlivered\nliveried\nliveries\nliverish\nliverishness\nliverleaf\nliverleaves\nliverpudlian\nliverpudlians\nlivers\nliverwort\nliverworts\nliverwurst\nlivery\nliveryman\nliverymen\nlives\nlivestock\nlivetrap\nlivetraps\nlivid\nlividity\nlividly\nlividness\nliving\nlivingly\nlivingness\nlivings\nlivingstone\nlivonia\nlivonian\nlivonians\nlivorno\nlivre\nlivres\nlivy\nlixiviate\nlixiviated\nlixiviates\nlixiviating\nlixiviation\nlixiviations\nlizard\nlizardfish\nlizardfishes\nlizardlike\nlizards\nlizzie\nliège\nljubljana\nll\nllama\nllamas\nllano\nllanos\nlloyd\nllullaillaco\nlo\nloach\nloaches\nload\nloaded\nloader\nloaders\nloading\nloadings\nloadmaster\nloadmasters\nloads\nloadstar\nloadstars\nloadstone\nloadstones\nloaf\nloafed\nloafer\nloafers\nloafing\nloafs\nloam\nloamed\nloaming\nloams\nloamy\nloan\nloanable\nloanda\nloaned\nloaner\nloaners\nloaning\nloans\nloansharking\nloansharkings\nloanword\nloanwords\nloath\nloathe\nloathed\nloather\nloathers\nloathes\nloathing\nloathingly\nloathings\nloathly\nloathness\nloathsome\nloathsomely\nloathsomeness\nloaves\nlob\nlobar\nlobate\nlobated\nlobately\nlobation\nlobations\nlobbed\nlobber\nlobbers\nlobbied\nlobbies\nlobbing\nlobby\nlobbyer\nlobbyers\nlobbygow\nlobbygows\nlobbying\nlobbyism\nlobbyist\nlobbyists\nlobe\nlobectomies\nlobectomy\nlobed\nlobefin\nlobefinned\nlobefins\nlobelia\nlobelias\nlobeline\nlobelines\nlobes\nloblollies\nloblolly\nlobo\nlobola\nlobolas\nlobos\nlobotomies\nlobotomize\nlobotomized\nlobotomizes\nlobotomizing\nlobotomy\nlobs\nlobscouse\nlobscouses\nlobster\nlobstered\nlobsterer\nlobsterers\nlobstering\nlobsterlike\nlobsterman\nlobstermen\nlobsters\nlobular\nlobularly\nlobulate\nlobulated\nlobulation\nlobulations\nlobule\nlobules\nlobulose\nlobworm\nlobworms\nloc\nlocal\nlocale\nlocales\nlocalism\nlocalisms\nlocalist\nlocalists\nlocalite\nlocalites\nlocalities\nlocality\nlocalizability\nlocalizable\nlocalization\nlocalizations\nlocalize\nlocalized\nlocalizer\nlocalizers\nlocalizes\nlocalizing\nlocally\nlocalness\nlocals\nlocarno\nlocatable\nlocate\nlocated\nlocater\nlocaters\nlocates\nlocating\nlocation\nlocational\nlocationally\nlocations\nlocative\nlocatives\nlocator\nlocators\nloch\nlochia\nlochial\nlochs\nloci\nlock\nlockable\nlockage\nlockages\nlockbox\nlockboxes\nlockdown\nlockdowns\nlocke\nlocked\nlocker\nlockers\nlocket\nlockets\nlocking\nlockjaw\nlockkeeper\nlockkeepers\nlockmaster\nlockmasters\nlocknut\nlocknuts\nlockout\nlockouts\nlockram\nlocks\nlockset\nlocksets\nlocksmith\nlocksmithing\nlocksmiths\nlockstep\nlockstitch\nlockstitched\nlockstitches\nlockstitching\nlockup\nlockups\nloco\nlocoed\nlocoes\nlocofoco\nlocofocos\nlocoing\nlocoism\nlocoisms\nlocomote\nlocomoted\nlocomotes\nlocomoting\nlocomotion\nlocomotive\nlocomotives\nlocomotor\nlocomotory\nlocos\nlocoweed\nlocoweeds\nlocular\nloculate\nloculated\nloculation\nloculations\nlocule\nloculed\nlocules\nloculi\nloculicidal\nloculus\nlocum\nlocus\nlocust\nlocusts\nlocution\nlocutions\nlode\nloden\nlodens\nlodes\nlodestar\nlodestars\nlodestone\nlodestones\nlodge\nlodged\nlodgement\nlodgements\nlodgepole\nlodger\nlodgers\nlodges\nlodging\nlodgings\nlodgment\nlodgments\nlodicule\nlodicules\nloeb\nloess\nloessial\nloft\nlofted\nloftier\nloftiest\nloftily\nloftiness\nlofting\nloftlike\nlofts\nlofty\nlog\nloganberries\nloganberry\nlogarithm\nlogarithmic\nlogarithmical\nlogarithmically\nlogarithms\nlogbook\nlogbooks\nloge\nloges\nlogged\nlogger\nloggerhead\nloggerheads\nloggers\nloggia\nloggias\nlogging\nloggings\nlogia\nlogic\nlogical\nlogicality\nlogically\nlogicalness\nlogician\nlogicians\nlogics\nlogier\nlogiest\nlogin\nlogins\nlogion\nlogistic\nlogistical\nlogistically\nlogistician\nlogisticians\nlogistics\nlogjam\nlogjams\nlognormal\nlognormality\nlognormally\nlogo\nlogogram\nlogogrammatic\nlogogrammatically\nlogograms\nlogograph\nlogographic\nlogographically\nlogographs\nlogography\nlogogriph\nlogogriphs\nlogoi\nlogomachies\nlogomachy\nlogorrhea\nlogorrheic\nlogos\nlogotype\nlogotypes\nlogout\nlogroll\nlogrolled\nlogroller\nlogrollers\nlogrolling\nlogrollings\nlogrolls\nlogs\nlogwood\nlogwoods\nlogy\nlohengrin\nloin\nloincloth\nloincloths\nloins\nloire\nloiter\nloitered\nloiterer\nloiterers\nloitering\nloiters\nloki\nlolita\nlolitas\nloll\nlolland\nlollapalooza\nlollapaloozas\nlollard\nlollardism\nlollards\nlollardy\nlolled\nloller\nlollers\nlollies\nlolling\nlollingly\nlollipop\nlollipops\nlollop\nlolloped\nlolloping\nlollops\nlollopy\nlolls\nlolly\nlollygag\nlollygagged\nlollygagging\nlollygags\nlollypop\nlollypops\nlombard\nlombardian\nlombardic\nlombards\nlombardy\nlombok\nloment\nloments\nlomond\nlomé\nlondon\nlondonderry\nlondoner\nlondoners\nlone\nlonelier\nloneliest\nlonelily\nloneliness\nlonely\nloneness\nloner\nloners\nlonesome\nlonesomely\nlonesomeness\nlonesomes\nlong\nlongan\nlonganimity\nlongans\nlongboat\nlongboats\nlongbow\nlongbowman\nlongbowmen\nlongbows\nlongcase\nlonged\nlonger\nlongeron\nlongerons\nlongest\nlongevities\nlongevity\nlongevous\nlongfellow\nlonghair\nlonghaired\nlonghairs\nlonghand\nlonghead\nlongheaded\nlongheadedness\nlongheads\nlonghorn\nlonghorns\nlonghouse\nlonghouses\nlongicorn\nlongicorns\nlonging\nlongingly\nlongings\nlongish\nlongitude\nlongitudes\nlongitudinal\nlongitudinally\nlongleaf\nlonglegs\nlongline\nlonglines\nlongman\nlongneck\nlongnecks\nlongness\nlongobard\nlongobardi\nlongobardic\nlongobards\nlongs\nlongship\nlongships\nlongshore\nlongshoreman\nlongshoremen\nlongshoring\nlongsighted\nlongsightedness\nlongsome\nlongsomely\nlongsomeness\nlongspur\nlongspurs\nlongstanding\nlongsuffering\nlongtime\nlongue\nlongues\nlongueur\nlongueurs\nlongwinded\nlongwindedly\nlongwise\nlongyi\nlongyis\nlonsdale\nloo\nloobies\nlooby\nloofa\nloofah\nloofahs\nloofas\nlook\nlookalike\nlookalikes\nlookdown\nlookdowns\nlooked\nlooker\nlookers\nlooking\nlookout\nlookouts\nlooks\nlookup\nlookups\nloom\nloomed\nlooming\nlooms\nloon\nlooney\nlooneys\nloonier\nloonies\nlooniest\nloonily\nlooniness\nloons\nloony\nloop\nlooped\nlooper\nloopers\nloophole\nloopholes\nloopier\nloopiest\nlooping\nloops\nloopy\nloos\nloose\nloosed\nloosely\nloosen\nloosened\nlooseness\nloosening\nloosens\nlooser\nlooses\nloosest\nloosestrife\nloosestrifes\nloosey\nloosing\nloot\nlooted\nlooter\nlooters\nlooting\nloots\nlop\nlope\nloped\nloper\nlopers\nlopes\nlophophore\nlophophores\nloping\nlopped\nlopper\nloppers\nloppier\nloppiest\nlopping\nloppy\nlops\nlopsided\nlopsidedly\nlopsidedness\nloquacious\nloquaciously\nloquaciousness\nloquacity\nloquat\nloquats\nloran\nlorca\nlord\nlorded\nlording\nlordings\nlordlier\nlordliest\nlordliness\nlordling\nlordlings\nlordly\nlordoses\nlordosis\nlordotic\nlords\nlordship\nlordships\nlordy\nlore\nloreal\nlorelei\nloreleis\nlorentz\nlorenz\nlorgnette\nlorgnettes\nlorgnon\nlorgnons\nlorica\nloricae\nloricate\nloricated\nlories\nlorikeet\nlorikeets\nloris\nlorises\nlorn\nlorne\nlornness\nlorraine\nlorries\nlorry\nlory\nlos\nlosable\nlosableness\nlose\nlosel\nlosels\nloser\nlosers\nloses\nlosing\nlosingest\nlosings\nloss\nlosses\nlossless\nlossy\nlost\nlostness\nlot\nlota\nlotah\nlotahs\nlotas\nloth\nlothario\nlotharios\nlothian\nloti\nlotic\nlotion\nlotions\nlotos\nlotoses\nlots\nlotte\nlotted\nlotteries\nlottery\nlotting\nlotto\nlottos\nlotus\nlotuses\nlotusland\nlouche\nloud\nlouden\nloudened\nloudening\nloudens\nlouder\nloudest\nloudly\nloudmouth\nloudmouthed\nloudmouths\nloudness\nloudspeaker\nloudspeakers\nloudun\nlough\nloughs\nlouis\nlouise\nlouisiana\nlouisville\nlounge\nlounged\nlounger\nloungers\nlounges\nloungewear\nlounging\nloupe\nloupes\nlour\nlourdes\nloured\nlourenço\nlouring\nlours\nloury\nlouse\nloused\nlouses\nlousewort\nlouseworts\nlousier\nlousiest\nlousily\nlousiness\nlousing\nlousy\nlout\nlouted\nlouting\nloutish\nloutishly\nloutishness\nlouts\nlouvain\nlouver\nlouvered\nlouvers\nlouvre\nlouvred\nlouvres\nlovability\nlovable\nlovableness\nlovably\nlovage\nlovages\nlovastatin\nlovat\nlovats\nlove\nloveable\nlovebird\nlovebirds\nlovebug\nlovebugs\nloved\nlovelace\nloveless\nlovelessly\nlovelessness\nlovelier\nlovelies\nloveliest\nlovelily\nloveliness\nlovelock\nlovelocks\nlovelorn\nlovelornness\nlovely\nlovemaking\nlover\nloverly\nlovers\nloves\nloveseat\nloveseats\nlovesick\nlovesickness\nlovesome\nlovey\nloving\nlovingly\nlovingness\nlow\nlowball\nlowballed\nlowballing\nlowballs\nlowborn\nlowboy\nlowboys\nlowbred\nlowbrow\nlowbrowed\nlowbrows\nlowdown\nlowed\nlower\nlowercase\nlowercased\nlowercases\nlowercasing\nlowerclassman\nlowerclassmen\nlowered\nlowering\nloweringly\nlowermost\nlowers\nlowery\nlowest\nlowing\nlowland\nlowlander\nlowlanders\nlowlands\nlowlier\nlowliest\nlowlife\nlowlifes\nlowlight\nlowlights\nlowlihead\nlowliheads\nlowliness\nlowlives\nlowly\nlown\nlowness\nlows\nlox\nloxes\nloxodrome\nloxodromes\nloxodromic\nloxodromical\nloxodromically\nloyal\nloyalism\nloyalist\nloyalists\nloyally\nloyalties\nloyalty\nloyola\nlozenge\nlozenges\nlsd\nluanda\nluau\nluaus\nluba\nlubas\nlubavitcher\nlubavitchers\nlubber\nlubberliness\nlubberly\nlubbers\nlube\nlubed\nlubes\nlubing\nlubricant\nlubricants\nlubricate\nlubricated\nlubricates\nlubricating\nlubrication\nlubrications\nlubricative\nlubricator\nlubricators\nlubricious\nlubriciously\nlubriciousness\nlubricities\nlubricity\nlubricous\nlucania\nlucarne\nlucarnes\nlucca\nlucency\nlucent\nlucently\nlucerne\nluces\nlucia\nlucian\nlucians\nlucid\nlucida\nlucidas\nlucidity\nlucidly\nlucidness\nlucifer\nluciferase\nluciferases\nluciferin\nluciferins\nlucina\nlucinas\nlucite\nluck\nlucked\nluckier\nluckiest\nluckily\nluckiness\nlucking\nluckless\nlucknow\nlucks\nlucky\nlucrative\nlucre\nlucrece\nlucretian\nlucretius\nlucubrate\nlucubrated\nlucubrates\nlucubrating\nlucubration\nlucubrations\nluculent\nlucullan\nluddism\nluddite\nluddites\nlude\nludes\nludicrous\nludicrously\nludicrousness\nlues\nluetic\nluetically\nluff\nluffa\nluffas\nluffed\nluffing\nluffs\nlufthansa\nluftwaffe\nlug\nlugano\nluge\nluged\nluger\nlugers\nluges\nluggage\nlugged\nlugger\nluggers\nlugging\nluging\nlugs\nlugsail\nlugsails\nlugubrious\nlugubriously\nlugubriousness\nlugworm\nlugworms\nluichow\nluiseño\nluiseños\nluke\nlukewarm\nlukewarmly\nlukewarmness\nlull\nlullabied\nlullabies\nlullaby\nlullabying\nlulled\nlulling\nlulls\nlully\nlulu\nlulus\nlumbago\nlumbar\nlumber\nlumbered\nlumberer\nlumberers\nlumbering\nlumberingly\nlumberjack\nlumberjacks\nlumberman\nlumbermen\nlumbers\nlumberyard\nlumberyards\nlumbricoid\nlumeloid\nlumen\nlumenal\nlumens\nlumina\nluminal\nluminance\nluminaria\nluminarias\nluminaries\nluminary\nluminesce\nluminesced\nluminescence\nluminescent\nluminesces\nluminescing\nluminiferous\nluminism\nluminist\nluminists\nluminosities\nluminosity\nluminous\nluminously\nluminousness\nlumière\nlummox\nlummoxes\nlump\nlumpectomies\nlumpectomy\nlumped\nlumpen\nlumpenproletariat\nlumpenproletariats\nlumpfish\nlumpfishes\nlumpier\nlumpiest\nlumpily\nlumpiness\nlumping\nlumpish\nlumpishly\nlumpishness\nlumps\nlumpur\nlumpy\nluna\nlunacies\nlunacy\nlunar\nlunarscape\nlunarscapes\nlunate\nlunated\nlunates\nlunatic\nlunatics\nlunation\nlunch\nlunched\nluncheon\nluncheonette\nluncheonettes\nluncheons\nluncher\nlunchers\nlunches\nlunching\nlunchmeat\nlunchmeats\nlunchroom\nlunchrooms\nlunchtime\nlunchtimes\nlundy\nlune\nlunes\nlunette\nlunettes\nlung\nlunge\nlunged\nlunger\nlungers\nlunges\nlungfish\nlungfishes\nlungi\nlunging\nlungis\nlungs\nlungworm\nlungworms\nlungwort\nlungworts\nlungyi\nlungyis\nlunisolar\nlunitidal\nlunker\nlunkers\nlunkhead\nlunkheaded\nlunkheads\nlunula\nlunulae\nlunular\nlunulate\nlunulated\nlunule\nlunules\nluny\nlupercalia\nlupercalian\nlupin\nlupine\nlupines\nlupins\nlupulin\nlupulins\nlupus\nlurch\nlurched\nlurcher\nlurchers\nlurches\nlurching\nlurchingly\nlure\nlured\nlurer\nlurers\nlures\nlurex\nlurid\nluridly\nluridness\nluring\nluringly\nlurk\nlurked\nlurker\nlurkers\nlurking\nlurkingly\nlurks\nlusaka\nlusatia\nlusatian\nlusatians\nluscious\nlusciously\nlusciousness\nlush\nlushed\nlusher\nlushes\nlushest\nlushing\nlushly\nlushness\nlusitania\nlusitanian\nlusitanians\nlust\nlusted\nluster\nlustered\nlustering\nlusterless\nlusters\nlusterware\nlustful\nlustfully\nlustfulness\nlustier\nlustiest\nlustily\nlustiness\nlusting\nlustra\nlustral\nlustrate\nlustrated\nlustrates\nlustrating\nlustration\nlustrations\nlustrative\nlustrous\nlustrously\nlustrousness\nlustrum\nlustrums\nlusts\nlusty\nlusus\nlutanist\nlutanists\nlute\nluteal\nlutecium\nluted\nlutefisk\nlutefisks\nlutein\nluteinization\nluteinizations\nluteinize\nluteinized\nluteinizes\nluteinizing\nluteins\nlutenist\nlutenists\nluteous\nlutes\nlutetium\nlutfisk\nlutfisks\nluther\nlutheran\nlutheranism\nlutheranize\nlutheranized\nlutheranizes\nlutheranizing\nlutherans\nlutherism\nluthier\nluthiers\nluting\nlutist\nlutists\nlutyens\nlutz\nlutzes\nluwian\nluwians\nlux\nluxate\nluxated\nluxates\nluxating\nluxation\nluxations\nluxe\nluxembourg\nluxembourger\nluxembourgers\nluxemburg\nluxes\nluxor\nluxuriance\nluxuriant\nluxuriantly\nluxuriate\nluxuriated\nluxuriates\nluxuriating\nluxuries\nluxurious\nluxuriously\nluxuriousness\nluxury\nluzon\nlwei\nlyam\nlyase\nlyases\nlycanthrope\nlycanthropes\nlycanthropies\nlycanthropy\nlyceum\nlyceums\nlych\nlychee\nlychees\nlychnis\nlychnises\nlycia\nlycian\nlycians\nlycopene\nlycopenes\nlycopod\nlycopodium\nlycopodiums\nlycopods\nlycra\nlycée\nlycées\nlyddite\nlyddites\nlydia\nlydian\nlydians\nlye\nlygus\nlying\nlyings\nlyme\nlymph\nlymphadenitis\nlymphadenopathies\nlymphadenopathy\nlymphangiogram\nlymphangiograms\nlymphangiographic\nlymphangiographies\nlymphangiography\nlymphatic\nlymphatically\nlymphatics\nlymphoblast\nlymphoblastic\nlymphoblasts\nlymphocyte\nlymphocytes\nlymphocytic\nlymphocytosis\nlymphocytotic\nlymphogram\nlymphograms\nlymphogranuloma\nlymphogranulomatoses\nlymphogranulomatosis\nlymphographic\nlymphography\nlymphoid\nlymphokine\nlymphokines\nlymphoma\nlymphomas\nlymphomata\nlymphomatoid\nlymphomatoses\nlymphomatosis\nlymphomatous\nlymphopoieses\nlymphopoiesis\nlymphopoietic\nlymphosarcoma\nlymphosarcomas\nlymphosarcomata\nlymphotoxin\nlymphotoxins\nlymphotropic\nlynch\nlynched\nlyncher\nlynchers\nlynches\nlynching\nlynchings\nlynchpin\nlynchpins\nlynx\nlynxes\nlyon\nlyonnais\nlyonnaise\nlyonnesse\nlyons\nlyophile\nlyophiled\nlyophilic\nlyophilization\nlyophilizations\nlyophilize\nlyophilized\nlyophilizer\nlyophilizers\nlyophilizes\nlyophilizing\nlyophobic\nlyra\nlyrate\nlyre\nlyrebird\nlyrebirds\nlyres\nlyric\nlyrical\nlyrically\nlyricalness\nlyricism\nlyricist\nlyricists\nlyricize\nlyricized\nlyricizes\nlyricizing\nlyrics\nlyrism\nlyrist\nlyrists\nlysander\nlysate\nlysates\nlyse\nlysed\nlysenko\nlysenkoism\nlysergic\nlyses\nlysimeter\nlysimeters\nlysimetric\nlysin\nlysine\nlysing\nlysins\nlysis\nlysistrata\nlysithea\nlysogen\nlysogenic\nlysogenicity\nlysogenies\nlysogenization\nlysogenizations\nlysogenize\nlysogenized\nlysogenizes\nlysogenizing\nlysogens\nlysogeny\nlysol\nlysolecithin\nlysolecithins\nlysosomal\nlysosome\nlysosomes\nlysozyme\nlysozymes\nlytic\nlytically\nlytta\nlyttae\nlytton\nlázne\nlésvos\nlèse\nlímnos\nlübeck\nm\nm1\nm16\nma\nma'am\nmaar\nmaars\nmaasai\nmaasais\nmaastricht\nmab\nmabe\nmac\nmacabre\nmacabrely\nmacaco\nmacacos\nmacadam\nmacadamia\nmacadamias\nmacadamization\nmacadamizations\nmacadamize\nmacadamized\nmacadamizer\nmacadamizers\nmacadamizes\nmacadamizing\nmacanese\nmacao\nmacaque\nmacaques\nmacaroni\nmacaronic\nmacaronics\nmacaronies\nmacaronis\nmacaroon\nmacaroons\nmacassar\nmacau\nmacaulay\nmacaw\nmacaws\nmacbeth\nmaccabean\nmaccabees\nmacduff\nmace\nmacebearer\nmacebearers\nmaced\nmacedon\nmacedonia\nmacedonian\nmacedonians\nmacer\nmacerate\nmacerated\nmacerater\nmaceraters\nmacerates\nmacerating\nmaceration\nmacerations\nmacerator\nmacerators\nmacers\nmaces\nmach\nmachabees\nmache\nmaches\nmachete\nmachetes\nmachiavelli\nmachiavellian\nmachiavellianism\nmachiavellians\nmachiavellism\nmachiavellist\nmachiavellists\nmachicolate\nmachicolated\nmachicolates\nmachicolating\nmachicolation\nmachicolations\nmachina\nmachinability\nmachinable\nmachinate\nmachinated\nmachinates\nmachinating\nmachination\nmachinations\nmachinator\nmachinators\nmachine\nmachineability\nmachineable\nmachined\nmachineless\nmachinelike\nmachineries\nmachinery\nmachines\nmachining\nmachinist\nmachinists\nmachismo\nmachmeter\nmachmeters\nmacho\nmachoism\nmachos\nmachzor\nmacing\nmacintosh\nmacintoshes\nmack\nmackenzie\nmackerel\nmackerels\nmackinac\nmackinaw\nmackinaws\nmackintosh\nmackintoshes\nmackle\nmackled\nmackles\nmacklin\nmackling\nmaclaurin\nmacle\nmacled\nmacles\nmacmillan\nmacon\nmacpherson\nmacramé\nmacready\nmacro\nmacroaggregate\nmacroaggregated\nmacroaggregates\nmacrobiotic\nmacrobiotics\nmacrocephalia\nmacrocephalic\nmacrocephalous\nmacrocephaly\nmacroclimate\nmacroclimates\nmacroclimatic\nmacrocode\nmacrocodes\nmacrocosm\nmacrocosmic\nmacrocosmically\nmacrocosms\nmacrocyclic\nmacrocyte\nmacrocytes\nmacrocytic\nmacrocytoses\nmacrocytosis\nmacrocytotic\nmacrodome\nmacrodomes\nmacroeconomic\nmacroeconomics\nmacroeconomist\nmacroeconomists\nmacroevolution\nmacroevolutionary\nmacroevolutions\nmacrofossil\nmacrofossils\nmacrogamete\nmacrogametes\nmacroglobulin\nmacroglobulinemia\nmacroglobulinemias\nmacroglobulinemic\nmacroglobulins\nmacrograph\nmacrographs\nmacrography\nmacroinstruction\nmacroinstructions\nmacrolepidoptera\nmacromere\nmacromeres\nmacromolecular\nmacromolecule\nmacromolecules\nmacron\nmacrons\nmacronuclear\nmacronuclei\nmacronucleus\nmacronutrient\nmacronutrients\nmacrophage\nmacrophages\nmacrophagic\nmacrophotograph\nmacrophotographs\nmacrophotography\nmacrophysics\nmacrophyte\nmacrophytes\nmacrophytic\nmacropterous\nmacros\nmacroscale\nmacroscales\nmacroscopic\nmacroscopical\nmacroscopically\nmacrosporangia\nmacrosporangium\nmacrospore\nmacrospores\nmacrostructural\nmacrostructure\nmacrostructures\nmacs\nmacula\nmaculae\nmacular\nmaculas\nmaculate\nmaculated\nmaculates\nmaculating\nmaculation\nmacule\nmaculed\nmacules\nmaculing\nmacumba\nmacédoine\nmad\nmadagascan\nmadagascans\nmadagascar\nmadam\nmadame\nmadames\nmadams\nmadcap\nmadcaps\nmadded\nmadden\nmaddened\nmaddening\nmaddeningly\nmaddens\nmadder\nmadders\nmaddest\nmadding\nmaddish\nmade\nmadeira\nmadeiran\nmadeirans\nmadeiras\nmadeleine\nmadeleines\nmademoiselle\nmademoiselles\nmadhouse\nmadhouses\nmadhya\nmadison\nmadly\nmadman\nmadmen\nmadness\nmadnesses\nmadonna\nmadonnas\nmadras\nmadrepore\nmadrepores\nmadreporian\nmadreporic\nmadreporite\nmadreporites\nmadrid\nmadrigal\nmadrigalian\nmadrigalist\nmadrigalists\nmadrigals\nmadrilene\nmadrilenes\nmadrilène\nmadrilènes\nmadrona\nmadrone\nmadrones\nmadrono\nmadroña\nmadroñas\nmadroño\nmadroños\nmads\nmaduro\nmaduros\nmadwoman\nmadwomen\nmadwort\nmadworts\nmae\nmaecenas\nmaecenases\nmaelstrom\nmaelstroms\nmaenad\nmaenadic\nmaenads\nmaestoso\nmaestri\nmaestro\nmaestros\nmafeking\nmaffick\nmafficked\nmafficking\nmafficks\nmafia\nmafic\nmafiosi\nmafioso\nmafiosos\nmag\nmagadha\nmagazine\nmagazines\nmagazinist\nmagazinists\nmagdalen\nmagdalene\nmagdalenes\nmagdalenian\nmagdalens\nmagdeburg\nmage\nmagellan\nmagellanic\nmagen\nmagenta\nmagentas\nmages\nmaggiore\nmaggot\nmaggots\nmaggoty\nmaghreb\nmaghrib\nmagi\nmagian\nmagianism\nmagic\nmagical\nmagically\nmagician\nmagicians\nmagicked\nmagicking\nmagics\nmaginot\nmagisterial\nmagisterially\nmagisterium\nmagisteriums\nmagistracies\nmagistracy\nmagistral\nmagistrally\nmagistrate\nmagistrates\nmagistratical\nmagistratically\nmagistrature\nmagistratures\nmaglemosian\nmaglev\nmaglevs\nmagma\nmagmas\nmagmata\nmagmatic\nmagna\nmagnanimities\nmagnanimity\nmagnanimous\nmagnanimously\nmagnanimousness\nmagnate\nmagnates\nmagnesia\nmagnesian\nmagnesite\nmagnesites\nmagnesium\nmagnet\nmagnetar\nmagnetars\nmagnetic\nmagnetically\nmagnetism\nmagnetisms\nmagnetite\nmagnetizable\nmagnetization\nmagnetizations\nmagnetize\nmagnetized\nmagnetizer\nmagnetizers\nmagnetizes\nmagnetizing\nmagneto\nmagnetoelectric\nmagnetoelectricity\nmagnetofluiddynamic\nmagnetofluiddynamics\nmagnetogasdynamic\nmagnetogasdynamics\nmagnetograph\nmagnetographs\nmagnetohydrodynamic\nmagnetohydrodynamics\nmagnetometer\nmagnetometers\nmagnetometric\nmagnetometry\nmagnetomotive\nmagneton\nmagnetons\nmagnetopause\nmagnetopauses\nmagnetoplasmadynamic\nmagnetoplasmadynamics\nmagnetoresistance\nmagnetoresistances\nmagnetos\nmagnetosphere\nmagnetospheres\nmagnetospheric\nmagnetostatic\nmagnetostriction\nmagnetostrictions\nmagnetostrictive\nmagnetostrictively\nmagnetron\nmagnetrons\nmagnets\nmagnifiable\nmagnific\nmagnifical\nmagnifically\nmagnificat\nmagnification\nmagnifications\nmagnificats\nmagnificence\nmagnificent\nmagnificently\nmagnifico\nmagnificoes\nmagnified\nmagnifier\nmagnifiers\nmagnifies\nmagnify\nmagnifying\nmagniloquence\nmagniloquent\nmagniloquently\nmagnitude\nmagnitudes\nmagnolia\nmagnolias\nmagnon\nmagnum\nmagnums\nmagnus\nmagot\nmagots\nmagpie\nmagpies\nmags\nmaguey\nmagueys\nmagus\nmagyar\nmagyars\nmah\nmahabharata\nmahal\nmahaleb\nmahalebs\nmahalo\nmaharaja\nmaharajah\nmaharajahs\nmaharajas\nmaharanee\nmaharanees\nmaharani\nmaharanis\nmaharashtra\nmaharishi\nmaharishis\nmahatma\nmahatmas\nmahayana\nmahayanas\nmahayanist\nmahayanistic\nmahayanists\nmahdi\nmahdis\nmahdism\nmahdist\nmahdists\nmahi\nmahican\nmahicans\nmahimahi\nmahis\nmahjong\nmahjongg\nmahjonggs\nmahjongs\nmahler\nmahlstick\nmahlsticks\nmahoe\nmahoes\nmahoganies\nmahogany\nmahomet\nmahonia\nmahout\nmahouts\nmahrati\nmahratta\nmahratti\nmahuang\nmahuangs\nmahzor\nmahzorim\nmahzors\nmaia\nmaid\nmaiden\nmaidenhair\nmaidenhairs\nmaidenhead\nmaidenheads\nmaidenhood\nmaidenliness\nmaidenly\nmaidens\nmaidhood\nmaidish\nmaidishness\nmaids\nmaidservant\nmaidservants\nmaidu\nmaidus\nmaieutic\nmaieutical\nmail\nmailability\nmailable\nmailbag\nmailbags\nmailbox\nmailboxes\nmaile\nmailed\nmailer\nmailers\nmailgram\nmailing\nmailings\nmaillot\nmaillots\nmailman\nmailmen\nmailroom\nmailrooms\nmails\nmaim\nmaimed\nmaimer\nmaimers\nmaiming\nmaims\nmain\nmaine\nmainframe\nmainframes\nmainland\nmainlander\nmainlanders\nmainline\nmainlined\nmainliner\nmainliners\nmainlines\nmainlining\nmainly\nmainmast\nmainmasts\nmains\nmainsail\nmainsails\nmainsheet\nmainsheets\nmainspring\nmainsprings\nmainstay\nmainstays\nmainstream\nmainstreamed\nmainstreamer\nmainstreamers\nmainstreaming\nmainstreams\nmaintain\nmaintainability\nmaintainable\nmaintained\nmaintainer\nmaintainers\nmaintaining\nmaintains\nmaintenance\nmaintop\nmaintops\nmainz\nmaiolica\nmaisonette\nmaisonettes\nmaitre\nmaitres\nmaize\nmaizes\nmajeste\nmajestic\nmajestical\nmajestically\nmajesties\nmajesty\nmajesté\nmajeure\nmajolica\nmajor\nmajora\nmajorca\nmajorcan\nmajorcans\nmajordomo\nmajordomos\nmajored\nmajorette\nmajorettes\nmajoring\nmajoritarian\nmajoritarianism\nmajoritarians\nmajorities\nmajority\nmajorly\nmajors\nmajuscular\nmajuscule\nmajuscules\nmakable\nmakalu\nmakar\nmakars\nmakassar\nmake\nmakeable\nmakebate\nmakebates\nmakefast\nmakefasts\nmakeover\nmakeovers\nmaker\nmakereadies\nmakeready\nmakers\nmakes\nmakeshift\nmakeshifts\nmakeup\nmakeups\nmakeweight\nmakeweights\nmakimono\nmakimonos\nmaking\nmakings\nmako\nmakos\nmakuta\nmal\nmalabar\nmalabo\nmalabsorption\nmalabsorptions\nmalacca\nmalaccas\nmalachi\nmalachias\nmalachite\nmalacological\nmalacologist\nmalacologists\nmalacology\nmalacostracan\nmalacostracans\nmaladaptation\nmaladaptations\nmaladapted\nmaladaptive\nmaladies\nmaladjusted\nmaladjustive\nmaladjustment\nmaladjustments\nmaladminister\nmaladministered\nmaladministering\nmaladministers\nmaladministration\nmaladministrations\nmaladroit\nmaladroitly\nmaladroitness\nmaladroits\nmalady\nmalaga\nmalagas\nmalagasies\nmalagasy\nmalagueña\nmalaise\nmalamute\nmalamutes\nmalapert\nmalapertly\nmalapertness\nmalaperts\nmalapportioned\nmalapportionment\nmalapportionments\nmalaprop\nmalapropian\nmalapropism\nmalapropisms\nmalapropist\nmalapropists\nmalapropos\nmalaprops\nmalar\nmalaria\nmalarial\nmalarian\nmalariologist\nmalariologists\nmalariology\nmalarious\nmalarkey\nmalarky\nmalars\nmalassimilation\nmalassimilations\nmalate\nmalates\nmalathion\nmalawi\nmalawian\nmalawians\nmalay\nmalaya\nmalayalam\nmalayalams\nmalayan\nmalayans\nmalays\nmalaysia\nmalaysian\nmalaysians\nmalcontent\nmalcontented\nmalcontentedly\nmalcontentedness\nmalcontents\nmaldistribution\nmaldistributions\nmaldivan\nmaldivans\nmaldive\nmaldives\nmaldivian\nmaldivians\nmale\nmaleate\nmaleates\nmalebranche\nmalecite\nmalecites\nmaledict\nmaledicted\nmaledicting\nmalediction\nmaledictions\nmaledictory\nmaledicts\nmalefaction\nmalefactions\nmalefactor\nmalefactors\nmalefic\nmaleficence\nmaleficent\nmaleic\nmalemute\nmalemutes\nmaleness\nmalentendu\nmalentendus\nmales\nmalevolence\nmalevolent\nmalevolently\nmalfeasance\nmalfeasant\nmalfeasants\nmalfi\nmalformation\nmalformations\nmalformed\nmalfunction\nmalfunctioned\nmalfunctioning\nmalfunctions\nmalgre\nmali\nmalian\nmalians\nmalic\nmalice\nmalicious\nmaliciously\nmaliciousness\nmalign\nmalignance\nmalignancies\nmalignancy\nmalignant\nmalignantly\nmaligned\nmaligner\nmaligners\nmaligning\nmalignities\nmalignity\nmalignly\nmaligns\nmalihini\nmalihinis\nmaline\nmalines\nmalinger\nmalingered\nmalingerer\nmalingerers\nmalingering\nmalingers\nmalinke\nmalinkes\nmalinois\nmaliseet\nmaliseets\nmalison\nmalisons\nmalkin\nmalkins\nmall\nmallard\nmallards\nmalleability\nmalleable\nmalleableness\nmalleably\nmalled\nmallee\nmallees\nmallei\nmallemuck\nmallemucks\nmallet\nmallets\nmalleus\nmalling\nmallorca\nmallow\nmallows\nmalls\nmalmsey\nmalmseys\nmalnourish\nmalnourished\nmalnourishes\nmalnourishing\nmalnourishment\nmalnourishments\nmalnutrition\nmalo\nmalocclusion\nmalocclusions\nmalodor\nmalodorous\nmalodorously\nmalodorousness\nmalodors\nmalolactic\nmalonic\nmaloti\nmalpighian\nmalplaquet\nmalposition\nmalpositions\nmalpractice\nmalpractitioner\nmalpractitioners\nmalt\nmalta\nmaltase\nmalted\nmaltese\nmaltha\nmalthas\nmalthus\nmalthusian\nmalthusianism\nmalthusians\nmalting\nmaltose\nmaltreat\nmaltreated\nmaltreater\nmaltreaters\nmaltreating\nmaltreatment\nmaltreatments\nmaltreats\nmalts\nmaltster\nmaltsters\nmalty\nmalvasia\nmalvasias\nmalversation\nmalversations\nmalvinas\nmalvoisie\nmalvoisies\nmama\nmamas\nmamba\nmambas\nmamberamo\nmambo\nmamboed\nmamboing\nmambos\nmameluke\nmamelukes\nmamey\nmameys\nmamluk\nmamluks\nmamma\nmammae\nmammal\nmammalian\nmammalians\nmammalogical\nmammalogist\nmammalogists\nmammalogy\nmammals\nmammaplasties\nmammaplasty\nmammary\nmammas\nmammate\nmammee\nmammer\nmammered\nmammering\nmammers\nmammies\nmammiferous\nmammilla\nmammillae\nmammillary\nmammillate\nmammillated\nmammillation\nmammillations\nmammock\nmammocked\nmammocking\nmammocks\nmammogram\nmammograms\nmammographic\nmammographies\nmammography\nmammon\nmammonism\nmammonist\nmammonists\nmammoplasties\nmammoplasty\nmammoth\nmammoths\nmammy\nmamoré\nman\nmana\nmanacle\nmanacled\nmanacles\nmanacling\nmanage\nmanageability\nmanageable\nmanageableness\nmanageably\nmanaged\nmanagement\nmanagemental\nmanagements\nmanager\nmanageress\nmanageresses\nmanagerial\nmanagerially\nmanagers\nmanagership\nmanagerships\nmanages\nmanaging\nmanagua\nmanaguan\nmanaguans\nmanakin\nmanakins\nmanama\nmanamah\nmanas\nmanasseh\nmanatee\nmanatees\nmanchester\nmanchineel\nmanchineels\nmanchu\nmanchuguo\nmanchukuo\nmanchuria\nmanchurian\nmanchurians\nmanchus\nmanciple\nmanciples\nmancunian\nmancunians\nmandaean\nmandaeans\nmandala\nmandalas\nmandalay\nmandalic\nmandamus\nmandamused\nmandamuses\nmandamusing\nmandan\nmandans\nmandarin\nmandarinate\nmandarinates\nmandarinic\nmandarinism\nmandarins\nmandataries\nmandatary\nmandate\nmandated\nmandates\nmandating\nmandator\nmandatories\nmandatorily\nmandators\nmandatory\nmande\nmandean\nmandeans\nmandekan\nmandekans\nmandelbrot\nmandes\nmandible\nmandibles\nmandibular\nmandibulate\nmandibulates\nmandingo\nmandingoes\nmandingos\nmandinka\nmandinkas\nmandioca\nmandola\nmandolas\nmandolin\nmandoline\nmandolines\nmandolinist\nmandolinists\nmandolins\nmandragora\nmandragoras\nmandrake\nmandrakes\nmandrel\nmandrels\nmandril\nmandrill\nmandrills\nmandrils\nmane\nmaned\nmanege\nmaneges\nmanes\nmanet\nmaneuver\nmaneuverability\nmaneuverable\nmaneuvered\nmaneuverer\nmaneuverers\nmaneuvering\nmaneuverings\nmaneuvers\nmanful\nmanfully\nmanfulness\nmangabey\nmangabeys\nmanganate\nmanganates\nmanganese\nmanganesian\nmanganic\nmanganite\nmanganites\nmanganous\nmange\nmangel\nmanger\nmangers\nmangier\nmangiest\nmangily\nmanginess\nmangle\nmangled\nmangler\nmanglers\nmangles\nmangling\nmango\nmangoes\nmangonel\nmangonels\nmangos\nmangosteen\nmangosteens\nmangrove\nmangroves\nmangy\nmanhandle\nmanhandled\nmanhandles\nmanhandling\nmanhattan\nmanhattanite\nmanhattanites\nmanhattanization\nmanhattanizations\nmanhattanize\nmanhattanized\nmanhattanizes\nmanhattanizing\nmanhattans\nmanhole\nmanholes\nmanhood\nmanhunt\nmanhunts\nmania\nmaniac\nmaniacal\nmaniacally\nmaniacs\nmanias\nmanic\nmanically\nmanichaean\nmanichaeanism\nmanichaeanisms\nmanichaeans\nmanichaeism\nmanichaeisms\nmanichean\nmanicheans\nmanichee\nmanichees\nmanicheism\nmanicotti\nmanics\nmanicure\nmanicured\nmanicures\nmanicuring\nmanicurist\nmanicurists\nmanifest\nmanifestant\nmanifestants\nmanifestation\nmanifestations\nmanifested\nmanifester\nmanifesters\nmanifesting\nmanifestly\nmanifesto\nmanifestoed\nmanifestoes\nmanifestoing\nmanifestos\nmanifests\nmanifold\nmanifolded\nmanifolding\nmanifoldly\nmanifoldness\nmanifolds\nmanikin\nmanikins\nmanila\nmanilas\nmanilla\nmanillas\nmanille\nmaninka\nmaninkas\nmanioc\nmanioca\nmaniocas\nmaniocs\nmaniple\nmaniples\nmanipulability\nmanipulable\nmanipular\nmanipulars\nmanipulatable\nmanipulate\nmanipulated\nmanipulates\nmanipulating\nmanipulation\nmanipulations\nmanipulative\nmanipulatively\nmanipulativeness\nmanipulator\nmanipulators\nmanipulatory\nmanipur\nmanito\nmanitoba\nmanitoban\nmanitobans\nmanitos\nmanitou\nmanitoulin\nmanitous\nmanitu\nmanitus\nmankind\nmanless\nmanlier\nmanliest\nmanlike\nmanliness\nmanly\nmanmade\nmanna\nmannan\nmannans\nmannar\nmanned\nmannequin\nmannequins\nmanner\nmannered\nmannerism\nmannerisms\nmannerist\nmanneristic\nmannerists\nmannerless\nmannerliness\nmannerly\nmanners\nmannheim\nmannikin\nmannikins\nmanning\nmannish\nmannishly\nmannishness\nmannite\nmannites\nmannitol\nmannitols\nmannose\nmannoses\nmano\nmanometer\nmanometers\nmanometric\nmanometrical\nmanometrically\nmanometry\nmanor\nmanorial\nmanorialism\nmanors\nmanos\nmanpack\nmanpower\nmanqué\nmanrope\nmanropes\nmans\nmansard\nmansarded\nmansards\nmanse\nmanservant\nmanses\nmansfield\nmansion\nmansions\nmanslaughter\nmanslayer\nmanslayers\nmansuetude\nmansuetudes\nmanta\nmantas\nmanteau\nmanteaus\nmanteaux\nmantegna\nmantel\nmantelet\nmantelets\nmantelletta\nmantellettas\nmantelpiece\nmantelpieces\nmantels\nmantelshelf\nmantelshelfs\nmanteltree\nmanteltrees\nmantes\nmantic\nmantically\nmanticore\nmantid\nmantids\nmantilla\nmantillas\nmantis\nmantises\nmantissa\nmantissas\nmantle\nmantled\nmantles\nmantlet\nmantlets\nmantling\nmantoux\nmantova\nmantra\nmantrap\nmantraps\nmantras\nmantric\nmantua\nmantuan\nmantuans\nmantuas\nmanu\nmanual\nmanually\nmanuals\nmanubria\nmanubrium\nmanufactories\nmanufactory\nmanufacturable\nmanufactural\nmanufacture\nmanufactured\nmanufacturer\nmanufacturers\nmanufactures\nmanufacturing\nmanumission\nmanumissions\nmanumit\nmanumits\nmanumitted\nmanumitter\nmanumitters\nmanumitting\nmanure\nmanured\nmanurer\nmanurers\nmanures\nmanurial\nmanuring\nmanus\nmanuscript\nmanuscripts\nmanward\nmanwards\nmanwise\nmanx\nmanxman\nmanxmen\nmanxwoman\nmanxwomen\nmany\nmanyfold\nmanyplies\nmanzanilla\nmanzanillas\nmanzanita\nmanzanitas\nmanzoni\nmanège\nmanèges\nmao\nmaoism\nmaoist\nmaoists\nmaori\nmaoris\nmap\nmaple\nmaples\nmaplike\nmapmaker\nmapmakers\nmapmaking\nmappable\nmapped\nmapper\nmappers\nmapping\nmappings\nmaps\nmaputo\nmaquette\nmaquettes\nmaqui\nmaquila\nmaquiladora\nmaquiladoras\nmaquilas\nmaquillage\nmaquillages\nmaquis\nmaquisard\nmaquisards\nmar\nmara\nmarabou\nmarabous\nmarabout\nmarabouts\nmaraca\nmaracaibo\nmaracas\nmaraging\nmarajó\nmaranta\nmarantas\nmaras\nmarasca\nmarascas\nmaraschino\nmaraschinos\nmarasmic\nmarasmus\nmarat\nmaratha\nmarathas\nmarathi\nmarathon\nmarathoner\nmarathoners\nmarathoning\nmarathons\nmarattas\nmaraud\nmarauded\nmarauder\nmarauders\nmarauding\nmarauds\nmarañón\nmarbella\nmarble\nmarbled\nmarbleize\nmarbleized\nmarbleizes\nmarbleizing\nmarbles\nmarblewood\nmarblewoods\nmarbling\nmarbly\nmarburg\nmarc\nmarcasite\nmarcasites\nmarcasitical\nmarcato\nmarcatos\nmarcel\nmarcelled\nmarcelling\nmarcels\nmarcescent\nmarch\nmarchand\nmarche\nmarched\nmarchen\nmarcher\nmarchers\nmarches\nmarchesa\nmarchese\nmarchesi\nmarching\nmarchioness\nmarchionesses\nmarchland\nmarchlands\nmarchlike\nmarchpane\nmarchpanes\nmarcionism\nmarcionite\nmarcionites\nmarconi\nmarcs\nmardi\nmarduk\nmare\nmarek\nmarengo\nmares\nmarfan\nmargarine\nmargarines\nmargarita\nmargaritas\nmargarite\nmargarites\nmargay\nmarge\nmargent\nmargents\nmargin\nmarginal\nmarginalia\nmarginality\nmarginalization\nmarginalizations\nmarginalize\nmarginalized\nmarginalizes\nmarginalizing\nmarginally\nmarginate\nmarginated\nmarginates\nmarginating\nmargination\nmarginations\nmargined\nmargining\nmargins\nmargravate\nmargravates\nmargrave\nmargraves\nmargravial\nmargraviate\nmargraviates\nmargravine\nmargravines\nmarguerite\nmarguerites\nmaria\nmariachi\nmariachis\nmarian\nmariana\nmarianas\nmarianist\nmarianists\nmaricopa\nmaricopas\nmaricultural\nmariculture\nmaricultures\nmariculturist\nmariculturists\nmarie\nmarienberg\nmarienbourg\nmarienburg\nmarigold\nmarigolds\nmarihuana\nmarijuana\nmarimba\nmarimbas\nmarimbist\nmarimbists\nmarina\nmarinade\nmarinaded\nmarinades\nmarinading\nmarinara\nmarinaras\nmarinas\nmarinate\nmarinated\nmarinates\nmarinating\nmarination\nmarinations\nmarine\nmariner\nmariners\nmarines\nmarino\nmariolater\nmariolaters\nmariolatrous\nmariolatry\nmariological\nmariology\nmarionette\nmarionettes\nmariposa\nmarish\nmarishes\nmarist\nmarists\nmarital\nmaritally\nmaritime\nmariánské\nmarjoram\nmark\nmarkdown\nmarkdowns\nmarked\nmarkedly\nmarkedness\nmarker\nmarkers\nmarket\nmarketability\nmarketable\nmarketed\nmarketeer\nmarketeering\nmarketeers\nmarketer\nmarketers\nmarketing\nmarketings\nmarketplace\nmarketplaces\nmarkets\nmarketwise\nmarkham\nmarkhor\nmarkhors\nmarking\nmarkings\nmarkka\nmarkkaa\nmarkkas\nmarkoff\nmarkov\nmarkovian\nmarks\nmarksman\nmarksmanship\nmarksmen\nmarkswoman\nmarkswomen\nmarkup\nmarkups\nmarl\nmarled\nmarlin\nmarline\nmarlines\nmarlinespike\nmarlinespikes\nmarling\nmarlingspike\nmarlingspikes\nmarlins\nmarlinspike\nmarlinspikes\nmarlite\nmarlites\nmarlitic\nmarls\nmarlstone\nmarlstones\nmarly\nmarmalade\nmarmalades\nmarmara\nmarmite\nmarmites\nmarmolada\nmarmoreal\nmarmoreally\nmarmorean\nmarmoset\nmarmosets\nmarmot\nmarmots\nmarne\nmarocain\nmarocains\nmaronite\nmaronites\nmaroon\nmarooned\nmarooning\nmaroons\nmarplot\nmarplots\nmarque\nmarquee\nmarquees\nmarques\nmarquesan\nmarquesans\nmarquess\nmarquessate\nmarquessates\nmarquesses\nmarqueterie\nmarqueteries\nmarquetries\nmarquetry\nmarquette\nmarquis\nmarquisate\nmarquisates\nmarquise\nmarquises\nmarquisette\nmarquisettes\nmarrakech\nmarrakesh\nmarram\nmarrams\nmarrano\nmarranos\nmarred\nmarriage\nmarriageability\nmarriageable\nmarriageableness\nmarriages\nmarried\nmarrieds\nmarries\nmarring\nmarron\nmarrons\nmarrow\nmarrowbone\nmarrowbones\nmarrowfat\nmarrowfats\nmarrowy\nmarry\nmarrying\nmars\nmarsala\nmarsalas\nmarse\nmarseillaise\nmarseille\nmarseilles\nmarsh\nmarshal\nmarshalcy\nmarshaled\nmarshaling\nmarshall\nmarshalled\nmarshalling\nmarshals\nmarshalship\nmarshalships\nmarshes\nmarshier\nmarshiest\nmarshiness\nmarshland\nmarshlands\nmarshmallow\nmarshmallows\nmarshmallowy\nmarshy\nmarston\nmarsupia\nmarsupial\nmarsupials\nmarsupium\nmart\nmartaban\nmartagon\nmartagons\nmarted\nmartel\nmartello\nmarten\nmartens\nmartensite\nmartensites\nmartensitic\nmartensitically\nmartha\nmartial\nmartialed\nmartialing\nmartialism\nmartialist\nmartialists\nmartialled\nmartialling\nmartially\nmartials\nmartian\nmartians\nmartin\nmartinet\nmartinets\nmarting\nmartingal\nmartingale\nmartingales\nmartingals\nmartini\nmartinique\nmartinis\nmartinmas\nmartinmases\nmartins\nmartlet\nmartlets\nmarts\nmartyr\nmartyrdom\nmartyred\nmartyries\nmartyring\nmartyrization\nmartyrizations\nmartyrize\nmartyrized\nmartyrizes\nmartyrizing\nmartyrologies\nmartyrologist\nmartyrologists\nmartyrology\nmartyrs\nmartyry\nmartí\nmarvel\nmarveled\nmarveling\nmarvelled\nmarvelling\nmarvellous\nmarvelous\nmarvelously\nmarvelousness\nmarvels\nmarx\nmarxian\nmarxianism\nmarxians\nmarxism\nmarxist\nmarxists\nmary\nmaryknoller\nmaryknollers\nmaryland\nmarylander\nmarylanders\nmaryology\nmarys\nmarzipan\nmas\nmasaccio\nmasachusetts\nmasada\nmasai\nmasais\nmasala\nmasalas\nmasbate\nmascara\nmascaraed\nmascaraing\nmascaras\nmascarpone\nmascarpones\nmascon\nmascons\nmascot\nmascots\nmasculine\nmasculinely\nmasculineness\nmasculines\nmasculinities\nmasculinity\nmasculinization\nmasculinizations\nmasculinize\nmasculinized\nmasculinizes\nmasculinizing\nmasefield\nmaser\nmasers\nmaseru\nmash\nmashed\nmasher\nmasherbrum\nmashers\nmashes\nmashgiach\nmashgiah\nmashgichim\nmashgihim\nmashie\nmashies\nmashing\nmashy\nmasjid\nmasjids\nmask\nmaskable\nmasked\nmaskeg\nmaskegs\nmasker\nmaskers\nmasking\nmaskings\nmaskinonge\nmaskinonges\nmasklike\nmasks\nmasochism\nmasochist\nmasochistic\nmasochistically\nmasochists\nmason\nmasoned\nmasonic\nmasoning\nmasonite\nmasonries\nmasonry\nmasons\nmasora\nmasorah\nmasorahs\nmasoras\nmasorete\nmasoretes\nmasoretic\nmasque\nmasquer\nmasquerade\nmasqueraded\nmasquerader\nmasqueraders\nmasquerades\nmasquerading\nmasquers\nmasques\nmass\nmassachuset\nmassachusets\nmassachusett\nmassachusetts\nmassacre\nmassacred\nmassacrer\nmassacrers\nmassacres\nmassacring\nmassage\nmassaged\nmassager\nmassagers\nmassages\nmassaging\nmassasauga\nmassasaugas\nmasscult\nmasscults\nmasse\nmassed\nmassena\nmasses\nmasseter\nmasseteric\nmasseters\nmasseur\nmasseurs\nmasseuse\nmasseuses\nmassicot\nmassicots\nmassier\nmassiest\nmassif\nmassifs\nmassing\nmassinger\nmassive\nmassively\nmassiveness\nmassless\nmassorete\nmassoretes\nmassy\nmassé\nmast\nmastaba\nmastabah\nmastabahs\nmastabas\nmastectomies\nmastectomy\nmasted\nmaster\nmasterdom\nmastered\nmasterful\nmasterfully\nmasterfulness\nmasteries\nmastering\nmasterliness\nmasterly\nmastermind\nmasterminded\nmasterminding\nmasterminds\nmasterpiece\nmasterpieces\nmasters\nmastership\nmasterships\nmastersinger\nmastersingers\nmasterstroke\nmasterstrokes\nmasterwork\nmasterworks\nmastery\nmasthead\nmastheads\nmastic\nmasticate\nmasticated\nmasticates\nmasticating\nmastication\nmastications\nmasticator\nmasticatories\nmasticators\nmasticatory\nmastics\nmastiff\nmastiffs\nmastigophoran\nmastigophorans\nmastitic\nmastitis\nmastodon\nmastodonic\nmastodons\nmastodont\nmastoid\nmastoidectomies\nmastoidectomy\nmastoiditis\nmastoids\nmasts\nmasturbate\nmasturbated\nmasturbates\nmasturbating\nmasturbation\nmasturbational\nmasturbator\nmasturbators\nmasturbatory\nmasuria\nmasurian\nmat\nmatabele\nmatabeleland\nmatabeles\nmatador\nmatadors\nmatagorda\nmatapan\nmatch\nmatchability\nmatchable\nmatchboard\nmatchboards\nmatchbook\nmatchbooks\nmatchbox\nmatchboxes\nmatched\nmatcher\nmatchers\nmatches\nmatching\nmatchless\nmatchlessly\nmatchlessness\nmatchlock\nmatchlocks\nmatchmaker\nmatchmakers\nmatchmaking\nmatchstick\nmatchsticks\nmatchup\nmatchups\nmatchwood\nmatchwoods\nmate\nmated\nmatelot\nmatelote\nmatelotes\nmatelots\nmatelotte\nmatelottes\nmater\nmaterfamilias\nmaterfamiliases\nmateria\nmaterial\nmaterialism\nmaterialist\nmaterialistic\nmaterialistically\nmaterialists\nmaterialities\nmateriality\nmaterialization\nmaterializations\nmaterialize\nmaterialized\nmaterializer\nmaterializers\nmaterializes\nmaterializing\nmaterially\nmaterialness\nmaterials\nmateriel\nmaternal\nmaternalism\nmaternally\nmaternities\nmaternity\nmaters\nmates\nmatey\nmateyness\nmath\nmathematic\nmathematical\nmathematically\nmathematician\nmathematicians\nmathematics\nmathematization\nmathematizations\nmathematize\nmathematized\nmathematizes\nmathematizing\nmaths\nmatilda\nmatilija\nmatin\nmatinal\nmatinee\nmatinees\nmating\nmatins\nmatinée\nmatinées\nmatisse\nmatjes\nmatriarch\nmatriarchal\nmatriarchalism\nmatriarchate\nmatriarchates\nmatriarchic\nmatriarchies\nmatriarchs\nmatriarchy\nmatrices\nmatricidal\nmatricide\nmatricides\nmatriclinous\nmatriculant\nmatriculants\nmatriculate\nmatriculated\nmatriculates\nmatriculating\nmatriculation\nmatriculations\nmatrilineage\nmatrilineages\nmatrilineal\nmatrilineally\nmatrilocal\nmatrilocally\nmatrimonial\nmatrimonially\nmatrimonies\nmatrimony\nmatrix\nmatrixes\nmatron\nmatronal\nmatronliness\nmatronly\nmatrons\nmatronymic\nmatronymics\nmats\nmatsu\nmatte\nmatted\nmatter\nmattered\nmatterhorn\nmattering\nmatters\nmattery\nmattes\nmatthaean\nmatthean\nmatthew\nmatthias\nmatting\nmattings\nmattock\nmattocks\nmattress\nmattresses\nmaturate\nmaturated\nmaturates\nmaturating\nmaturation\nmaturational\nmaturations\nmaturative\nmature\nmatured\nmaturely\nmatureness\nmaturer\nmatures\nmaturest\nmaturing\nmaturities\nmaturity\nmatutinal\nmatutinally\nmatzo\nmatzoh\nmatzohs\nmatzos\nmatzot\nmatzoth\nmaté\nmatériel\nmau\nmaud\nmaudlin\nmaudlinly\nmaudlinness\nmaued\nmaugham\nmaugre\nmaui\nmauing\nmaul\nmauled\nmauler\nmaulers\nmauling\nmauls\nmaulstick\nmaulsticks\nmaund\nmaunder\nmaundered\nmaunderer\nmaunderers\nmaundering\nmaunders\nmaunds\nmaundy\nmaupassant\nmauretania\nmauretanian\nmauretanians\nmaurice\nmauritania\nmauritanian\nmauritanians\nmauritian\nmauritians\nmauritius\nmauser\nmausolea\nmausolean\nmausoleum\nmausoleums\nmauve\nmauves\nmaven\nmavens\nmaverick\nmavericks\nmavin\nmavins\nmavis\nmavises\nmavourneen\nmavourneens\nmavournin\nmavournins\nmaw\nmawkish\nmawkishly\nmawkishness\nmaws\nmax\nmaxed\nmaxes\nmaxi\nmaxilla\nmaxillae\nmaxillaries\nmaxillary\nmaxillas\nmaxilliped\nmaxillipeds\nmaxillofacial\nmaxim\nmaxima\nmaximal\nmaximalist\nmaximalists\nmaximally\nmaximals\nmaximi\nmaximilian\nmaximin\nmaximization\nmaximizations\nmaximize\nmaximized\nmaximizer\nmaximizers\nmaximizes\nmaximizing\nmaxims\nmaximum\nmaximums\nmaximus\nmaxing\nmaxis\nmaxixe\nmaxixes\nmaxwell\nmay\nmaya\nmayagüez\nmayan\nmayanist\nmayanists\nmayans\nmayapple\nmayapples\nmayas\nmaybe\nmaybes\nmayday\nmaydays\nmayest\nmayflies\nmayflower\nmayflowers\nmayfly\nmayhap\nmayhem\nmayhems\nmaying\nmayings\nmaymyo\nmayn\nmayn't\nmayo\nmayon\nmayonnaise\nmayor\nmayoral\nmayoralties\nmayoralty\nmayoress\nmayoresses\nmayors\nmayorship\nmayorships\nmayos\nmayotte\nmaypole\nmaypoles\nmaypop\nmaypops\nmays\nmayst\nmaytime\nmayweed\nmayweeds\nmazaedia\nmazaedium\nmazal\nmazard\nmazards\nmazatlán\nmazda\nmazdaism\nmazdeism\nmaze\nmazed\nmazel\nmazelike\nmazer\nmazers\nmazes\nmazier\nmaziest\nmazily\nmaziness\nmazing\nmazourka\nmazourkas\nmazuma\nmazumas\nmazurka\nmazurkas\nmazy\nmazzard\nmazzards\nmaître\nmañana\nmbabane\nmbira\nmbiras\nmbundu\nmbundus\nmccarthyism\nmccarthyist\nmccarthyists\nmccarthyite\nmccarthyites\nmcclure\nmccoy\nmccoys\nmcintosh\nmcintoshes\nmckinley\nmdewakanton\nmdewakantons\nme\nmea\nmead\nmeadow\nmeadowfoam\nmeadowland\nmeadowlands\nmeadowlark\nmeadowlarks\nmeadows\nmeadowsweet\nmeadowsweets\nmeadowy\nmeager\nmeagerly\nmeagerness\nmeagre\nmeal\nmealie\nmealier\nmealies\nmealiest\nmealiness\nmeals\nmealtime\nmealtimes\nmealworm\nmealworms\nmealy\nmealybug\nmealybugs\nmealymouthed\nmean\nmeander\nmeandered\nmeanderer\nmeanderers\nmeandering\nmeanderingly\nmeanders\nmeandrous\nmeaner\nmeanest\nmeanie\nmeanies\nmeaning\nmeaningful\nmeaningfully\nmeaningfulness\nmeaningless\nmeaninglessly\nmeaninglessness\nmeaningly\nmeanings\nmeanly\nmeanness\nmeans\nmeant\nmeantime\nmeanwhile\nmeany\nmeasle\nmeasles\nmeaslier\nmeasliest\nmeasly\nmeasurability\nmeasurable\nmeasurably\nmeasure\nmeasured\nmeasuredly\nmeasuredness\nmeasureless\nmeasurelessly\nmeasurelessness\nmeasurement\nmeasurements\nmeasurer\nmeasurers\nmeasures\nmeasuring\nmeat\nmeatball\nmeatballs\nmeated\nmeathead\nmeatheads\nmeatier\nmeatiest\nmeatiness\nmeatless\nmeatloaf\nmeatloaves\nmeatpacker\nmeatpackers\nmeatpacking\nmeatpackings\nmeats\nmeatus\nmeatuses\nmeaty\nmecamylamine\nmecamylamines\nmecca\nmeccas\nmechanic\nmechanical\nmechanically\nmechanicalness\nmechanicals\nmechanician\nmechanicians\nmechanics\nmechanism\nmechanisms\nmechanist\nmechanistic\nmechanistically\nmechanists\nmechanizable\nmechanization\nmechanizations\nmechanize\nmechanized\nmechanizer\nmechanizers\nmechanizes\nmechanizing\nmechanochemical\nmechanochemistry\nmechanoreception\nmechanoreceptions\nmechanoreceptive\nmechanoreceptor\nmechanoreceptors\nmechanotherapies\nmechanotherapist\nmechanotherapists\nmechanotherapy\nmechlin\nmechlins\nmecklenburg\nmeclizine\nmeclizines\nmeconium\nmeconiums\nmecopteran\nmecopterans\nmecopterous\nmecum\nmecums\nmed\nmedaillon\nmedaillons\nmedaka\nmedakas\nmedal\nmedaled\nmedaling\nmedalist\nmedalists\nmedalled\nmedallic\nmedalling\nmedallion\nmedallions\nmedallist\nmedallists\nmedals\nmeddle\nmeddled\nmeddler\nmeddlers\nmeddles\nmeddlesome\nmeddlesomely\nmeddlesomeness\nmeddling\nmede\nmedea\nmedellín\nmedes\nmedevac\nmedevaced\nmedevacing\nmedevacs\nmedflies\nmedfly\nmedia\nmediacy\nmediad\nmediae\nmediaeval\nmediaevalism\nmediaevalisms\nmediaevalist\nmediaevalists\nmediagenic\nmedial\nmedially\nmedials\nmedian\nmedianly\nmedians\nmediant\nmediants\nmedias\nmediastina\nmediastinal\nmediastinum\nmediate\nmediated\nmediately\nmediates\nmediating\nmediation\nmediational\nmediations\nmediative\nmediatization\nmediatizations\nmediatize\nmediatized\nmediatizes\nmediatizing\nmediator\nmediators\nmediatory\nmediatrix\nmedic\nmedica\nmedicable\nmedicaid\nmedical\nmedically\nmedicals\nmedicament\nmedicamentous\nmedicaments\nmedicare\nmedicate\nmedicated\nmedicates\nmedicating\nmedication\nmedications\nmedicative\nmedicatrix\nmedicean\nmedici\nmedicinable\nmedicinal\nmedicinally\nmedicine\nmedicines\nmedick\nmedicks\nmedico\nmedicolegal\nmedicos\nmedics\nmedieval\nmedievalism\nmedievalisms\nmedievalist\nmedievalists\nmedievally\nmedina\nmedinas\nmediocre\nmediocrities\nmediocritization\nmediocritizations\nmediocritize\nmediocritized\nmediocritizes\nmediocritizing\nmediocrity\nmeditate\nmeditated\nmeditates\nmeditating\nmeditation\nmeditational\nmeditations\nmeditative\nmeditatively\nmeditativeness\nmeditator\nmeditators\nmediterranean\nmediterraneans\nmedium\nmediumistic\nmediums\nmediumship\nmedlar\nmedlars\nmedley\nmedleys\nmedoc\nmedocs\nmedulla\nmedullae\nmedullar\nmedullary\nmedullas\nmedullated\nmedullization\nmedullizations\nmedulloblastoma\nmedulloblastomas\nmedulloblastomata\nmedusa\nmedusae\nmedusan\nmedusans\nmedusas\nmedusoid\nmedusoids\nmeed\nmeeds\nmeek\nmeeker\nmeekest\nmeekly\nmeekness\nmeemies\nmeerkat\nmeerkats\nmeerschaum\nmeerschaums\nmeet\nmeeter\nmeeters\nmeeting\nmeetinghouse\nmeetinghouses\nmeetings\nmeetly\nmeets\nmefenamic\nmegaampere\nmegaamperes\nmegabar\nmegabars\nmegabecquerel\nmegabecquerels\nmegabit\nmegabits\nmegabuck\nmegabucks\nmegabyte\nmegabytes\nmegacandela\nmegacandelas\nmegacephalic\nmegacephalies\nmegacephalous\nmegacephaly\nmegacities\nmegacity\nmegacorporation\nmegacorporations\nmegacoulomb\nmegacoulombs\nmegacycle\nmegacycles\nmegadeal\nmegadeals\nmegadeath\nmegadeaths\nmegadose\nmegadoses\nmegaera\nmegafarad\nmegafarads\nmegafauna\nmegafaunal\nmegaflop\nmegaflops\nmegagamete\nmegagametes\nmegagametophyte\nmegagametophytes\nmegagram\nmegagrams\nmegahenries\nmegahenry\nmegahenrys\nmegahertz\nmegahit\nmegahits\nmegajoule\nmegajoules\nmegakaryocyte\nmegakaryocytes\nmegakaryocytic\nmegakelvin\nmegakelvins\nmegalith\nmegalithic\nmegaliths\nmegaloblast\nmegaloblastic\nmegaloblasts\nmegalocardia\nmegalocardias\nmegalocephalic\nmegalocephalies\nmegalocephalous\nmegalocephaly\nmegalomania\nmegalomaniac\nmegalomaniacal\nmegalomaniacally\nmegalomaniacs\nmegalomanic\nmegalopolis\nmegalopolises\nmegalopolistic\nmegalopolitan\nmegalosaur\nmegalosaurian\nmegalosaurians\nmegalosaurs\nmegalumen\nmegalumens\nmegalux\nmegameter\nmegameters\nmegamole\nmegamoles\nmeganewton\nmeganewtons\nmegaohm\nmegaohms\nmegaparsec\nmegaparsecs\nmegapascal\nmegapascals\nmegaphone\nmegaphoned\nmegaphones\nmegaphonic\nmegaphonically\nmegaphoning\nmegapode\nmegapodes\nmegapolis\nmegaproject\nmegaprojects\nmegara\nmegaradian\nmegaradians\nmegarian\nmegarians\nmegaric\nmegarics\nmegaron\nmegarons\nmegascopic\nmegascopically\nmegasecond\nmegaseconds\nmegasiemens\nmegasievert\nmegasieverts\nmegasporangia\nmegasporangium\nmegaspore\nmegaspores\nmegasporic\nmegasporocyte\nmegasporocytes\nmegasporogeneses\nmegasporogenesis\nmegasporophyll\nmegasporophylls\nmegastar\nmegastars\nmegasteradian\nmegasteradians\nmegastructure\nmegastructures\nmegatesla\nmegateslas\nmegathere\nmegatheres\nmegatherian\nmegaton\nmegatonnage\nmegatons\nmegavitamin\nmegavitamins\nmegavolt\nmegavoltage\nmegavoltages\nmegavolts\nmegawatt\nmegawattage\nmegawattages\nmegawatts\nmegaweber\nmegawebers\nmeghalaya\nmegillah\nmegillahs\nmegilp\nmegilps\nmegohm\nmegohms\nmegrez\nmegrim\nmegrims\nmeiji\nmein\nmeioses\nmeiosis\nmeiotic\nmeiotically\nmeissen\nmeissens\nmeistersinger\nmeistersingers\nmeitnerium\nmekong\nmelamine\nmelancholia\nmelancholiac\nmelancholiacs\nmelancholic\nmelancholically\nmelancholics\nmelancholily\nmelancholiness\nmelancholy\nmelanchthon\nmelanesia\nmelanesian\nmelanesians\nmelange\nmelanges\nmelanic\nmelanin\nmelanism\nmelanistic\nmelanite\nmelanites\nmelanitic\nmelanization\nmelanizations\nmelanize\nmelanized\nmelanizes\nmelanizing\nmelanoblast\nmelanoblastic\nmelanoblasts\nmelanocyte\nmelanocytes\nmelanogenesis\nmelanoid\nmelanoids\nmelanoma\nmelanomas\nmelanomata\nmelanophore\nmelanophores\nmelanoses\nmelanosis\nmelanosity\nmelanosome\nmelanosomes\nmelanotic\nmelanous\nmelaphyre\nmelaphyres\nmelatonin\nmelatonins\nmelba\nmelbourne\nmelchior\nmelchite\nmelchites\nmelchizedek\nmelchizedeks\nmeld\nmelded\nmelding\nmelds\nmelee\nmelees\nmelena\nmelenas\nmelic\nmelilot\nmelilots\nmeliorable\nmeliorate\nmeliorated\nmeliorates\nmeliorating\nmelioration\nmeliorations\nmeliorative\nmelioratives\nmeliorator\nmeliorators\nmeliorism\nmeliorist\nmelioristic\nmeliorists\nmelisma\nmelismas\nmelismata\nmelismatic\nmelkite\nmelkites\nmell\nmelled\nmelliferous\nmellific\nmellifluence\nmellifluent\nmellifluently\nmellifluous\nmellifluously\nmellifluousness\nmelling\nmellitus\nmellophone\nmellophones\nmellotron\nmellotrons\nmellow\nmellowed\nmellower\nmellowest\nmellowing\nmellowly\nmellowness\nmellows\nmells\nmelodeon\nmelodeons\nmelodic\nmelodically\nmelodies\nmelodious\nmelodiously\nmelodiousness\nmelodist\nmelodists\nmelodize\nmelodized\nmelodizer\nmelodizers\nmelodizes\nmelodizing\nmelodrama\nmelodramas\nmelodramatic\nmelodramatically\nmelodramatics\nmelodramatist\nmelodramatists\nmelodramatization\nmelodramatizations\nmelodramatize\nmelodramatized\nmelodramatizes\nmelodramatizing\nmelody\nmeloid\nmeloids\nmelon\nmelongene\nmelongenes\nmelons\nmelos\nmelphalan\nmelphalans\nmelpomene\nmelt\nmeltability\nmeltable\nmeltage\nmeltages\nmeltdown\nmeltdowns\nmelted\nmelter\nmelters\nmelting\nmeltingly\nmelton\nmeltons\nmelts\nmeltwater\nmelty\nmelville\nmem\nmember\nmembered\nmembers\nmembership\nmemberships\nmembranal\nmembrane\nmembraned\nmembranes\nmembranous\nmembranously\nmemento\nmementoes\nmementos\nmemnon\nmemo\nmemoir\nmemoire\nmemoirist\nmemoirists\nmemoirs\nmemorabilia\nmemorability\nmemorable\nmemorableness\nmemorably\nmemoranda\nmemorandum\nmemorandums\nmemorial\nmemorialist\nmemorialists\nmemorialization\nmemorializations\nmemorialize\nmemorialized\nmemorializer\nmemorializers\nmemorializes\nmemorializing\nmemorially\nmemorials\nmemoriam\nmemories\nmemoriter\nmemorizable\nmemorization\nmemorizations\nmemorize\nmemorized\nmemorizer\nmemorizers\nmemorizes\nmemorizing\nmemory\nmemos\nmemphis\nmemsahib\nmemsahibs\nmen\nmenace\nmenaced\nmenacer\nmenacers\nmenaces\nmenacing\nmenacingly\nmenad\nmenadione\nmenadiones\nmenads\nmenage\nmenagerie\nmenageries\nmenages\nmenander\nmenarche\nmenarcheal\nmenazon\nmenazons\nmencken\nmenckenian\nmend\nmendable\nmendacious\nmendaciously\nmendaciousness\nmendacities\nmendacity\nmende\nmended\nmendel\nmendeleev\nmendelevium\nmendelian\nmendelianism\nmendelianisms\nmendelians\nmendelism\nmendelisms\nmendelist\nmendelists\nmendelssohn\nmender\nmenders\nmendes\nmendicancy\nmendicant\nmendicants\nmendicity\nmending\nmendings\nmends\nmeneer\nmeneers\nmenelaus\nmenenius\nmenfolk\nmenfolks\nmenhaden\nmenhadens\nmenhir\nmenhirs\nmenial\nmenially\nmenials\nmeniere\nmeningeal\nmeninges\nmeningioma\nmeningiomas\nmeningiomata\nmeningitic\nmeningitides\nmeningitis\nmeningococcal\nmeningococci\nmeningococcic\nmeningococcus\nmeningoencephalitic\nmeningoencephalitis\nmeninx\nmeniscal\nmeniscate\nmeniscectomy\nmenisci\nmeniscoid\nmeniscoidal\nmeniscus\nmeniscuses\nmennonite\nmennonites\nmeno\nmenology\nmenominee\nmenominees\nmenopausal\nmenopause\nmenorah\nmenorahs\nmenorca\nmenorrhagia\nmenorrhagias\nmenorrhagic\nmens\nmensa\nmensal\nmensch\nmenschen\nmensches\nmensem\nmenservants\nmenses\nmensh\nmenshevik\nmensheviki\nmensheviks\nmenshevism\nmenshevist\nmenshevists\nmenstrua\nmenstrual\nmenstruate\nmenstruated\nmenstruates\nmenstruating\nmenstruation\nmenstruous\nmenstruum\nmenstruums\nmensurability\nmensurable\nmensurableness\nmensural\nmensuration\nmensurations\nmensurative\nmenswear\nmenta\nmental\nmentalism\nmentalisms\nmentalist\nmentalistic\nmentalists\nmentalities\nmentality\nmentally\nmentation\nmentations\nmenthe\nmenthol\nmentholated\nmenthols\nmention\nmentionable\nmentioned\nmentioner\nmentioners\nmentioning\nmentions\nmentis\nmentor\nmentored\nmentoring\nmentors\nmentorship\nmentorships\nmentum\nmenu\nmenuhin\nmenus\nmeo\nmeos\nmeow\nmeowed\nmeowing\nmeows\nmeperidine\nmeperidines\nmephistophelean\nmephistopheles\nmephistophelian\nmephitic\nmephitical\nmephitically\nmephitis\nmephitises\nmeprobamate\nmeprobamates\nmer\nmeramec\nmerbromin\nmerbromins\nmercalli\nmercantile\nmercantilism\nmercantilist\nmercantilistic\nmercantilists\nmercaptan\nmercaptans\nmercaptopurine\nmercaptopurines\nmercator\nmercedario\nmercedes\nmercenaries\nmercenarily\nmercenariness\nmercenary\nmercer\nmerceries\nmercerization\nmercerizations\nmercerize\nmercerized\nmercerizes\nmercerizing\nmercers\nmercery\nmerchandisable\nmerchandise\nmerchandised\nmerchandiser\nmerchandisers\nmerchandises\nmerchandising\nmerchandisings\nmerchandize\nmerchandized\nmerchandizes\nmerchandizing\nmerchandizings\nmerchant\nmerchantability\nmerchantable\nmerchantman\nmerchantmen\nmerchants\nmercia\nmercian\nmercians\nmercies\nmerciful\nmercifully\nmercifulness\nmerciless\nmercilessly\nmercilessness\nmercurate\nmercurated\nmercurates\nmercurating\nmercuration\nmercurations\nmercurial\nmercurialism\nmercurialisms\nmercurially\nmercurialness\nmercurials\nmercuric\nmercurochrome\nmercurous\nmercury\nmercutio\nmercy\nmerde\nmere\nmeredith\nmerely\nmerengue\nmerengues\nmerest\nmeretricious\nmeretriciously\nmeretriciousness\nmerganser\nmergansers\nmerge\nmerged\nmergence\nmerger\nmergers\nmerges\nmerging\nmeridian\nmeridians\nmeridiem\nmeridional\nmeridionally\nmeridionals\nmeringue\nmeringues\nmerino\nmerinos\nmeristem\nmeristematic\nmeristematically\nmeristems\nmeristic\nmeristically\nmerit\nmerited\nmeriting\nmeritless\nmeritocracies\nmeritocracy\nmeritocrat\nmeritocratic\nmeritocrats\nmeritorious\nmeritoriously\nmeritoriousness\nmerits\nmerl\nmerle\nmerles\nmerlin\nmerlins\nmerlon\nmerlons\nmerlot\nmerlots\nmerls\nmermaid\nmermaids\nmerman\nmermen\nmeroblastic\nmeroblastically\nmerocrine\nmeromorphic\nmeromyosin\nmeromyosins\nmerope\nmeropia\nmeropic\nmeroplankton\nmeroplanktonic\nmeroplanktons\nmerovingian\nmerovingians\nmerowe\nmerozoite\nmerozoites\nmeroë\nmerrier\nmerriest\nmerrily\nmerrimack\nmerriment\nmerriness\nmerry\nmerrymaker\nmerrymakers\nmerrymaking\nmerrythought\nmerrythoughts\nmerseyside\nmerthiolate\nmesa\nmesabi\nmesarch\nmesas\nmescal\nmescalero\nmescaleros\nmescaline\nmescals\nmesdames\nmesdemoiselles\nmeseemed\nmeseems\nmesembryanthemum\nmesembryanthemums\nmesencephalic\nmesencephalon\nmesenchymal\nmesenchymatous\nmesenchyme\nmesenchymes\nmesenteric\nmesenteries\nmesenteritis\nmesenteritises\nmesenteron\nmesenteronic\nmesenterons\nmesentery\nmesh\nmeshach\nmeshed\nmeshes\nmeshing\nmeshuga\nmeshugaas\nmeshugah\nmeshugga\nmeshuggah\nmeshugge\nmeshuggener\nmeshuggeners\nmeshwork\nmeshy\nmesial\nmesially\nmesic\nmesityl\nmesitylene\nmesitylenes\nmesmer\nmesmeric\nmesmerically\nmesmerism\nmesmerist\nmesmerists\nmesmerization\nmesmerizations\nmesmerize\nmesmerized\nmesmerizer\nmesmerizers\nmesmerizes\nmesmerizing\nmesne\nmesoamerica\nmesoamerican\nmesoamericans\nmesoblast\nmesoblastic\nmesoblasts\nmesocarp\nmesocarps\nmesocephalic\nmesocephally\nmesocyclone\nmesocyclones\nmesoderm\nmesodermal\nmesodermic\nmesogastria\nmesogastric\nmesogastrium\nmesoglea\nmesogleal\nmesogloea\nmesolithic\nmesomere\nmesomeres\nmesomorph\nmesomorphic\nmesomorphism\nmesomorphous\nmesomorphs\nmesomorphy\nmeson\nmesonephric\nmesonephros\nmesonephroses\nmesonic\nmesons\nmesopause\nmesopauses\nmesopelagic\nmesophyll\nmesophyllic\nmesophyllous\nmesophylls\nmesophyte\nmesophytes\nmesophytic\nmesopotamia\nmesopotamian\nmesopotamians\nmesoscale\nmesosome\nmesosomes\nmesosphere\nmesospheric\nmesothelia\nmesothelial\nmesothelioma\nmesotheliomas\nmesotheliomata\nmesothelium\nmesothoraces\nmesothoracic\nmesothorax\nmesothoraxes\nmesothorium\nmesothoriums\nmesotrophic\nmesozoic\nmesquite\nmesquites\nmess\nmessage\nmessaged\nmessages\nmessaging\nmessaline\nmessalines\nmessed\nmesseigneurs\nmessenger\nmessengered\nmessengering\nmessengers\nmessenia\nmessenian\nmessenians\nmesses\nmessiah\nmessiahs\nmessiahship\nmessianic\nmessianism\nmessianisms\nmessianist\nmessianists\nmessias\nmessier\nmessiest\nmessieurs\nmessily\nmessina\nmessiness\nmessing\nmessmate\nmessmates\nmessrs\nmessuage\nmessuages\nmessy\nmestiza\nmestizas\nmestizo\nmestizoes\nmestizos\nmestranol\nmestranols\nmet\nmetabolic\nmetabolically\nmetabolism\nmetabolisms\nmetabolite\nmetabolites\nmetabolizable\nmetabolize\nmetabolized\nmetabolizes\nmetabolizing\nmetacarpal\nmetacarpally\nmetacarpals\nmetacarpi\nmetacarpus\nmetacenter\nmetacenters\nmetacentric\nmetacentricity\nmetacentrics\nmetacercaria\nmetacercarial\nmetacercarias\nmetachromatic\nmetachromatism\nmetachromatisms\nmetaethical\nmetaethics\nmetafiction\nmetafictional\nmetafictionist\nmetafictionists\nmetafictions\nmetagalactic\nmetagalaxies\nmetagalaxy\nmetagenesis\nmetagenetic\nmetagnathism\nmetagnathous\nmetal\nmetalanguage\nmetalanguages\nmetaled\nmetaling\nmetalinguistic\nmetalinguistics\nmetalize\nmetalized\nmetalizes\nmetalizing\nmetalled\nmetallic\nmetallically\nmetallics\nmetalliferous\nmetalline\nmetalling\nmetallization\nmetallizations\nmetallize\nmetallized\nmetallizes\nmetallizing\nmetallographer\nmetallographers\nmetallographic\nmetallographically\nmetallography\nmetalloid\nmetalloidal\nmetalloids\nmetallophone\nmetallophones\nmetallurgic\nmetallurgical\nmetallurgically\nmetallurgist\nmetallurgists\nmetallurgy\nmetalmark\nmetalmarks\nmetals\nmetalsmith\nmetalsmiths\nmetalware\nmetalwork\nmetalworker\nmetalworkers\nmetalworking\nmetamathematical\nmetamathematician\nmetamathematicians\nmetamathematics\nmetamere\nmetameres\nmetameric\nmetamerically\nmetamerism\nmetamerisms\nmetamorphic\nmetamorphically\nmetamorphism\nmetamorphose\nmetamorphosed\nmetamorphoses\nmetamorphosing\nmetamorphosis\nmetamorphous\nmetanalyses\nmetanalysis\nmetanephric\nmetanephros\nmetanephroses\nmetaphase\nmetaphases\nmetaphor\nmetaphoric\nmetaphorical\nmetaphorically\nmetaphors\nmetaphosphate\nmetaphosphates\nmetaphosphoric\nmetaphrase\nmetaphrased\nmetaphrases\nmetaphrasing\nmetaphrast\nmetaphrastic\nmetaphrasts\nmetaphysic\nmetaphysical\nmetaphysically\nmetaphysician\nmetaphysicians\nmetaphysics\nmetaplasia\nmetaplasias\nmetaplasm\nmetaplasmic\nmetaplasms\nmetaplastic\nmetapontum\nmetaprotein\nmetaproteins\nmetapsychological\nmetapsychology\nmetasequoia\nmetasilicate\nmetasomatic\nmetasomatically\nmetasomatism\nmetasomatosis\nmetastability\nmetastable\nmetastably\nmetastases\nmetastasis\nmetastasize\nmetastasized\nmetastasizes\nmetastasizing\nmetastatic\nmetastatically\nmetatarsal\nmetatarsally\nmetatarsals\nmetatarsi\nmetatarsus\nmetate\nmetates\nmetatheses\nmetathesis\nmetathesize\nmetathesized\nmetathesizes\nmetathesizing\nmetathetic\nmetathetical\nmetathetically\nmetathoraces\nmetathoracic\nmetathorax\nmetathoraxes\nmetaxylem\nmetaxylems\nmetazoal\nmetazoan\nmetazoans\nmetazoic\nmete\nmeted\nmetempsychoses\nmetempsychosis\nmetencephala\nmetencephalic\nmetencephalon\nmeteor\nmeteoric\nmeteorically\nmeteorite\nmeteorites\nmeteoritic\nmeteoritical\nmeteoriticist\nmeteoriticists\nmeteoritics\nmeteorograph\nmeteorographs\nmeteoroid\nmeteoroidal\nmeteoroids\nmeteorologic\nmeteorological\nmeteorologically\nmeteorologist\nmeteorologists\nmeteorology\nmeteors\nmeter\nmetered\nmetering\nmeters\nmeterstick\nmetersticks\nmetes\nmetestrous\nmetestrus\nmetestruses\nmeth\nmethacrylate\nmethacrylates\nmethacrylic\nmethadon\nmethadone\nmethamphetamine\nmethamphetamines\nmethanation\nmethanations\nmethane\nmethanol\nmethaqualone\nmethaqualones\nmethedrine\nmetheglin\nmetheglins\nmethemoglobin\nmethemoglobinemia\nmethemoglobins\nmethenamine\nmethenamines\nmethicillin\nmethicillins\nmethinks\nmethionine\nmethionines\nmethod\nmethodic\nmethodical\nmethodically\nmethodicalness\nmethodism\nmethodist\nmethodistic\nmethodistical\nmethodists\nmethodization\nmethodizations\nmethodize\nmethodized\nmethodizer\nmethodizers\nmethodizes\nmethodizing\nmethodological\nmethodologically\nmethodologies\nmethodologist\nmethodologists\nmethodology\nmethods\nmethotrexate\nmethotrexates\nmethought\nmethoxychlor\nmethoxychlors\nmethoxyflurane\nmethuen\nmethuselah\nmethyl\nmethylal\nmethylals\nmethylamine\nmethylamines\nmethylase\nmethylases\nmethylate\nmethylated\nmethylates\nmethylating\nmethylation\nmethylations\nmethylator\nmethylators\nmethylbenzene\nmethylbenzenes\nmethylcellulose\nmethylcelluloses\nmethylcholanthrene\nmethyldopa\nmethyldopas\nmethylene\nmethylenes\nmethylic\nmethylmercury\nmethylnaphthalene\nmethylnaphthalenes\nmethylphenidate\nmethylphenidates\nmethylprednisolone\nmethylxanthine\nmethylxanthines\nmethysergide\nmethysergides\nmeticais\nmetical\nmeticals\nmeticulosity\nmeticulous\nmeticulously\nmeticulousness\nmetier\nmetiers\nmeting\nmetis\nmetonic\nmetonym\nmetonymic\nmetonymical\nmetonymically\nmetonymies\nmetonyms\nmetonymy\nmetoo\nmetope\nmetopes\nmetopic\nmetopon\nmetopons\nmetralgia\nmetralgias\nmetrazol\nmetric\nmetrical\nmetrically\nmetricate\nmetricated\nmetricates\nmetricating\nmetrication\nmetricize\nmetricized\nmetricizes\nmetricizing\nmetrics\nmetrification\nmetrifications\nmetrified\nmetrifies\nmetrify\nmetrifying\nmetrist\nmetrists\nmetritis\nmetritises\nmetro\nmetrological\nmetrologically\nmetrologies\nmetrologist\nmetrologists\nmetrology\nmetronidazole\nmetronidazoles\nmetronome\nmetronomes\nmetronomic\nmetronomical\nmetronomically\nmetronymic\nmetroplex\nmetroplexs\nmetropolis\nmetropolises\nmetropolitan\nmetropolitans\nmetrorrhagia\nmetrorrhagias\nmetrorrhagic\nmetros\nmetternich\nmettle\nmettled\nmettles\nmettlesome\nmetz\nmeunière\nmeursault\nmeuse\nmew\nmewed\nmewing\nmewl\nmewled\nmewling\nmewls\nmews\nmex\nmexicali\nmexican\nmexicans\nmexico\nmeyerbeer\nmeze\nmezereon\nmezereons\nmezereum\nmezereums\nmezes\nmezuza\nmezuzah\nmezuzahs\nmezuzas\nmezuzot\nmezza\nmezzanine\nmezzanines\nmezzo\nmezzos\nmezzotint\nmezzotints\nmi\nmiami\nmiamis\nmiao\nmiaos\nmiaow\nmiasma\nmiasmal\nmiasmas\nmiasmata\nmiasmatic\nmiasmic\nmiasmically\nmica\nmicaceous\nmicah\nmicas\nmicawber\nmicawberish\nmicawbers\nmiccosukee\nmiccosukees\nmice\nmicellar\nmicelle\nmicelles\nmich\nmichael\nmichaelis\nmichaelmas\nmichaelmases\nmicheas\nmichelangelo\nmichelin\nmichigan\nmichigander\nmichiganders\nmick\nmickey\nmickeys\nmickle\nmicks\nmicmac\nmicmacs\nmicra\nmicro\nmicroampere\nmicroamperes\nmicroanalyses\nmicroanalysis\nmicroanalyst\nmicroanalysts\nmicroanalytic\nmicroanalytical\nmicroanatomical\nmicroanatomy\nmicrobalance\nmicrobalances\nmicrobar\nmicrobarograph\nmicrobarographs\nmicrobars\nmicrobe\nmicrobeam\nmicrobeams\nmicrobecquerel\nmicrobecquerels\nmicrobes\nmicrobial\nmicrobic\nmicrobiologic\nmicrobiological\nmicrobiologically\nmicrobiologist\nmicrobiologists\nmicrobiology\nmicrobrewer\nmicrobreweries\nmicrobrewers\nmicrobrewery\nmicrobrewing\nmicroburst\nmicrobursts\nmicrobus\nmicrobuses\nmicrobusses\nmicrocalorimeter\nmicrocalorimeters\nmicrocalorimetric\nmicrocalorimetry\nmicrocandela\nmicrocandelas\nmicrocapsule\nmicrocapsules\nmicrocassette\nmicrocassettes\nmicrocavity\nmicrocephalic\nmicrocephalics\nmicrocephalies\nmicrocephalous\nmicrocephaly\nmicrochemical\nmicrochemist\nmicrochemistries\nmicrochemistry\nmicrochemists\nmicrochip\nmicrochips\nmicrocircuit\nmicrocircuitry\nmicrocircuits\nmicrocirculation\nmicrocirculations\nmicrocirculatory\nmicroclimate\nmicroclimates\nmicroclimatic\nmicroclimatologic\nmicroclimatological\nmicroclimatology\nmicrocline\nmicroclines\nmicrococcal\nmicrococci\nmicrococcus\nmicrocode\nmicrocomputer\nmicrocomputers\nmicrocopied\nmicrocopies\nmicrocopy\nmicrocopying\nmicrocosm\nmicrocosmic\nmicrocosmical\nmicrocosmically\nmicrocosmos\nmicrocosms\nmicrocoulomb\nmicrocoulombs\nmicrocrystal\nmicrocrystalline\nmicrocrystallinity\nmicrocrystals\nmicrocultural\nmicroculture\nmicrocultures\nmicrocurie\nmicrocuries\nmicrocyte\nmicrocytes\nmicrocytic\nmicrodensitometer\nmicrodensitometers\nmicrodensitometric\nmicrodensitometry\nmicrodissection\nmicrodissections\nmicrodot\nmicrodots\nmicroearthquake\nmicroearthquakes\nmicroeconomic\nmicroeconomics\nmicroelectrode\nmicroelectrodes\nmicroelectromechanical\nmicroelectronic\nmicroelectronically\nmicroelectronics\nmicroelectrophoresis\nmicroelectrophoretic\nmicroelectrophoretically\nmicroelement\nmicroelements\nmicroencapsulate\nmicroencapsulated\nmicroencapsulates\nmicroencapsulating\nmicroencapsulation\nmicroencapsulations\nmicroenvironment\nmicroenvironmental\nmicroenvironments\nmicroevolution\nmicroevolutionary\nmicroevolutions\nmicrofabrication\nmicrofarad\nmicrofarads\nmicrofauna\nmicrofaunal\nmicrofibril\nmicrofibrillar\nmicrofibrils\nmicrofiche\nmicrofiches\nmicrofilament\nmicrofilamentous\nmicrofilaments\nmicrofilaria\nmicrofilariae\nmicrofilarial\nmicrofilm\nmicrofilmable\nmicrofilmed\nmicrofilmer\nmicrofilmers\nmicrofilming\nmicrofilms\nmicrofloppies\nmicrofloppy\nmicroflora\nmicrofloral\nmicroform\nmicroforms\nmicrofossil\nmicrofossils\nmicrofungi\nmicrofungus\nmicrofunguses\nmicrogamete\nmicrogametes\nmicrogametocyte\nmicrogametocytes\nmicrogram\nmicrograms\nmicrograph\nmicrographic\nmicrographically\nmicrographics\nmicrographs\nmicrography\nmicrogravity\nmicrogroove\nmicrogrooves\nmicrohabitat\nmicrohabitats\nmicrohenries\nmicrohenry\nmicrohenrys\nmicrohertz\nmicroimage\nmicroimages\nmicroinch\nmicroinches\nmicroinject\nmicroinjected\nmicroinjecting\nmicroinjection\nmicroinjections\nmicroinjects\nmicroinstruction\nmicroinstructions\nmicrojet\nmicrojets\nmicrojoule\nmicrojoules\nmicrokelvin\nmicrokelvins\nmicrolepidoptera\nmicrolepidopterous\nmicroliter\nmicroliters\nmicrolith\nmicrolithic\nmicrolithography\nmicroliths\nmicrolumen\nmicrolumens\nmicrolux\nmicromachining\nmicromanage\nmicromanaged\nmicromanagement\nmicromanager\nmicromanagers\nmicromanages\nmicromanaging\nmicromanipulation\nmicromanipulations\nmicromanipulative\nmicromanipulator\nmicromanipulators\nmicromere\nmicromeres\nmicrometeorite\nmicrometeorites\nmicrometeoritic\nmicrometeoroid\nmicrometeoroids\nmicrometeorological\nmicrometeorologist\nmicrometeorologists\nmicrometeorology\nmicrometer\nmicrometers\nmicromethod\nmicromethods\nmicrometric\nmicrometrical\nmicrometrically\nmicrometry\nmicromini\nmicrominiature\nmicrominiaturization\nmicrominiaturizations\nmicrominiaturize\nmicrominiaturized\nmicrominiaturizes\nmicrominiaturizing\nmicrominis\nmicromolar\nmicromole\nmicromoles\nmicromorphological\nmicromorphology\nmicron\nmicroneedle\nmicroneedles\nmicronesia\nmicronesian\nmicronesians\nmicronewton\nmicronewtons\nmicronize\nmicronized\nmicronizes\nmicronizing\nmicrons\nmicronuclear\nmicronuclei\nmicronucleus\nmicronucleuses\nmicronutrient\nmicronutrients\nmicroohm\nmicroohms\nmicroorganism\nmicroorganisms\nmicropaleontologic\nmicropaleontological\nmicropaleontologist\nmicropaleontologists\nmicropaleontology\nmicroparticle\nmicroparticles\nmicropascal\nmicropascals\nmicrophage\nmicrophages\nmicrophagic\nmicrophone\nmicrophones\nmicrophonic\nmicrophonics\nmicrophotograph\nmicrophotographer\nmicrophotographers\nmicrophotographic\nmicrophotographs\nmicrophotography\nmicrophotometer\nmicrophotometers\nmicrophotometric\nmicrophotometrically\nmicrophotometry\nmicrophyll\nmicrophyllous\nmicrophylls\nmicrophysical\nmicrophysically\nmicrophysicist\nmicrophysicists\nmicrophysics\nmicrophyte\nmicrophytes\nmicrophytic\nmicropipet\nmicropipets\nmicropipette\nmicropipettes\nmicroplankton\nmicroplanktons\nmicropore\nmicropores\nmicroporosity\nmicroporous\nmicroprint\nmicroprints\nmicroprism\nmicroprisms\nmicroprobe\nmicroprobes\nmicroprocessor\nmicroprocessors\nmicroprogram\nmicroprogramming\nmicroprogrammings\nmicroprograms\nmicroprojection\nmicroprojections\nmicroprojector\nmicroprojectors\nmicropublisher\nmicropublishers\nmicropublishing\nmicropublishings\nmicropulsation\nmicropulsations\nmicropuncture\nmicropunctures\nmicropylar\nmicropyle\nmicropyles\nmicroquake\nmicroquakes\nmicroradian\nmicroradians\nmicroradiograph\nmicroradiographic\nmicroradiographs\nmicroradiography\nmicroreader\nmicroreaders\nmicroreproduction\nmicroreproductions\nmicros\nmicroscale\nmicroscales\nmicroscope\nmicroscopes\nmicroscopic\nmicroscopical\nmicroscopically\nmicroscopies\nmicroscopist\nmicroscopists\nmicroscopium\nmicroscopy\nmicrosecond\nmicroseconds\nmicroseism\nmicroseismic\nmicroseismicity\nmicroseisms\nmicrosensor\nmicrosensors\nmicrosiemens\nmicrosievert\nmicrosieverts\nmicrosoft\nmicrosomal\nmicrosome\nmicrosomes\nmicrosomic\nmicrospectrophotometer\nmicrospectrophotometers\nmicrospectrophotometric\nmicrospectrophotometry\nmicrosphere\nmicrospheres\nmicrospherical\nmicrosporangia\nmicrosporangiate\nmicrosporangium\nmicrospore\nmicrospores\nmicrosporic\nmicrosporocyte\nmicrosporocytes\nmicrosporogenesis\nmicrosporophyll\nmicrosporophylls\nmicrosporous\nmicrostate\nmicrostates\nmicrosteradian\nmicrosteradians\nmicrostructural\nmicrostructure\nmicrostructures\nmicrosurgeries\nmicrosurgery\nmicrosurgical\nmicroswitch\nmicroswitches\nmicrosystems\nmicroteaching\nmicroteachings\nmicrotechnic\nmicrotechnics\nmicrotechnique\nmicrotechniques\nmicrotesla\nmicroteslas\nmicrotome\nmicrotomes\nmicrotomic\nmicrotomies\nmicrotomy\nmicrotonal\nmicrotonality\nmicrotonally\nmicrotone\nmicrotones\nmicrotubular\nmicrotubule\nmicrotubules\nmicrovascular\nmicrovasculature\nmicrovasculatures\nmicrovillar\nmicrovilli\nmicrovillous\nmicrovillus\nmicrovolt\nmicrovolts\nmicrowatt\nmicrowatts\nmicrowavable\nmicrowave\nmicrowaveable\nmicrowaved\nmicrowaves\nmicrowaving\nmicroweber\nmicrowebers\nmicroworld\nmicroworlds\nmicturate\nmicturated\nmicturates\nmicturating\nmicturition\nmicturitions\nmid\nmidair\nmidas\nmidbrain\nmidbrains\nmidcourse\nmidcult\nmidcults\nmidday\nmidden\nmiddens\nmiddies\nmiddle\nmiddlebrow\nmiddlebrows\nmiddled\nmiddleman\nmiddlemen\nmiddlemost\nmiddler\nmiddlers\nmiddles\nmiddleton\nmiddleweight\nmiddleweights\nmiddling\nmiddlingly\nmiddlings\nmiddorsal\nmiddy\nmideast\nmideasterner\nmideasterners\nmidfield\nmidfielder\nmidfielders\nmidfields\nmidgard\nmidge\nmidges\nmidget\nmidgets\nmidgut\nmidguts\nmidi\nmidianite\nmidianites\nmidiron\nmidirons\nmidis\nmidland\nmidlander\nmidlanders\nmidlands\nmidlatitude\nmidlatitudes\nmidlevel\nmidlevels\nmidlife\nmidline\nmidlines\nmidlives\nmidlothian\nmidmonth\nmidmorning\nmidmost\nmidnight\nmidnightly\nmidpoint\nmidpoints\nmidrange\nmidranges\nmidrash\nmidrashic\nmidrashim\nmidrib\nmidribs\nmidriff\nmidriffs\nmidsagittal\nmidseason\nmidsection\nmidsections\nmidship\nmidshipman\nmidshipmen\nmidships\nmidsize\nmidsized\nmidsole\nmidsoles\nmidst\nmidstream\nmidsummer\nmidterm\nmidterms\nmidtown\nmidtowns\nmidway\nmidways\nmidweek\nmidweekly\nmidwest\nmidwestern\nmidwesterner\nmidwesterners\nmidwife\nmidwifed\nmidwifery\nmidwifes\nmidwifing\nmidwinter\nmidwinters\nmidwived\nmidwives\nmidwiving\nmidyear\nmidyears\nmien\nmiens\nmieux\nmiff\nmiffed\nmiffier\nmiffiest\nmiffiness\nmiffing\nmiffs\nmiffy\nmight\nmightier\nmightiest\nmightily\nmightiness\nmightn't\nmighty\nmignon\nmignonette\nmignonettes\nmignons\nmigraine\nmigraines\nmigrainous\nmigrant\nmigrants\nmigrate\nmigrated\nmigrates\nmigrating\nmigration\nmigrational\nmigrations\nmigrator\nmigrators\nmigratory\nmihrab\nmihrabs\nmikado\nmikados\nmikasuki\nmikasukis\nmike\nmiked\nmikes\nmiking\nmikra\nmikron\nmikrons\nmikvah\nmikvos\nmikvot\nmikvoth\nmil\nmiladies\nmilady\nmilage\nmilages\nmilah\nmilan\nmilanese\nmilano\nmilch\nmilchig\nmild\nmilder\nmildest\nmildew\nmildewed\nmildewing\nmildews\nmildewy\nmildly\nmildness\nmile\nmileage\nmileages\nmilepost\nmileposts\nmiler\nmilers\nmiles\nmilesian\nmilesians\nmilestone\nmilestones\nmiletus\nmilfoil\nmilfoils\nmilia\nmiliaria\nmiliarial\nmiliarias\nmiliary\nmilieu\nmilieus\nmilieux\nmilitance\nmilitancy\nmilitant\nmilitantly\nmilitantness\nmilitants\nmilitaria\nmilitaries\nmilitarily\nmilitarism\nmilitarist\nmilitaristic\nmilitaristically\nmilitarists\nmilitarization\nmilitarizations\nmilitarize\nmilitarized\nmilitarizes\nmilitarizing\nmilitary\nmilitate\nmilitated\nmilitates\nmilitating\nmilites\nmilitia\nmilitiaman\nmilitiamen\nmilitias\nmilium\nmilk\nmilked\nmilker\nmilkers\nmilkfish\nmilkfishes\nmilkier\nmilkiest\nmilkiness\nmilking\nmilkmaid\nmilkmaids\nmilkman\nmilkmen\nmilks\nmilkshake\nmilkshakes\nmilksop\nmilksoppy\nmilksops\nmilkweed\nmilkweeds\nmilkwort\nmilkworts\nmilky\nmill\nmillage\nmillages\nmillais\nmillboard\nmillboards\nmilldam\nmilldams\nmille\nmilled\nmillefiori\nmillefleur\nmillefleurs\nmillenarian\nmillenarianism\nmillenarians\nmillenaries\nmillenary\nmillennia\nmillennial\nmillennialism\nmillennialist\nmillennialists\nmillennially\nmillennium\nmillenniums\nmillepede\nmillepedes\nmillepore\nmillepores\nmiller\nmillerite\nmillerites\nmillers\nmillesimal\nmillesimally\nmillesimals\nmillet\nmillets\nmillhouse\nmillhouses\nmilliammeter\nmilliammeters\nmilliampere\nmilliamperes\nmilliard\nmilliards\nmilliary\nmillibar\nmillibars\nmillibecquerel\nmillibecquerels\nmillicandela\nmillicandelas\nmillicoulomb\nmillicoulombs\nmillicurie\nmillicuries\nmillidegree\nmillidegrees\nmillieme\nmilliemes\nmillifarad\nmillifarads\nmilligal\nmilligals\nmilligram\nmilligrams\nmillihenries\nmillihenry\nmillihenrys\nmillihertz\nmillijoule\nmillijoules\nmillikelvin\nmillikelvins\nmillilambert\nmillilamberts\nmilliliter\nmilliliters\nmillilitre\nmillilitres\nmillilumen\nmillilumens\nmillilux\nmillime\nmillimeter\nmillimeters\nmillimetre\nmillimetres\nmillimicron\nmillimicrons\nmillimolar\nmillimole\nmillimoles\nmilline\nmilliner\nmillineries\nmilliners\nmillinery\nmillines\nmillinewton\nmillinewtons\nmilling\nmillings\nmilliohm\nmilliohms\nmillion\nmillionaire\nmillionaires\nmillionairess\nmillionairesses\nmillionfold\nmillions\nmillionth\nmillionths\nmilliosmol\nmilliosmols\nmillipascal\nmillipascals\nmillipede\nmillipedes\nmilliradian\nmilliradians\nmillirem\nmillirems\nmilliroentgen\nmilliroentgens\nmillisecond\nmilliseconds\nmillisiemens\nmillisievert\nmillisieverts\nmillisteradian\nmillisteradians\nmillitesla\nmilliteslas\nmillivolt\nmillivoltmeter\nmillivoltmeters\nmillivolts\nmilliwatt\nmilliwatts\nmilliweber\nmilliwebers\nmillpond\nmillponds\nmillrace\nmillraces\nmillrun\nmillruns\nmills\nmillstone\nmillstones\nmillstream\nmillstreams\nmillwork\nmillworks\nmillwright\nmillwrights\nmilo\nmilord\nmilos\nmilpa\nmilpas\nmilquetoast\nmilquetoasts\nmilquetoasty\nmilreis\nmilrinone\nmils\nmilt\nmilted\nmilter\nmilters\nmiltiades\nmilting\nmilton\nmiltonian\nmiltonic\nmilts\nmilwaukee\nmim\nmimas\nmimbres\nmime\nmimed\nmimeo\nmimeoed\nmimeograph\nmimeographed\nmimeographing\nmimeographs\nmimeoing\nmimeos\nmimer\nmimers\nmimes\nmimeses\nmimesis\nmimetic\nmimetically\nmimic\nmimicked\nmimicker\nmimickers\nmimicking\nmimicries\nmimicry\nmimics\nmiming\nmimosa\nmimosas\nmin\nmina\nminable\nminacious\nminaciously\nminaciousness\nminacity\nminae\nminamata\nminaret\nminarets\nminas\nminatorial\nminatorily\nminatory\nminaudière\nminaudières\nmince\nminced\nmincemeat\nmincer\nmincers\nminces\nminch\nmincing\nmincingly\nmind\nmindanao\nmindblower\nmindblowers\nminded\nmindedly\nmindedness\nminden\nminder\nminders\nmindful\nmindfully\nmindfulness\nminding\nmindless\nmindlessly\nmindlessness\nmindoro\nminds\nmindscape\nmindscapes\nmindset\nmindsets\nmine\nmineable\nmined\nminefield\nminefields\nminelayer\nminelayers\nminer\nmineral\nmineralizable\nmineralization\nmineralizations\nmineralize\nmineralized\nmineralizer\nmineralizers\nmineralizes\nmineralizing\nmineralocorticoid\nmineralocorticoids\nmineralogic\nmineralogical\nmineralogically\nmineralogies\nmineralogist\nmineralogists\nmineralogy\nminerals\nminers\nminerva\nmines\nmineshaft\nmineshafts\nminestrone\nminestrones\nminesweeper\nminesweepers\nminesweeping\nmineworker\nmineworkers\nming\nmingier\nmingiest\nmingle\nmingled\nmingler\nminglers\nmingles\nmingling\nmingy\nminho\nmini\nminiature\nminiatures\nminiaturist\nminiaturistic\nminiaturists\nminiaturization\nminiaturizations\nminiaturize\nminiaturized\nminiaturizes\nminiaturizing\nminibar\nminibars\nminibike\nminibiker\nminibikers\nminibikes\nminibus\nminibuses\nminibusses\nminicab\nminicabs\nminicam\nminicamp\nminicamps\nminicams\nminicar\nminicars\nminicomputer\nminicomputers\nminiconjou\nminiconjous\nminiconvention\nminiconventions\nminicourse\nminicourses\nminicoy\nminicycle\nminicycles\nminidisk\nminidisks\nminie\nminified\nminifies\nminify\nminifying\nminikin\nminikins\nminilab\nminilabs\nminim\nminima\nminimal\nminimalism\nminimalist\nminimalists\nminimality\nminimalization\nminimalizations\nminimalize\nminimalized\nminimalizes\nminimalizing\nminimally\nminimax\nminimill\nminimills\nminimization\nminimizations\nminimize\nminimized\nminimizer\nminimizers\nminimizes\nminimizing\nminims\nminimum\nminimums\nmining\nminings\nminion\nminions\nminipark\nminiparks\nminis\nminischool\nminischools\nminiscule\nminiseries\nminiski\nminiskirt\nminiskirted\nminiskirts\nminiskis\nministate\nministates\nminister\nministered\nministerial\nministerially\nministering\nministers\nministership\nministrant\nministrants\nministration\nministrations\nministrative\nministries\nministroke\nministrokes\nministry\nminitrack\nminitracks\nminium\nminiums\nminivan\nminivans\nminiver\nminivers\nminié\nmink\nminke\nminks\nminn\nminnan\nminneapolis\nminneconjou\nminneconjous\nminnesinger\nminnesingers\nminnesota\nminnesotan\nminnesotans\nminnow\nminnows\nminoan\nminoans\nminor\nminora\nminorca\nminorcan\nminorcans\nminored\nminoring\nminorite\nminorites\nminorities\nminority\nminors\nminos\nminotaur\nminoxidil\nminsk\nminster\nminsters\nminstrel\nminstrels\nminstrelsies\nminstrelsy\nmint\nmintage\nminted\nminter\nminters\nminting\nmintmark\nmintmarks\nminton\nmints\nminty\nminuend\nminuends\nminuet\nminuets\nminus\nminuscular\nminuscule\nminuses\nminute\nminuted\nminutely\nminuteman\nminutemen\nminuteness\nminuter\nminutes\nminutest\nminutia\nminutiae\nminuting\nminx\nminxes\nminxish\nminyan\nminyanim\nminyans\nmiocene\nmioses\nmiosis\nmiotic\nmiotics\nmiquelet\nmiquelets\nmiquelon\nmir\nmirabile\nmirabiles\nmirabilia\nmirabilis\nmiracidia\nmiracidial\nmiracidium\nmiracle\nmiracles\nmiraculous\nmiraculously\nmiraculousness\nmirador\nmiradors\nmirage\nmirages\nmiranda\nmirandize\nmirandized\nmirandizes\nmirandizing\nmire\nmired\nmirepoix\nmirepoixs\nmires\nmirex\nmirexes\nmirier\nmiriest\nmirin\nmiriness\nmiring\nmirins\nmirk\nmirks\nmirky\nmirliton\nmirlitons\nmirror\nmirrored\nmirroring\nmirrorlike\nmirrors\nmirs\nmirth\nmirthful\nmirthfully\nmirthfulness\nmirthless\nmirthlessly\nmirthlessness\nmirv\nmirved\nmirving\nmirvs\nmiry\nmiró\nmisact\nmisacts\nmisaddress\nmisaddressed\nmisaddresses\nmisaddressing\nmisadjust\nmisadjusted\nmisadjusting\nmisadjusts\nmisadministration\nmisadministrations\nmisadventure\nmisadventures\nmisadvise\nmisadvised\nmisadvises\nmisadvising\nmisaim\nmisaimed\nmisaiming\nmisaims\nmisalign\nmisaligned\nmisaligning\nmisalignment\nmisalignments\nmisaligns\nmisalliance\nmisalliances\nmisallied\nmisallies\nmisallocate\nmisallocated\nmisallocates\nmisallocating\nmisallocation\nmisallocations\nmisally\nmisallying\nmisanalyses\nmisanalysis\nmisanthrope\nmisanthropes\nmisanthropic\nmisanthropically\nmisanthropist\nmisanthropists\nmisanthropy\nmisapplication\nmisapplications\nmisapplied\nmisapplies\nmisapply\nmisapplying\nmisappraisal\nmisappraisals\nmisapprehend\nmisapprehended\nmisapprehending\nmisapprehends\nmisapprehension\nmisapprehensions\nmisappropriate\nmisappropriated\nmisappropriates\nmisappropriating\nmisappropriation\nmisappropriations\nmisarrange\nmisarranged\nmisarranges\nmisarranging\nmisarticulate\nmisarticulated\nmisarticulates\nmisarticulating\nmisassemble\nmisassembled\nmisassembles\nmisassembling\nmisassumption\nmisassumptions\nmisattribute\nmisattributed\nmisattributes\nmisattributing\nmisattribution\nmisattributions\nmisbalance\nmisbalanced\nmisbalances\nmisbalancing\nmisbecame\nmisbecome\nmisbecomes\nmisbecoming\nmisbegotten\nmisbehave\nmisbehaved\nmisbehaver\nmisbehavers\nmisbehaves\nmisbehaving\nmisbehavior\nmisbehaviors\nmisbelief\nmisbeliefs\nmisbelieve\nmisbelieved\nmisbeliever\nmisbelievers\nmisbelieves\nmisbelieving\nmisbound\nmisbrand\nmisbranded\nmisbranding\nmisbrands\nmisbutton\nmisbuttoned\nmisbuttoning\nmisbuttons\nmisc\nmiscalculate\nmiscalculated\nmiscalculates\nmiscalculating\nmiscalculation\nmiscalculations\nmiscall\nmiscalled\nmiscalling\nmiscalls\nmiscaption\nmiscaptioned\nmiscaptioning\nmiscaptions\nmiscarriage\nmiscarriages\nmiscarried\nmiscarries\nmiscarry\nmiscarrying\nmiscast\nmiscasting\nmiscasts\nmiscatalog\nmiscataloged\nmiscataloging\nmiscatalogs\nmiscegenation\nmiscegenational\nmiscegenations\nmiscellanea\nmiscellaneous\nmiscellaneously\nmiscellaneousness\nmiscellanies\nmiscellanist\nmiscellanists\nmiscellany\nmisch\nmischance\nmischannel\nmischanneled\nmischanneling\nmischannels\nmischaracterization\nmischaracterizations\nmischaracterize\nmischaracterized\nmischaracterizes\nmischaracterizing\nmischarge\nmischarged\nmischarges\nmischarging\nmischief\nmischievous\nmischievously\nmischievousness\nmischoice\nmischoices\nmiscibility\nmiscible\nmiscitation\nmiscitations\nmisclassification\nmisclassifications\nmisclassified\nmisclassifies\nmisclassify\nmisclassifying\nmiscode\nmiscoded\nmiscodes\nmiscoding\nmiscommunication\nmiscommunications\nmiscomprehend\nmiscomprehended\nmiscomprehending\nmiscomprehends\nmiscomprehension\nmiscomprehensions\nmiscomputation\nmiscomputations\nmiscompute\nmiscomputed\nmiscomputes\nmiscomputing\nmisconceive\nmisconceived\nmisconceiver\nmisconceivers\nmisconceives\nmisconceiving\nmisconception\nmisconceptions\nmisconduct\nmisconducted\nmisconducting\nmisconducts\nmisconnect\nmisconnected\nmisconnecting\nmisconnection\nmisconnections\nmisconnects\nmisconstruction\nmisconstructions\nmisconstrue\nmisconstrued\nmisconstrues\nmisconstruing\nmiscopied\nmiscopies\nmiscopy\nmiscopying\nmiscorrelation\nmiscorrelations\nmiscount\nmiscounted\nmiscounting\nmiscounts\nmiscreant\nmiscreants\nmiscreate\nmiscreated\nmiscreates\nmiscreating\nmiscreation\nmiscreations\nmiscue\nmiscued\nmiscueing\nmiscues\nmiscuing\nmiscut\nmisdate\nmisdated\nmisdates\nmisdating\nmisdeal\nmisdealer\nmisdealers\nmisdealing\nmisdeals\nmisdealt\nmisdeed\nmisdeeds\nmisdeem\nmisdeemed\nmisdeeming\nmisdeems\nmisdefine\nmisdefined\nmisdefines\nmisdefining\nmisdemeanant\nmisdemeanants\nmisdemeanor\nmisdemeanors\nmisdemeanour\nmisdemeanours\nmisdescribe\nmisdescribed\nmisdescribes\nmisdescribing\nmisdescription\nmisdescriptions\nmisdevelop\nmisdeveloped\nmisdeveloping\nmisdevelops\nmisdiagnose\nmisdiagnosed\nmisdiagnoses\nmisdiagnosing\nmisdiagnosis\nmisdial\nmisdialed\nmisdialing\nmisdialled\nmisdialling\nmisdials\nmisdid\nmisdirect\nmisdirected\nmisdirecting\nmisdirection\nmisdirects\nmisdistribution\nmisdistributions\nmisdivision\nmisdivisions\nmisdo\nmisdoer\nmisdoers\nmisdoes\nmisdoing\nmisdone\nmisdoubt\nmisdoubted\nmisdoubting\nmisdoubts\nmisdraw\nmisdrawing\nmisdrawn\nmisdrew\nmise\nmiseducate\nmiseducated\nmiseducates\nmiseducating\nmiseducation\nmiseducations\nmisemphases\nmisemphasis\nmisemphasize\nmisemphasized\nmisemphasizes\nmisemphasizing\nmisemploy\nmisemployed\nmisemploying\nmisemployment\nmisemployments\nmisemploys\nmiser\nmiserable\nmiserableness\nmiserably\nmiserere\nmisereres\nmisericord\nmisericorde\nmisericordes\nmisericords\nmiseries\nmiserliness\nmiserly\nmisers\nmisery\nmisesteem\nmisesteemed\nmisesteeming\nmisesteems\nmisestimate\nmisestimated\nmisestimates\nmisestimating\nmisestimation\nmisestimations\nmisevaluate\nmisevaluated\nmisevaluates\nmisevaluating\nmisevaluation\nmisevaluations\nmisfeasance\nmisfeasor\nmisfeasors\nmisfield\nmisfielded\nmisfielding\nmisfields\nmisfile\nmisfiled\nmisfiles\nmisfiling\nmisfire\nmisfired\nmisfires\nmisfiring\nmisfit\nmisfits\nmisfocus\nmisfocused\nmisfocuses\nmisfocusing\nmisfortune\nmisfortunes\nmisfuel\nmisfueled\nmisfueling\nmisfuelled\nmisfuelling\nmisfuels\nmisfunction\nmisfunctioned\nmisfunctioning\nmisfunctions\nmisgauge\nmisgauged\nmisgauges\nmisgauging\nmisgave\nmisgive\nmisgiven\nmisgives\nmisgiving\nmisgivings\nmisgovern\nmisgoverned\nmisgoverning\nmisgovernment\nmisgovernments\nmisgovernor\nmisgovernors\nmisgoverns\nmisgrade\nmisgraded\nmisgrades\nmisgrading\nmisguidance\nmisguide\nmisguided\nmisguidedly\nmisguidedness\nmisguider\nmisguiders\nmisguides\nmisguiding\nmishandle\nmishandled\nmishandles\nmishandling\nmishanter\nmishanters\nmishap\nmishaps\nmishear\nmisheard\nmishearing\nmishears\nmishegaas\nmishegoss\nmishit\nmishits\nmishitting\nmishmash\nmishmashes\nmishna\nmishnah\nmishnaic\nmisidentification\nmisidentifications\nmisidentified\nmisidentifies\nmisidentify\nmisidentifying\nmisimpression\nmisimpressions\nmisinform\nmisinformant\nmisinformants\nmisinformation\nmisinformed\nmisinformer\nmisinformers\nmisinforming\nmisinforms\nmisinterpret\nmisinterpretation\nmisinterpretations\nmisinterpreted\nmisinterpreter\nmisinterpreters\nmisinterpreting\nmisinterprets\nmisjoinder\nmisjoinders\nmisjudge\nmisjudged\nmisjudges\nmisjudging\nmisjudgment\nmisjudgments\nmiskick\nmiskicked\nmiskicking\nmiskicks\nmiskito\nmiskitos\nmisknew\nmisknow\nmisknowing\nmisknowledge\nmisknown\nmisknows\nmislabel\nmislabeled\nmislabeling\nmislabelled\nmislabelling\nmislabels\nmislaid\nmislay\nmislayer\nmislayers\nmislaying\nmislays\nmislead\nmisleader\nmisleaders\nmisleading\nmisleadingly\nmisleads\nmislearn\nmislearned\nmislearning\nmislearns\nmislearnt\nmisled\nmislike\nmisliked\nmislikes\nmisliking\nmislocate\nmislocated\nmislocates\nmislocating\nmislocation\nmislocations\nmismanage\nmismanaged\nmismanagement\nmismanages\nmismanaging\nmismark\nmismarked\nmismarking\nmismarks\nmismarriage\nmismarriages\nmismatch\nmismatched\nmismatches\nmismatching\nmismate\nmismated\nmismates\nmismating\nmisname\nmisnamed\nmisnames\nmisnaming\nmisnomer\nmisnomered\nmisnomers\nmiso\nmisogamic\nmisogamist\nmisogamists\nmisogamy\nmisogynic\nmisogynist\nmisogynistic\nmisogynists\nmisogynous\nmisogyny\nmisologist\nmisologists\nmisology\nmisoneism\nmisoneist\nmisoneists\nmisorder\nmisordered\nmisordering\nmisorders\nmisorient\nmisorientation\nmisoriented\nmisorienting\nmisorients\nmisos\nmispackage\nmispackaged\nmispackages\nmispackaging\nmisperceive\nmisperceived\nmisperceives\nmisperceiving\nmisperception\nmisperceptions\nmispickel\nmispickels\nmisplace\nmisplaced\nmisplacement\nmisplacements\nmisplaces\nmisplacing\nmisplan\nmisplanned\nmisplanning\nmisplans\nmisplay\nmisplayed\nmisplaying\nmisplays\nmisposition\nmispositioned\nmispositioning\nmispositions\nmisprint\nmisprinted\nmisprinting\nmisprints\nmisprision\nmisprisions\nmisprize\nmisprized\nmisprizer\nmisprizers\nmisprizes\nmisprizing\nmisprogram\nmisprogramed\nmisprograming\nmisprogrammed\nmisprogramming\nmisprograms\nmispronounce\nmispronounced\nmispronounces\nmispronouncing\nmispronunciation\nmispronunciations\nmisquotation\nmisquotations\nmisquote\nmisquoted\nmisquoter\nmisquoters\nmisquotes\nmisquoting\nmisread\nmisreading\nmisreads\nmisreckon\nmisreckoned\nmisreckoning\nmisreckons\nmisrecollection\nmisrecollections\nmisrecord\nmisrecorded\nmisrecording\nmisrecords\nmisreference\nmisreferenced\nmisreferences\nmisreferencing\nmisregister\nmisregistered\nmisregistering\nmisregisters\nmisregistration\nmisregistrations\nmisrelate\nmisrelated\nmisrelates\nmisrelating\nmisremember\nmisremembered\nmisremembering\nmisremembers\nmisrender\nmisrendered\nmisrendering\nmisrenders\nmisreport\nmisreported\nmisreporter\nmisreporters\nmisreporting\nmisreports\nmisrepresent\nmisrepresentation\nmisrepresentations\nmisrepresentative\nmisrepresented\nmisrepresenter\nmisrepresenters\nmisrepresenting\nmisrepresents\nmisroute\nmisrouted\nmisroutes\nmisrouting\nmisrule\nmisruled\nmisrules\nmisruling\nmiss\nmissa\nmissable\nmissal\nmissals\nmissed\nmissend\nmissending\nmissends\nmissense\nmissenses\nmissent\nmisses\nmisset\nmissets\nmissetting\nmisshape\nmisshaped\nmisshapen\nmisshapenly\nmisshaper\nmisshapers\nmisshapes\nmisshaping\nmissies\nmissile\nmissileer\nmissileers\nmissileman\nmissilemen\nmissileries\nmissilery\nmissiles\nmissilries\nmissilry\nmissing\nmissiol\nmission\nmissional\nmissionaries\nmissionary\nmissioned\nmissioner\nmissioners\nmissioning\nmissionization\nmissionizations\nmissionize\nmissionized\nmissionizer\nmissionizers\nmissionizes\nmissionizing\nmissions\nmissis\nmissises\nmississippi\nmississippian\nmississippians\nmissive\nmissives\nmissolonghi\nmissort\nmissorted\nmissorting\nmissorts\nmissouri\nmissourian\nmissourians\nmissouris\nmissout\nmissouts\nmisspeak\nmisspeaking\nmisspeaks\nmisspell\nmisspelled\nmisspelling\nmisspellings\nmisspells\nmisspelt\nmisspend\nmisspending\nmisspends\nmisspent\nmisspoke\nmisspoken\nmisstate\nmisstated\nmisstatement\nmisstatements\nmisstates\nmisstating\nmisstep\nmissteps\nmisstricken\nmisstrike\nmisstrikes\nmisstriking\nmisstruck\nmissus\nmissuses\nmissy\nmist\nmistakable\nmistakably\nmistake\nmistaken\nmistakenly\nmistaker\nmistakers\nmistakes\nmistaking\nmistassini\nmisted\nmister\nmisters\nmistflower\nmistflowers\nmisthink\nmisthinking\nmisthinks\nmisthought\nmisthrew\nmisthrow\nmisthrowing\nmisthrown\nmisthrows\nmistier\nmistiest\nmistily\nmistime\nmistimed\nmistimes\nmistiming\nmistiness\nmisting\nmistitle\nmistitled\nmistitles\nmistitling\nmistletoe\nmistletoes\nmisto\nmistook\nmistrain\nmistrained\nmistraining\nmistrains\nmistral\nmistrals\nmistranscribe\nmistranscribed\nmistranscribes\nmistranscribing\nmistranscription\nmistranscriptions\nmistranslate\nmistranslated\nmistranslates\nmistranslating\nmistranslation\nmistranslations\nmistreat\nmistreated\nmistreating\nmistreatment\nmistreatments\nmistreats\nmistress\nmistresses\nmistrial\nmistrials\nmistrust\nmistrusted\nmistrustful\nmistrustfully\nmistrustfulness\nmistrusting\nmistrusts\nmistruth\nmistruths\nmists\nmistune\nmistuned\nmistunes\nmistuning\nmisty\nmistype\nmistyped\nmistypes\nmistyping\nmisunderstand\nmisunderstanding\nmisunderstandings\nmisunderstands\nmisunderstood\nmisusage\nmisusages\nmisuse\nmisused\nmisuser\nmisusers\nmisuses\nmisusing\nmisutilization\nmisutilizations\nmisvalue\nmisvalued\nmisvalues\nmisvaluing\nmisvocalization\nmisvocalizations\nmisword\nmisworded\nmiswording\nmiswords\nmiswrite\nmiswrites\nmiswriting\nmiswritten\nmiswrote\nmitanni\nmitannian\nmitannians\nmitchell\nmite\nmiter\nmitered\nmiterer\nmiterers\nmitering\nmiters\nmiterwort\nmiterworts\nmites\nmithraic\nmithraism\nmithraist\nmithraists\nmithras\nmithridate\nmithridates\nmithridatic\nmithridatism\nmithridatisms\nmiticidal\nmiticide\nmiticides\nmitigable\nmitigate\nmitigated\nmitigates\nmitigating\nmitigation\nmitigations\nmitigative\nmitigator\nmitigators\nmitigatory\nmitochondria\nmitochondrial\nmitochondrion\nmitogen\nmitogenic\nmitogenicity\nmitogens\nmitomycin\nmitomycins\nmitoses\nmitosis\nmitotic\nmitotically\nmitral\nmitre\nmitred\nmitres\nmitrewort\nmitreworts\nmitring\nmitsubishi\nmitsubishis\nmitt\nmitten\nmittens\nmittimus\nmitts\nmitty\nmittyish\nmitzvah\nmitzvahed\nmitzvahing\nmitzvahs\nmitzvoth\nmiwok\nmiwoks\nmix\nmixable\nmixed\nmixer\nmixers\nmixes\nmixing\nmixologist\nmixologists\nmixology\nmixt\nmixtec\nmixtecs\nmixture\nmixtures\nmizar\nmizen\nmizenmast\nmizenmasts\nmizens\nmizoram\nmizzen\nmizzenmast\nmizzenmasts\nmizzens\nmizzle\nmizzled\nmizzles\nmizzling\nmizzly\nmiño\nml\nmlle\nmlles\nmm\nmme\nmmes\nmnemonic\nmnemonically\nmnemonics\nmnemosyne\nmoa\nmoab\nmoabite\nmoabites\nmoabitish\nmoan\nmoaned\nmoaner\nmoaners\nmoaning\nmoans\nmoas\nmoat\nmoated\nmoating\nmoatlike\nmoats\nmob\nmobbed\nmobbing\nmobbish\nmobbishly\nmobcap\nmobcaps\nmobe\nmobil\nmobile\nmobiles\nmobility\nmobilization\nmobilizations\nmobilize\nmobilized\nmobilizes\nmobilizing\nmobled\nmobocracies\nmobocracy\nmobocrat\nmobocratic\nmobocratical\nmobocrats\nmobs\nmobster\nmobsters\nmobuto\nmoc\nmoccasin\nmoccasins\nmocha\nmochas\nmoche\nmochica\nmock\nmocked\nmocker\nmockeries\nmockers\nmockery\nmocking\nmockingbird\nmockingbirds\nmockingly\nmocks\nmockup\nmockups\nmocs\nmod\nmodacrylic\nmodacrylics\nmodal\nmodalities\nmodality\nmodally\nmode\nmodel\nmodeled\nmodeler\nmodelers\nmodeless\nmodeling\nmodelings\nmodelled\nmodelling\nmodels\nmodem\nmodems\nmodena\nmoderate\nmoderated\nmoderately\nmoderateness\nmoderates\nmoderating\nmoderation\nmoderations\nmoderato\nmoderator\nmoderators\nmoderatorship\nmoderatorships\nmoderatos\nmodern\nmoderne\nmodernism\nmodernisms\nmodernist\nmodernistic\nmodernists\nmodernities\nmodernity\nmodernization\nmodernizations\nmodernize\nmodernized\nmodernizer\nmodernizers\nmodernizes\nmodernizing\nmodernly\nmodernness\nmoderns\nmodes\nmodest\nmodesties\nmodestly\nmodesty\nmodi\nmodica\nmodicum\nmodicums\nmodifiability\nmodifiable\nmodification\nmodifications\nmodificative\nmodificator\nmodificators\nmodificatory\nmodified\nmodifier\nmodifiers\nmodifies\nmodify\nmodifying\nmodigliani\nmodillion\nmodillions\nmodioli\nmodiolus\nmodish\nmodishly\nmodishness\nmodiste\nmodistes\nmodoc\nmodocs\nmodred\nmods\nmodulability\nmodular\nmodularity\nmodularization\nmodularizations\nmodularize\nmodularized\nmodularizes\nmodularizing\nmodularly\nmodulars\nmodulate\nmodulated\nmodulates\nmodulating\nmodulation\nmodulations\nmodulative\nmodulator\nmodulators\nmodulatory\nmodule\nmodules\nmoduli\nmodulo\nmodulus\nmodus\nmoesia\nmofette\nmofettes\nmoffette\nmoffettes\nmogadishu\nmogen\nmoggie\nmoggies\nmoggy\nmoghul\nmoghuls\nmogollon\nmogul\nmoguls\nmohair\nmohammed\nmohammedan\nmohammedanism\nmohammedanisms\nmohammedans\nmoharram\nmohave\nmohaves\nmohawk\nmohawks\nmohegan\nmohegans\nmohenjo\nmohican\nmohicans\nmoho\nmohock\nmohockism\nmohorovicic\nmohos\nmohs\nmohur\nmohurs\nmoidore\nmoidores\nmoieties\nmoiety\nmoil\nmoiled\nmoiler\nmoilers\nmoiling\nmoilingly\nmoils\nmoines\nmoirai\nmoire\nmoires\nmoiré\nmoist\nmoisten\nmoistened\nmoistener\nmoisteners\nmoistening\nmoistens\nmoister\nmoistest\nmoistly\nmoistness\nmoisture\nmoistures\nmoisturize\nmoisturized\nmoisturizer\nmoisturizers\nmoisturizes\nmoisturizing\nmojarra\nmojarras\nmojave\nmojaves\nmojo\nmojoes\nmojos\nmoke\nmokes\nmol\nmola\nmolal\nmolalities\nmolality\nmolar\nmolarities\nmolarity\nmolars\nmolas\nmolasses\nmold\nmoldable\nmoldavia\nmoldavian\nmoldavians\nmoldboard\nmoldboards\nmolded\nmolder\nmoldered\nmoldering\nmolders\nmoldier\nmoldiest\nmoldiness\nmolding\nmoldings\nmoldova\nmoldovan\nmoldovans\nmolds\nmoldy\nmole\nmolecular\nmolecularity\nmolecularly\nmolecule\nmolecules\nmolehill\nmolehills\nmoles\nmoleskin\nmoleskins\nmolest\nmolestation\nmolestations\nmolested\nmolester\nmolesters\nmolesting\nmolests\nmolies\nmoline\nmolise\nmolière\nmoll\nmollie\nmollies\nmollifiable\nmollification\nmollifications\nmollified\nmollifier\nmollifiers\nmollifies\nmollify\nmollifying\nmollifyingly\nmolls\nmollusc\nmollusca\nmolluscan\nmolluscicidal\nmolluscicide\nmolluscicides\nmolluscoid\nmolluscous\nmolluscs\nmolluscum\nmollusk\nmolluskan\nmollusks\nmolly\nmollycoddle\nmollycoddled\nmollycoddler\nmollycoddlers\nmollycoddles\nmollycoddling\nmoloch\nmolokai\nmolopo\nmolotov\nmols\nmolt\nmolted\nmolten\nmolter\nmolters\nmolting\nmolto\nmolts\nmoluccan\nmoluccans\nmoluccas\nmoly\nmolybdate\nmolybdates\nmolybdenite\nmolybdenites\nmolybdenum\nmolybdic\nmolybdous\nmom\nmombasa\nmome\nmoment\nmomenta\nmomentarily\nmomentariness\nmomentary\nmomently\nmomento\nmomentous\nmomentously\nmomentousness\nmoments\nmomentum\nmomentums\nmomes\nmomma\nmommas\nmommies\nmommy\nmoms\nmomus\nmon\nmona\nmonacan\nmonacans\nmonachal\nmonachism\nmonachisms\nmonaco\nmonad\nmonadelphous\nmonadic\nmonadical\nmonadically\nmonadism\nmonadnock\nmonadnocks\nmonads\nmonandries\nmonandrous\nmonandry\nmonanthous\nmonarch\nmonarchal\nmonarchally\nmonarchial\nmonarchian\nmonarchianism\nmonarchic\nmonarchical\nmonarchically\nmonarchies\nmonarchism\nmonarchist\nmonarchistic\nmonarchists\nmonarchs\nmonarchy\nmonarda\nmonardas\nmonasterial\nmonasteries\nmonasterries\nmonastery\nmonastic\nmonastical\nmonastically\nmonasticism\nmonastics\nmonatomic\nmonatomically\nmonaural\nmonaurally\nmonaxial\nmonazite\nmonazites\nmonday\nmondays\nmonde\nmondrian\nmonecious\nmonel\nmonensin\nmonensins\nmoneran\nmonerans\nmonestrous\nmonet\nmonetarily\nmonetarism\nmonetarist\nmonetarists\nmonetary\nmonetization\nmonetizations\nmonetize\nmonetized\nmonetizes\nmonetizing\nmoney\nmoneybag\nmoneybags\nmoneybox\nmoneyboxes\nmoneychanger\nmoneychangers\nmoneyed\nmoneyer\nmoneyers\nmoneygrubber\nmoneygrubbers\nmoneygrubbing\nmoneylender\nmoneylenders\nmoneymaker\nmoneymakers\nmoneymaking\nmoneyman\nmoneymen\nmoneys\nmoneysaving\nmoneywort\nmoneyworts\nmongeese\nmonger\nmongered\nmongering\nmongers\nmongo\nmongol\nmongolia\nmongolian\nmongolians\nmongolic\nmongolism\nmongoloid\nmongoloids\nmongols\nmongoose\nmongooses\nmongrel\nmongrelism\nmongrelization\nmongrelizations\nmongrelize\nmongrelized\nmongrelizes\nmongrelizing\nmongrelly\nmongrels\nmonicker\nmonickers\nmonied\nmonies\nmoniker\nmonikers\nmonilial\nmoniliasis\nmoniliform\nmoniliformly\nmonish\nmonished\nmonishes\nmonishing\nmonism\nmonist\nmonistic\nmonistically\nmonists\nmonition\nmonitions\nmonitor\nmonitored\nmonitorial\nmonitorially\nmonitories\nmonitoring\nmonitors\nmonitorship\nmonitorships\nmonitory\nmonk\nmonkeries\nmonkery\nmonkey\nmonkeyed\nmonkeying\nmonkeylike\nmonkeypod\nmonkeypods\nmonkeys\nmonkeyshine\nmonkeyshines\nmonkfish\nmonkfishes\nmonkhood\nmonkhoods\nmonkish\nmonkishly\nmonkishness\nmonks\nmonkshood\nmonkshoods\nmono\nmonoacid\nmonoacidic\nmonoacids\nmonoamine\nmonoaminergic\nmonoamines\nmonobasic\nmonocarboxylic\nmonocarp\nmonocarpellary\nmonocarpic\nmonocarpous\nmonocarps\nmonocausal\nmonocephalic\nmonocephalous\nmonoceros\nmonochasia\nmonochasial\nmonochasium\nmonochord\nmonochords\nmonochromat\nmonochromatic\nmonochromatically\nmonochromaticity\nmonochromatism\nmonochromator\nmonochromators\nmonochromats\nmonochrome\nmonochromes\nmonochromic\nmonochromist\nmonochromists\nmonocle\nmonocled\nmonocles\nmonoclinal\nmonocline\nmonoclines\nmonoclinic\nmonoclinous\nmonoclonal\nmonocoque\nmonocoques\nmonocot\nmonocots\nmonocotyledon\nmonocotyledonous\nmonocotyledons\nmonocracies\nmonocracy\nmonocrat\nmonocratic\nmonocrats\nmonocrystal\nmonocrystalline\nmonocrystals\nmonocular\nmonocularly\nmonocultural\nmonoculture\nmonocultures\nmonocycle\nmonocycles\nmonocyclic\nmonocyte\nmonocytes\nmonocytic\nmonocytoid\nmonocytoses\nmonocytosis\nmonodactyl\nmonodactylous\nmonodactyls\nmonodic\nmonodical\nmonodically\nmonodies\nmonodisperse\nmonodist\nmonodists\nmonodrama\nmonodramas\nmonodramatic\nmonody\nmonoecious\nmonoeciously\nmonoecism\nmonoester\nmonoesters\nmonofilament\nmonofilaments\nmonogamic\nmonogamist\nmonogamists\nmonogamous\nmonogamously\nmonogamy\nmonogastric\nmonogenean\nmonogeneans\nmonogenesis\nmonogenetic\nmonogenic\nmonogenically\nmonogenism\nmonogenist\nmonogenistic\nmonogenists\nmonogenous\nmonogerm\nmonoglot\nmonoglots\nmonoglyceride\nmonoglycerides\nmonogram\nmonogramed\nmonograming\nmonogrammatic\nmonogrammed\nmonogrammer\nmonogrammers\nmonogramming\nmonograms\nmonograph\nmonographed\nmonographer\nmonographers\nmonographic\nmonographically\nmonographing\nmonographs\nmonogynist\nmonogynists\nmonogynous\nmonogyny\nmonohull\nmonohulls\nmonohybrid\nmonohybrids\nmonohydrate\nmonohydrated\nmonohydrates\nmonohydric\nmonohydroxy\nmonoicous\nmonolayer\nmonolayers\nmonolingual\nmonolingualism\nmonolinguals\nmonolith\nmonolithic\nmonolithically\nmonoliths\nmonolog\nmonologged\nmonologging\nmonologic\nmonological\nmonologist\nmonologists\nmonologize\nmonologized\nmonologizes\nmonologizing\nmonologs\nmonologue\nmonologued\nmonologues\nmonologuing\nmonologuist\nmonologuists\nmonomania\nmonomaniac\nmonomaniacal\nmonomaniacally\nmonomaniacs\nmonomer\nmonomeric\nmonomers\nmonometallic\nmonometallism\nmonometallist\nmonometallists\nmonometer\nmonometers\nmonomial\nmonomials\nmonomolecular\nmonomolecularly\nmonomorphemic\nmonomorphic\nmonomorphism\nmonomorphous\nmonongahela\nmononuclear\nmononucleate\nmononucleated\nmononucleosis\nmononucleotide\nmononucleotides\nmonopetalous\nmonophagous\nmonophagy\nmonophobia\nmonophobias\nmonophobic\nmonophonic\nmonophonically\nmonophonies\nmonophony\nmonophosphate\nmonophthong\nmonophthongal\nmonophthongs\nmonophyletic\nmonophyletically\nmonophyly\nmonophysite\nmonophysites\nmonophysitic\nmonophysitism\nmonoplane\nmonoplanes\nmonoplegia\nmonoplegias\nmonoplegic\nmonoploid\nmonoploids\nmonopod\nmonopode\nmonopodes\nmonopodia\nmonopodial\nmonopodially\nmonopodium\nmonopods\nmonopole\nmonopoles\nmonopolies\nmonopolism\nmonopolist\nmonopolistic\nmonopolistically\nmonopolists\nmonopolization\nmonopolizations\nmonopolize\nmonopolized\nmonopolizer\nmonopolizers\nmonopolizes\nmonopolizing\nmonopoly\nmonopropellant\nmonopropellants\nmonoprotic\nmonopsonies\nmonopsonist\nmonopsonistic\nmonopsonists\nmonopsony\nmonorail\nmonorails\nmonorchid\nmonorchidism\nmonorchids\nmonorhyme\nmonorhymed\nmonorhymes\nmonos\nmonosaccharide\nmonosaccharides\nmonosepalous\nmonosodium\nmonosome\nmonosomes\nmonosomic\nmonosomy\nmonospecific\nmonospecificity\nmonospermal\nmonospermous\nmonostele\nmonosteles\nmonostelic\nmonostely\nmonostich\nmonostiches\nmonostichous\nmonostome\nmonostomous\nmonostylous\nmonosyllabic\nmonosyllabically\nmonosyllabicity\nmonosyllable\nmonosyllables\nmonosynaptic\nmonosynaptically\nmonoterpene\nmonoterpenes\nmonotheism\nmonotheist\nmonotheistic\nmonotheistical\nmonotheistically\nmonotheists\nmonothematic\nmonotint\nmonotints\nmonotone\nmonotones\nmonotonic\nmonotonically\nmonotonicity\nmonotonies\nmonotonous\nmonotonously\nmonotonousness\nmonotony\nmonotrematous\nmonotreme\nmonotremes\nmonotrichate\nmonotrichic\nmonotrichous\nmonotype\nmonotypes\nmonotypic\nmonounsaturate\nmonounsaturated\nmonounsaturates\nmonovalence\nmonovalency\nmonovalent\nmonovular\nmonoxide\nmonoxides\nmonozygotic\nmonroe\nmonrovia\nmons\nmonseigneur\nmonsieur\nmonsignor\nmonsignori\nmonsignorial\nmonsignors\nmonsoon\nmonsoonal\nmonsoons\nmonster\nmonsters\nmonstrance\nmonstrances\nmonstrosities\nmonstrosity\nmonstrous\nmonstrously\nmonstrousness\nmontadale\nmontadales\nmontage\nmontaged\nmontages\nmontaging\nmontagnais\nmontagnard\nmontagnards\nmontague\nmontagues\nmontaigne\nmontan\nmontana\nmontanan\nmontanans\nmontane\nmontanism\nmontanist\nmontanists\nmontargis\nmontauk\nmontauks\nmonte\nmontecristo\nmontego\nmonteith\nmonteiths\nmontenegrin\nmontenegrins\nmontenegro\nmonterey\nmontero\nmonteros\nmonterrey\nmontes\nmontesquieu\nmontessori\nmontessorian\nmonteverdi\nmontevideo\nmontezuma\nmontferrat\nmontfort\nmontgolfier\nmontgomery\nmonth\nmonthlies\nmonthlong\nmonthly\nmonths\nmonticello\nmonticule\nmonticules\nmontmartre\nmontmorency\nmontmorillonite\nmontmorillonites\nmontmorillonitic\nmontparnasse\nmontpelier\nmontpellier\nmontrachet\nmontreal\nmontreux\nmontréal\nmontserrat\nmonument\nmonumental\nmonumentality\nmonumentalize\nmonumentalized\nmonumentalizes\nmonumentalizing\nmonumentally\nmonuments\nmonuron\nmonurons\nmonzonite\nmonzonites\nmonzonitic\nmonégasque\nmonégasques\nmoo\nmooch\nmooched\nmoocher\nmoochers\nmooches\nmooching\nmood\nmoodier\nmoodiest\nmoodily\nmoodiness\nmoods\nmoody\nmooed\nmooing\nmoola\nmoolah\nmoon\nmoonbeam\nmoonbeams\nmoonblind\nmooncalf\nmooncalves\nmoonchild\nmoonchildren\nmoondust\nmooned\nmooneye\nmooneyed\nmooneyes\nmoonfaced\nmoonfish\nmoonfishes\nmoonflower\nmoonflowers\nmoonie\nmoonier\nmoonies\nmooniest\nmooning\nmoonish\nmoonishly\nmoonless\nmoonlet\nmoonlets\nmoonlight\nmoonlighted\nmoonlighter\nmoonlighters\nmoonlighting\nmoonlights\nmoonlike\nmoonlit\nmoonquake\nmoonquakes\nmoonrise\nmoonrises\nmoons\nmoonscape\nmoonscapes\nmoonseed\nmoonseeds\nmoonset\nmoonsets\nmoonshine\nmoonshined\nmoonshiner\nmoonshiners\nmoonshines\nmoonshining\nmoonstone\nmoonstones\nmoonstricken\nmoonstruck\nmoonwalk\nmoonwalked\nmoonwalker\nmoonwalkers\nmoonwalking\nmoonwalks\nmoonward\nmoonwort\nmoonworts\nmoony\nmoor\nmoorage\nmoore\nmoorea\nmoored\nmoorfowl\nmoorfowls\nmoorhen\nmoorhens\nmooring\nmoorings\nmoorish\nmoorland\nmoorlands\nmoors\nmoos\nmoose\nmoosebird\nmoosebirds\nmoosehead\nmooser\nmoosewood\nmoosewoods\nmoot\nmooted\nmooting\nmootness\nmoots\nmop\nmopboard\nmopboards\nmope\nmoped\nmopeds\nmoper\nmopers\nmopes\nmopey\nmoping\nmopish\nmopishly\nmopped\nmopper\nmoppers\nmoppet\nmoppets\nmopping\nmops\nmoquette\nmoquettes\nmor\nmora\nmorae\nmorainal\nmoraine\nmoraines\nmorainic\nmoral\nmorale\nmoralism\nmoralisms\nmoralist\nmoralistic\nmoralistically\nmoralists\nmoralities\nmorality\nmoralization\nmoralizations\nmoralize\nmoralized\nmoralizer\nmoralizers\nmoralizes\nmoralizing\nmorally\nmorals\nmoras\nmorass\nmorasses\nmorassy\nmoratoria\nmoratorium\nmoratoriums\nmoratory\nmoravia\nmoravian\nmoravians\nmoray\nmorays\nmorbid\nmorbidities\nmorbidity\nmorbidly\nmorbidness\nmorbific\nmorbus\nmorceau\nmorceaux\nmordacious\nmordaciously\nmordacity\nmordancy\nmordant\nmordanted\nmordanting\nmordantly\nmordants\nmordecai\nmordent\nmordents\nmordovia\nmordvinia\nmore\nmoreen\nmoreens\nmorel\nmorello\nmorellos\nmorels\nmoreover\nmores\nmoresque\nmoresques\nmorgan\nmorgana\nmorganatic\nmorganatically\nmorganite\nmorganites\nmorgans\nmorgen\nmorgens\nmorgue\nmorgues\nmori\nmoribund\nmoribundity\nmoribundly\nmorion\nmorions\nmorisco\nmoriscoes\nmoriscos\nmoritz\nmormon\nmormonism\nmormons\nmorn\nmornay\nmorning\nmornings\nmorns\nmorny\nmoro\nmoroccan\nmoroccans\nmorocco\nmoroccos\nmoron\nmoronic\nmoronically\nmoronism\nmoronity\nmorons\nmoros\nmorose\nmorosely\nmoroseness\nmorosity\nmorph\nmorphactin\nmorphactins\nmorphallaxes\nmorphallaxis\nmorphean\nmorpheme\nmorphemes\nmorphemic\nmorphemically\nmorphemics\nmorpheus\nmorphia\nmorphias\nmorphine\nmorphing\nmorphinism\nmorphinisms\nmorphinist\nmorphinists\nmorpho\nmorphogen\nmorphogenesis\nmorphogenetic\nmorphogenetically\nmorphogenic\nmorphogens\nmorphologic\nmorphological\nmorphologically\nmorphologies\nmorphologist\nmorphologists\nmorphology\nmorphometric\nmorphometrically\nmorphometry\nmorphophonemic\nmorphophonemics\nmorphos\nmorphoses\nmorphosis\nmorphs\nmorris\nmorrow\nmorrows\nmorse\nmorsel\nmorsels\nmort\nmortadella\nmortadellas\nmortal\nmortalities\nmortality\nmortally\nmortals\nmortar\nmortarboard\nmortarboards\nmortared\nmortaring\nmortarless\nmortars\nmortem\nmortems\nmortgage\nmortgaged\nmortgagee\nmortgagees\nmortgager\nmortgagers\nmortgages\nmortgaging\nmortgagor\nmortgagors\nmortice\nmorticed\nmortices\nmortician\nmorticians\nmorticing\nmortification\nmortifications\nmortified\nmortifier\nmortifiers\nmortifies\nmortify\nmortifying\nmortifyingly\nmortimer\nmortis\nmortise\nmortised\nmortises\nmortising\nmortmain\nmortola\nmorton\nmorts\nmortuaries\nmortuary\nmorula\nmorulae\nmorular\nmorulation\nmorulations\nmosaic\nmosaically\nmosaicism\nmosaicisms\nmosaicist\nmosaicists\nmosaicked\nmosaicking\nmosaiclike\nmosaics\nmosasaur\nmosasaurs\nmoschatel\nmoschatels\nmoscow\nmoselle\nmoselles\nmoses\nmosey\nmoseyed\nmoseying\nmoseys\nmosfet\nmoshav\nmoshavim\nmoslem\nmoslems\nmosotho\nmosque\nmosques\nmosquito\nmosquitoes\nmosquitoey\nmosquitos\nmoss\nmossback\nmossbacked\nmossbacks\nmossbunker\nmossbunkers\nmossed\nmosses\nmossgrown\nmossier\nmossiest\nmossiness\nmossing\nmosslike\nmosso\nmossy\nmost\nmostaccioli\nmostly\nmot\nmote\nmotel\nmotels\nmotes\nmotet\nmotets\nmoth\nmothball\nmothballed\nmothballing\nmothballs\nmother\nmotherboard\nmotherboards\nmothered\nmotherfucker\nmotherfuckers\nmotherfucking\nmotherhood\nmotherhouse\nmotherhouses\nmothering\nmotherings\nmotherland\nmotherlands\nmotherless\nmotherlessness\nmotherliness\nmotherly\nmothers\nmotherwort\nmotherworts\nmothier\nmothiest\nmothlike\nmothproof\nmothproofed\nmothproofer\nmothproofers\nmothproofing\nmothproofs\nmoths\nmothy\nmotif\nmotific\nmotifs\nmotile\nmotility\nmotion\nmotional\nmotioned\nmotioning\nmotionless\nmotionlessly\nmotionlessness\nmotions\nmotivate\nmotivated\nmotivates\nmotivating\nmotivation\nmotivational\nmotivationally\nmotivations\nmotivative\nmotivator\nmotivators\nmotive\nmotived\nmotiveless\nmotivelessly\nmotives\nmotivic\nmotiving\nmotivities\nmotivity\nmotley\nmotleys\nmotmot\nmotmots\nmotocross\nmotocrosses\nmotoneuron\nmotoneurons\nmotor\nmotorbike\nmotorbikes\nmotorboat\nmotorboater\nmotorboaters\nmotorboating\nmotorboats\nmotorbus\nmotorbuses\nmotorbusses\nmotorcade\nmotorcaded\nmotorcades\nmotorcading\nmotorcar\nmotorcars\nmotorcycle\nmotorcycled\nmotorcycles\nmotorcycling\nmotorcyclist\nmotorcyclists\nmotordom\nmotored\nmotoric\nmotorically\nmotoring\nmotorist\nmotorists\nmotorization\nmotorizations\nmotorize\nmotorized\nmotorizes\nmotorizing\nmotorless\nmotorman\nmotormen\nmotormouth\nmotormouths\nmotorola\nmotors\nmotortruck\nmotortrucks\nmotorway\nmotorways\nmots\nmott\nmotte\nmottes\nmottle\nmottled\nmottler\nmottlers\nmottles\nmottling\nmotto\nmottoes\nmottos\nmotts\nmoue\nmoues\nmoufflon\nmoufflons\nmouflon\nmouflons\nmouillé\nmoujik\nmoujiks\nmoulage\nmoulages\nmoulin\nmoulins\nmound\nmoundbird\nmoundbirds\nmounded\nmounding\nmounds\nmount\nmountable\nmountain\nmountaineer\nmountaineered\nmountaineering\nmountaineers\nmountainous\nmountainously\nmountainousness\nmountains\nmountainside\nmountainsides\nmountaintop\nmountaintops\nmountainy\nmountbatten\nmountebank\nmountebanked\nmountebankery\nmountebanking\nmountebanks\nmounted\nmounter\nmounters\nmountie\nmounties\nmounting\nmountings\nmounts\nmounty\nmourn\nmourned\nmourner\nmourners\nmournful\nmournfully\nmournfulness\nmourning\nmourningly\nmourns\nmouse\nmoused\nmouser\nmousers\nmouses\nmousetrap\nmousetrapped\nmousetrapping\nmousetraps\nmousey\nmousier\nmousiest\nmousily\nmousiness\nmousing\nmousings\nmousquetaire\nmousquetaires\nmoussaka\nmousse\nmoussed\nmousseline\nmousselines\nmousses\nmoussing\nmoustache\nmoustaches\nmoustachio\nmoustachioed\nmoustachios\nmousterian\nmousy\nmouth\nmouthbreeder\nmouthbreeders\nmouthed\nmouther\nmouthers\nmouthful\nmouthfuls\nmouthier\nmouthiest\nmouthiness\nmouthing\nmouthings\nmouthlike\nmouthpart\nmouthparts\nmouthpiece\nmouthpieces\nmouths\nmouthwash\nmouthwashes\nmouthwatering\nmouthwateringly\nmouthy\nmouton\nmoutonnée\nmoutonnéed\nmoutonnées\nmoutons\nmovability\nmovable\nmovableness\nmovables\nmovably\nmove\nmoveable\nmoved\nmoveless\nmovelessly\nmovelessness\nmovement\nmovements\nmover\nmovers\nmoves\nmovie\nmoviedom\nmoviedoms\nmoviegoer\nmoviegoers\nmoviegoing\nmoviemaker\nmoviemakers\nmoviemaking\nmovies\nmoving\nmovingly\nmoviola\nmoviolas\nmow\nmowed\nmower\nmowers\nmowing\nmown\nmows\nmoxie\nmoyen\nmozambican\nmozambicans\nmozambique\nmozarab\nmozarabic\nmozarabs\nmozart\nmozartian\nmozartians\nmozetta\nmozettas\nmozo\nmozos\nmozzarella\nmozzetta\nmozzettas\nmpg\nmph\nmr\nmri\nmridanga\nmridangam\nmrs\nms\nmsg\nmu\nmuch\nmuchacho\nmuchachos\nmuchness\nmuciferous\nmucilage\nmucilaginous\nmucilaginously\nmucin\nmucinous\nmucins\nmuck\nmuckamuck\nmuckamucks\nmucked\nmucker\nmuckers\nmuckety\nmuckier\nmuckiest\nmuckily\nmucking\nmuckluck\nmucklucks\nmuckrake\nmuckraked\nmuckraker\nmuckrakers\nmuckrakes\nmuckraking\nmucks\nmuckworm\nmuckworms\nmucky\nmucocutaneous\nmucoid\nmucoids\nmucolytic\nmucopeptide\nmucopeptides\nmucopolysaccharide\nmucopolysaccharides\nmucoprotein\nmucoproteins\nmucopurulent\nmucosa\nmucosae\nmucosal\nmucosas\nmucous\nmucoviscidosis\nmucro\nmucronate\nmucronation\nmucronations\nmucrones\nmucus\nmud\nmudbug\nmudbugs\nmudded\nmudder\nmudders\nmuddied\nmuddier\nmuddies\nmuddiest\nmuddily\nmuddiness\nmudding\nmuddle\nmuddled\nmuddleheaded\nmuddleheadedly\nmuddleheadedness\nmuddler\nmuddlers\nmuddles\nmuddling\nmuddly\nmuddy\nmuddying\nmudfish\nmudfishes\nmudflat\nmudflats\nmudflow\nmudflows\nmudguard\nmudguards\nmudpack\nmudpacks\nmudra\nmudras\nmudroom\nmudrooms\nmuds\nmudsill\nmudsills\nmudskipper\nmudskippers\nmudslide\nmudslides\nmudslinger\nmudslingers\nmudslinging\nmudstone\nmudstones\nmudéjar\nmudéjares\nmuenster\nmuensters\nmuesli\nmueslis\nmuezzin\nmuezzins\nmuff\nmuffed\nmuffin\nmuffing\nmuffins\nmuffle\nmuffled\nmuffler\nmufflered\nmufflers\nmuffles\nmuffling\nmuffs\nmuffuletta\nmuffulettas\nmufti\nmuftis\nmug\nmugful\nmugged\nmuggee\nmuggees\nmugger\nmuggers\nmuggier\nmuggiest\nmugginess\nmugging\nmuggings\nmuggy\nmughal\nmughals\nmugho\nmugo\nmugs\nmugwump\nmugwumpery\nmugwumps\nmuhammad\nmuhammadan\nmuhammadanism\nmuhammadanisms\nmuhammadans\nmuhammedan\nmuhammedans\nmuharram\nmuharrum\nmujahedeen\nmujahedeens\nmujahedin\nmujahedins\nmujahideen\nmujahideens\nmujahidin\nmujahidins\nmujik\nmujiks\nmukluk\nmukluks\nmuktuk\nmulatto\nmulattoes\nmulattos\nmulberries\nmulberry\nmulch\nmulched\nmulches\nmulching\nmulct\nmulcted\nmulcting\nmulcts\nmule\nmules\nmuleskinner\nmuleskinners\nmuleta\nmuletas\nmuleteer\nmuleteers\nmuley\nmuleys\nmulhacén\nmuliebrity\nmulish\nmulishly\nmulishness\nmull\nmulla\nmullah\nmullahism\nmullahs\nmullas\nmulled\nmullein\nmulleins\nmullen\nmullens\nmuller\nmullerian\nmullers\nmullet\nmullets\nmulligan\nmulligans\nmulligatawnies\nmulligatawny\nmulling\nmullion\nmullioned\nmullions\nmullite\nmullites\nmulls\nmulti\nmultiaddress\nmultiage\nmultiagency\nmultiarmed\nmultiatom\nmultiauthor\nmultiaxial\nmultiband\nmultibank\nmultibarrel\nmultibarreled\nmultibillion\nmultibillionaire\nmultibillionaires\nmultibladed\nmultibranched\nmultibuilding\nmulticampus\nmulticar\nmulticarbon\nmulticausal\nmulticell\nmulticelled\nmulticellular\nmulticellularity\nmulticellulocentric\nmulticenter\nmultichain\nmultichambered\nmultichannel\nmulticharacter\nmulticity\nmulticlient\nmulticoated\nmulticolor\nmulticolored\nmulticolumn\nmulticomponent\nmulticonductor\nmulticopy\nmulticounty\nmulticourse\nmulticultural\nmulticulturalism\nmulticurie\nmulticurrency\nmultidentate\nmultidialectal\nmultidimensional\nmultidimensionality\nmultidirectional\nmultidisciplinary\nmultidiscipline\nmultidivisional\nmultidomain\nmultidrug\nmultielectrode\nmultielement\nmultiemployer\nmultiengine\nmultienzyme\nmultiethnic\nmultifaceted\nmultifactor\nmultifactorial\nmultifactorially\nmultifamily\nmultifarious\nmultifariously\nmultifariousness\nmultifid\nmultifilament\nmultiflash\nmultiflora\nmultiflorous\nmultifocal\nmultifoil\nmultifoils\nmultifold\nmultiform\nmultiformity\nmultifrequency\nmultifunction\nmultifunctional\nmultigenerational\nmultigenic\nmultigerm\nmultigrade\nmultigrain\nmultigravida\nmultigravidas\nmultigrid\nmultigrooved\nmultigroup\nmultihandicapped\nmultiheaded\nmultihospital\nmultihued\nmultihull\nmultilane\nmultilateral\nmultilateralism\nmultilateralist\nmultilateralists\nmultilaterally\nmultilayer\nmultilayered\nmultilevel\nmultileveled\nmultiline\nmultilingual\nmultilingualism\nmultilingually\nmultilobed\nmultilocular\nmultimanned\nmultimedia\nmultimegaton\nmultimegawatt\nmultimember\nmultimetallic\nmultimillennial\nmultimillion\nmultimillionaire\nmultimillionaires\nmultimodal\nmultimode\nmultimolecular\nmultination\nmultinational\nmultinationalism\nmultinationals\nmultinomial\nmultinomials\nmultinuclear\nmultinucleate\nmultinucleated\nmultiorgasmic\nmultipack\nmultipacks\nmultipage\nmultipaned\nmultipara\nmultiparae\nmultiparameter\nmultiparas\nmultiparity\nmultiparous\nmultipart\nmultiparticle\nmultipartite\nmultiparty\nmultipath\nmultiped\nmultipede\nmultiphase\nmultiphasic\nmultiphoton\nmultipicture\nmultipiece\nmultipion\nmultipiston\nmultiplant\nmultiplayer\nmultiple\nmultiples\nmultiplet\nmultiplets\nmultiplex\nmultiplexed\nmultiplexer\nmultiplexers\nmultiplexes\nmultiplexing\nmultiplexor\nmultiplexors\nmultipliable\nmultiplicable\nmultiplicand\nmultiplicands\nmultiplicate\nmultiplication\nmultiplicational\nmultiplications\nmultiplicative\nmultiplicatively\nmultiplicities\nmultiplicity\nmultiplied\nmultiplier\nmultipliers\nmultiplies\nmultiply\nmultiplying\nmultipoint\nmultipolar\nmultipolarity\nmultipole\nmultiport\nmultipotential\nmultipower\nmultiproblem\nmultiprocessing\nmultiprocessor\nmultiprocessors\nmultiproduct\nmultiprogramming\nmultipronged\nmultipurpose\nmultiracial\nmultiracialism\nmultiracialisms\nmultirange\nmultiregional\nmultireligious\nmultiroom\nmultiscreen\nmultisense\nmultisensory\nmultiservice\nmultisided\nmultisite\nmultisize\nmultiskilled\nmultisource\nmultispecies\nmultispectral\nmultispeed\nmultisport\nmultisports\nmultistage\nmultistate\nmultistemmed\nmultistep\nmultistoried\nmultistory\nmultistranded\nmultisyllabic\nmultisystem\nmultitalented\nmultitask\nmultitasked\nmultitasking\nmultitasks\nmultiterminal\nmultithreaded\nmultitiered\nmultiton\nmultitone\nmultitowered\nmultitrack\nmultitracked\nmultitracking\nmultitrillion\nmultitude\nmultitudes\nmultitudinous\nmultitudinously\nmultitudinousness\nmultiunion\nmultiunit\nmultiuse\nmultiuser\nmultivalence\nmultivalent\nmultivariable\nmultivariate\nmultiversities\nmultiversity\nmultivitamin\nmultivitamins\nmultivoltine\nmultivolume\nmultiwall\nmultiwarhead\nmultiwavelength\nmultiword\nmultiyear\nmultnomah\nmulture\nmultures\nmum\nmumble\nmumbled\nmumbler\nmumblers\nmumbles\nmumblety\nmumbling\nmumbly\nmumbo\nmummed\nmummer\nmummeries\nmummers\nmummery\nmummichog\nmummichogs\nmummies\nmummification\nmummifications\nmummified\nmummifies\nmummify\nmummifying\nmumming\nmummy\nmump\nmumped\nmumps\nmums\nmunch\nmunchausen\nmunched\nmuncher\nmunchers\nmunches\nmunchhausen\nmunchies\nmunching\nmunchkin\nmunchkins\nmunda\nmundane\nmundanely\nmundaneness\nmundanity\nmundungus\nmung\nmungo\nmungos\nmuni\nmunich\nmunicipal\nmunicipalities\nmunicipality\nmunicipalization\nmunicipalizations\nmunicipalize\nmunicipalized\nmunicipalizes\nmunicipalizing\nmunicipally\nmunicipals\nmunificence\nmunificent\nmunificently\nmuniment\nmuniments\nmunis\nmunition\nmunitioned\nmunitioning\nmunitions\nmunsee\nmunsees\nmunster\nmunsters\nmuntin\nmuntins\nmuntjac\nmuntjacs\nmuntjak\nmuntjaks\nmuon\nmuonic\nmuonium\nmuons\nmuppie\nmuppies\nmural\nmuraled\nmuralist\nmuralists\nmuralled\nmurals\nmuramic\nmurat\nmurchison\nmurder\nmurdered\nmurderee\nmurderees\nmurderer\nmurderers\nmurderess\nmurderesses\nmurdering\nmurderous\nmurderously\nmurderousness\nmurders\nmurein\nmureins\nmurex\nmurexes\nmuriate\nmuriates\nmuriatic\nmuricate\nmuricated\nmurices\nmurid\nmurids\nmurine\nmurines\nmurk\nmurkier\nmurkiest\nmurkily\nmurkiness\nmurks\nmurky\nmurmansk\nmurmur\nmurmured\nmurmurer\nmurmurers\nmurmuring\nmurmuringly\nmurmurous\nmurmurously\nmurmurs\nmurphies\nmurphy\nmurrain\nmurrains\nmurray\nmurre\nmurres\nmurrey\nmurreys\nmurrumbidgee\nmurther\nmurthered\nmurthering\nmurthers\nmusca\nmuscadet\nmuscadets\nmuscadine\nmuscadines\nmuscae\nmuscarine\nmuscarines\nmuscarinic\nmuscat\nmuscatel\nmuscatels\nmuscats\nmuscid\nmuscids\nmuscle\nmusclebound\nmuscled\nmuscleman\nmusclemen\nmuscles\nmuscling\nmuscly\nmuscovite\nmuscovites\nmuscovy\nmuscular\nmuscularity\nmuscularly\nmusculature\nmusculoskeletal\nmuse\nmused\nmuseological\nmuseologically\nmuseologist\nmuseologists\nmuseology\nmuser\nmusers\nmuses\nmusette\nmusettes\nmuseum\nmuseumgoer\nmuseumgoers\nmuseums\nmush\nmushed\nmusher\nmushers\nmushes\nmushier\nmushiest\nmushily\nmushiness\nmushing\nmushroom\nmushroomed\nmushrooming\nmushrooms\nmushy\nmusic\nmusical\nmusicale\nmusicales\nmusicality\nmusicalization\nmusicalizations\nmusicalize\nmusicalized\nmusicalizes\nmusicalizing\nmusically\nmusicals\nmusician\nmusicianly\nmusicians\nmusicianship\nmusicological\nmusicologically\nmusicologist\nmusicologists\nmusicology\nmusing\nmusingly\nmusings\nmusique\nmusk\nmuskeg\nmuskegs\nmuskellunge\nmuskellunges\nmuskelunge\nmuskelunges\nmusket\nmusketeer\nmusketeers\nmusketry\nmuskets\nmuskhogean\nmuskhogeans\nmuskie\nmuskier\nmuskies\nmuskiest\nmuskiness\nmuskingum\nmuskmelon\nmuskmelons\nmuskogean\nmuskogeans\nmuskogee\nmuskogees\nmuskox\nmuskoxen\nmuskrat\nmuskrats\nmuskroot\nmuskroots\nmusky\nmuslim\nmuslims\nmuslin\nmuslins\nmusquash\nmusquashes\nmusquashs\nmuss\nmussalman\nmussed\nmussel\nmussels\nmusses\nmussier\nmussiest\nmussily\nmussiness\nmussing\nmussolini\nmussorgsky\nmussulman\nmussulmans\nmussulmen\nmussy\nmust\nmustache\nmustached\nmustaches\nmustachio\nmustachioed\nmustachios\nmustang\nmustangs\nmustard\nmustards\nmustardy\nmusteline\nmuster\nmustered\nmustering\nmusters\nmusth\nmusths\nmustier\nmustiest\nmustily\nmustiness\nmustn\nmustn't\nmusts\nmusty\nmutability\nmutable\nmutableness\nmutably\nmutagen\nmutageneses\nmutagenesis\nmutagenic\nmutagenically\nmutagenicity\nmutagenize\nmutagenized\nmutagenizes\nmutagenizing\nmutagens\nmutandis\nmutant\nmutants\nmutase\nmutases\nmutate\nmutated\nmutates\nmutating\nmutation\nmutational\nmutationally\nmutations\nmutatis\nmutative\nmutchkin\nmutchkins\nmute\nmuted\nmutedly\nmutely\nmuteness\nmuter\nmutes\nmutest\nmutilate\nmutilated\nmutilates\nmutilating\nmutilation\nmutilations\nmutilative\nmutilator\nmutilators\nmutine\nmutined\nmutineer\nmutineers\nmutines\nmuting\nmutinied\nmutinies\nmutining\nmutinous\nmutinously\nmutinousness\nmutiny\nmutinying\nmutism\nmutisms\nmuton\nmutons\nmutt\nmutter\nmuttered\nmutterer\nmutterers\nmuttering\nmutterings\nmutters\nmutton\nmuttonchops\nmuttonfish\nmuttonfishes\nmuttonhead\nmuttonheaded\nmuttonheads\nmuttons\nmuttony\nmutts\nmutual\nmutualism\nmutualisms\nmutualist\nmutualistic\nmutualists\nmutuality\nmutualization\nmutualizations\nmutualize\nmutualized\nmutualizes\nmutualizing\nmutually\nmutuals\nmutuel\nmutuels\nmuumuu\nmuumuus\nmuzak\nmuzhik\nmuzhiks\nmuzjik\nmuzjiks\nmuztag\nmuztagata\nmuztagh\nmuzzier\nmuzziest\nmuzzily\nmuzziness\nmuzzle\nmuzzled\nmuzzleloader\nmuzzleloaders\nmuzzleloading\nmuzzler\nmuzzlers\nmuzzles\nmuzzling\nmuzzy\nmv\nmy\nmyalgia\nmyalgic\nmyanmar\nmyasthenia\nmyasthenic\nmyc\nmycelia\nmycelial\nmycelium\nmycenae\nmycenaean\nmycenaeans\nmycenian\nmycenians\nmycetoma\nmycetomas\nmycetomata\nmycetomatous\nmycetophagous\nmycetozoan\nmycetozoans\nmycobacteria\nmycobacterial\nmycobacterium\nmycoflora\nmycologic\nmycological\nmycologically\nmycologies\nmycologist\nmycologists\nmycology\nmycophagist\nmycophagists\nmycophagous\nmycophagy\nmycophile\nmycophiles\nmycoplasma\nmycoplasmal\nmycoplasmas\nmycorhiza\nmycorrhiza\nmycorrhizae\nmycorrhizal\nmycorrhizas\nmycoses\nmycosis\nmycotic\nmycotoxicoses\nmycotoxicosis\nmycotoxin\nmycotoxins\nmycs\nmydriasis\nmydriatic\nmydriatics\nmyelencephalic\nmyelencephalon\nmyelencephalons\nmyelin\nmyelinated\nmyelination\nmyelinations\nmyeline\nmyelines\nmyelinic\nmyelinization\nmyelinizations\nmyelinize\nmyelinized\nmyelinizes\nmyelinizing\nmyelins\nmyelitis\nmyeloblast\nmyeloblastic\nmyeloblasts\nmyelocyte\nmyelocytes\nmyelocytic\nmyelofibroses\nmyelofibrosis\nmyelofibrotic\nmyelogenic\nmyelogenous\nmyelogram\nmyelograms\nmyelography\nmyeloid\nmyeloma\nmyelomas\nmyelomata\nmyelomatoid\nmyelomatous\nmyelopathic\nmyelopathy\nmyeloproliferative\nmyiases\nmyiasis\nmykonos\nmylar\nmylonite\nmylonites\nmyna\nmynah\nmynahs\nmynas\nmynheer\nmynheers\nmyoblast\nmyoblasts\nmyocardia\nmyocardial\nmyocarditis\nmyocarditises\nmyocardium\nmyoclonic\nmyoclonus\nmyoclonuses\nmyoelectric\nmyoelectrical\nmyofibril\nmyofibrillar\nmyofibrils\nmyofilament\nmyofilaments\nmyogenetic\nmyogenic\nmyoglobin\nmyoglobins\nmyograph\nmyographs\nmyoinositol\nmyoinositols\nmyologic\nmyologist\nmyologists\nmyology\nmyoma\nmyomas\nmyomata\nmyomatous\nmyoneural\nmyopathic\nmyopathies\nmyopathy\nmyope\nmyopes\nmyopia\nmyopic\nmyopically\nmyosin\nmyosis\nmyositis\nmyositises\nmyosotis\nmyosotises\nmyotic\nmyotome\nmyotomes\nmyotonia\nmyotonias\nmyotonic\nmyriad\nmyriads\nmyriapod\nmyriapodous\nmyriapods\nmyriopod\nmyriopods\nmyristic\nmyrmecological\nmyrmecologist\nmyrmecologists\nmyrmecology\nmyrmecophile\nmyrmecophiles\nmyrmecophilous\nmyrmecophily\nmyrmidon\nmyrmidons\nmyrobalan\nmyrobalans\nmyrrh\nmyrtle\nmyself\nmysia\nmysian\nmysians\nmysid\nmysids\nmysophobia\nmysophobias\nmysore\nmystagogic\nmystagogue\nmystagogues\nmystagogy\nmysteries\nmysterious\nmysteriously\nmysteriousness\nmystery\nmystic\nmystical\nmystically\nmysticalness\nmysticete\nmysticetes\nmysticetous\nmysticism\nmystics\nmystification\nmystified\nmystifier\nmystifiers\nmystifies\nmystify\nmystifying\nmystifyingly\nmystique\nmystiques\nmyth\nmythic\nmythical\nmythically\nmythicize\nmythicized\nmythicizer\nmythicizers\nmythicizes\nmythicizing\nmythmaker\nmythmakers\nmythmaking\nmythographer\nmythographers\nmythographies\nmythography\nmythoi\nmythologer\nmythologers\nmythologic\nmythological\nmythologically\nmythologies\nmythologist\nmythologists\nmythologize\nmythologized\nmythologizer\nmythologizers\nmythologizes\nmythologizing\nmythology\nmythomania\nmythomaniac\nmythomanias\nmythopeic\nmythopoeia\nmythopoeic\nmythopoesis\nmythopoetic\nmythopoetical\nmythos\nmyths\nmythy\nmyxameba\nmyxamoeba\nmyxamoebae\nmyxamoebas\nmyxedema\nmyxedemas\nmyxedematous\nmyxedemic\nmyxobacteria\nmyxobacterium\nmyxoedema\nmyxoedemas\nmyxoid\nmyxoma\nmyxomas\nmyxomata\nmyxomatoses\nmyxomatosis\nmyxomatous\nmyxomycete\nmyxomycetes\nmyxoviral\nmyxovirus\nmyxoviruses\nmálaga\nmâche\nmâches\nmâché\nmâcon\nmälaren\nmärchen\nmédaillon\nmédaillons\nmédoc\nmélange\nmélanges\nménage\nménages\nménière\nmérida\nmérite\nmésalliance\nmésalliances\nmétier\nmétiers\nmétis\nmêlée\nmêlées\nmême\nmíkonos\nmílos\nmöbius\nmössbauer\nmüller\nmüllerian\nmünster\nn\nn'djamena\nn'gana\nn'ganas\nnaan\nnab\nnabataea\nnabataean\nnabataeans\nnabatean\nnabateans\nnabbed\nnabber\nnabbers\nnabbing\nnabe\nnabes\nnabob\nnabobs\nnabokov\nnaboth\nnabs\nnacelle\nnacelles\nnacho\nnachos\nnacre\nnacred\nnacreous\nnacres\nnada\nnadir\nnadirs\nnadu\nnaff\nnaffed\nnaffing\nnaffs\nnag\nnaga\nnagaland\nnagana\nnaganas\nnagar\nnagas\nnagasaki\nnagged\nnagger\nnaggers\nnagging\nnaggingly\nnags\nnah\nnahuatl\nnahuatlan\nnahuatls\nnahum\nnaiad\nnaiades\nnaiads\nnaif\nnaifs\nnail\nnailbrush\nnailbrushes\nnailed\nnailer\nnailers\nnailing\nnails\nnainsook\nnaipaul\nnaira\nnairas\nnairobi\nnaive\nnaively\nnaiveness\nnaiveties\nnaivety\nnaiveté\nnaked\nnakedly\nnakedness\nnaled\nnaleds\nnalidixic\nnalorphine\nnalorphines\nnaloxone\nnaloxones\nnaltrexone\nnaltrexones\nnam\nnama\nnamable\nnamaland\nnamaqualand\nnamas\nnamaycush\nnamaycushes\nnamby\nname\nnameable\nnamed\nnameless\nnamelessly\nnamelessness\nnamely\nnameplate\nnameplates\nnamer\nnamers\nnames\nnamesake\nnamesakes\nnametag\nnametags\nnametape\nnametapes\nnamib\nnamibia\nnamibian\nnamibians\nnaming\nnan\nnana\nnanak\nnanas\nnance\nnances\nnancy\nnandina\nnanism\nnanisms\nnankeen\nnankeens\nnankin\nnanking\nnankins\nnannie\nnannies\nnannofossil\nnannofossils\nnannoplankton\nnannoplanktons\nnanny\nnannyberries\nnannyberry\nnannyish\nnanoampere\nnanoamperes\nnanobecquerel\nnanobecquerels\nnanocandela\nnanocandelas\nnanocoulomb\nnanocoulombs\nnanoengineering\nnanofarad\nnanofarads\nnanofossil\nnanofossils\nnanogram\nnanograms\nnanohenries\nnanohenry\nnanohenrys\nnanohertz\nnanojoule\nnanojoules\nnanokelvin\nnanokelvins\nnanolumen\nnanolumens\nnanolux\nnanometer\nnanometers\nnanomole\nnanomoles\nnanonewton\nnanonewtons\nnanoohm\nnanoohms\nnanopascal\nnanopascals\nnanoplankton\nnanoplanktons\nnanoradian\nnanoradians\nnanosecond\nnanoseconds\nnanosiemens\nnanosievert\nnanosieverts\nnanosteradian\nnanosteradians\nnanotechnology\nnanotesla\nnanoteslas\nnanovolt\nnanovolts\nnanowatt\nnanowatts\nnanoweber\nnanowebers\nnansen\nnanterre\nnantes\nnanticoke\nnanticokes\nnantua\nnantucket\nnantucketer\nnantucketers\nnaoise\nnaomi\nnap\nnapa\nnapalm\nnapalmed\nnapalming\nnapalms\nnapas\nnape\nnaperies\nnaperville\nnapery\nnapes\nnaphtali\nnaphtha\nnaphthalene\nnaphthalenes\nnaphthalenic\nnaphthalin\nnaphthaline\nnaphthalines\nnaphthalins\nnaphthas\nnaphthene\nnaphthenes\nnaphthenic\nnaphthol\nnaphthols\nnaphthous\nnaphthylamine\nnaphthylamines\nnaphtol\nnaphtols\nnapier\nnapierian\nnapiform\nnapkin\nnapkins\nnaples\nnapless\nnapoleon\nnapoleonic\nnapoleons\nnapoli\nnapoléon\nnappa\nnappas\nnappe\nnapped\nnappes\nnappier\nnappies\nnappiest\nnapping\nnappy\nnaprapath\nnaprapathies\nnaprapaths\nnaprapathy\nnaproxen\nnaproxens\nnaps\nnaptime\nnaptimes\nnarbonne\nnarc\nnarceine\nnarceines\nnarcism\nnarcisms\nnarcissi\nnarcissism\nnarcissisms\nnarcissist\nnarcissistic\nnarcissistically\nnarcissists\nnarcissus\nnarcissuses\nnarco\nnarcoanalyses\nnarcoanalysis\nnarcoanalytic\nnarcodollar\nnarcodollars\nnarcokleptocracies\nnarcokleptocracy\nnarcolepsies\nnarcolepsy\nnarcoleptic\nnarcoma\nnarcomas\nnarcomata\nnarcos\nnarcoses\nnarcosis\nnarcosyntheses\nnarcosynthesis\nnarcotic\nnarcotically\nnarcotics\nnarcotism\nnarcotisms\nnarcotization\nnarcotizations\nnarcotize\nnarcotized\nnarcotizes\nnarcotizing\nnarcs\nnard\nnards\nnares\nnarghile\nnarghiles\nnargileh\nnargilehs\nnarial\nnaris\nnark\nnarked\nnarking\nnarks\nnarraganset\nnarragansets\nnarragansett\nnarragansetts\nnarratability\nnarratable\nnarrate\nnarrated\nnarrater\nnarraters\nnarrates\nnarrating\nnarration\nnarrational\nnarrationally\nnarrations\nnarrative\nnarratively\nnarratives\nnarratological\nnarratologist\nnarratologists\nnarratology\nnarrator\nnarrators\nnarrow\nnarrowback\nnarrowbacks\nnarrowband\nnarrowcast\nnarrowcaster\nnarrowcasters\nnarrowcasting\nnarrowcasts\nnarrowed\nnarrower\nnarrowest\nnarrowing\nnarrowish\nnarrowly\nnarrowness\nnarrows\nnarthex\nnarthexes\nnarváez\nnarwal\nnarwals\nnarwhal\nnarwhale\nnarwhales\nnarwhals\nnary\nnasal\nnasality\nnasalization\nnasalizations\nnasalize\nnasalized\nnasalizes\nnasalizing\nnasally\nnasals\nnascence\nnascency\nnascent\nnaseberries\nnaseberry\nnaseby\nnashville\nnasion\nnasions\nnaskapi\nnaskapis\nnasofrontal\nnasogastric\nnasopharyngeal\nnasopharynges\nnasopharynx\nnasopharynxes\nnassau\nnastic\nnastier\nnasties\nnastiest\nnastily\nnastiness\nnasturtium\nnasturtiums\nnasty\nnatal\nnatalities\nnatality\nnatant\nnatation\nnatations\nnatatorial\nnatatorium\nnatatory\nnatch\nnatchez\nnates\nnathan\nnathanael\nnatheless\nnathless\nnatick\nnaticks\nnation\nnational\nnationalism\nnationalist\nnationalistic\nnationalistically\nnationalists\nnationalities\nnationality\nnationalization\nnationalizations\nnationalize\nnationalized\nnationalizer\nnationalizers\nnationalizes\nnationalizing\nnationally\nnationals\nnationhood\nnationless\nnations\nnationwide\nnative\nnatively\nnativeness\nnatives\nnativism\nnativisms\nnativist\nnativistic\nnativists\nnativities\nnativity\nnato\nnatriureses\nnatriuresis\nnatriuretic\nnatrolite\nnatrolites\nnatron\nnatrons\nnatter\nnattered\nnattering\nnatters\nnattier\nnattiest\nnattily\nnattiness\nnatty\nnaturae\nnatural\nnaturalism\nnaturalist\nnaturalistic\nnaturalistically\nnaturalists\nnaturalizable\nnaturalization\nnaturalizations\nnaturalize\nnaturalized\nnaturalizes\nnaturalizing\nnaturally\nnaturalness\nnaturals\nnature\nnatured\nnaturedly\nnaturedness\nnaturel\nnatures\nnaturism\nnaturist\nnaturists\nnaturopath\nnaturopathic\nnaturopathies\nnaturopaths\nnaturopathy\nnaugahyde\nnaught\nnaughtier\nnaughties\nnaughtiest\nnaughtily\nnaughtiness\nnaughts\nnaughty\nnaumachia\nnaumachiae\nnaumachias\nnauplial\nnauplii\nnauplius\nnauru\nnauruan\nnauruans\nnausea\nnauseam\nnauseant\nnauseants\nnauseate\nnauseated\nnauseates\nnauseating\nnauseatingly\nnauseation\nnauseations\nnauseous\nnauseously\nnauseousness\nnausicaa\nnautch\nnautical\nnautically\nnautili\nnautiloid\nnautiloids\nnautilus\nnautiluses\nnavaho\nnavahos\nnavaid\nnavaids\nnavajo\nnavajos\nnaval\nnavarre\nnave\nnavel\nnavels\nnavelwort\nnavelworts\nnaves\nnavicular\nnaviculars\nnavies\nnavigability\nnavigable\nnavigableness\nnavigably\nnavigate\nnavigated\nnavigates\nnavigating\nnavigation\nnavigational\nnavigationally\nnavigations\nnavigator\nnavigators\nnavvies\nnavvy\nnavy\nnawab\nnawabs\nnaxos\nnay\nnays\nnaysaid\nnaysay\nnaysayer\nnaysayers\nnaysaying\nnaysays\nnazarene\nnazarenes\nnazareth\nnazarite\nnazarites\nnaze\nnazi\nnazification\nnazifications\nnazify\nnaziism\nnazirite\nnazirites\nnaziritism\nnazis\nnazism\nnaïf\nnaïfs\nnaïve\nnaïvely\nnaïver\nnaïvest\nnaïvety\nnaïveté\nnaïvetés\nnco\nncos\nncr\nndebele\nndebeles\nndjamena\nndongo\nndongos\nne\nne'er\nneandertal\nneanderthal\nneanderthaloid\nneanderthals\nneanthropic\nneap\nneapolitan\nneapolitans\nneaps\nnear\nnearby\nnearctic\nneared\nnearer\nnearest\nnearing\nnearly\nnearness\nnears\nnearshore\nnearside\nnearsighted\nnearsightedly\nnearsightedness\nneat\nneaten\nneatened\nneatening\nneatens\nneater\nneatest\nneath\nneatherd\nneatly\nneatness\nneats\nneb\nnebbish\nnebbishes\nnebbishy\nnebenkern\nnebenkerns\nnebraska\nnebraskan\nnebraskans\nnebs\nnebuchadnezzar\nnebuchadnezzars\nnebula\nnebulae\nnebular\nnebulas\nnebulization\nnebulizations\nnebulize\nnebulized\nnebulizer\nnebulizers\nnebulizes\nnebulizing\nnebulosities\nnebulosity\nnebulous\nnebulously\nnebulousness\nnecessaries\nnecessarily\nnecessary\nnecessitarian\nnecessitarianism\nnecessitarians\nnecessitate\nnecessitated\nnecessitates\nnecessitating\nnecessitation\nnecessitations\nnecessitative\nnecessities\nnecessitous\nnecessitously\nnecessitousness\nnecessity\nneck\nneckband\nneckbands\nnecked\nneckerchief\nneckerchiefs\nneckerchieves\nnecking\nneckings\nnecklace\nnecklaces\nneckless\nneckline\nnecklines\nneckpiece\nneckpieces\nnecks\nnecktie\nneckties\nneckwear\nnecrobiosis\nnecrobiotic\nnecrologic\nnecrological\nnecrologies\nnecrologist\nnecrologists\nnecrology\nnecromancer\nnecromancers\nnecromancy\nnecromantic\nnecromantically\nnecrophagia\nnecrophagias\nnecrophagous\nnecrophile\nnecrophiles\nnecrophilia\nnecrophiliac\nnecrophiliacs\nnecrophilic\nnecrophilism\nnecrophobia\nnecrophobias\nnecrophobic\nnecropoleis\nnecropolis\nnecropolises\nnecropsied\nnecropsies\nnecropsing\nnecropsy\nnecrose\nnecrosed\nnecroses\nnecrosing\nnecrosis\nnecrotic\nnecrotize\nnecrotized\nnecrotizes\nnecrotizing\nnecrotomies\nnecrotomy\nnectar\nnectarial\nnectaries\nnectarine\nnectarines\nnectarous\nnectars\nnectary\nnee\nneed\nneeded\nneedful\nneedfully\nneedfulness\nneedier\nneediest\nneediness\nneeding\nneedle\nneedlecraft\nneedlecrafts\nneedled\nneedlefish\nneedlefishes\nneedlelike\nneedlepoint\nneedlepointed\nneedlepointing\nneedlepoints\nneedler\nneedlers\nneedles\nneedless\nneedlessly\nneedlessness\nneedlewoman\nneedlewomen\nneedlework\nneedleworker\nneedleworkers\nneedling\nneedn\nneedn't\nneeds\nneedy\nneem\nneems\nnefarious\nnefariously\nnefariousness\nnefertiti\nnefyn\nnegate\nnegated\nnegater\nnegaters\nnegates\nnegating\nnegation\nnegational\nnegations\nnegative\nnegatived\nnegatively\nnegativeness\nnegatives\nnegativing\nnegativism\nnegativist\nnegativistic\nnegativists\nnegativity\nnegator\nnegators\nnegatory\nnegatron\nnegatrons\nnegev\nneglect\nneglected\nneglecter\nneglecters\nneglectful\nneglectfully\nneglectfulness\nneglecting\nneglects\nnegligee\nnegligees\nnegligence\nnegligent\nnegligently\nnegligibility\nnegligible\nnegligibleness\nnegligibly\nnegligé\nnegligée\nnegligées\nnegligés\nnegotiability\nnegotiable\nnegotiably\nnegotiant\nnegotiants\nnegotiate\nnegotiated\nnegotiates\nnegotiating\nnegotiation\nnegotiations\nnegotiator\nnegotiators\nnegotiatory\nnegress\nnegresses\nnegrillo\nnegrilloes\nnegrillos\nnegrito\nnegritoes\nnegritos\nnegritude\nnegro\nnegroes\nnegroid\nnegroids\nnegroness\nnegrophile\nnegrophiles\nnegrophilism\nnegrophobe\nnegrophobes\nnegrophobia\nnegros\nnegus\nneguses\nnehemiah\nnehemias\nnehru\nneigh\nneighbor\nneighbored\nneighborhood\nneighborhoods\nneighboring\nneighborliness\nneighborly\nneighbors\nneighed\nneighing\nneighs\nneither\nnekton\nnektonic\nnektons\nnellie\nnellies\nnelly\nnellyism\nnelson\nnelsons\nnem\nnematic\nnematicidal\nnematicide\nnematicides\nnematocidal\nnematocide\nnematocides\nnematocyst\nnematocystic\nnematocysts\nnematode\nnematodes\nnematological\nnematologist\nnematologists\nnematology\nnembutal\nnemean\nnemeans\nnemertean\nnemerteans\nnemertine\nnemertines\nnemeses\nnemesis\nnemophila\nnemophilas\nnene\nnenes\nnenets\nnennius\nneo\nneoarsphenamine\nneoarsphenamines\nneoclassic\nneoclassical\nneoclassicism\nneoclassicist\nneoclassicists\nneocolonial\nneocolonialism\nneocolonialist\nneocolonialists\nneocon\nneocons\nneoconservatism\nneoconservative\nneoconservatives\nneocortex\nneocortexes\nneocortical\nneocortices\nneodymium\nneofascism\nneofascist\nneofascists\nneogaea\nneogaean\nneogaeas\nneogea\nneogeas\nneogenesis\nneogenetic\nneoimpressionism\nneoimpressionist\nneoimpressionists\nneoliberal\nneoliberalism\nneoliberals\nneolith\nneolithic\nneoliths\nneological\nneologically\nneologies\nneologism\nneologisms\nneologist\nneologistic\nneologistical\nneologists\nneologize\nneologized\nneologizes\nneologizing\nneology\nneomycin\nneon\nneonatal\nneonatally\nneonate\nneonates\nneonatologist\nneonatologists\nneonatology\nneoned\nneoorthodox\nneoorthodoxy\nneopallia\nneopallium\nneopalliums\nneophilia\nneophiliac\nneophiliacs\nneophyte\nneophytes\nneoplasia\nneoplasias\nneoplasm\nneoplasms\nneoplastic\nneoplasticism\nneoplasticist\nneoplasticists\nneoplatonic\nneoplatonism\nneoplatonist\nneoplatonists\nneoprene\nneoptolemus\nneorealism\nneorealist\nneorealistic\nneorealists\nneorican\nneoricans\nneostigmine\nneostigmines\nneotenic\nneotenies\nneotenous\nneoteny\nneoteric\nneoterics\nneotropic\nneotropical\nneotropics\nneotype\nneotypes\nnepal\nnepalese\nnepali\nnepalis\nnepenthe\nnepenthean\nnepenthes\nnepheline\nnephelines\nnephelinic\nnephelinite\nnephelinites\nnephelinitic\nnephelite\nnephelites\nnephelometer\nnephelometers\nnephelometric\nnephelometrically\nnephelometry\nnephew\nnephews\nnephological\nnephology\nnephoscope\nnephoscopes\nnephrectomies\nnephrectomize\nnephrectomized\nnephrectomizes\nnephrectomizing\nnephrectomy\nnephric\nnephridia\nnephridial\nnephridium\nnephrite\nnephrites\nnephritic\nnephritides\nnephritis\nnephritises\nnephrogenic\nnephrogenous\nnephrologist\nnephrologists\nnephrology\nnephron\nnephrons\nnephropathic\nnephropathies\nnephropathy\nnephroses\nnephrosis\nnephrostome\nnephrostomes\nnephrotic\nnephrotomies\nnephrotomy\nnephrotoxic\nnephrotoxicity\nnepotism\nnepotist\nnepotistic\nnepotistical\nnepotists\nneptune\nneptunian\nneptunium\nneral\nnerals\nnerd\nnerdish\nnerds\nnerdy\nnereid\nnereides\nnereids\nnereis\nnereus\nneritic\nnero\nnerol\nneroli\nnerols\nneronian\nnerts\nnervate\nnervation\nnervations\nnerve\nnerved\nnerveless\nnervelessly\nnervelessness\nnerves\nnervier\nnerviest\nnervily\nnerviness\nnerving\nnervosa\nnervosity\nnervous\nnervously\nnervousness\nnervure\nnervures\nnervy\nnescience\nnesciences\nnescient\nnescients\nness\nnesselrode\nnesselrodes\nnesses\nnessus\nnest\nnested\nnester\nnesters\nnesting\nnestle\nnestled\nnestler\nnestlers\nnestles\nnestling\nnestlings\nnestor\nnestorian\nnestorianism\nnestorians\nnestorius\nnestors\nnests\nnet\nnetback\nnetbacks\nnether\nnetherlander\nnetherlanders\nnetherlandish\nnetherlands\nnethermost\nnetherworld\nnetherworldly\nnetherworlds\nnetkeeper\nnetkeepers\nnetless\nnetlike\nnetminder\nnetminders\nnets\nnetsuke\nnetsukes\nnetted\nnetter\nnetters\nnetting\nnettle\nnettled\nnettles\nnettlesome\nnettling\nnetty\nnetwork\nnetworked\nnetworker\nnetworkers\nnetworking\nnetworkings\nnetworks\nnetzahualcóyotl\nneuchâtel\nneufchâtel\nneum\nneumatic\nneume\nneumes\nneums\nneural\nneuralgia\nneuralgic\nneurally\nneuraminidase\nneuraminidases\nneurasthenia\nneurasthenic\nneurasthenically\nneurasthenics\nneurectomies\nneurectomy\nneurilemma\nneurilemmal\nneurilemmas\nneuristor\nneuristors\nneuritic\nneuritis\nneuroanatomical\nneuroanatomies\nneuroanatomist\nneuroanatomists\nneuroanatomy\nneurobiological\nneurobiologist\nneurobiologists\nneurobiology\nneuroblast\nneuroblastoma\nneuroblastomas\nneuroblastomata\nneuroblasts\nneurochemical\nneurochemist\nneurochemistry\nneurochemists\nneuroendocrine\nneuroendocrinological\nneuroendocrinologist\nneuroendocrinologists\nneuroendocrinology\nneurofibril\nneurofibrillary\nneurofibrils\nneurofibroma\nneurofibromas\nneurofibromata\nneurofibromatoses\nneurofibromatosis\nneurofilament\nneurofilamentous\nneurofilaments\nneurogeneses\nneurogenesis\nneurogenetics\nneurogenic\nneurogenically\nneuroglia\nneuroglial\nneurohormonal\nneurohormone\nneurohormones\nneurohypophyseal\nneurohypophyses\nneurohypophysial\nneurohypophysis\nneuroimaging\nneuroleptic\nneuroleptics\nneurologic\nneurological\nneurologically\nneurologist\nneurologists\nneurology\nneuroma\nneuromas\nneuromata\nneuromuscular\nneuron\nneuronal\nneurone\nneurones\nneuronic\nneuronically\nneurons\nneuropath\nneuropathic\nneuropathically\nneuropathies\nneuropathologic\nneuropathological\nneuropathologist\nneuropathologists\nneuropathology\nneuropaths\nneuropathy\nneuropharmacological\nneuropharmacologist\nneuropharmacologists\nneuropharmacology\nneurophysiologic\nneurophysiological\nneurophysiologist\nneurophysiologists\nneurophysiology\nneuropsychiatric\nneuropsychiatrist\nneuropsychiatrists\nneuropsychiatry\nneuropsychological\nneuropsychologist\nneuropsychologists\nneuropsychology\nneuropteran\nneuropterans\nneuropterous\nneuroradiological\nneuroradiologist\nneuroradiologists\nneuroradiology\nneuroscience\nneuroscientific\nneuroscientist\nneuroscientists\nneurosecretion\nneurosecretions\nneurosecretory\nneurosensory\nneuroses\nneurosis\nneurospora\nneurosurgeon\nneurosurgeons\nneurosurgeries\nneurosurgery\nneurosurgical\nneurotic\nneurotically\nneuroticism\nneurotics\nneurotomies\nneurotomy\nneurotoxic\nneurotoxicity\nneurotoxin\nneurotoxins\nneurotransmission\nneurotransmissions\nneurotransmitter\nneurotransmitters\nneurotropic\nneurotropism\nneurula\nneurulae\nneurulas\nneurulation\nneurulations\nneustadt\nneuston\nneustons\nneustria\nneustrian\nneustrians\nneuter\nneutered\nneutering\nneuters\nneutral\nneutralism\nneutralist\nneutralistic\nneutralists\nneutrality\nneutralization\nneutralizations\nneutralize\nneutralized\nneutralizer\nneutralizers\nneutralizes\nneutralizing\nneutrally\nneutralness\nneutrals\nneutrino\nneutrinoless\nneutrinos\nneutron\nneutronic\nneutrons\nneutrophil\nneutrophile\nneutrophilic\nneutrophils\nnevada\nnevadan\nnevadans\nnevadian\nnevadians\nnever\nneverland\nnevermore\nnevertheless\nnevi\nneville\nnevilles\nnevis\nnevoid\nnevus\nnew\nnewark\nnewborn\nnewborns\nnewburg\nnewburgh\nnewcastle\nnewcomen\nnewcomer\nnewcomers\nnewel\nnewels\nnewer\nnewest\nnewfangled\nnewfangledness\nnewfound\nnewfoundland\nnewfoundlander\nnewfoundlanders\nnewie\nnewies\nnewish\nnewly\nnewlywed\nnewlyweds\nnewmarket\nnewmarkets\nnewness\nnewport\nnews\nnewsagent\nnewsagents\nnewsboy\nnewsboys\nnewsbreak\nnewsbreaks\nnewscast\nnewscaster\nnewscasters\nnewscasts\nnewsdealer\nnewsdealers\nnewsgathering\nnewsgatherings\nnewsgirl\nnewsgirls\nnewsgroup\nnewsgroups\nnewshound\nnewshounds\nnewsier\nnewsiest\nnewsiness\nnewsless\nnewsletter\nnewsletters\nnewsmagazine\nnewsmagazines\nnewsmaker\nnewsmakers\nnewsman\nnewsmen\nnewsmonger\nnewsmongers\nnewspaper\nnewspapering\nnewspaperings\nnewspaperman\nnewspapermen\nnewspapers\nnewspaperwoman\nnewspaperwomen\nnewspeak\nnewspeople\nnewsperson\nnewspersons\nnewsprint\nnewsreader\nnewsreaders\nnewsreel\nnewsreels\nnewsroom\nnewsrooms\nnewsstand\nnewsstands\nnewsweeklies\nnewsweekly\nnewswire\nnewswires\nnewswoman\nnewswomen\nnewsworthier\nnewsworthiest\nnewsworthiness\nnewsworthy\nnewswriting\nnewsy\nnewt\nnewton\nnewtonian\nnewtons\nnewts\nnext\nnexus\nnexuses\nnez\nngorongoro\nngultrum\nngultrums\nnguni\nngunis\nngwee\nniacin\nniacinamide\nniagara\nnialamide\nniamey\nnib\nnibble\nnibbled\nnibbler\nnibblers\nnibbles\nnibbling\nnibelung\nnibelungen\nnibelungenlied\nnibelungs\nniblick\nniblicks\nnibs\nnicad\nnicads\nnicaea\nnicaragua\nnicaraguan\nnicaraguans\nniccolite\nniccolites\nnice\nnicely\nnicene\nniceness\nnicer\nnicest\nniceties\nnicety\nniche\nniched\nniches\nniching\nnicholas\nnichrome\nnick\nnicked\nnickel\nnickeled\nnickelic\nnickeliferous\nnickeling\nnickelled\nnickelling\nnickelodeon\nnickelodeons\nnickelous\nnickels\nnicker\nnickered\nnickering\nnickers\nnicking\nnickle\nnickles\nnicknack\nnicknacks\nnickname\nnicknamed\nnicknamer\nnicknamers\nnicknames\nnicknaming\nnicks\nnicobar\nnicodemus\nnicomedia\nnicosia\nnicotiana\nnicotianas\nnicotinamide\nnicotine\nnicotinic\nnicotinism\nnictate\nnictated\nnictates\nnictating\nnictitate\nnictitated\nnictitates\nnictitating\nnictitation\nnictitations\nnidate\nnidated\nnidates\nnidating\nnidation\nnidations\nniddering\nnidderings\nnide\nnides\nnidi\nnidicolous\nnidificate\nnidificated\nnidificates\nnidificating\nnidification\nnidifications\nnidified\nnidifies\nnidifugous\nnidify\nnidifying\nnidus\nniduses\nniece\nnieces\nnielli\nniellist\nniellists\nniello\nnielloed\nnielloing\nniellos\nnielsbohrium\nniente\nnietzsche\nnietzschean\nnietzscheans\nnifedipine\nnifedipines\nniflheim\nniftier\nnifties\nniftiest\nniftily\nniftiness\nnifty\nnigella\nnigellas\nniger\nnigeria\nnigerian\nnigerians\nniggard\nniggardliness\nniggardly\nniggards\nnigger\nniggers\nniggle\nniggled\nniggler\nnigglers\nniggles\nniggling\nnigglingly\nnigglings\nnigh\nnighed\nnigher\nnighest\nnighing\nnighs\nnight\nnightcap\nnightcaps\nnightclothes\nnightclub\nnightclubber\nnightclubbers\nnightclubby\nnightclubs\nnightdress\nnightdresses\nnighter\nnighters\nnightfall\nnightglow\nnightglows\nnightgown\nnightgowns\nnighthawk\nnighthawks\nnightie\nnighties\nnightingale\nnightingales\nnightjar\nnightjars\nnightless\nnightlife\nnightlong\nnightly\nnightmare\nnightmares\nnightmarish\nnightmarishly\nnightmarishness\nnightrider\nnightriders\nnights\nnightscape\nnightscapes\nnightscope\nnightscopes\nnightshade\nnightshades\nnightshirt\nnightshirts\nnightside\nnightsides\nnightspot\nnightspots\nnightstand\nnightstands\nnightstick\nnightsticks\nnighttime\nnightwalker\nnightwalkers\nnightwear\nnighty\nnigra\nnigrae\nnigrescence\nnigrescences\nnigrescent\nnigrosine\nnigrosines\nnihil\nnihilism\nnihilist\nnihilistic\nnihilistically\nnihilists\nnihilities\nnihility\nniihau\nnijinsky\nnike\nnikkei\nnil\nnile\nniles\nnilgai\nnilgais\nnill\nnilled\nnilling\nnills\nnilly\nnilotic\nnilpotency\nnilpotent\nnilpotents\nnim\nnimbi\nnimble\nnimbleness\nnimbler\nnimblest\nnimbly\nnimbostrati\nnimbostratus\nnimbus\nnimbuses\nnimes\nnimieties\nnimiety\nniminy\nnimmed\nnimming\nnimrod\nnimrods\nnims\nnincompoop\nnincompoopery\nnincompoops\nnine\nninebark\nninebarks\nninefold\nninepin\nninepins\nniner\nniners\nnines\nnineteen\nnineteenfold\nnineteens\nnineteenth\nnineteenths\nnineties\nninetieth\nninetieths\nninety\nninetyfold\nnineveh\nninhydrin\nninhydrins\nninja\nninjas\nninnies\nninny\nninnyhammer\nninnyhammers\nninon\nninons\nninth\nninthly\nninths\nniobate\nniobates\nniobe\nniobite\nniobites\nniobium\nnip\nnipa\nnipas\nniping\nnipped\nnipper\nnippers\nnippier\nnippiest\nnippily\nnippiness\nnipping\nnippingly\nnipple\nnippled\nnipples\nnipplewort\nnippleworts\nnippon\nnipponese\nnippy\nnips\nnirvana\nnirvanas\nnirvanic\nnisan\nnisei\nniseis\nnisi\nnissan\nnissans\nnissen\nnisus\nnit\nniter\nniterie\nniteries\nniters\nnitery\nnitid\nnitinol\nnitpick\nnitpicked\nnitpicker\nnitpickers\nnitpicking\nnitpickings\nnitpicks\nnitpicky\nnitrate\nnitrated\nnitrates\nnitrating\nnitration\nnitrations\nnitrator\nnitrators\nnitric\nnitride\nnitrided\nnitrides\nnitriding\nnitrifiable\nnitrification\nnitrifications\nnitrified\nnitrifier\nnitrifiers\nnitrifies\nnitrify\nnitrifying\nnitril\nnitrile\nnitriles\nnitrils\nnitrite\nnitrites\nnitro\nnitrobacteria\nnitrobacterium\nnitrobenzene\nnitrocellulose\nnitrocellulosic\nnitrochloroform\nnitrochloroforms\nnitrofuran\nnitrofurans\nnitrofurantoin\nnitrofurantoins\nnitrogen\nnitrogenase\nnitrogenases\nnitrogenize\nnitrogenized\nnitrogenizes\nnitrogenizing\nnitrogenous\nnitroglycerin\nnitroglycerine\nnitrohydrochloric\nnitromethane\nnitromethanes\nnitroparaffin\nnitroparaffins\nnitroreductase\nnitros\nnitrosamine\nnitrosamines\nnitrostarch\nnitrostarches\nnitrous\nnits\nnitty\nnitwit\nnitwits\nnitwitted\nniue\nnival\nniveous\nnivernais\nnix\nnixed\nnixes\nnixie\nnixies\nnixing\nnixy\nnizam\nnizamate\nnizams\nniño\nniños\nno\nnoachian\nnoachic\nnoachical\nnoah\nnoah's\nnob\nnobbier\nnobbiest\nnobble\nnobbled\nnobbler\nnobblers\nnobbles\nnobbling\nnobby\nnobel\nnobelist\nnobelists\nnobelium\nnobiliary\nnobilities\nnobility\nnoble\nnobleman\nnoblemen\nnobleness\nnobler\nnobles\nnoblesse\nnoblest\nnoblewoman\nnoblewomen\nnobly\nnobodies\nnobody\nnobs\nnocent\nnociceptive\nnociceptor\nnociceptors\nnock\nnocked\nnocking\nnocks\nnoctambulation\nnoctambulations\nnoctambulism\nnoctambulisms\nnoctambulist\nnoctambulists\nnoctiluca\nnoctilucas\nnoctilucent\nnoctuid\nnoctuids\nnoctule\nnoctules\nnocturn\nnocturnal\nnocturnally\nnocturne\nnocturnes\nnocturns\nnocuous\nnocuously\nnod\nnodal\nnodality\nnodally\nnodded\nnodder\nnodders\nnoddies\nnodding\nnoddle\nnoddles\nnoddy\nnode\nnodes\nnodi\nnodose\nnodosity\nnods\nnodular\nnodulation\nnodulations\nnodule\nnodules\nnodulose\nnodulous\nnodus\nnoel\nnoels\nnoes\nnoesis\nnoetic\nnog\nnoggin\nnogging\nnoggins\nnogs\nnoh\nnohow\nnoil\nnoils\nnoir\nnoire\nnoires\nnoirish\nnoise\nnoised\nnoiseless\nnoiselessly\nnoiselessness\nnoisemaker\nnoisemakers\nnoisemaking\nnoises\nnoisette\nnoisettes\nnoisier\nnoisiest\nnoisily\nnoisiness\nnoising\nnoisome\nnoisomely\nnoisomeness\nnoisy\nnolens\nnolle\nnolo\nnolos\nnom\nnoma\nnomad\nnomadic\nnomadically\nnomadism\nnomads\nnomarchies\nnomarchy\nnomas\nnombril\nnombrils\nnome\nnomen\nnomenclator\nnomenclatorial\nnomenclators\nnomenclatural\nnomenclature\nnomenclatures\nnomenklatura\nnomenklaturas\nnomes\nnomina\nnominal\nnominalism\nnominalist\nnominalistic\nnominalists\nnominalization\nnominalize\nnominalized\nnominalizes\nnominalizing\nnominally\nnominals\nnominate\nnominated\nnominates\nnominating\nnomination\nnominations\nnominative\nnominatives\nnominator\nnominators\nnominee\nnominees\nnomogram\nnomograms\nnomograph\nnomographic\nnomographs\nnomography\nnomologic\nnomological\nnomologically\nnomologist\nnomologists\nnomology\nnomothetic\nnomothetical\nnomothetically\nnoms\nnon\nnonabrasive\nnonabsorbable\nnonabsorbent\nnonabsorptive\nnonabstract\nnonacademic\nnonacceptance\nnonaccountable\nnonaccredited\nnonaccrual\nnonachievement\nnonacid\nnonacidic\nnonacquisitive\nnonacting\nnonaction\nnonactivated\nnonactor\nnonadaptive\nnonaddict\nnonaddictive\nnonadditive\nnonadditivity\nnonadhesive\nnonadiabatic\nnonadjacent\nnonadjustable\nnonadmirer\nnonadmission\nnonaesthetic\nnonaffiliated\nnonaffluent\nnonage\nnonagenarian\nnonagenarians\nnonages\nnonaggression\nnonaggressive\nnonagon\nnonagons\nnonagricultural\nnonalcoholic\nnonalcoholics\nnonaligned\nnonalignment\nnonallelic\nnonallergenic\nnonallergic\nnonalphabetic\nnonaluminum\nnonambiguous\nnonanalytic\nnonanatomic\nnonanimal\nnonanoic\nnonanswer\nnonantagonistic\nnonanthropological\nnonanthropologist\nnonantibiotic\nnonantigenic\nnonappearance\nnonappearances\nnonaquatic\nnonaqueous\nnonarable\nnonarbitrariness\nnonarbitrary\nnonarchitect\nnonarchitecture\nnonargument\nnonaristocratic\nnonaromatic\nnonart\nnonartist\nnonartistic\nnonary\nnonascetic\nnonaspirin\nnonassertive\nnonassessable\nnonassociated\nnonastronomical\nnonathlete\nnonathletic\nnonatomic\nnonattached\nnonattachment\nnonattendance\nnonattender\nnonauditory\nnonauthor\nnonauthoritarian\nnonautomated\nnonautomatic\nnonautomotive\nnonautonomous\nnonavailability\nnonbacterial\nnonbank\nnonbanking\nnonbarbiturate\nnonbaryonic\nnonbasic\nnonbearing\nnonbehavioral\nnonbeing\nnonbeings\nnonbelief\nnonbeliever\nnonbelievers\nnonbelligerency\nnonbelligerent\nnonbelligerents\nnonbetting\nnonbibliographic\nnonbinary\nnonbinding\nnonbiodegradable\nnonbiographical\nnonbiological\nnonbiologically\nnonbiologist\nnonbiting\nnonblack\nnonblacks\nnonblank\nnonbody\nnonbonded\nnonbonding\nnonbook\nnonbooks\nnonbotanist\nnonbrand\nnonbreakable\nnonbreathing\nnonbreeder\nnonbreeding\nnonbroadcast\nnonbuilding\nnonburnable\nnonbusiness\nnonbuying\nnoncabinet\nnoncaking\nnoncallable\nnoncaloric\nnoncampus\nnoncancelable\nnoncancerous\nnoncandidacy\nnoncandidate\nnoncandidates\nnoncannibalistic\nnoncapital\nnoncapitalist\nnoncarcinogen\nnoncarcinogenic\nnoncardiac\nnoncareer\nnoncarrier\nnoncash\nnoncasual\nnoncausal\nnonce\nnoncelebration\nnoncelebrity\nnoncellular\nnoncellulosic\nnoncentral\nnoncertificated\nnoncertified\nnonchalance\nnonchalant\nnonchalantly\nnoncharacter\nnoncharismatic\nnonchauvinist\nnonchemical\nnonchromosomal\nnonchronological\nnonchurch\nnonchurchgoer\nnoncircular\nnoncirculating\nnoncitizen\nnoncitizens\nnonclandestine\nnonclass\nnonclassical\nnonclassified\nnonclassroom\nnonclearing\nnonclerical\nnoncling\nnonclinical\nnonclogging\nnoncoercive\nnoncognitive\nnoncoherent\nnoncoincidence\nnoncoital\nnoncoking\nnoncola\nnoncollector\nnoncollege\nnoncollegiate\nnoncollinear\nnoncolor\nnoncolored\nnoncolorfast\nnoncom\nnoncombat\nnoncombatant\nnoncombatants\nnoncombative\nnoncombustible\nnoncommercial\nnoncommissioned\nnoncommitment\nnoncommittal\nnoncommittally\nnoncommitted\nnoncommunicating\nnoncommunication\nnoncommunicative\nnoncommunist\nnoncommunists\nnoncommunity\nnoncommutative\nnoncommutativity\nnoncomparability\nnoncomparable\nnoncompatible\nnoncompetition\nnoncompetitive\nnoncompetitor\nnoncomplementary\nnoncomplex\nnoncompliance\nnoncompliances\nnoncompliant\nnoncompliants\nnoncomplicated\nnoncomplying\nnoncomposer\nnoncompound\nnoncomprehension\nnoncompressible\nnoncompulsory\nnoncomputer\nnoncomputerized\nnoncoms\nnonconceptual\nnonconcern\nnonconclusion\nnonconcur\nnonconcured\nnonconcuring\nnonconcurrence\nnonconcurrent\nnonconcurring\nnonconcurs\nnoncondensable\nnonconditioned\nnonconducting\nnonconduction\nnonconductive\nnonconductor\nnonconductors\nnonconference\nnonconfidence\nnonconfidential\nnonconflicting\nnonconform\nnonconformance\nnonconformances\nnonconformed\nnonconformer\nnonconformers\nnonconforming\nnonconformism\nnonconformist\nnonconformists\nnonconformity\nnonconforms\nnonconfrontation\nnonconfrontational\nnoncongruent\nnonconjugated\nnonconnection\nnonconscious\nnonconsecutive\nnonconsensual\nnonconservation\nnonconservative\nnonconsolidated\nnonconstant\nnonconstitutional\nnonconstruction\nnonconstructive\nnonconsumer\nnonconsuming\nnonconsumption\nnonconsumptive\nnoncontact\nnoncontagious\nnoncontemporary\nnoncontiguous\nnoncontingent\nnoncontinuous\nnoncontract\nnoncontractual\nnoncontradiction\nnoncontradictory\nnoncontributing\nnoncontributory\nnoncontrollable\nnoncontrolled\nnoncontrolling\nnoncontroversial\nnonconventional\nnonconvertible\nnoncooperation\nnoncooperationist\nnoncooperationists\nnoncooperations\nnoncooperative\nnoncooperator\nnoncooperators\nnoncoplanar\nnoncorporate\nnoncorrelation\nnoncorrodible\nnoncorroding\nnoncorrosive\nnoncountry\nnoncounty\nnoncoverage\nnoncreative\nnoncreativity\nnoncredentialed\nnoncredit\nnoncrime\nnoncriminal\nnoncrisis\nnoncritical\nnoncrossover\nnoncrushable\nnoncrystalline\nnonculinary\nnoncultivated\nnoncultivation\nnoncultural\nnoncumulative\nnoncurrent\nnoncustodial\nnoncustomer\nnoncyclic\nnoncyclical\nnondairy\nnondance\nnondancer\nnondeceptive\nnondecision\nnondecreasing\nnondeductibility\nnondeductible\nnondeductive\nnondefense\nnondeferrable\nnondeforming\nnondegenerate\nnondegradable\nnondegree\nnondelegate\nnondeliberate\nnondelinquent\nnondelivery\nnondemanding\nnondemocratic\nnondenominational\nnondenominationalism\nnondepartmental\nnondependent\nnondepletable\nnondepleting\nnondeposition\nnondepressed\nnonderivative\nnondescript\nnondescriptive\nnondescriptly\nnondescripts\nnondesert\nnondestructive\nnondestructively\nnondestructiveness\nnondetachable\nnondeterministic\nnondevelopment\nnondeviant\nnondiabetic\nnondialyzable\nnondiapausing\nnondidactic\nnondiffusible\nnondimensional\nnondiplomatic\nnondirected\nnondirectional\nnondirective\nnondisabled\nnondisclosure\nnondisclosures\nnondiscount\nnondiscretionary\nnondiscrimination\nnondiscriminatory\nnondiscursive\nnondisjunction\nnondisjunctional\nnondisjunctions\nnondispersive\nnondisruptive\nnondistinctive\nnondiversified\nnondividing\nnondoctor\nnondoctrinaire\nnondocumentary\nnondogmatic\nnondollar\nnondomestic\nnondominant\nnondormant\nnondramatic\nnondrinker\nnondrinkers\nnondrinking\nnondriver\nnondrug\nnondrying\nnondurable\nnondurables\nnone\nnonearning\nnonecclesiastical\nnoneconomic\nnoneconomist\nnonedible\nnoneditorial\nnoneducation\nnoneducational\nnoneffective\nnonego\nnonelastic\nnonelected\nnonelection\nnonelective\nnonelectric\nnonelectrical\nnonelectrolyte\nnonelectrolytes\nnonelectronic\nnonelementary\nnonelite\nnonemergency\nnonemotional\nnonemphatic\nnonempirical\nnonemployee\nnonemployment\nnonempty\nnonencapsulated\nnonending\nnonenergy\nnonenforceability\nnonenforcement\nnonengagement\nnonengineering\nnonentertainment\nnonentities\nnonentity\nnonenzymatic\nnonenzymic\nnonequilibrium\nnonequivalence\nnonequivalent\nnonerotic\nnones\nnonessential\nnonessentials\nnonestablished\nnonestablishment\nnonesterified\nnonesuch\nnonesuches\nnonet\nnonetheless\nnonethical\nnonethnic\nnonets\nnonevaluative\nnonevent\nnonevents\nnonevidence\nnonexclusive\nnonexecutive\nnonexempt\nnonexistence\nnonexistent\nnonexistential\nnonexotic\nnonexpendable\nnonexperimental\nnonexpert\nnonexplanatory\nnonexploitation\nnonexploitative\nnonexploitive\nnonexplosive\nnonexplosives\nnonexposed\nnonextant\nnonfact\nnonfactor\nnonfactual\nnonfaculty\nnonfading\nnonfamilial\nnonfamily\nnonfan\nnonfarm\nnonfarmer\nnonfat\nnonfatal\nnonfattening\nnonfatty\nnonfeasance\nnonfederal\nnonfederated\nnonfeminist\nnonferrous\nnonfiction\nnonfictional\nnonfigurative\nnonfilamentous\nnonfilterable\nnonfinal\nnonfinancial\nnonfinite\nnonfissionable\nnonflammability\nnonflammable\nnonflowering\nnonfluency\nnonfluorescent\nnonflying\nnonfood\nnonforfeitable\nnonforfeiture\nnonformal\nnonfossil\nnonfraternization\nnonfreezing\nnonfrivolous\nnonfrozen\nnonfuel\nnonfulfillment\nnonfunctional\nnonfunctioning\nnongame\nnongaseous\nnongay\nnongenetic\nnongenital\nnongeometrical\nnonghetto\nnonglamorous\nnonglare\nnongolfer\nnongonococcal\nnongovernment\nnongovernmental\nnongraded\nnongraduate\nnongrammatical\nnongranular\nnongravitational\nnongreasy\nnongreen\nnongregarious\nnongrowing\nnongrowth\nnonguest\nnonhalogenated\nnonhandicapped\nnonhappening\nnonhardy\nnonharmonic\nnonhazardous\nnonheme\nnonhemolytic\nnonhereditary\nnonhero\nnonheroes\nnonhierarchical\nnonhistone\nnonhistorical\nnonhome\nnonhomogeneous\nnonhomologous\nnonhomosexual\nnonhormonal\nnonhospital\nnonhospitalized\nnonhostile\nnonhousing\nnonhuman\nnonhumans\nnonhunter\nnonhunting\nnonhygroscopic\nnonhysterical\nnonideal\nnonidentical\nnonidentity\nnonideological\nnonillion\nnonillions\nnonillionth\nnonillionths\nnonimage\nnonimitative\nnonimmigrant\nnonimmigrants\nnonimmune\nnonimpact\nnonimplication\nnonimportation\nnoninclusion\nnonincreasing\nnonincumbent\nnonindependence\nnonindigenous\nnonindividual\nnoninductive\nnonindustrial\nnonindustrialized\nnonindustry\nnoninfected\nnoninfectious\nnoninfective\nnoninfested\nnoninflammable\nnoninflammatory\nnoninflationary\nnoninflectional\nnoninfluence\nnoninformation\nnoninitial\nnoninitiate\nnoninjury\nnoninsect\nnoninsecticidal\nnoninstallment\nnoninstitutional\nnoninstitutionalized\nnoninstructional\nnoninstrumental\nnoninsurance\nnoninsured\nnonintegral\nnonintegrated\nnonintellectual\nnoninteracting\nnoninteractive\nnoninterchangeable\nnonintercourse\nnoninterest\nnoninterference\nnonintersecting\nnonintervention\nnoninterventionist\nnoninterventionists\nnonintimidating\nnonintoxicant\nnonintoxicating\nnonintrospective\nnonintrusive\nnonintuitive\nnoninvasive\nnoninvolved\nnoninvolvement\nnonionic\nnonionizing\nnonirradiated\nnonirrigated\nnonirritant\nnonirritating\nnonissue\nnonissues\nnonjoinder\nnonjoinders\nnonjoiner\nnonjudgmental\nnonjudicial\nnonjuring\nnonjuror\nnonjurors\nnonjury\nnonjusticiable\nnonkosher\nnonlabor\nnonlandowner\nnonlanguage\nnonlawyer\nnonleaded\nnonleague\nnonlegal\nnonlegume\nnonleguminous\nnonlethal\nnonlexical\nnonlibrarian\nnonlibrary\nnonlife\nnonlineal\nnonlinear\nnonlinearities\nnonlinearity\nnonlinearly\nnonlinguistic\nnonliquid\nnonliteral\nnonliterary\nnonliterate\nnonliterates\nnonliving\nnonlocal\nnonlogical\nnonluminous\nnonmagnetic\nnonmainstream\nnonmajor\nnonmalignant\nnonmalleable\nnonmammalian\nnonmanagement\nnonmanagerial\nnonmandatory\nnonmanual\nnonmanufacturing\nnonmarital\nnonmarket\nnonmarketable\nnonmaterial\nnonmaterialistic\nnonmathematical\nnonmatriculated\nnonmeaningful\nnonmeasurable\nnonmeat\nnonmechanical\nnonmechanistic\nnonmedical\nnonmeeting\nnonmember\nnonmembers\nnonmembership\nnonmental\nnonmercurial\nnonmetal\nnonmetallic\nnonmetals\nnonmetameric\nnonmetaphorical\nnonmetric\nnonmetrical\nnonmetro\nnonmetropolitan\nnonmicrobial\nnonmigrant\nnonmigratory\nnonmilitant\nnonmilitary\nnonmimetic\nnonminority\nnonmobile\nnonmolecular\nnonmonetarist\nnonmonetary\nnonmoney\nnonmonogamous\nnonmoral\nnonmotile\nnonmotility\nnonmotorized\nnonmoving\nnonmunicipal\nnonmusic\nnonmusical\nnonmusician\nnonmutant\nnonmyelinated\nnonmystical\nnonnarrative\nnonnational\nnonnative\nnonnatural\nnonnecessity\nnonnegative\nnonnegligent\nnonnegotiable\nnonnetwork\nnonneural\nnonnews\nnonnitrogenous\nnonnormative\nnonnovel\nnonnuclear\nnonnucleated\nnonnumeric\nnonnumerical\nnonnumerically\nnonnutritious\nnonnutritive\nnonobjective\nnonobjectivism\nnonobjectivist\nnonobjectivists\nnonobjectivity\nnonobligatory\nnonobscene\nnonobservance\nnonobservances\nnonobservant\nnonobservantly\nnonobvious\nnonoccupational\nnonoccurrence\nnonofficial\nnonohmic\nnonoily\nnonoperatic\nnonoperating\nnonoperational\nnonoperative\nnonoptimal\nnonorganic\nnonorgasmic\nnonorthodox\nnonoverlapping\nnonowner\nnonoxidizing\nnonoxynol\nnonpaid\nnonpainful\nnonparallel\nnonparametric\nnonparasitic\nnonpareil\nnonpareils\nnonparticipant\nnonparticipating\nnonparticipation\nnonparticipatory\nnonpartisan\nnonpartisans\nnonpartisanship\nnonpartisanships\nnonparty\nnonpasserine\nnonpassive\nnonpast\nnonpathogenic\nnonpaying\nnonpayment\nnonpeak\nnonperformance\nnonperformer\nnonperforming\nnonperishable\nnonpermanent\nnonpermissive\nnonpersistent\nnonperson\nnonpersonal\nnonpersons\nnonpetroleum\nnonphilosopher\nnonphilosophical\nnonphonemic\nnonphonetic\nnonphosphate\nnonphotographic\nnonphysical\nnonphysician\nnonplanar\nnonplastic\nnonplay\nnonplaying\nnonplus\nnonplused\nnonpluses\nnonplusing\nnonplussed\nnonplusses\nnonplussing\nnonpoetic\nnonpoint\nnonpoisonous\nnonpolar\nnonpolarizable\nnonpolice\nnonpolitical\nnonpolitically\nnonpolitician\nnonpolluting\nnonpoor\nnonporous\nnonpossession\nnonpractical\nnonpracticing\nnonpregnant\nnonprescription\nnonprime\nnonprint\nnonprinting\nnonproblem\nnonprocedural\nnonproducing\nnonproductive\nnonproductively\nnonproductiveness\nnonproductives\nnonprofessional\nnonprofessionally\nnonprofessionals\nnonprofessorial\nnonprofit\nnonprogram\nnonprogrammer\nnonprogressive\nnonproliferation\nnonproprietary\nnonpros\nnonprossed\nnonprosses\nnonprossing\nnonprotein\nnonpsychiatric\nnonpsychiatrist\nnonpsychological\nnonpsychotic\nnonpublic\nnonpunitive\nnonpurposive\nnonquantifiable\nnonquantitative\nnonracial\nnonracially\nnonradioactive\nnonrailroad\nnonrandom\nnonrandomness\nnonrated\nnonrational\nnonreactive\nnonreactor\nnonreader\nnonreaders\nnonreading\nnonrealistic\nnonreappointment\nnonreceipt\nnonreciprocal\nnonrecognition\nnonrecombinant\nnonrecourse\nnonrecoverable\nnonrectangular\nnonrecurrent\nnonrecurring\nnonrecursive\nnonrecyclable\nnonreducing\nnonredundant\nnonrefillable\nnonreflecting\nnonrefundable\nnonregulated\nnonregulation\nnonrelative\nnonrelativistic\nnonrelativistically\nnonrelevant\nnonreligious\nnonrenewable\nnonrenewal\nnonrepayable\nnonrepresentational\nnonrepresentationalism\nnonrepresentative\nnonreproductive\nnonresidence\nnonresidency\nnonresident\nnonresidential\nnonresidents\nnonresistance\nnonresistances\nnonresistant\nnonresistants\nnonresonant\nnonrespondent\nnonresponder\nnonresponse\nnonresponsive\nnonrestricted\nnonrestrictive\nnonretractile\nnonretroactive\nnonreturnable\nnonreusable\nnonreversible\nnonrevolutionary\nnonrigid\nnonrioter\nnonrioting\nnonromantic\nnonrotating\nnonroutine\nnonroyal\nnonrubber\nnonruling\nnonruminant\nnonsalable\nnonsaline\nnonsaponifiable\nnonscheduled\nnonschizophrenic\nnonschool\nnonscience\nnonscientific\nnonscientist\nnonscientists\nnonseasonal\nnonsecretor\nnonsecretors\nnonsecretory\nnonsectarian\nnonsectarianism\nnonsecure\nnonsedimentable\nnonsegregated\nnonsegregation\nnonselected\nnonselective\nnonself\nnonsensational\nnonsense\nnonsensical\nnonsensicality\nnonsensically\nnonsensicalness\nnonsensitive\nnonsensuous\nnonsentence\nnonseptate\nnonsequential\nnonserious\nnonsexist\nnonsexual\nnonshrink\nnonshrinkable\nnonsigner\nnonsignificance\nnonsignificant\nnonsignificantly\nnonsimultaneous\nnonsingular\nnonsinkable\nnonskater\nnonsked\nnonskeds\nnonskeletal\nnonskid\nnonskier\nnonslip\nnonsmoker\nnonsmokers\nnonsmoking\nnonsocial\nnonsocialist\nnonsolar\nnonsolid\nnonsolution\nnonspatial\nnonspeaker\nnonspeaking\nnonspecialist\nnonspecialists\nnonspecific\nnonspecifically\nnonspectacular\nnonspeculative\nnonspeech\nnonspherical\nnonsporting\nnonstandard\nnonstarter\nnonstarters\nnonstationary\nnonstatistical\nnonsteady\nnonsteroid\nnonsteroidal\nnonstick\nnonstop\nnonstory\nnonstrategic\nnonstructural\nnonstructured\nnonstudent\nnonstyle\nnonsubject\nnonsubjective\nnonsubsidized\nnonsuccess\nnonsuch\nnonsuches\nnonsugar\nnonsuit\nnonsuited\nnonsuiting\nnonsuits\nnonsuperimposable\nnonsupervisory\nnonsupport\nnonsurgical\nnonswimmer\nnonswimmers\nnonsyllabic\nnonsymbolic\nnonsymmetric\nnonsymmetrical\nnonsynchronous\nnonsystem\nnonsystematic\nnonsystemic\nnonsystems\nnontarget\nnontariff\nnontaxable\nnonteaching\nnontechnical\nnontemporal\nnontenured\nnonterminal\nnonterminating\nnontheatrical\nnontheist\nnontheistic\nnontheological\nnontheoretical\nnontherapeutic\nnonthermal\nnonthinking\nnonthreatening\nnontidal\nnontitle\nnontobacco\nnontonal\nnontotalitarian\nnontoxic\nnontraditional\nnontraditionally\nnontransferable\nnontransparent\nnontreatment\nnontrivial\nnontropical\nnonturbulent\nnontypical\nnonunanimous\nnonuniform\nnonuniformity\nnonunion\nnonunionized\nnonunique\nnonuniqueness\nnonuniversal\nnonuniversity\nnonuple\nnonuples\nnonurban\nnonurgent\nnonuse\nnonuser\nnonusers\nnonutilitarian\nnonutility\nnonutopian\nnonvalid\nnonvalidity\nnonvanishing\nnonvascular\nnonvector\nnonvectors\nnonvegetarian\nnonvenomous\nnonverbal\nnonverbally\nnonveteran\nnonviable\nnonviewer\nnonvintage\nnonviolence\nnonviolent\nnonviolently\nnonviral\nnonvirgin\nnonviscous\nnonvisual\nnonvocal\nnonvocational\nnonvolatile\nnonvolcanic\nnonvoluntary\nnonvoter\nnonvoters\nnonvoting\nnonwar\nnonwestern\nnonwhite\nnonwhites\nnonwinning\nnonwoody\nnonword\nnonwords\nnonwork\nnonworker\nnonworking\nnonwoven\nnonwovens\nnonwriter\nnonyellowing\nnonylphenylhydroxynonaoxyethylene\nnonzero\nnoodle\nnoodled\nnoodles\nnoodling\nnook\nnooks\nnooky\nnoon\nnoonday\nnooning\nnoons\nnoontide\nnoontime\nnoose\nnoosed\nnooses\nnoosing\nnoosphere\nnootka\nnootkas\nnopal\nnopals\nnope\nnor\nnor'easter\nnor'easters\nnor'wester\nnor'westers\nnoradrenalin\nnoradrenaline\nnoradrenalins\nnoradrenergic\nnoradrenergically\nnordic\nnordics\nnordkyn\nnordmann\nnorepinephrine\nnorepinephrines\nnorethindrone\nnorethindrones\nnorfolk\nnori\nnoria\nnorias\nnoricum\nnoris\nnorite\nnorites\nnoritic\nnorland\nnorm\nnorma\nnormal\nnormalcy\nnormality\nnormalizable\nnormalization\nnormalizations\nnormalize\nnormalized\nnormalizer\nnormalizers\nnormalizes\nnormalizing\nnormally\nnormals\nnorman\nnormande\nnormandy\nnormans\nnormative\nnormatively\nnormativeness\nnormed\nnormocyte\nnormocytes\nnormotensive\nnormotensives\nnormothermia\nnormothermic\nnorms\nnorn\nnornicotine\nnornicotines\nnorns\nnorrköping\nnorse\nnorseman\nnorsemen\nnorth\nnorthamptonshire\nnorthanger\nnorthbound\nnortheast\nnortheaster\nnortheasterly\nnortheastern\nnortheasterner\nnortheasterners\nnortheasternmost\nnortheasters\nnortheastward\nnortheastwardly\nnortheastwards\nnorther\nnortherlies\nnortherly\nnorthern\nnortherner\nnortherners\nnorthernmost\nnorthernness\nnorthers\nnorthing\nnorthings\nnorthland\nnorthlander\nnorthlanders\nnorthlands\nnorthman\nnorthmen\nnorthrop\nnorthumberland\nnorthumbria\nnorthumbrian\nnorthumbrians\nnorthward\nnorthwardly\nnorthwards\nnorthwest\nnorthwester\nnorthwesterly\nnorthwestern\nnorthwesterner\nnorthwesterners\nnorthwesternmost\nnorthwesters\nnorthwestward\nnorthwestwardly\nnorthwestwards\nnortriptyline\nnortriptylines\nnorway\nnorwegian\nnorwegians\nnorwich\nnose\nnosebag\nnosebags\nnoseband\nnosebands\nnosebleed\nnosebleeds\nnosed\nnosedive\nnosedives\nnosegay\nnosegays\nnoseguard\nnoseguards\nnosepiece\nnosepieces\nnoser\nnoses\nnosewheel\nnosewheels\nnosey\nnosh\nnoshed\nnosher\nnoshers\nnoshes\nnoshing\nnosier\nnosiest\nnosily\nnosiness\nnosing\nnosings\nnosocomial\nnosographer\nnosographers\nnosographic\nnosographical\nnosography\nnosologic\nnosological\nnosologically\nnosologies\nnosologist\nnosologists\nnosology\nnostalgia\nnostalgic\nnostalgically\nnostalgist\nnostalgists\nnostoc\nnostocs\nnostra\nnostradamus\nnostril\nnostrils\nnostrum\nnostrums\nnosy\nnot\nnota\nnotabilities\nnotability\nnotable\nnotableness\nnotables\nnotably\nnotarial\nnotarially\nnotaries\nnotarization\nnotarizations\nnotarize\nnotarized\nnotarizes\nnotarizing\nnotary\nnotate\nnotated\nnotates\nnotating\nnotation\nnotational\nnotations\nnotch\nnotchback\nnotchbacks\nnotched\nnotches\nnotching\nnote\nnotebook\nnotebooks\nnotecase\nnotecases\nnoted\nnotedly\nnotedness\nnoteless\nnotepad\nnotepads\nnotepaper\nnoter\nnoters\nnotes\nnoteworthier\nnoteworthiest\nnoteworthily\nnoteworthiness\nnoteworthy\nnothing\nnothingism\nnothingness\nnothings\nnotice\nnoticeability\nnoticeable\nnoticeably\nnoticed\nnoticer\nnoticers\nnotices\nnoticing\nnotifiable\nnotification\nnotifications\nnotified\nnotifier\nnotifiers\nnotifies\nnotify\nnotifying\nnoting\nnotion\nnotional\nnotionality\nnotionally\nnotions\nnotochord\nnotochordal\nnotochords\nnotogaea\nnotogea\nnotoriety\nnotorious\nnotoriously\nnotoriousness\nnotornis\nnottinghamshire\nnotum\nnotwithstanding\nnouakchott\nnougat\nnougats\nnought\nnoughts\nnoumena\nnoumenal\nnoumenon\nnouméa\nnoun\nnouns\nnourish\nnourished\nnourisher\nnourishers\nnourishes\nnourishing\nnourishment\nnourishments\nnous\nnouveau\nnouveaux\nnouvelle\nnova\nnovaculite\nnovaculites\nnovae\nnovalike\nnovas\nnovation\nnovations\nnovaya\nnovel\nnovelette\nnovelettes\nnovelettish\nnovelist\nnovelistic\nnovelistically\nnovelists\nnovelization\nnovelizations\nnovelize\nnovelized\nnovelizer\nnovelizers\nnovelizes\nnovelizing\nnovella\nnovellas\nnovelle\nnovelly\nnovels\nnovelties\nnovelty\nnovember\nnovembers\nnovemdecillion\nnovena\nnovenae\nnovenas\nnovercal\nnovgorod\nnovice\nnovices\nnoviciate\nnoviciates\nnovitiate\nnovitiates\nnovo\nnovobiocin\nnovobiocins\nnovocain\nnovocaine\nnovocaines\nnow\nnowadays\nnoway\nnoways\nnowhere\nnowhither\nnowise\nnowness\nnoxious\nnoxiously\nnoxiousness\nnozzle\nnozzles\nnoël\nnoëls\nns\nnt\nnth\nnu\nnuance\nnuanced\nnuances\nnub\nnuba\nnubbier\nnubbiest\nnubbin\nnubbins\nnubble\nnubbles\nnubbly\nnubby\nnubia\nnubian\nnubians\nnubile\nnubility\nnubs\nnucellar\nnucelli\nnucellus\nnucha\nnuchal\nnuchas\nnuclear\nnuclearization\nnuclearizations\nnuclearize\nnuclearized\nnuclearizes\nnuclearizing\nnuclease\nnucleases\nnucleate\nnucleated\nnucleates\nnucleating\nnucleation\nnucleations\nnucleator\nnucleators\nnuclei\nnucleic\nnuclein\nnucleinic\nnucleins\nnucleocapsid\nnucleocapsids\nnucleohistone\nnucleohistones\nnucleoid\nnucleoids\nnucleolar\nnucleolate\nnucleolated\nnucleoli\nnucleolus\nnucleon\nnucleonic\nnucleonics\nnucleons\nnucleophile\nnucleophiles\nnucleophilic\nnucleophilically\nnucleophilicity\nnucleoplasm\nnucleoplasmatic\nnucleoplasmic\nnucleoplasms\nnucleoprotein\nnucleoproteins\nnucleoside\nnucleosides\nnucleosomal\nnucleosome\nnucleosomes\nnucleosynthesis\nnucleosynthetic\nnucleotidase\nnucleotidases\nnucleotide\nnucleotides\nnucleus\nnucleuses\nnuclide\nnuclides\nnuclidic\nnude\nnudely\nnudeness\nnuder\nnudes\nnudest\nnudge\nnudged\nnudger\nnudgers\nnudges\nnudging\nnudibranch\nnudibranches\nnudibranchian\nnudibranchians\nnudibranchiate\nnudibranchiates\nnudism\nnudist\nnudists\nnudity\nnudnick\nnudnicks\nnudnik\nnudniks\nnudzh\nnudzhed\nnudzhes\nnudzhing\nnudzhs\nnugatory\nnugget\nnuggets\nnuisance\nnuisances\nnuke\nnuked\nnukes\nnuking\nnull\nnullah\nnullahs\nnullarbor\nnulled\nnullification\nnullificationist\nnullificationists\nnullifications\nnullified\nnullifier\nnullifiers\nnullifies\nnullify\nnullifying\nnulling\nnullipara\nnulliparas\nnulliparous\nnullities\nnullity\nnulls\nnumb\nnumbed\nnumber\nnumberable\nnumbered\nnumberer\nnumberers\nnumbering\nnumberings\nnumberless\nnumbers\nnumbest\nnumbfish\nnumbfishes\nnumbing\nnumbingly\nnumbly\nnumbness\nnumbs\nnumbskull\nnumbskulls\nnumen\nnumerable\nnumeracy\nnumeral\nnumerally\nnumerals\nnumerary\nnumerate\nnumerated\nnumerates\nnumerating\nnumeration\nnumerations\nnumerator\nnumerators\nnumeric\nnumerical\nnumerically\nnumerics\nnumero\nnumerological\nnumerologist\nnumerologists\nnumerology\nnumerous\nnumerously\nnumerousness\nnumidia\nnumidian\nnumidians\nnumina\nnuminous\nnuminousness\nnumismatic\nnumismatically\nnumismatics\nnumismatist\nnumismatists\nnummular\nnummulite\nnummulites\nnummulitic\nnumskull\nnumskulls\nnun\nnunatak\nnunataks\nnunc\nnunchaku\nnunchakus\nnunciature\nnunciatures\nnuncio\nnuncios\nnuncle\nnuncles\nnuncupative\nnunivak\nnunlike\nnunneries\nnunnery\nnuns\nnuptial\nnuptiality\nnuptially\nnuptials\nnurd\nnurds\nnuremberg\nnureyev\nnuristan\nnuristani\nnuristanis\nnurse\nnursed\nnursemaid\nnursemaids\nnurser\nnurseries\nnursers\nnursery\nnurseryman\nnurserymen\nnurses\nnursing\nnursling\nnurslings\nnurturance\nnurturances\nnurturant\nnurture\nnurtured\nnurturer\nnurturers\nnurtures\nnurturing\nnut\nnutate\nnutated\nnutates\nnutating\nnutation\nnutational\nnutations\nnutcase\nnutcases\nnutcracker\nnutcrackers\nnutgall\nnutgalls\nnuthatch\nnuthatches\nnuthouse\nnuthouses\nnutlet\nnutlets\nnutlike\nnutmeat\nnutmeats\nnutmeg\nnutmegs\nnutpick\nnutpicks\nnutria\nnutrias\nnutrient\nnutrients\nnutriment\nnutrimental\nnutriments\nnutrition\nnutritional\nnutritionally\nnutritionist\nnutritionists\nnutritious\nnutritiously\nnutritiousness\nnutritive\nnutritively\nnuts\nnutsedge\nnutshell\nnutshells\nnutted\nnutter\nnutters\nnuttier\nnuttiest\nnuttily\nnuttiness\nnutting\nnutty\nnux\nnuzzle\nnuzzled\nnuzzler\nnuzzlers\nnuzzles\nnuzzling\nnw\nnyala\nnyalas\nnyanja\nnyasa\nnyasaland\nnyctalopia\nnyctalopias\nnyctalopic\nnyctitropic\nnyctitropism\nnyctitropisms\nnyctophobia\nnyctophobias\nnyet\nnylon\nnylons\nnymph\nnympha\nnymphae\nnymphal\nnymphalid\nnymphalids\nnymphet\nnymphets\nnymphette\nnymphettes\nnympho\nnympholepsies\nnympholepsy\nnympholept\nnympholeptic\nnympholepts\nnymphomania\nnymphomaniac\nnymphomaniacal\nnymphomaniacs\nnymphos\nnymphs\nnynorsk\nnystagmic\nnystagmus\nnystagmuses\nnystatin\nnystatins\nnáxos\nnée\nnévé\nnîmes\nnürnberg\no\no'clock\no'er\no'neill\no'odham\no'odhams\noaf\noafish\noafishly\noafishness\noafs\noahu\noak\noaken\noakland\noakley\noakleys\noakmoss\noakmosses\noaks\noakum\noar\noared\noarfish\noarfishes\noaring\noarless\noarlock\noarlocks\noars\noarsman\noarsmanship\noarsmen\noarswoman\noarswomen\noases\noasis\noast\noasts\noat\noatcake\noatcakes\noaten\noater\noaters\noath\noaths\noatmeal\noats\nobadiah\nobbligati\nobbligato\nobbligatos\nobcompressed\nobcordate\nobduracy\nobdurate\nobdurately\nobdurateness\nobeah\nobeahs\nobedience\nobedient\nobediently\nobeisance\nobeisances\nobeisant\nobeisantly\nobeli\nobelia\nobelias\nobeliscal\nobelisk\nobeliskoid\nobelisks\nobelize\nobelized\nobelizes\nobelizing\nobelus\nobento\nobentos\noberammergau\noberon\nobese\nobesely\nobeseness\nobesity\nobey\nobeyed\nobeyer\nobeyers\nobeying\nobeys\nobfuscate\nobfuscated\nobfuscates\nobfuscating\nobfuscation\nobfuscations\nobfuscatory\nobi\nobie\nobies\nobis\nobit\nobiter\nobits\nobituaries\nobituarist\nobituarists\nobituary\nobject\nobjected\nobjectification\nobjectifications\nobjectified\nobjectifier\nobjectifiers\nobjectifies\nobjectify\nobjectifying\nobjecting\nobjection\nobjectionability\nobjectionable\nobjectionableness\nobjectionably\nobjections\nobjective\nobjectively\nobjectiveness\nobjectives\nobjectivism\nobjectivist\nobjectivistic\nobjectivists\nobjectivity\nobjectivization\nobjectivizations\nobjectivize\nobjectivized\nobjectivizes\nobjectivizing\nobjectless\nobjectlessness\nobjector\nobjectors\nobjects\nobjet\nobjets\nobjurgate\nobjurgated\nobjurgates\nobjurgating\nobjurgation\nobjurgations\nobjurgatorily\nobjurgatory\noblanceolate\noblast\noblasti\noblasts\noblate\noblately\noblateness\noblates\noblation\noblational\noblations\noblatory\nobligable\nobligate\nobligated\nobligately\nobligates\nobligati\nobligating\nobligation\nobligational\nobligations\nobligato\nobligator\nobligatorily\nobligators\nobligatory\nobligatos\noblige\nobliged\nobligee\nobligees\nobliger\nobligers\nobliges\nobliging\nobligingly\nobligingness\nobligor\nobligors\noblique\nobliqued\nobliquely\nobliqueness\nobliques\nobliquing\nobliquities\nobliquitous\nobliquity\nobliterate\nobliterated\nobliterates\nobliterating\nobliteration\nobliterations\nobliterative\nobliterator\nobliterators\noblivion\noblivious\nobliviously\nobliviousness\noblong\noblongata\noblongatae\noblongatas\noblongs\nobloquies\nobloquy\nobnoxious\nobnoxiously\nobnoxiousness\nobnubilate\nobnubilated\nobnubilates\nobnubilating\nobnubilation\nobnubilations\noboe\noboes\noboist\noboists\nobol\noboli\nobols\nobolus\nobovate\nobovoid\nobscene\nobscenely\nobsceneness\nobscener\nobscenest\nobscenities\nobscenity\nobscura\nobscurant\nobscurantic\nobscurantism\nobscurantist\nobscurantists\nobscurants\nobscuras\nobscuration\nobscurations\nobscure\nobscured\nobscurely\nobscureness\nobscurer\nobscurers\nobscures\nobscurest\nobscuring\nobscurities\nobscurity\nobsequies\nobsequious\nobsequiously\nobsequiousness\nobsequy\nobservability\nobservable\nobservables\nobservably\nobservance\nobservances\nobservant\nobservantly\nobservants\nobservation\nobservational\nobservationally\nobservations\nobservatories\nobservatory\nobserve\nobserved\nobserver\nobservers\nobserves\nobserving\nobservingly\nobsess\nobsessed\nobsesses\nobsessing\nobsession\nobsessional\nobsessionally\nobsessions\nobsessive\nobsessively\nobsessiveness\nobsessives\nobsessor\nobsessors\nobsidian\nobsidians\nobsolesce\nobsolesced\nobsolescence\nobsolescent\nobsolescently\nobsolesces\nobsolescing\nobsolete\nobsoleted\nobsoletely\nobsoleteness\nobsoletes\nobsoleting\nobsoletism\nobstacle\nobstacles\nobstante\nobstetric\nobstetrical\nobstetrically\nobstetrician\nobstetricians\nobstetrics\nobstinacies\nobstinacy\nobstinate\nobstinately\nobstinateness\nobstreperous\nobstreperously\nobstreperousness\nobstruct\nobstructed\nobstructer\nobstructers\nobstructing\nobstruction\nobstructionism\nobstructionist\nobstructionistic\nobstructionists\nobstructions\nobstructive\nobstructively\nobstructiveness\nobstructor\nobstructors\nobstructs\nobstruent\nobstruents\nobtain\nobtainability\nobtainable\nobtained\nobtainer\nobtainers\nobtaining\nobtainment\nobtainments\nobtains\nobtect\nobtected\nobtest\nobtestation\nobtestations\nobtested\nobtesting\nobtests\nobtrude\nobtruded\nobtruder\nobtruders\nobtrudes\nobtruding\nobtrusion\nobtrusions\nobtrusive\nobtrusively\nobtrusiveness\nobtund\nobtunded\nobtundent\nobtunding\nobtundity\nobtunds\nobturate\nobturated\nobturates\nobturating\nobturation\nobturations\nobturator\nobturators\nobtuse\nobtusely\nobtuseness\nobtuser\nobtusest\nobverse\nobversely\nobverses\nobversion\nobversions\nobvert\nobverted\nobverting\nobverts\nobviate\nobviated\nobviates\nobviating\nobviation\nobviations\nobviator\nobviators\nobvious\nobviously\nobviousness\noca\nocarina\nocarinas\nocas\noccam\noccasion\noccasional\noccasionally\noccasioned\noccasioning\noccasions\noccident\noccidental\noccidentalism\noccidentalization\noccidentalizations\noccidentalize\noccidentalized\noccidentalizes\noccidentalizing\noccidentally\noccidentals\noccipita\noccipital\noccipitally\noccipitals\nocciput\nocciputs\noccitan\noccitanian\noccitans\nocclude\noccluded\noccludent\noccludes\noccluding\nocclusal\nocclusion\nocclusions\nocclusive\nocclusives\noccult\noccultation\noccultations\nocculted\nocculter\nocculters\nocculting\noccultism\noccultist\noccultists\noccultly\noccultness\noccults\noccupancies\noccupancy\noccupant\noccupants\noccupation\noccupational\noccupationally\noccupations\noccupied\noccupier\noccupiers\noccupies\noccupy\noccupying\noccur\noccurred\noccurrence\noccurrences\noccurrent\noccurring\noccurs\nocean\noceanaria\noceanarium\noceanariums\noceanaut\noceanauts\noceanfront\noceangoing\noceania\noceanian\noceanians\noceanic\noceanid\noceanides\noceanids\noceanographer\noceanographers\noceanographic\noceanographical\noceanographically\noceanography\noceanologic\noceanological\noceanologically\noceanologist\noceanologists\noceanology\noceans\noceanus\nocellar\nocellate\nocellated\nocellation\nocellations\nocelli\nocellus\nocelot\nocelots\nocher\nocherous\nochers\nochery\nochlocracies\nochlocracy\nochlocrat\nochlocratic\nochlocratical\nochlocratically\nochlocrats\nochlophobia\nochlophobic\nochlophobics\nochre\nochreous\nochres\nockham\nocotillo\nocotillos\nocrea\nocreae\noctad\noctadic\noctads\noctagon\noctagonal\noctagonally\noctagons\noctahedra\noctahedral\noctahedrally\noctahedron\noctahedrons\noctal\noctamerous\noctameter\noctameters\noctandrious\noctane\noctans\noctant\noctantal\noctants\noctapeptide\noctapeptides\noctastyle\noctaval\noctavalent\noctave\noctaves\noctavian\noctavius\noctavo\noctavos\noctennial\noctet\noctets\noctillion\noctillions\noctillionth\noctillionths\noctober\noctobers\noctobrist\noctobrists\noctocentenary\noctodecillion\noctodecimo\noctodecimos\noctogenarian\noctogenarians\noctometer\noctometers\noctonaries\noctonary\noctopi\noctoploid\noctoploids\noctopod\noctopodous\noctopods\noctopus\noctopuses\noctoroon\noctoroons\noctosyllabic\noctosyllabics\noctosyllable\noctosyllables\noctothorp\noctothorps\noctuple\noctupled\noctuples\noctupling\noctylcyanoacrylate\nocular\nocularist\nocularists\noculars\noculi\noculist\noculists\noculogyric\noculomotor\noculus\nodalisk\nodalisks\nodalisque\nodalisques\nodd\noddball\noddballs\nodder\noddest\noddish\noddities\noddity\noddjobber\noddjobbers\noddly\noddment\noddments\noddness\nodds\noddsmaker\noddsmakers\node\nodea\nodense\nodeon\noder\nodes\nodessa\nodeum\nodic\nodin\nodious\nodiously\nodiousness\nodist\nodists\nodium\nodograph\nodographs\nodometer\nodometers\nodometry\nodonate\nodonates\nodontalgia\nodontalgias\nodontalgic\nodontoblast\nodontoblastic\nodontoblasts\nodontoglossum\nodontoid\nodontological\nodontologically\nodontologist\nodontologists\nodontology\nodontophoral\nodontophore\nodontophores\nodontophorine\nodontophorous\nodor\nodorant\nodorants\nodored\nodoriferous\nodoriferously\nodoriferousness\nodorize\nodorized\nodorizes\nodorizing\nodorless\nodorlessly\nodorlessness\nodorous\nodorously\nodorousness\nodors\nodyssean\nodysseus\nodyssey\nodysseys\noecumenical\noedema\noedipal\noedipally\noedipus\noeil\noeillade\noeillades\noeils\noenological\noenologist\noenologists\noenology\noenomel\noenomels\noenone\noenophile\noenophiles\noersted\noersteds\noesophagi\noesophagus\noestrogen\noestrogens\noestrus\noeuvre\noeuvres\nof\nofay\noff\noffa\noffal\noffbeat\noffcast\noffcasts\noffcut\noffcuts\noffed\noffenbach\noffence\noffences\noffend\noffended\noffender\noffenders\noffending\noffends\noffense\noffenseless\noffenses\noffensive\noffensively\noffensiveness\noffensives\noffer\noffered\nofferer\nofferers\noffering\nofferings\nofferor\nofferors\noffers\noffertories\noffertory\noffhand\noffhanded\noffhandedly\noffhandedness\noffice\nofficeholder\nofficeholders\nofficemate\nofficemates\nofficer\nofficered\nofficering\nofficers\noffices\nofficial\nofficialdom\nofficialdoms\nofficialese\nofficialeses\nofficialism\nofficially\nofficials\nofficiant\nofficiants\nofficiaries\nofficiary\nofficiate\nofficiated\nofficiates\nofficiating\nofficiation\nofficiations\nofficiator\nofficiators\nofficinal\nofficinally\nofficinals\nofficio\nofficious\nofficiously\nofficiousness\noffing\noffish\noffishly\noffishness\noffline\noffload\noffloaded\noffloading\noffloads\noffprint\noffprinted\noffprinting\noffprints\noffs\noffscouring\noffscourings\noffscreen\noffset\noffsets\noffsetting\noffshoot\noffshoots\noffshore\noffside\noffsides\noffspring\noffsprings\noffstage\nofftrack\noffy\noft\noften\noftener\noftenest\noftentimes\nofttimes\nogam\nogams\nogee\nogees\nogham\noghamic\noghamist\noghamists\noghams\nogival\nogive\nogives\noglala\noglalas\nogle\nogled\nogler\noglers\nogles\nogling\nogre\nogreish\nogres\nogress\nogresses\noh\nohia\nohio\nohioan\nohioans\nohm\nohmic\nohmically\nohmmeter\nohmmeters\nohms\noho\noidia\noidium\noil\noilbird\noilbirds\noilcan\noilcans\noilcloth\noilcloths\noiled\noiler\noilers\noilfield\noilfields\noilier\noiliest\noilily\noiliness\noiling\noilman\noilmen\noilpaper\noilpapers\noils\noilseed\noilseeds\noilskin\noilskins\noilstone\noilstones\noily\noink\noinked\noinking\noinks\nointment\nointments\noireachtas\noiticica\noiticicas\nojibwa\nojibwas\nojibway\nojibways\nok\nok'd\nok'ing\nok's\noka\nokapi\nokapis\nokas\nokay\nokayed\nokaying\nokays\nokeechobee\nokeydoke\nokeydokey\nokhotsk\nokie\nokies\nokinawa\noklahoma\noklahoman\noklahomans\nokra\nokras\noks\noktoberfest\nolaf\nold\nolden\noldenburg\nolder\noldest\noldfangled\noldie\noldies\noldish\noldness\nolds\noldsquaw\noldsquaws\noldster\noldsters\noldwife\noldwives\nolea\noleaginous\noleaginously\noleaginousness\noleander\noleanders\noleandomycin\noleaster\noleasters\noleate\noleates\nolecranal\nolecranial\nolecranian\nolecranon\nolecranons\nolefin\nolefinic\nolefins\noleic\nolein\noleine\noleines\noleins\noleo\noleograph\noleographer\noleographers\noleographic\noleographs\noleography\noleomargarine\noleomargarines\noleoresin\noleoresinous\noleoresins\noleos\noleum\noleums\nolfaction\nolfactometer\nolfactometers\nolfactometric\nolfactometry\nolfactory\nolicook\nolicooks\noligarch\noligarchic\noligarchical\noligarchies\noligarchs\noligarchy\noligocene\noligochaete\noligochaetes\noligochaetous\noligochete\noligochetes\noligoclase\noligoclases\noligodendrocyte\noligodendrocytes\noligodendroglia\noligodendroglial\noligodendroglias\noligomer\noligomeric\noligomerization\noligomerizations\noligomers\noligonucleotide\noligonucleotides\noligophagous\noligophagy\noligopolies\noligopolistic\noligopoly\noligopsonies\noligopsonistic\noligopsony\noligosaccharide\noligosaccharides\noligotrophic\noligotrophy\nolingo\nolingos\nolio\nolios\nolivaceous\nolive\nolivenite\nolivenites\noliver\nolives\nolivewood\nolivewoods\nolivia\nolivier\nolivine\nolivinic\nolivinitic\nolla\nollas\nolmec\nolmecs\nologies\nology\nololiuqui\noloroso\nolorosos\nolympia\nolympiad\nolympiads\nolympian\nolympians\nolympic\nolympics\nolympus\nolé\nom\nomaha\nomahas\noman\nomani\nomanis\nomar\nomasa\nomasum\nomayyad\nomber\nombre\nombudsman\nombudsmanship\nombudsmen\nombudsperson\nombudspersons\nombudspersonship\nombudswoman\nombudswomanship\nombudswomen\nomdurman\nomega\nomegas\nomelet\nomelets\nomelette\nomelettes\nomen\nomened\nomening\nomens\nomenta\nomental\nomentum\nomentums\nomer\nomers\nomertà\nomicron\nomicrons\nominous\nominously\nominousness\nomissible\nomission\nomissions\nomissive\nomit\nomits\nomitted\nomitting\nommatidia\nommatidial\nommatidium\nommatophore\nommatophores\nommatophorous\nommiad\nomnibus\nomnibuses\nomnicompetence\nomnicompetent\nomnidirectional\nomnifarious\nomnifariously\nomnifariousness\nomnificent\nomnipotence\nomnipotency\nomnipotent\nomnipotently\nomnipotents\nomnipresence\nomnipresent\nomnirange\nomniranges\nomniscience\nomnisciency\nomniscient\nomnisciently\nomniscients\nomnium\nomnivore\nomnivores\nomnivorous\nomnivorously\nomnivorousness\nomphali\nomphalos\nomphaloskepsis\nomsk\non\nonager\nonagers\nonanism\nonanist\nonanistic\nonanists\nonboard\nonce\nonchocerciasis\noncidium\noncidiums\noncogene\noncogenes\noncogenesis\noncogenic\noncogenicity\noncologic\noncological\noncologist\noncologists\noncology\noncoming\noncornavirus\noncornaviruses\none\none's\nonefold\noneida\noneidas\noneiric\noneirically\noneiromancer\noneiromancers\noneiromancy\noneness\nonerous\nonerously\nonerousness\nones\noneself\nonetime\nongoing\nongoingness\nonion\nonions\nonionskin\nonionskins\noniony\nonium\nonlay\nonlays\nonline\nonload\nonloaded\nonloading\nonloads\nonlooker\nonlookers\nonlooking\nonly\nonomastic\nonomastically\nonomastician\nonomasticians\nonomastics\nonomatologist\nonomatologists\nonomatology\nonomatopoeia\nonomatopoeias\nonomatopoeic\nonomatopoeically\nonomatopoetic\nonomatopoetically\nonondaga\nonondagan\nonondagas\nonrush\nonrushes\nonrushing\nonset\nonsets\nonshore\nonside\nonsite\nonslaught\nonslaughts\nonstage\nonstream\nontario\nontic\nontically\nonto\nontogeneses\nontogenesis\nontogenetic\nontogenetically\nontogenies\nontogeny\nontological\nontologically\nontologist\nontologists\nontology\nonus\nonuses\nonward\nonwards\nonycholyses\nonycholysis\nonychophoran\nonychophorans\nonyx\nonyxes\noocyst\noocysts\noocyte\noocytes\noodles\noogamete\noogametes\noogamous\noogamy\noogenesis\noogenetic\noogonia\noogonial\noogonium\noogoniums\nooh\noohed\noohing\noohs\noolemma\noolemmas\noolite\noolites\noolith\nooliths\noolitic\noologic\noological\noologically\noologist\noologists\noology\noolong\noolongs\noomiak\noomiaks\noompah\noompahs\noomph\noop\noophorectomies\noophorectomy\noophoritis\noophoritises\noops\noort\noosphere\noospheres\noospore\noospores\noosporic\noosporous\nootheca\noothecae\noothecal\nootid\nootids\nooze\noozed\noozes\noozier\nooziest\noozily\nooziness\noozing\noozy\nop\nopacifier\nopacifiers\nopacities\nopacity\nopah\nopahs\nopal\nopalesce\nopalesced\nopalescence\nopalescent\nopalescently\nopalesces\nopalescing\nopaline\nopallesces\nopals\nopaque\nopaquely\nopaqueness\nopaques\nope\noped\nopen\nopenability\nopenable\nopencast\nopened\nopener\nopeners\nopenest\nopenhanded\nopenhandedly\nopenhandedness\nopenhearted\nopenheartedly\nopenheartedness\nopening\nopenings\nopenly\nopenmouthed\nopenmouthedly\nopenmouthedness\nopenness\nopens\nopenwork\nopera\noperability\noperable\noperably\noperagoer\noperagoers\noperagoing\noperand\noperandi\noperands\noperant\noperantly\noperants\noperas\noperate\noperated\noperates\noperatic\noperatically\noperatics\noperating\noperation\noperational\noperationalism\noperationalist\noperationalistic\noperationalists\noperationalize\noperationalized\noperationalizes\noperationalizing\noperationally\noperationism\noperationist\noperationists\noperations\noperative\noperatively\noperativeness\noperatives\noperator\noperatorless\noperators\nopercula\nopercular\nopercularly\noperculate\noperculated\noperculum\noperculums\noperetta\noperettas\noperettist\noperettists\noperon\noperons\noperose\noperosely\noperoseness\nopes\nophelia\nophidian\nophidians\nophiolite\nophiolites\nophiological\nophiologist\nophiologists\nophiology\nophiophagous\nophir\nophite\nophites\nophitic\nophiuchus\nophiuroid\nophiuroids\nophthalmia\nophthalmias\nophthalmic\nophthalmitis\nophthalmitises\nophthalmologic\nophthalmological\nophthalmologically\nophthalmologist\nophthalmologists\nophthalmology\nophthalmoscope\nophthalmoscopes\nophthalmoscopic\nophthalmoscopical\nophthalmoscopy\nopiate\nopiated\nopiates\nopiating\nopine\nopined\nopines\noping\nopining\nopinion\nopinionated\nopinionatedly\nopinionatedness\nopinionative\nopinionatively\nopinionativeness\nopinioned\nopinions\nopioid\nopioids\nopisthobranch\nopisthobranchs\nopisthognathism\nopisthognathous\nopium\noporto\nopossum\nopossums\nopponency\nopponent\nopponents\nopportune\nopportunely\nopportuneness\nopportunism\nopportunist\nopportunistic\nopportunistically\nopportunists\nopportunities\nopportunity\nopposability\nopposable\noppose\nopposed\nopposeless\nopposer\nopposers\nopposes\nopposing\nopposite\noppositely\noppositeness\nopposites\nopposition\noppositional\noppositionist\noppositionists\noppositions\noppress\noppressed\noppresses\noppressing\noppression\noppressions\noppressive\noppressively\noppressiveness\noppressor\noppressors\nopprobrious\nopprobriously\nopprobriousness\nopprobrium\noppugn\noppugned\noppugner\noppugners\noppugning\noppugns\nopsin\nopsins\nopsonic\nopsonin\nopsonins\nopsonization\nopsonizations\nopsonize\nopsonized\nopsonizes\nopsonizing\nopt\noptative\noptatively\noptatives\nopted\noptic\noptical\noptically\noptician\nopticians\noptics\noptima\noptimal\noptimality\noptimally\noptimism\noptimist\noptimistic\noptimistically\noptimists\noptimization\noptimizations\noptimize\noptimized\noptimizer\noptimizers\noptimizes\noptimizing\noptimum\noptimums\nopting\noption\noptional\noptionality\noptionally\noptioned\noptioning\noptions\noptoelectronic\noptoelectronics\noptokinetic\noptometric\noptometrical\noptometrist\noptometrists\noptometry\nopts\nopulence\nopulency\nopulent\nopulently\nopuntia\nopuntias\nopus\nopuscula\nopuscule\nopuscules\nopusculum\nopuses\nopéra\noquassa\noquassas\nor\nora\norach\norache\noraches\noracle\noracles\noracular\noracularity\noracularly\noral\noralism\noralist\noralists\norality\norally\norals\noran\norang\norange\norangeade\norangeades\norangeism\norangeman\norangemen\norangerie\norangeries\norangeroot\norangeroots\norangery\noranges\norangewood\norangewoods\norangey\norangish\norangoutang\norangoutangs\norangs\norangutan\norangutans\norangy\norate\norated\norates\norating\noration\norations\norator\noratorial\noratorian\noratorians\noratorical\noratorically\noratories\noratorio\noratorios\norators\noratorship\noratory\norb\norbed\norbicular\norbicularity\norbicularly\norbiculate\norbiculated\norbiculately\norbing\norbit\norbital\norbitals\norbited\norbiteer\norbiteered\norbiteering\norbiteers\norbiter\norbiters\norbiting\norbits\norbs\norca\norcadian\norcadians\norcas\norchard\norchardist\norchardists\norchards\norchestra\norchestral\norchestrally\norchestras\norchestrate\norchestrated\norchestrater\norchestraters\norchestrates\norchestrating\norchestration\norchestrational\norchestrations\norchestrator\norchestrators\norchestrina\norchestrion\norchid\norchidaceous\norchidectomies\norchidectomy\norchidlike\norchids\norchiectomies\norchiectomy\norchil\norchils\norchis\norchises\norcus\nordain\nordained\nordainer\nordainers\nordaining\nordainment\nordainments\nordains\nordeal\nordeals\norder\norderable\nordered\norderer\norderers\nordering\norderings\norderless\norderlies\norderliness\norderly\norders\nordinal\nordinals\nordinance\nordinances\nordinand\nordinands\nordinaries\nordinarily\nordinariness\nordinary\nordinate\nordinates\nordination\nordinations\nordines\nordnance\nordo\nordonnance\nordonnances\nordos\nordovician\nordure\nore\noread\noreads\noregano\noregon\noregonian\noregonians\noreide\noreides\noreo\noreos\nores\norestes\noresund\norfray\norfrays\norgan\norgana\norgandie\norgandies\norgandy\norganelle\norganelles\norganic\norganically\norganicism\norganicist\norganicists\norganicity\norganics\norganism\norganismal\norganismic\norganismically\norganisms\norganist\norganists\norganizable\norganization\norganizational\norganizationally\norganizations\norganize\norganized\norganizer\norganizers\norganizes\norganizing\norganochlorine\norganochlorines\norganogeneses\norganogenesis\norganogenetic\norganogenetically\norganographic\norganographically\norganographies\norganography\norganoleptic\norganoleptically\norganologic\norganological\norganology\norganomercurial\norganomercurials\norganometallic\norganon\norganons\norganophosphate\norganophosphates\norganophosphorous\norganophosphorus\norganophosphoruses\norganotherapeutic\norganotherapies\norganotherapy\norganotropic\norganotropically\norganotropism\norganotropy\norgans\norganum\norganums\norganza\norganzine\norganzines\norgasm\norgasmic\norgasmically\norgasms\norgastic\norgastically\norgeat\norgeats\norgiast\norgiastic\norgiastically\norgiasts\norgies\norgone\norgones\norgulous\norgy\noribatid\noribatids\noribi\noribis\noriel\noriels\norient\noriental\norientalia\norientalism\norientalist\norientalists\norientalize\norientalized\norientalizes\norientalizing\norientally\norientals\norientate\norientated\norientates\norientating\norientation\norientational\norientationally\norientations\noriented\norienteer\norienteering\norienteers\norienting\norients\norifice\norifices\norificial\noriflamme\noriflammes\norigami\norigamis\noriganum\noriganums\norigin\noriginal\noriginalism\noriginalist\noriginalists\noriginalities\noriginality\noriginally\noriginals\noriginate\noriginated\noriginates\noriginating\norigination\noriginations\noriginative\noriginatively\noriginator\noriginators\norigins\norinasal\norinasals\norinoco\noriole\norioles\norion\norion's\norismological\norismology\norison\norisons\norissa\noriya\norizaba\norkney\norlando\norleanian\norleanians\norleanist\norleanists\norleans\norlon\norlop\norlops\norléanais\norléans\normazd\normer\normers\normolu\normolus\normuz\normuzd\nornament\nornamental\nornamentally\nornamentals\nornamentation\nornamented\nornamenter\nornamenters\nornamenting\nornaments\nornate\nornately\nornateness\nornerier\norneriest\norneriness\nornery\nornithic\nornithine\nornithines\nornithischian\nornithischians\nornithologic\nornithological\nornithologically\nornithologist\nornithologists\nornithology\nornithopod\nornithopods\nornithopter\nornithopters\nornithosis\norogenesis\norogenetic\norogenic\norogenically\norogeny\norographic\norographical\norographically\norography\noroide\noroides\norological\norologically\norologist\norologists\norology\noromo\noromos\noropharyngeal\noropharynges\noropharynx\noropharynxes\norotund\norotundity\norphan\norphanage\norphanages\norphaned\norphanhood\norphaning\norphans\norphean\norpheus\norphic\norphically\norphism\norphist\norphists\norphrey\norphreys\norpiment\norpine\norpines\norpington\norpingtons\norreries\norrery\norris\norrises\norrisroot\norrisroots\nors\nort\northicon\northicons\northo\northocenter\northocenters\northochromatic\northochromatism\northoclase\northoclastic\northodontia\northodontic\northodontically\northodontics\northodontist\northodontists\northodonture\northodox\northodoxes\northodoxies\northodoxly\northodoxy\northoepic\northoepical\northoepically\northoepist\northoepists\northoepy\northogenesis\northogenetic\northogenetically\northogonal\northogonality\northogonalization\northogonalizations\northogonalize\northogonalized\northogonalizes\northogonalizing\northogonally\northograde\northographer\northographers\northographic\northographical\northographically\northographies\northographist\northographists\northography\northomolecular\northonormal\northopaedic\northopaedics\northopedic\northopedically\northopedics\northopedist\northopedists\northophosphate\northophosphates\northophosphoric\northopsychiatric\northopsychiatrical\northopsychiatrist\northopsychiatrists\northopsychiatry\northoptera\northopteral\northopteran\northopterans\northopterist\northopterists\northopteroid\northopteron\northopterons\northopterous\northorhombic\northoscopic\northoses\northosis\northostatic\northotic\northotics\northotist\northotists\northotropic\northotropically\northotropism\northotropous\nortler\nortles\nortolan\nortolans\norts\norvieto\norwellian\noryx\noryxes\norzo\norzos\nos\nosage\nosages\nosaka\nosar\nosborne\noscan\noscans\noscar\noscars\nosceola\noscillate\noscillated\noscillates\noscillating\noscillation\noscillational\noscillations\noscillator\noscillators\noscillatory\noscillogram\noscillograms\noscillograph\noscillographic\noscillographically\noscillographs\noscillography\noscilloscope\noscilloscopes\noscilloscopic\noscine\noscines\noscitance\noscitances\noscitancies\noscitancy\noscitant\noscula\nosculant\noscular\nosculate\nosculated\nosculates\nosculating\nosculation\nosculations\nosculatory\noscule\noscules\nosculum\nosee\nosier\nosiers\nosiris\noslo\nosmanli\nosmanlis\nosmatic\nosmeteria\nosmeterium\nosmic\nosmically\nosmics\nosmious\nosmiridium\nosmiridiums\nosmium\nosmol\nosmolal\nosmolalities\nosmolality\nosmolar\nosmolarities\nosmolarity\nosmole\nosmoles\nosmols\nosmometer\nosmometers\nosmometric\nosmometry\nosmoregulation\nosmoregulations\nosmoregulatory\nosmose\nosmosed\nosmoses\nosmosing\nosmosis\nosmotic\nosmotically\nosmous\nosmund\nosmunda\nosmundas\nosmunds\nosnabrück\nosnaburg\nosnaburgs\nosprey\nospreys\nosric\nossa\nossature\nossatures\nossein\nosseins\nosseous\nosseously\nosset\nossete\nossetes\nossetia\nossetian\nossetians\nossetic\nossets\nossia\nossian\nossianic\nossicle\nossicles\nossicular\nossiculate\nossific\nossification\nossified\nossifies\nossifrage\nossifrages\nossify\nossifying\nosso\nossuaries\nossuary\nosteal\nosteitis\nostend\nostende\nostensible\nostensibly\nostensive\nostensively\nostensoria\nostensories\nostensorium\nostensory\nostentation\nostentatious\nostentatiously\nostentatiousness\nosteoarthritic\nosteoarthritis\nosteoblast\nosteoblastic\nosteoblasts\nosteoclases\nosteoclasis\nosteoclast\nosteoclastic\nosteoclasts\nosteocyte\nosteocytes\nosteogeneses\nosteogenesis\nosteogenetic\nosteogenic\nosteogenous\nosteoid\nosteoids\nosteological\nosteologically\nosteologies\nosteologist\nosteologists\nosteology\nosteolyses\nosteolysis\nosteolytic\nosteoma\nosteomalacia\nosteomalacias\nosteomas\nosteomata\nosteomyelitis\nosteomyelitises\nosteopath\nosteopathic\nosteopathically\nosteopathist\nosteopathists\nosteopaths\nosteopathy\nosteophyte\nosteophytes\nosteophytic\nosteoplastic\nosteoplasties\nosteoplasty\nosteoporoses\nosteoporosis\nosteoporotic\nosteosarcoma\nosteosarcomas\nosteosarcomata\nosteoses\nosteosis\nosteotomies\nosteotomist\nosteotomists\nosteotomy\nostia\nostiak\nostiaks\nostiaries\nostiary\nostinato\nostinatos\nostiolar\nostiole\nostioles\nostium\nostler\nostlers\nostmark\nostmarks\nostomate\nostomates\nostomies\nostomy\nostoses\nostosis\nostraca\nostracism\nostracize\nostracized\nostracizes\nostracizing\nostracod\nostracode\nostracoderm\nostracoderms\nostracodes\nostracods\nostracon\nostrich\nostriches\nostrichlike\nostrogoth\nostrogothic\nostrogoths\nostyak\nostyaks\noswego\notaheite\notalgia\notalgias\notalgic\nothello\nother\notherguess\notherness\nothers\notherwhere\notherwhile\notherwhiles\notherwise\notherworld\notherworldliness\notherworldly\notherworlds\nothman\nothmans\notic\notiose\notiosely\notioseness\notiosity\notitic\notitis\noto\notocyst\notocystic\notocysts\notolaryngological\notolaryngologist\notolaryngologists\notolaryngology\notolith\notolithic\notoliths\notological\notologist\notologists\notology\notophone\notorhinolaryngological\notorhinolaryngologist\notorhinolaryngologists\notorhinolaryngology\notos\notoscleroses\notosclerosis\notosclerotic\notoscope\notoscopes\nototoxic\nototoxicity\notranto\nottar\nottars\nottava\nottawa\nottawas\notter\notters\notto\nottoman\nottomans\nottos\notway\nouabain\nouabains\nouachita\nouagadougou\noubliette\noubliettes\nouch\nouches\noud\noudenarde\noudh\nouds\nought\noughtn\noughtn't\noughts\nouguiya\nouguiyas\nouija\nounce\nounces\nour\nours\nourself\nourselves\nousel\nousels\noushak\noust\nousted\nouster\nousters\nousting\nousts\nout\noutachieve\noutachieved\noutachieves\noutachieving\noutact\noutacted\noutacting\noutacts\noutage\noutages\noutate\noutback\noutbacker\noutbackers\noutbalance\noutbalanced\noutbalances\noutbalancing\noutbargain\noutbargained\noutbargaining\noutbargains\noutbid\noutbidden\noutbidding\noutbids\noutbitch\noutbitched\noutbitches\noutbitching\noutbluff\noutbluffed\noutbluffing\noutbluffs\noutboard\noutboards\noutbought\noutbound\noutbox\noutboxed\noutboxes\noutboxing\noutbrag\noutbraged\noutbraging\noutbrags\noutbrave\noutbraved\noutbraves\noutbraving\noutbrawl\noutbrawled\noutbrawling\noutbrawls\noutbreak\noutbreaks\noutbred\noutbreed\noutbreeding\noutbreedings\noutbreeds\noutbuilding\noutbuildings\noutbulk\noutbulked\noutbulking\noutbulks\noutburst\noutbursts\noutbuy\noutbuying\noutbuys\noutcall\noutcalls\noutcast\noutcaste\noutcastes\noutcasts\noutcatch\noutcatches\noutcatching\noutcaught\noutcharge\noutcharged\noutcharges\noutcharging\noutclass\noutclassed\noutclasses\noutclassing\noutclimb\noutclimbed\noutclimbing\noutclimbs\noutcoach\noutcoached\noutcoaches\noutcoaching\noutcome\noutcomes\noutcompete\noutcompeted\noutcompetes\noutcompeting\noutcries\noutcrop\noutcropped\noutcropping\noutcroppings\noutcrops\noutcross\noutcrossed\noutcrosses\noutcrossing\noutcry\noutcurve\noutcurves\noutdance\noutdanced\noutdances\noutdancing\noutdate\noutdated\noutdatedly\noutdatedness\noutdates\noutdating\noutdazzle\noutdazzled\noutdazzles\noutdazzling\noutdebate\noutdebated\noutdebates\noutdebating\noutdeliver\noutdelivered\noutdelivering\noutdelivers\noutdesign\noutdesigned\noutdesigning\noutdesigns\noutdid\noutdistance\noutdistanced\noutdistances\noutdistancing\noutdo\noutdoes\noutdoing\noutdone\noutdoor\noutdoors\noutdoorsman\noutdoorsmanship\noutdoorsmen\noutdoorswoman\noutdoorswomen\noutdoorsy\noutdrag\noutdragged\noutdragging\noutdrags\noutdrank\noutdraw\noutdrawing\noutdrawn\noutdraws\noutdress\noutdressed\noutdresses\noutdressing\noutdrew\noutdrink\noutdrinking\noutdrinks\noutdrive\noutdriven\noutdrives\noutdriving\noutdrove\noutdrunk\noutduel\noutdueled\noutdueling\noutduelled\noutduelling\noutduels\noutearn\noutearned\noutearning\noutearns\nouteat\nouteaten\nouteating\nouteats\nouted\nouter\noutercoat\noutercoats\noutermost\nouters\nouterwear\noutface\noutfaced\noutfaces\noutfacing\noutfall\noutfalls\noutfield\noutfielder\noutfielders\noutfields\noutfight\noutfighting\noutfights\noutfigure\noutfigured\noutfigures\noutfiguring\noutfish\noutfished\noutfishes\noutfishing\noutfit\noutfits\noutfitted\noutfitter\noutfitters\noutfitting\noutflank\noutflanked\noutflanking\noutflanks\noutflew\noutflies\noutflow\noutflowed\noutflowing\noutflown\noutflows\noutfly\noutflying\noutfoot\noutfooted\noutfooting\noutfoots\noutfought\noutfox\noutfoxed\noutfoxes\noutfoxing\noutfumble\noutfumbled\noutfumbles\noutfumbling\noutgain\noutgained\noutgaining\noutgains\noutgas\noutgassed\noutgasses\noutgassing\noutgeneral\noutgeneraled\noutgeneraling\noutgenerals\noutgiving\noutglitter\noutglittered\noutglittering\noutglitters\noutgo\noutgoes\noutgoing\noutgoingness\noutgoings\noutgone\noutgrew\noutgrip\noutgripped\noutgripping\noutgrips\noutgross\noutgrossed\noutgrosses\noutgrossing\noutgrow\noutgrowing\noutgrown\noutgrows\noutgrowth\noutgrowths\noutguess\noutguessed\noutguesses\noutguessing\noutgun\noutgunned\noutgunning\noutguns\nouthaul\nouthauls\nouthit\nouthits\nouthitting\nouthomer\nouthomered\nouthomering\nouthomers\nouthouse\nouthouses\nouthunt\nouthunted\nouthunting\nouthunts\nouthustle\nouthustled\nouthustles\nouthustling\nouting\noutings\noutintrigue\noutintrigued\noutintrigues\noutintriguing\noutjump\noutjumped\noutjumping\noutjumps\noutkick\noutkicked\noutkicking\noutkicks\noutkill\noutkilled\noutkilling\noutkills\noutlaid\noutland\noutlander\noutlanders\noutlandish\noutlandishly\noutlandishness\noutlands\noutlast\noutlasted\noutlasting\noutlasts\noutlaw\noutlawed\noutlawing\noutlawries\noutlawry\noutlaws\noutlay\noutlaying\noutlays\noutleap\noutleaped\noutleaping\noutleaps\noutleapt\noutlearn\noutlearned\noutlearning\noutlearns\noutlearnt\noutlet\noutlets\noutlier\noutliers\noutline\noutlined\noutliner\noutliners\noutlines\noutlining\noutlive\noutlived\noutlives\noutliving\noutlook\noutlooks\noutlying\noutman\noutmaneuver\noutmaneuvered\noutmaneuvering\noutmaneuvers\noutmanipulate\noutmanipulated\noutmanipulates\noutmanipulating\noutmanned\noutmanning\noutmans\noutmarch\noutmarched\noutmarches\noutmarching\noutmatch\noutmatched\noutmatches\noutmatching\noutmode\noutmoded\noutmodes\noutmoding\noutmost\noutmuscle\noutmuscled\noutmuscles\noutmuscling\noutness\noutnumber\noutnumbered\noutnumbering\noutnumbers\noutorganize\noutorganized\noutorganizes\noutorganizing\noutpace\noutpaced\noutpaces\noutpacing\noutpass\noutpassed\noutpasses\noutpassing\noutpatient\noutpatients\noutperform\noutperformed\noutperforming\noutperforms\noutpitch\noutpitched\noutpitches\noutpitching\noutplace\noutplaced\noutplacement\noutplacements\noutplacer\noutplacers\noutplaces\noutplacing\noutplay\noutplayed\noutplaying\noutplays\noutplot\noutplots\noutplotted\noutplotting\noutpoint\noutpointed\noutpointing\noutpoints\noutpolitick\noutpoliticked\noutpoliticking\noutpoliticks\noutpoll\noutpolled\noutpolling\noutpolls\noutpopulate\noutpopulated\noutpopulates\noutpopulating\noutport\noutports\noutpost\noutposts\noutpour\noutpoured\noutpourer\noutpourers\noutpouring\noutpourings\noutpours\noutpower\noutpowered\noutpowering\noutpowers\noutpray\noutprayed\noutpraying\noutprays\noutpreach\noutpreached\noutpreaches\noutpreaching\noutprice\noutpriced\noutprices\noutpricing\noutproduce\noutproduced\noutproduces\noutproducing\noutpromise\noutpromised\noutpromises\noutpromising\noutpull\noutpulled\noutpulling\noutpulls\noutpunch\noutpunched\noutpunches\noutpunching\noutput\noutputs\noutputted\noutputting\noutrace\noutraced\noutraces\noutracing\noutrage\noutraged\noutrageous\noutrageously\noutrageousness\noutrages\noutraging\noutran\noutrange\noutranged\noutranges\noutranging\noutrank\noutranked\noutranking\noutranks\noutrate\noutrated\noutrates\noutrating\noutreach\noutreached\noutreaches\noutreaching\noutrebound\noutrebounded\noutrebounding\noutrebounds\noutreproduce\noutreproduced\noutreproduces\noutreproducing\noutridden\noutride\noutrider\noutriders\noutrides\noutriding\noutrigger\noutriggers\noutright\noutrightly\noutrightness\noutrival\noutrivaled\noutrivaling\noutrivalled\noutrivalling\noutrivals\noutroar\noutroared\noutroaring\noutroars\noutrode\noutrow\noutrowed\noutrowing\noutrows\noutrun\noutrunning\noutruns\noutrush\noutrushed\noutrushes\noutrushing\noutré\nouts\noutsail\noutsailed\noutsailing\noutsails\noutsang\noutsat\noutscheme\noutschemed\noutschemes\noutscheming\noutscoop\noutscooped\noutscooping\noutscoops\noutscore\noutscored\noutscores\noutscoring\noutsell\noutselling\noutsells\noutset\noutsets\noutshine\noutshines\noutshining\noutshone\noutshoot\noutshooting\noutshoots\noutshot\noutshout\noutshouted\noutshouting\noutshouts\noutside\noutsider\noutsiderness\noutsiders\noutsides\noutsight\noutsights\noutsing\noutsinging\noutsings\noutsit\noutsits\noutsitting\noutsize\noutsized\noutsizes\noutskate\noutskated\noutskates\noutskating\noutskirt\noutskirts\noutslick\noutslicked\noutslicking\noutslicks\noutsmart\noutsmarted\noutsmarting\noutsmarts\noutsoar\noutsoared\noutsoaring\noutsoars\noutsold\noutsole\noutsoles\noutsource\noutsourced\noutsources\noutsourcing\noutsourcings\noutsparkle\noutsparkled\noutsparkles\noutsparkling\noutspeak\noutspeaking\noutspeaks\noutsped\noutspeed\noutspeeded\noutspeeding\noutspeeds\noutspend\noutspending\noutspends\noutspent\noutspoke\noutspoken\noutspokenly\noutspokenness\noutspread\noutspreading\noutspreads\noutsprint\noutsprinted\noutsprinting\noutsprints\noutstand\noutstanding\noutstandingly\noutstands\noutstare\noutstared\noutstares\noutstaring\noutstation\noutstations\noutstay\noutstayed\noutstaying\noutstays\noutstood\noutstretch\noutstretched\noutstretches\noutstretching\noutstridden\noutstride\noutstrides\noutstriding\noutstrip\noutstripped\noutstripping\noutstrips\noutstrode\noutstroke\noutstrokes\noutsung\noutswam\noutswear\noutswearing\noutswears\noutswim\noutswimming\noutswims\noutswore\noutsworn\noutswum\nouttake\nouttakes\nouttalk\nouttalked\nouttalking\nouttalks\noutthink\noutthinking\noutthinks\noutthought\noutthrew\noutthrow\noutthrowing\noutthrown\noutthrows\noutthrust\noutthrusted\noutthrusting\noutthrusts\nouttrade\nouttraded\nouttrades\nouttrading\noutturn\noutturning\noutturns\noutvie\noutvied\noutvies\noutvote\noutvoted\noutvotes\noutvoting\noutvying\noutwait\noutwaited\noutwaiting\noutwaits\noutwalk\noutwalked\noutwalking\noutwalks\noutward\noutwardly\noutwardness\noutwards\noutwash\noutwashes\noutwatch\noutwatched\noutwatches\noutwatching\noutwear\noutwearing\noutwears\noutweigh\noutweighed\noutweighing\noutweighs\noutwent\noutwit\noutwits\noutwitted\noutwitting\noutwore\noutwork\noutworked\noutworker\noutworkers\noutworking\noutworks\noutworn\noutwrestle\noutwrestled\noutwrestles\noutwrestling\noutwrite\noutwrites\noutwriting\noutwritten\noutwrote\noutwrought\noutyell\noutyelled\noutyelling\noutyells\noutyield\noutyielded\noutyielding\noutyields\nouzel\nouzels\nouzo\nouzos\nova\noval\novalbumin\novalbumins\novality\novally\novalness\novals\novambo\novambos\novarial\novarian\novariectomies\novariectomized\novariectomy\novaries\novariole\novarioles\novariotomies\novariotomy\novaritis\novaritises\novary\novate\novately\novation\novational\novations\noven\novenable\novenbird\novenbirds\novenproof\novens\novenware\nover\noverabounding\noverabstract\noverabundance\noverabundances\noverabundant\noverabundantly\noveraccentuate\noveraccentuated\noveraccentuates\noveraccentuating\noverachieve\noverachieved\noverachievement\noverachievements\noverachiever\noverachievers\noverachieves\noverachieving\noveract\noveracted\noveracting\noveraction\noveractions\noveractive\noveractivity\noveracts\noveradjustment\noveradjustments\noveradvertise\noveradvertised\noveradvertises\noveradvertising\noverage\noveraged\noverages\noveraggressive\noveraggressively\noveraggressiveness\noveralert\noverall\noveralled\noveralls\noverambition\noverambitious\noverambitiously\noverambitiousness\noveramplified\noveranalyses\noveranalysis\noveranalytical\noveranalyze\noveranalyzed\noveranalyzes\noveranalyzing\noveranxieties\noveranxiety\noveranxious\noveranxiously\noveranxiousness\noverapplication\noverapplications\noverarch\noverarched\noverarches\noverarching\noverarchingly\noverarm\noverarmed\noverarming\noverarms\noverarousal\noverarousals\noverarrange\noverarranged\noverarranges\noverarranging\noverarticulate\noverassert\noverasserted\noverasserting\noverassertion\noverassertions\noverassertive\noverasserts\noverassess\noverassessed\noverassesses\noverassessing\noverassessment\noverassessments\noverate\noverattention\noverattentions\noverawe\noverawed\noverawes\noverawing\noverbake\noverbaked\noverbakes\noverbaking\noverbalance\noverbalanced\noverbalances\noverbalancing\noverbear\noverbearing\noverbearingly\noverbearingness\noverbears\noverbeat\noverbeaten\noverbeating\noverbeats\noverbejeweled\noverbid\noverbidden\noverbidder\noverbidders\noverbidding\noverbids\noverbill\noverbilled\noverbilling\noverbills\noverbite\noverbites\noverbleach\noverbleached\noverbleaches\noverbleaching\noverblew\noverblouse\noverblouses\noverblow\noverblowing\noverblown\noverblows\noverboard\noverboil\noverboiled\noverboiling\noverboils\noverbold\noverbook\noverbooked\noverbooking\noverbooks\noverbore\noverborne\noverborrow\noverborrowed\noverborrowing\noverborrows\noverbought\noverbreathing\noverbrief\noverbright\noverbroad\noverbrowse\noverbrowsed\noverbrowses\noverbrowsing\noverbrutal\noverbuild\noverbuilding\noverbuilds\noverbuilt\noverburden\noverburdened\noverburdening\noverburdens\noverburn\noverbusy\noverbuy\noverbuying\noverbuys\novercall\novercalled\novercalling\novercalls\novercame\novercapacities\novercapacity\novercapitalization\novercapitalizations\novercapitalize\novercapitalized\novercapitalizes\novercapitalizing\novercareful\novercast\novercasting\novercastings\novercasts\novercaution\novercautious\novercautiously\novercautiousness\novercentralization\novercentralize\novercentralized\novercentralizes\novercentralizing\novercharge\novercharged\novercharges\novercharging\noverchill\noverchilled\noverchilling\noverchills\novercivilized\noverclaim\noverclaimed\noverclaiming\noverclaims\noverclassification\noverclassifications\noverclassified\noverclassifies\noverclassify\noverclassifying\noverclean\novercleaned\novercleaning\novercleans\noverclear\novercloud\noverclouded\noverclouding\noverclouds\novercoach\novercoached\novercoaches\novercoaching\novercoat\novercoating\novercoatings\novercoats\novercome\novercomer\novercomers\novercomes\novercoming\novercommercialization\novercommercialize\novercommercialized\novercommercializes\novercommercializing\novercommit\novercommitment\novercommitments\novercommits\novercommitted\novercommitting\novercommunicate\novercommunicated\novercommunicates\novercommunicating\novercommunication\novercompensate\novercompensated\novercompensates\novercompensating\novercompensation\novercompensatory\novercomplex\novercompliance\novercomplicate\novercomplicated\novercomplicates\novercomplicating\novercompress\novercompressed\novercompresses\novercompressing\noverconcentration\noverconcentrations\noverconcern\noverconcerned\noverconcerning\noverconcerns\noverconfidence\noverconfident\noverconfidently\noverconscientious\noverconscious\noverconservative\noverconstruct\noverconstructed\noverconstructing\noverconstructs\noverconsume\noverconsumed\noverconsumes\noverconsuming\noverconsumption\novercontrol\novercontrolled\novercontrolling\novercontrols\novercook\novercooked\novercooking\novercooks\novercool\novercooled\novercooling\novercools\novercorrect\novercorrected\novercorrecting\novercorrection\novercorrections\novercorrects\novercount\novercounted\novercounting\novercountings\novercounts\novercredulous\novercritical\novercritically\novercriticalness\novercrop\novercropped\novercropping\novercrops\novercrowd\novercrowded\novercrowding\novercrowds\novercultivation\novercure\novercurious\novercut\novercuts\novercutting\noverdecorate\noverdecorated\noverdecorates\noverdecorating\noverdecoration\noverdelicate\noverdemanding\noverdependence\noverdependent\noverdesign\noverdesigned\noverdesigning\noverdesigns\noverdetermine\noverdetermined\noverdetermines\noverdetermining\noverdevelop\noverdeveloped\noverdeveloping\noverdevelopment\noverdevelops\noverdid\noverdifferentiation\noverdirect\noverdiscount\noverdiscounted\noverdiscounting\noverdiscounts\noverdiversity\noverdo\noverdocument\noverdocumented\noverdocumenting\noverdocuments\noverdoer\noverdoers\noverdoes\noverdog\noverdogs\noverdoing\noverdominance\noverdominances\noverdominant\noverdone\noverdosage\noverdosages\noverdose\noverdosed\noverdoses\noverdosing\noverdraft\noverdrafts\noverdramatic\noverdramatize\noverdramatized\noverdramatizes\noverdramatizing\noverdrank\noverdraught\noverdraughts\noverdraw\noverdrawing\noverdrawn\noverdraws\noverdress\noverdressed\noverdresses\noverdressing\noverdrew\noverdried\noverdries\noverdrink\noverdrinking\noverdrinks\noverdrive\noverdriven\noverdrives\noverdriving\noverdrove\noverdry\noverdrying\noverdub\noverdubbed\noverdubbing\noverdubs\noverdue\novereager\novereagerly\novereagerness\noverearnest\novereat\novereaten\novereater\novereaters\novereating\novereats\novered\noveredit\noveredited\noverediting\noveredits\novereducate\novereducated\novereducates\novereducating\novereducation\noverelaborate\noverelaborated\noverelaborates\noverelaborating\noverelaboration\noverembellish\noverembellished\noverembellishes\noverembellishing\noveremote\noveremotional\noveremphases\noveremphasis\noveremphasize\noveremphasized\noveremphasizes\noveremphasizing\noveremphatic\noverenamored\noverencourage\noverencouraged\noverencourages\noverencouraging\noverenergetic\noverengineer\noverengineered\noverengineering\noverengineers\noverenrolled\noverentertained\noverenthusiasm\noverenthusiasms\noverenthusiastic\noverequip\noverequipped\noverequipping\noverequips\noverestimate\noverestimated\noverestimates\noverestimating\noverestimation\noverestimations\noverevaluation\noverevaluations\noverexaggerate\noverexaggerated\noverexaggerates\noverexaggerating\noverexaggeration\noverexaggerations\noverexcite\noverexcited\noverexcites\noverexciting\noverexercise\noverexercised\noverexercises\noverexercising\noverexert\noverexerted\noverexerting\noverexertion\noverexertions\noverexerts\noverexpand\noverexpanded\noverexpanding\noverexpands\noverexpansion\noverexpectation\noverexpectations\noverexplain\noverexplained\noverexplaining\noverexplains\noverexplicit\noverexploit\noverexploitation\noverexploitations\noverexploited\noverexploiting\noverexploits\noverexpose\noverexposed\noverexposes\noverexposing\noverexposure\noverexposures\noverextend\noverextended\noverextending\noverextends\noverextension\noverextensions\noverextraction\noverextractions\noverextrapolation\noverextrapolations\noverextravagant\noverexuberant\noverfacile\noverfamiliar\noverfamiliarities\noverfamiliarity\noverfastidious\noverfat\noverfatigue\noverfatigued\noverfavor\noverfavored\noverfavoring\noverfavors\noverfed\noverfeed\noverfeeding\noverfeeds\noverfertilization\noverfertilize\noverfertilized\noverfertilizes\noverfertilizing\noverfill\noverfilled\noverfilling\noverfills\noverfish\noverfished\noverfishes\noverfishing\noverflew\noverflies\noverflight\noverflights\noverflow\noverflowed\noverflowing\noverflown\noverflows\noverfly\noverflying\noverfocus\noverfocused\noverfocuses\noverfocusing\noverfocussed\noverfocusses\noverfocussing\noverfond\noverfulfill\noverfulfilled\noverfulfilling\noverfulfills\noverfull\noverfund\noverfunded\noverfunding\noverfunds\noverfussy\novergarment\novergarments\novergeneralization\novergeneralizations\novergeneralize\novergeneralized\novergeneralizes\novergeneralizing\novergenerosity\novergenerous\novergenerously\noverglamorize\noverglamorized\noverglamorizes\noverglamorizing\noverglaze\noverglazed\noverglazes\noverglazing\novergovern\novergoverned\novergoverning\novergoverns\novergraze\novergrazed\novergrazes\novergrazing\novergrew\novergrow\novergrowing\novergrown\novergrows\novergrowth\novergrowths\noverhand\noverhanded\noverhanding\noverhandle\noverhandled\noverhandles\noverhandling\noverhands\noverhang\noverhanging\noverhangs\noverharvest\noverharvested\noverharvesting\noverharvests\noverhasty\noverhaul\noverhauled\noverhauler\noverhaulers\noverhauling\noverhauls\noverhead\noverheads\noverhear\noverheard\noverhearer\noverhearers\noverhearing\noverhears\noverheat\noverheated\noverheating\noverheats\noverhit\noverhits\noverhitting\noverhomogenize\noverhomogenized\noverhomogenizes\noverhomogenizing\noverhung\noverhunt\noverhunted\noverhunting\noverhunts\noverhydrate\noverhydrated\noverhydrates\noverhydrating\noverhydration\noverhype\noverhyped\noverhypes\noverhyping\noveridealize\noveridealized\noveridealizes\noveridealizing\noveridentification\noveridentified\noveridentifies\noveridentify\noveridentifying\noverimaginative\noverimpress\noverimpressed\noverimpresses\noverimpressing\noverindebtedness\noverindulge\noverindulged\noverindulgence\noverindulgences\noverindulgent\noverindulgently\noverindulges\noverindulging\noverindustrialize\noverindustrialized\noverindustrializes\noverindustrializing\noverinflate\noverinflated\noverinflates\noverinflating\noverinflation\noverinform\noverinformed\noverinforming\noverinforms\novering\noveringenious\noveringenuity\noverinsistent\noverintellectualization\noverintellectualize\noverintellectualized\noverintellectualizes\noverintellectualizing\noverintense\noverintensity\noverinterpret\noverinterpretation\noverinterpretations\noverinterpreted\noverinterpreting\noverinterprets\noverinvestment\noverissuance\noverissue\noverissued\noverissues\noverissuing\noverjoy\noverjoyed\noverjoying\noverjoys\noverkill\noverkilled\noverkilling\noverkills\noverlabor\noverlabored\noverlaboring\noverlabors\noverladen\noverlaid\noverlain\noverland\noverlap\noverlapped\noverlapping\noverlaps\noverlarge\noverlavish\noverlay\noverlaying\noverlays\noverleaf\noverleap\noverleaped\noverleaping\noverleaps\noverleapt\noverlearn\noverlearned\noverlearning\noverlearns\noverlearnt\noverlend\noverlending\noverlends\noverlength\noverlengthen\noverlengthened\noverlengthening\noverlengthens\noverlent\noverlie\noverlies\noverlight\noverliteral\noverliterary\noverload\noverloaded\noverloading\noverloads\noverlong\noverlook\noverlooked\noverlooking\noverlooks\noverlord\noverlords\noverlordship\noverloud\noverlush\noverly\noverlying\noverman\novermanage\novermanaged\novermanages\novermanaging\novermanned\novermannered\novermanning\novermans\novermantel\novermantels\novermaster\novermastered\novermastering\novermasters\novermatch\novermatched\novermatches\novermatching\novermature\novermaturity\novermedicate\novermedicated\novermedicates\novermedicating\novermedication\novermen\novermighty\novermilk\novermilked\novermilking\novermilks\novermine\novermined\novermines\novermining\novermix\novermixed\novermixes\novermixing\novermodest\novermodestly\novermuch\novermuscled\novernice\novernight\novernighted\novernighter\novernighters\novernighting\novernights\novernourish\novernourished\novernourishes\novernourishing\novernutrition\noverobvious\noveroperate\noveroperated\noveroperates\noveroperating\noveropinionated\noveroptimism\noveroptimist\noveroptimistic\noveroptimistically\noveroptimists\noverorchestrate\noverorchestrated\noverorchestrates\noverorchestrating\noverorganize\noverorganized\noverorganizes\noverorganizing\noverornament\noverornamented\noverornamenting\noverornaments\noverpackage\noverpackaged\noverpackages\noverpackaging\noverpaid\noverparticular\noverpass\noverpassed\noverpasses\noverpassing\noverpast\noverpay\noverpaying\noverpayment\noverpayments\noverpays\noverpedal\noverpedaled\noverpedaling\noverpedals\noverpeople\noverpeopled\noverpeoples\noverpeopling\noverpersuade\noverpersuaded\noverpersuades\noverpersuading\noverpersuasion\noverplaid\noverplaided\noverplan\noverplanned\noverplanning\noverplans\noverplant\noverplanted\noverplanting\noverplants\noverplay\noverplayed\noverplaying\noverplays\noverplenty\noverplot\noverplots\noverplotted\noverplotting\noverplus\noverpluses\noverpopulate\noverpopulated\noverpopulates\noverpopulating\noverpopulation\noverpotent\noverpower\noverpowered\noverpowering\noverpoweringly\noverpowers\noverpraise\noverpraised\noverpraises\noverpraising\noverprecise\noverprescribe\noverprescribed\noverprescribes\noverprescribing\noverprescription\noverprescriptions\noverpressure\noverpressured\noverpressures\noverpressuring\noverpressurization\noverpressurizations\noverprice\noverpriced\noverprices\noverpricing\noverprint\noverprinted\noverprinting\noverprints\noverprivileged\noverprize\noverprized\noverprizes\noverprizing\noverprocess\noverprocessed\noverprocesses\noverprocessing\noverproduce\noverproduced\noverproducer\noverproducers\noverproduces\noverproducing\noverproduction\noverproductions\noverprogram\noverprogrammed\noverprogramming\noverprograms\noverpromise\noverpromised\noverpromises\noverpromising\noverpromote\noverpromoted\noverpromotes\noverpromoting\noverproof\noverproportion\noverproportionate\noverproportionately\noverproportioned\noverproportioning\noverproportions\noverprotect\noverprotected\noverprotecting\noverprotection\noverprotections\noverprotective\noverprotectiveness\noverprotects\noverpump\noverpumped\noverpumping\noverpumps\noverqualified\noverran\noverrate\noverrated\noverrates\noverrating\noverreach\noverreached\noverreacher\noverreachers\noverreaches\noverreaching\noverreact\noverreacted\noverreacting\noverreaction\noverreactions\noverreactive\noverreacts\noverrefine\noverrefined\noverrefinement\noverrefinements\noverrefines\noverrefining\noverregulate\noverregulated\noverregulates\noverregulating\noverregulation\noverregulations\noverreliance\noverreport\noverreported\noverreporting\noverreports\noverrepresentation\noverrepresentations\noverrepresented\noverrespond\noverresponded\noverresponding\noverresponds\noverrich\noverridden\noverride\noverrides\noverriding\noverridingly\noverrigid\noverripe\noverripely\noverripeness\noverrode\noverruff\noverruffed\noverruffing\noverruffs\noverrule\noverruled\noverrules\noverruling\noverrun\noverrunning\noverruns\novers\noversalt\noversalted\noversalting\noversalts\noversanguine\noversaturate\noversaturated\noversaturates\noversaturating\noversaturation\noversauce\noversauced\noversauces\noversaucing\noversaw\noverscale\noverscaled\noverscore\noverscored\noverscores\noverscoring\noverscrupulous\noversea\noverseas\noversecretion\noversee\noverseeing\noverseen\noverseer\noverseers\noversees\noversell\noverselling\noversells\noversensitive\noversensitiveness\noversensitivities\noversensitivity\noverserious\noverseriously\noverservice\noverserviced\noverservices\noverservicing\noverset\noversets\noversetting\noversew\noversewed\noversewing\noversewn\noversews\noversexed\novershadow\novershadowed\novershadowing\novershadows\novershirt\novershirts\novershoe\novershoes\novershoot\novershooting\novershoots\novershot\noversight\noversights\noversimple\noversimplification\noversimplifications\noversimplified\noversimplifier\noversimplifiers\noversimplifies\noversimplify\noversimplifying\noversimplistic\noversimply\noversize\noversized\noversizes\noverskirt\noverskirts\noverslaugh\noverslaughed\noverslaughing\noverslaughs\noversleep\noversleeping\noversleeps\noverslept\noverslip\noverslipped\noverslipping\noverslips\noversmoke\noversmoked\noversmokes\noversmoking\noversold\noversolicitous\noversophisticated\noversoul\noversouls\noverspecialization\noverspecializations\noverspecialize\noverspecialized\noverspecializes\noverspecializing\noverspeculate\noverspeculated\noverspeculates\noverspeculating\noverspeculation\noverspeculations\noverspend\noverspender\noverspenders\noverspending\noverspends\noverspent\noverspill\noverspilled\noverspilling\noverspills\noverspilt\noverspread\noverspreading\noverspreads\noverstability\noverstaff\noverstaffed\noverstaffing\noverstaffs\noverstate\noverstated\noverstatement\noverstatements\noverstates\noverstating\noverstay\noverstayed\noverstaying\noverstays\noversteer\noversteers\noverstep\noverstepped\noverstepping\noversteps\noverstimulate\noverstimulated\noverstimulates\noverstimulating\noverstimulation\noverstimulations\noverstitch\noverstitched\noverstitches\noverstitching\noverstock\noverstocked\noverstocking\noverstocks\noverstories\noverstory\noverstrain\noverstrained\noverstraining\noverstrains\noverstress\noverstressed\noverstresses\noverstressing\noverstretch\noverstretched\noverstretches\noverstretching\noverstrew\noverstrewed\noverstrewing\noverstrews\noverstridden\noverstride\noverstrides\noverstriding\noverstrike\noverstrikes\noverstrode\noverstructured\noverstrung\noverstuff\noverstuffed\noverstuffing\noverstuffs\noversubscribe\noversubscribed\noversubscribes\noversubscribing\noversubscription\noversubscriptions\noversubtle\noversuds\noversupplied\noversupplies\noversupply\noversupplying\noversuspicious\noversweet\noversweeten\noversweetened\noversweetening\noversweetens\noversweetness\noverswing\novert\novertake\novertaken\novertakes\novertaking\novertalk\novertalkative\novertalked\novertalking\novertalks\novertax\novertaxation\novertaxations\novertaxed\novertaxes\novertaxing\noverthin\noverthink\noverthinking\noverthinks\noverthinned\noverthinning\noverthins\noverthought\noverthrew\noverthrow\noverthrowing\noverthrown\noverthrows\noverthrust\novertighten\novertightened\novertightening\novertightens\novertime\novertimed\novertimes\novertiming\novertip\novertipped\novertipping\novertips\novertire\novertired\novertires\novertiring\novertly\novertness\novertone\novertones\novertook\novertop\novertopped\novertopping\novertops\novertrade\novertraded\novertrades\novertrading\novertrain\novertrained\novertraining\novertrains\novertreat\novertreated\novertreating\novertreatment\novertreats\novertrick\novertricks\novertrump\novertrumped\novertrumping\novertrumps\noverture\novertured\novertures\noverturing\noverturn\noverturned\noverturning\noverturns\novertype\novertyped\novertyping\noveruse\noverused\noveruses\noverusing\noverutilization\noverutilize\noverutilized\noverutilizes\noverutilizing\novervaluation\novervaluations\novervalue\novervalued\novervalues\novervaluing\noverview\noverviews\noverviolent\novervivid\novervoltage\novervoltages\noverwater\noverwatered\noverwatering\noverwaters\noverwear\noverwearied\noverwearies\noverwearing\noverwears\noverweary\noverwearying\noverweening\noverweeningly\noverweigh\noverweighed\noverweighing\noverweighs\noverweight\noverweighted\noverweighting\noverweights\noverwhelm\noverwhelmed\noverwhelming\noverwhelmingly\noverwhelms\noverwind\noverwinding\noverwinds\noverwinter\noverwintered\noverwintering\noverwinters\noverwithheld\noverwithhold\noverwithholding\noverwithholds\noverwore\noverwork\noverworked\noverworking\noverworks\noverworn\noverwound\noverwrite\noverwrites\noverwriting\noverwritten\noverwrote\noverwrought\noverzealous\noverzealously\noverzealousness\novicidal\novicide\novicides\novid\novidian\noviduct\noviductal\noviducts\noviferous\noviform\novimbundu\novimbundus\novine\novines\novipara\noviparity\noviparous\noviparously\noviposit\noviposited\novipositing\noviposition\novipositional\novipositions\novipositor\novipositors\noviposits\novisac\novisacs\novoid\novoidal\novoidals\novoids\novolactovegetarian\novolactovegetarians\novoli\novolo\novonic\novonics\novotestes\novotestis\novoviviparity\novoviviparous\novoviviparously\novoviviparousness\novular\novulary\novulate\novulated\novulates\novulating\novulation\novulations\novulatory\novule\novules\novum\now\nowe\nowed\nowes\nowing\nowl\nowlet\nowlets\nowlish\nowlishly\nowlishness\nowls\nown\nowned\nowner\nownerless\nowners\nownership\nowning\nowns\nowyheei\nox\noxacillin\noxacillins\noxalacetate\noxalacetates\noxalacetic\noxalate\noxalated\noxalates\noxalating\noxalic\noxalis\noxalises\noxaloacetate\noxaloacetates\noxaloacetic\noxalosuccinic\noxazepam\noxazepams\noxblood\noxbow\noxbows\noxbridge\noxcart\noxcarts\noxen\noxeye\noxeyes\noxford\noxfords\noxfordshire\noxheart\noxhearts\noxidant\noxidants\noxidase\noxidases\noxidasic\noxidation\noxidations\noxidative\noxidatively\noxide\noxides\noxidic\noxidizable\noxidization\noxidizations\noxidize\noxidized\noxidizer\noxidizers\noxidizes\noxidizing\noxidoreductase\noxidoreductases\noxime\noximes\noximeter\noximeters\noximetric\noximetrically\noximetry\noxlip\noxlips\noxo\noxon\noxonian\noxonians\noxpecker\noxpeckers\noxtail\noxtails\noxter\noxters\noxtongue\noxtongues\noxus\noxyacetylene\noxyacid\noxyacids\noxycephalic\noxycephalies\noxycephalous\noxycephaly\noxycodone\noxycodones\noxygen\noxygenase\noxygenases\noxygenate\noxygenated\noxygenates\noxygenating\noxygenation\noxygenations\noxygenator\noxygenators\noxygenic\noxygenically\noxygenize\noxygenized\noxygenizes\noxygenizing\noxygenless\noxygenous\noxyhemoglobin\noxyhemoglobins\noxyhydrogen\noxymetazoline\noxymetazolines\noxymora\noxymoron\noxymoronic\noxymoronically\noxymorons\noxyphenbutazone\noxyphenbutazones\noxyphilic\noxysulfide\noxysulfides\noxytetracycline\noxytetracyclines\noxytocia\noxytocias\noxytocic\noxytocics\noxytocin\noxytocins\noxytone\noxytones\noxyuriasis\noyer\noyes\noyesses\noyez\noyster\noystercatcher\noystercatchers\noystered\noystering\noysterman\noystermen\noysters\noz\nozark\nozarkian\nozarkians\nozarks\nozocerite\nozocerites\nozokerite\nozokerites\nozonate\nozonated\nozonates\nozonating\nozonation\nozonations\nozone\nozonic\nozonide\nozonides\nozonization\nozonizations\nozonize\nozonized\nozonizer\nozonizers\nozonizes\nozonizing\nozonosphere\nozonospheric\nozonospherical\nozonous\nozostomia\nozostomias\np\npa\npa'anga\npablum\npablums\npabulum\npac\npaca\npacas\npace\npaced\npacemaker\npacemakers\npacemaking\npacer\npacers\npaces\npacesetter\npacesetters\npacesetting\npacha\npachas\npachinko\npachinkos\npachisi\npachisis\npachouli\npachoulis\npachuco\npachucos\npachyderm\npachydermal\npachydermatous\npachydermic\npachydermous\npachyderms\npachysandra\npachysandras\npachytene\npachytenes\npacifarin\npacifarins\npacifiable\npacific\npacifical\npacifically\npacification\npacifications\npacificator\npacificators\npacificatory\npacificism\npacificisms\npacificist\npacificists\npacified\npacifier\npacifiers\npacifies\npacifism\npacifist\npacifistic\npacifistically\npacifists\npacify\npacifying\npacing\npacinian\npack\npackability\npackable\npackage\npackaged\npackager\npackagers\npackages\npackaging\npackagings\npackboard\npackboards\npacked\npacker\npackers\npacket\npackets\npackhorse\npackhorses\npacking\npackinghouse\npackinghouses\npackings\npackman\npackmen\npacks\npacksack\npacksacks\npacksaddle\npacksaddles\npackthread\npackthreads\npacs\npact\npacts\npad\npadauk\npadauks\npadded\npadder\npadders\npaddies\npadding\npaddings\npaddle\npaddleball\npaddleballs\npaddleboard\npaddleboards\npaddleboat\npaddleboats\npaddled\npaddlefish\npaddlefishes\npaddler\npaddlers\npaddles\npaddling\npaddlings\npaddock\npaddocked\npaddocking\npaddocks\npaddy\npaderborn\npadi\npadis\npadishah\npadishahs\npadless\npadlock\npadlocked\npadlocking\npadlocks\npadouk\npadouks\npadova\npadre\npadres\npadrone\npadrones\npadroni\npadronism\npads\npadua\npaduan\npaduans\npaduasoy\npaduasoys\npaean\npaeanistic\npaeans\npaedogeneses\npaedogenesis\npaedogenetic\npaedogenetically\npaedogenic\npaedomorph\npaedomorphic\npaedomorphism\npaedomorphisms\npaedomorphoses\npaedomorphosis\npaedomorphs\npaella\npaellas\npaeon\npaeons\npagan\npagandom\npagandoms\npaganini\npaganish\npaganism\npaganization\npaganizations\npaganize\npaganized\npaganizer\npaganizers\npaganizes\npaganizing\npagans\npage\npageant\npageantries\npageantry\npageants\npageboy\npageboys\npaged\npageful\npagefuls\npager\npagers\npages\npaginal\npaginate\npaginated\npaginates\npaginating\npagination\npaginations\npaging\npagoda\npagodas\npah\npahlavi\npahlavis\npaid\npail\npailful\npailfuls\npaillard\npaillards\npaillasse\npaillasses\npaillette\npailletted\npaillettes\npails\npain\npained\npainful\npainfuller\npainfullest\npainfully\npainfulness\npaining\npainkiller\npainkillers\npainkilling\npainless\npainlessly\npainlessness\npains\npainstaking\npainstakingly\npaint\npaintability\npaintable\npaintbrush\npaintbrushes\npainted\npainter\npainterliness\npainterly\npainters\npainting\npaintings\npaints\npaintwork\npair\npaired\npairing\npairings\npairs\npaisa\npaisan\npaisano\npaisanos\npaisans\npaisas\npaise\npaisley\npaisleys\npaiute\npaiutes\npajama\npajamaed\npajamas\npakeha\npakehas\npakistan\npakistani\npakistanis\npal\npalace\npalaces\npaladin\npaladins\npalaestra\npalankeen\npalankeens\npalanquin\npalanquins\npalapa\npalapas\npalatability\npalatable\npalatableness\npalatably\npalatal\npalatalization\npalatalizations\npalatalize\npalatalized\npalatalizes\npalatalizing\npalatally\npalatals\npalate\npalates\npalatial\npalatially\npalatialness\npalatinate\npalatinates\npalatine\npalatines\npalatino\npalau\npalaver\npalavered\npalavering\npalavers\npalawan\npalazzi\npalazzo\npalazzos\npale\npalea\npaleae\npaleal\npalearctic\npaled\npaleethnologic\npaleethnological\npaleethnologies\npaleethnology\npaleface\npalefaces\npalely\npaleness\npaleoanthropic\npaleoanthropologic\npaleoanthropological\npaleoanthropologist\npaleoanthropologists\npaleoanthropology\npaleobiochemical\npaleobiochemistries\npaleobiochemistry\npaleobiogeographic\npaleobiogeographical\npaleobiogeography\npaleobiologic\npaleobiological\npaleobiologist\npaleobiologists\npaleobiology\npaleobotanic\npaleobotanical\npaleobotanically\npaleobotanist\npaleobotanists\npaleobotany\npaleocene\npaleoclimatologist\npaleoclimatologists\npaleoclimatology\npaleoecologic\npaleoecological\npaleoecologist\npaleoecologists\npaleoecology\npaleogene\npaleogeographic\npaleogeographical\npaleogeographically\npaleogeography\npaleographer\npaleographers\npaleographic\npaleographical\npaleographically\npaleography\npaleolith\npaleolithic\npaleoliths\npaleomagnetic\npaleomagnetically\npaleomagnetism\npaleomagnetist\npaleomagnetists\npaleontologic\npaleontological\npaleontologist\npaleontologists\npaleontology\npaleopathological\npaleopathologist\npaleopathologists\npaleopathology\npaleozoic\npaleozoological\npaleozoologist\npaleozoologists\npaleozoology\npaler\npalermo\npales\npalest\npalestine\npalestinian\npalestinians\npalestra\npalestrae\npalestral\npalestras\npalestrian\npalestrina\npalette\npalettes\npaley\npalfrey\npalfreys\npali\npalier\npaliest\npalimony\npalimpsest\npalimpsests\npalindrome\npalindromes\npalindromic\npalindromist\npalindromists\npaling\npalingeneses\npalingenesis\npalingenetic\npalingenetically\npalings\npalinode\npalinodes\npalisade\npalisaded\npalisades\npalisading\npalish\npall\npalladia\npalladian\npalladianism\npalladic\npalladio\npalladium\npalladiums\npalladous\npallas\npallbearer\npallbearers\npalled\npallet\npalletization\npalletizations\npalletize\npalletized\npalletizer\npalletizers\npalletizes\npalletizing\npallets\npallette\npallettes\npallia\npallial\npalliasse\npalliasses\npalliate\npalliated\npalliates\npalliating\npalliation\npalliations\npalliative\npalliatively\npalliatives\npalliator\npalliators\npallid\npallidly\npallidness\npallier\npalliest\npalling\npallium\npalliums\npallor\npallors\npalls\npally\npalm\npalma\npalmar\npalmary\npalmas\npalmate\npalmated\npalmately\npalmatifid\npalmation\npalmations\npalmatisect\npalmed\npalmer\npalmers\npalmerston\npalmerworm\npalmerworms\npalmette\npalmettes\npalmetto\npalmettoes\npalmettos\npalmful\npalmfuls\npalmier\npalmiest\npalming\npalmist\npalmister\npalmisters\npalmistry\npalmists\npalmitate\npalmitates\npalmitic\npalmitin\npalmitins\npalmlike\npalms\npalmy\npalmyra\npalmyras\npalomar\npalomino\npalominos\npalooka\npalookas\npalouse\npalouses\npaloverde\npaloverdes\npalp\npalpability\npalpable\npalpably\npalpal\npalpate\npalpated\npalpates\npalpating\npalpation\npalpations\npalpator\npalpators\npalpatory\npalpebra\npalpebrae\npalpebral\npalpebras\npalpi\npalpitant\npalpitate\npalpitated\npalpitates\npalpitating\npalpitatingly\npalpitation\npalpitations\npalps\npalpus\npals\npalsgrave\npalsgraves\npalship\npalships\npalsied\npalsies\npalsy\npalsying\npalter\npaltered\npalterer\npalterers\npaltering\npalters\npaltrier\npaltriest\npaltrily\npaltriness\npaltry\npaludal\npaludism\npaludisms\npaly\npalynologic\npalynological\npalynologically\npalynologist\npalynologists\npalynology\npam\npamby\npamir\npamlico\npampa\npampas\npampean\npamper\npampered\npamperer\npamperers\npampering\npampero\npamperos\npampers\npamphlet\npamphletary\npamphleteer\npamphleteered\npamphleteering\npamphleteers\npamphlets\npamplona\npamprodactylous\npan\npanacea\npanacean\npanaceas\npanache\npanaches\npanada\npanadas\npanama\npanamanian\npanamanians\npanamint\npanatela\npanatelas\npanay\npancake\npancaked\npancakes\npancaking\npancetta\npancettas\npanchax\npanchaxes\npanchen\npanchromatic\npanchromatism\npancratium\npancratiums\npancreas\npancreases\npancreatectomies\npancreatectomized\npancreatectomy\npancreatic\npancreatin\npancreatins\npancreatitis\npancreozymin\npancreozymins\npancytopenia\npancytopenias\npanda\npandaemonium\npandanaceous\npandanus\npandanuses\npandar\npandarus\npandas\npandean\npandect\npandects\npandemic\npandemics\npandemoniac\npandemonium\npander\npandered\npanderer\npanderers\npandering\npanders\npandied\npandies\npandit\npandits\npandora\npandore\npandores\npandowdies\npandowdy\npandurate\npanduriform\npandy\npandying\npane\npaned\npanegyric\npanegyrical\npanegyrically\npanegyrics\npanegyrist\npanegyrists\npanegyrize\npanegyrized\npanegyrizes\npanegyrizing\npanel\npaneled\npaneling\npanelings\npanelist\npanelists\npanelization\npanelizations\npanelize\npanelized\npanelizes\npanelizing\npanelled\npanelling\npanellings\npanels\npanencephalitis\npanes\npanetela\npanetelas\npanetella\npanetellas\npanettone\npanettones\npanettoni\npanfish\npanfishes\npanfried\npanfries\npanfry\npanfrying\npanful\npanfuls\npang\npanga\npangaea\npangas\npangea\npanged\npangenesis\npangenetic\npangenetically\npanging\npangloss\npanglossian\npangola\npangolin\npangolins\npangram\npangrammatic\npangrams\npangs\npanhandle\npanhandled\npanhandler\npanhandlers\npanhandles\npanhandling\npanhellenic\npanhuman\npanic\npanicked\npanicking\npanicky\npanicle\npanicled\npanicles\npanics\npaniculate\npaniculated\npaniculately\npanicum\npanicums\npanier\npaniers\npanini\npanjabi\npanjandrum\npanjandrums\npanky\npanleucopenia\npanleukopenia\npanmictic\npanmixia\npanmixias\npanmixis\npanne\npanned\npannes\npannier\npanniered\npanniers\npannikin\npannikins\npanning\npannonia\npannonian\npannonians\npanocha\npanochas\npanoche\npanoches\npanoplied\npanoplies\npanoply\npanoptic\npanoptical\npanorama\npanoramas\npanoramic\npanoramically\npanpipe\npanpipes\npans\npansexual\npansexuality\npansies\npanspermia\npanspermias\npansy\npant\npantagruel\npantagruelian\npantagruelism\npantagruelist\npantagruelists\npantalet\npantalets\npantalette\npantalettes\npantalone\npantalones\npantaloon\npantaloons\npantdress\npantdresses\npantechnicon\npantechnicons\npanted\npantheism\npantheist\npantheistic\npantheistical\npantheistically\npantheists\npantheon\npantheons\npanther\npanthers\npantie\npanties\npantile\npantiled\npantiles\npanting\npantingly\npantisocracies\npantisocracy\npantisocratic\npantisocratical\npantisocratist\npantisocratists\npanto\npantoffle\npantoffles\npantofle\npantofles\npantograph\npantographic\npantographs\npantomime\npantomimed\npantomimes\npantomimic\npantomiming\npantomimist\npantomimists\npantos\npantothenate\npantothenates\npantothenic\npantoum\npantoums\npantries\npantropic\npantropical\npantry\npantryman\npantrymen\npants\npantsuit\npantsuited\npantsuits\npanty\npantyhose\npantywaist\npantywaists\npanzer\npanzers\npap\npapa\npapacies\npapacy\npapago\npapagos\npapain\npapains\npapal\npapally\npapanicolaou\npaparazzi\npaparazzo\npapas\npapaverine\npapaverines\npapaw\npapaws\npapaya\npapayas\npapeete\npaper\npaperback\npaperbacked\npaperbacks\npaperboard\npaperboards\npaperbound\npaperboy\npaperboys\npaperclip\npaperclips\npapercraft\npapered\npaperer\npaperers\npapergirl\npapergirls\npaperhanger\npaperhangers\npaperhanging\npaperiness\npapering\npaperings\npaperknife\npaperknives\npaperless\npapermaker\npapermakers\npapermaking\npapers\npaperweight\npaperweights\npaperwork\npapery\npapeterie\npapeteries\npaphian\npaphians\npaphos\npapiamento\npapiamentu\npapier\npapilionaceous\npapilla\npapillae\npapillary\npapillate\npapilloma\npapillomas\npapillomata\npapillomatous\npapillomavirus\npapillomaviruses\npapillon\npapillons\npapillose\npapillote\npapillotes\npapist\npapistic\npapistry\npapists\npapoose\npapooses\npapovavirus\npapovaviruses\npappataci\npappi\npappier\npappies\npappiest\npappose\npappous\npappus\npappy\npaprika\npaprikas\npaps\npapua\npapuan\npapuans\npapula\npapulae\npapular\npapule\npapules\npapyri\npapyrologic\npapyrological\npapyrologist\npapyrologists\npapyrology\npapyrus\npapyruses\npar\npara\nparabioses\nparabiosis\nparabiotic\nparabiotically\nparablast\nparablastic\nparablasts\nparable\nparables\nparabola\nparabolas\nparabolic\nparabolical\nparabolically\nparaboloid\nparaboloidal\nparaboloids\nparacelsus\nparachute\nparachuted\nparachuter\nparachuters\nparachutes\nparachutic\nparachuting\nparachutist\nparachutists\nparaclete\nparade\nparaded\nparader\nparaders\nparades\nparadichlorobenzene\nparadichlorobenzenes\nparadiddle\nparadiddles\nparadigm\nparadigmatic\nparadigmatically\nparadigms\nparading\nparadisaic\nparadisaical\nparadisaically\nparadisal\nparadisally\nparadise\nparadises\nparadisiac\nparadisiacal\nparadisiacally\nparadisial\nparadisical\nparador\nparadores\nparadors\nparadox\nparadoxes\nparadoxical\nparadoxicality\nparadoxically\nparadoxicalness\nparadrop\nparadropped\nparadropping\nparadrops\nparaesthesia\nparaffin\nparaffined\nparaffinic\nparaffining\nparaffins\nparafoil\nparafoils\nparaformaldehyde\nparaformaldehydes\nparagenesia\nparagenesis\nparagenetic\nparagenetically\nparagon\nparagoned\nparagoning\nparagons\nparagraph\nparagraphed\nparagrapher\nparagraphers\nparagraphic\nparagraphical\nparagraphing\nparagraphs\nparaguay\nparaguayan\nparaguayans\nparainfluenza\nparajournalism\nparajournalist\nparajournalistic\nparajournalists\nparakeet\nparakeets\nparalanguage\nparaldehyde\nparalegal\nparalegals\nparalinguistic\nparalinguistics\nparalipomenon\nparallactic\nparallax\nparallaxes\nparallel\nparalleled\nparallelepiped\nparallelepipeds\nparalleling\nparallelism\nparallelisms\nparallelled\nparallelling\nparallelogram\nparallelograms\nparallels\nparalogism\nparalogisms\nparalogist\nparalogistic\nparalogists\nparalympian\nparalympians\nparalympic\nparalyses\nparalysis\nparalytic\nparalytically\nparalytics\nparalyzation\nparalyzations\nparalyze\nparalyzed\nparalyzer\nparalyzers\nparalyzes\nparalyzing\nparalyzingly\nparamagnet\nparamagnetic\nparamagnetically\nparamagnetism\nparamagnets\nparamaribo\nparamatta\nparamattas\nparamecia\nparamecium\nparameciums\nparamedic\nparamedical\nparamedics\nparament\nparamenta\nparaments\nparameter\nparameterization\nparameterizations\nparameterize\nparameterized\nparameterizes\nparameterizing\nparameters\nparametric\nparametrical\nparametrically\nparametrization\nparametrizations\nparametrize\nparametrized\nparametrizes\nparametrizing\nparamilitaries\nparamilitary\nparamnesia\nparamo\nparamorph\nparamorphic\nparamorphine\nparamorphines\nparamorphism\nparamorphisms\nparamorphous\nparamorphs\nparamos\nparamount\nparamountcy\nparamountly\nparamour\nparamours\nparamylon\nparamylons\nparamylum\nparamylums\nparamyxovirus\nparamyxoviruses\nparang\nparangs\nparanoia\nparanoiac\nparanoiacs\nparanoic\nparanoically\nparanoics\nparanoid\nparanoidal\nparanoids\nparanormal\nparanormality\nparanormally\nparanymph\nparanymphs\nparapareses\nparaparesis\nparapet\nparapeted\nparapets\nparaph\nparaphernalia\nparaphrasable\nparaphrase\nparaphrased\nparaphraser\nparaphrasers\nparaphrases\nparaphrasing\nparaphrastic\nparaphrastical\nparaphrastically\nparaphs\nparaphyses\nparaphysis\nparaplegia\nparaplegic\nparaplegics\nparapodia\nparapodial\nparapodium\nparapraxes\nparapraxis\nparaprofessional\nparaprofessionals\nparapsychological\nparapsychologist\nparapsychologists\nparapsychology\nparaquat\nparaquats\npararosaniline\npararosanilines\nparas\nparasail\nparasailed\nparasailer\nparasailers\nparasailing\nparasails\nparasang\nparasangs\nparaselenae\nparaselene\nparaselenic\nparasensorily\nparasensory\nparasexual\nparasexuality\nparashah\nparasite\nparasites\nparasitic\nparasitical\nparasitically\nparasiticidal\nparasiticide\nparasiticides\nparasitism\nparasitization\nparasitizations\nparasitize\nparasitized\nparasitizes\nparasitizing\nparasitoid\nparasitoids\nparasitologic\nparasitological\nparasitologically\nparasitologist\nparasitologists\nparasitology\nparasitoses\nparasitosis\nparasol\nparasoled\nparasols\nparasomnia\nparasomnias\nparastatal\nparastatals\nparasympathetic\nparasympathetically\nparasympathetics\nparasympathomimetic\nparasympathomimetics\nparasyntheses\nparasynthesis\nparasynthetic\nparatactic\nparatactical\nparatactically\nparataxis\nparathion\nparathions\nparathormone\nparathormones\nparathyroid\nparathyroidectomies\nparathyroidectomized\nparathyroidectomy\nparathyroids\nparatroop\nparatrooper\nparatroopers\nparatroops\nparatyphoid\nparavane\nparavanes\nparaxial\nparboil\nparboiled\nparboiling\nparboils\nparbuckle\nparbuckled\nparbuckles\nparbuckling\nparcae\nparcel\nparceled\nparceling\nparcelled\nparcelling\nparcels\nparcenaries\nparcenary\nparcener\nparceners\nparch\nparched\nparchedness\nparcheesi\nparches\nparching\nparchment\nparchments\npard\npardi\npardie\npardner\npardners\npardon\npardonable\npardonableness\npardonably\npardoned\npardoner\npardoners\npardoning\npardons\npards\npardy\npare\npared\nparegoric\nparegorics\nparenchyma\nparenchymal\nparenchymatous\nparenchymatously\nparent\nparentage\nparental\nparentally\nparented\nparenteral\nparenterally\nparentheses\nparenthesis\nparenthesize\nparenthesized\nparenthesizes\nparenthesizing\nparenthetic\nparenthetical\nparenthetically\nparenthood\nparenting\nparentis\nparentless\nparents\nparenty\npareo\npareos\nparer\nparers\npares\npareses\nparesis\nparesthesia\nparesthetic\nparetic\nparetically\nparetics\npareu\npareus\npareve\nparfait\nparfaits\nparfleche\nparfleches\nparfocal\nparfocality\nparfocalize\nparfocalized\nparfocalizes\nparfocalizing\nparge\nparged\nparges\nparget\npargeted\npargeting\npargets\npargetted\npargetting\nparging\npargyline\npargylines\nparhelia\nparhelic\nparhelion\npari\npariah\npariahs\nparian\nparians\nparibus\nparicutin\nparies\nparietal\nparietals\nparietes\nparing\nparings\nparipinnate\nparis\nparish\nparishes\nparishioner\nparishioners\nparisian\nparisians\nparisienne\nparities\nparity\npark\nparka\nparkas\nparked\nparker\nparkers\nparking\nparkinson\nparkinson's\nparkinsonian\nparkinsonism\nparkinsonisms\nparkland\nparklands\nparklike\nparks\nparkway\nparkways\nparlance\nparlances\nparlando\nparlante\nparlay\nparlayed\nparlaying\nparlays\nparle\nparled\nparles\nparley\nparleyed\nparleying\nparleys\nparliament\nparliamentarian\nparliamentarians\nparliamentary\nparliaments\nparling\nparlor\nparlors\nparlous\nparlously\nparma\nparmenides\nparmesan\nparmesans\nparmigiana\nparmigiano\nparnassian\nparnassians\nparnassus\nparnassós\nparnell\nparochial\nparochialism\nparochialist\nparochialists\nparochially\nparodic\nparodical\nparodied\nparodies\nparodist\nparodistic\nparodists\nparody\nparodying\nparol\nparole\nparoled\nparolee\nparolees\nparoles\nparoling\nparols\nparonomasia\nparonomasial\nparonomasias\nparonomastic\nparonomastically\nparonychia\nparonychial\nparonychias\nparonym\nparonymic\nparonymous\nparonyms\nparos\nparosmia\nparosmias\nparotid\nparotidectomies\nparotidectomy\nparotiditis\nparotids\nparotitic\nparotitis\nparous\nparousia\nparoxysm\nparoxysmal\nparoxysmally\nparoxysms\nparoxytone\nparoxytones\nparquet\nparqueted\nparqueting\nparquetries\nparquetry\nparquets\nparr\nparrakeet\nparrakeets\nparral\nparrals\nparramatta\nparramattas\nparred\nparrel\nparrels\nparricidal\nparricidally\nparricide\nparricides\nparried\nparries\nparring\nparrot\nparroted\nparroter\nparroters\nparrotfish\nparrotfishes\nparroting\nparrots\nparrs\nparry\nparrying\npars\nparse\nparsec\nparsecs\nparsed\nparsee\nparseeism\nparsees\nparser\nparsers\nparses\nparsi\nparsifal\nparsiism\nparsimonious\nparsimoniously\nparsimoniousness\nparsimony\nparsing\nparsis\nparsley\nparsleyed\nparsleys\nparslied\nparsnip\nparsnips\nparson\nparsonage\nparsonages\nparsons\npart\npartake\npartaken\npartaker\npartakers\npartakes\npartaking\nparte\nparted\nparterre\nparterres\nparthenocarpic\nparthenocarpically\nparthenocarpy\nparthenogenesis\nparthenogenetic\nparthenogenetically\nparthenogenone\nparthenogenones\nparthenon\nparthia\nparthian\nparthians\nparti\npartial\npartialities\npartiality\npartially\npartialness\npartials\npartibility\npartible\nparticipance\nparticipant\nparticipants\nparticipate\nparticipated\nparticipates\nparticipating\nparticipation\nparticipational\nparticipations\nparticipative\nparticipator\nparticipators\nparticipatory\nparticipial\nparticipially\nparticipials\nparticiple\nparticiples\nparticle\nparticleboard\nparticles\nparticular\nparticularism\nparticularist\nparticularistic\nparticularists\nparticularities\nparticularity\nparticularization\nparticularizations\nparticularize\nparticularized\nparticularizer\nparticularizers\nparticularizes\nparticularizing\nparticularly\nparticulars\nparticulate\nparticulates\npartied\nparties\nparting\npartings\npartis\npartisan\npartisanly\npartisans\npartisanship\npartisanships\npartita\npartitas\npartite\npartition\npartitioned\npartitioner\npartitioners\npartitioning\npartitionings\npartitionist\npartitionists\npartitionment\npartitionments\npartitions\npartitive\npartitively\npartitives\npartizan\npartizans\npartlet\npartlets\npartly\npartner\npartnered\npartnering\npartnerless\npartners\npartnership\npartnerships\nparton\npartons\npartook\npartout\npartridge\npartridgeberry\npartridges\nparts\nparturiency\nparturient\nparturifacient\nparturifacients\nparturition\nparturitions\npartway\nparty\npartyer\npartyers\npartygoer\npartygoers\npartying\nparure\nparures\nparvati\nparve\nparvenu\nparvenue\nparvenues\nparvenus\nparvis\nparvise\nparvises\nparvo\nparvos\nparvovirus\nparvoviruses\npará\npas\npasadena\npascal\npascals\npasch\npascha\npaschal\npase\npaseo\npaseos\npases\npash\npasha\npashas\npashes\npashto\npashtun\npashtuns\npasiphaë\npaso\npasqueflower\npasqueflowers\npasquinade\npasquinaded\npasquinader\npasquinaders\npasquinades\npasquinading\npass\npassable\npassableness\npassably\npassacaglia\npassacaglias\npassade\npassades\npassado\npassadoes\npassados\npassage\npassaged\npassages\npassageway\npassageways\npassagework\npassageworks\npassaging\npassamaquoddies\npassamaquoddy\npassant\npassband\npassbands\npassbook\npassbooks\npasschendaele\npasse\npassed\npassel\npassels\npassementerie\npassementeries\npassenger\npassengers\npassepied\npassepieds\npasser\npasserby\npasserine\npasserines\npassers\npassersby\npasses\npassibility\npassible\npassim\npassing\npassingly\npassings\npassion\npassional\npassionals\npassionate\npassionately\npassionateness\npassionflower\npassionflowers\npassionist\npassionists\npassionless\npassionlessly\npassions\npassiontide\npassiontides\npassivate\npassivated\npassivates\npassivating\npassivation\npassivations\npassivator\npassivators\npassive\npassively\npassiveness\npassives\npassivism\npassivisms\npassivist\npassivists\npassivity\npasskey\npasskeys\npassover\npassovers\npassport\npassports\npassu\npassword\npasswords\npassé\npast\npasta\npastas\npaste\npasteboard\npasteboards\npasted\npastedown\npastedowns\npastel\npastelist\npastelists\npastellist\npastellists\npastels\npaster\npastern\npasternak\npasterns\npasters\npastes\npasteup\npasteups\npasteur\npasteurization\npasteurizations\npasteurize\npasteurized\npasteurizer\npasteurizers\npasteurizes\npasteurizing\npasticci\npasticcio\npasticcios\npastiche\npastiches\npasticheur\npasticheurs\npastier\npasties\npastiest\npastil\npastille\npastilles\npastils\npastime\npastimes\npastina\npastiness\npasting\npastis\npastises\npastless\npastness\npastor\npastoral\npastorale\npastorales\npastorali\npastoralism\npastoralisms\npastoralist\npastoralists\npastoralization\npastoralizations\npastoralize\npastoralized\npastoralizes\npastoralizing\npastorally\npastoralness\npastorals\npastorate\npastorates\npastored\npastoring\npastorium\npastoriums\npastors\npastorship\npastorships\npastrami\npastramis\npastries\npastromi\npastromis\npastry\npasts\npasturable\npasturage\npasture\npastured\npastureland\npasturelands\npasturer\npasturers\npastures\npasturing\npasty\npat\npataca\npatacas\npatagia\npatagial\npatagium\npatagonia\npatagonian\npatagonians\npataphysics\npatas\npatch\npatchable\npatchboard\npatchboards\npatched\npatcher\npatchers\npatches\npatchier\npatchiest\npatchily\npatchiness\npatching\npatchouli\npatchoulies\npatchoulis\npatchouly\npatchwork\npatchworks\npatchy\npate\npated\npatella\npatellae\npatellar\npatellate\npatelliform\npaten\npatency\npatens\npatent\npatentability\npatentable\npatented\npatentee\npatentees\npatenting\npatently\npatentor\npatentors\npatents\npater\npaterfamilias\npaterfamiliases\npaternal\npaternalism\npaternalist\npaternalistic\npaternalistically\npaternalists\npaternally\npaternities\npaternity\npaternoster\npaternosters\npaters\npates\npath\npathan\npathans\npathbreaking\npathetic\npathetical\npathetically\npathfinder\npathfinders\npathfinding\npathless\npathlessness\npathname\npathobiology\npathogen\npathogeneses\npathogenesis\npathogenetic\npathogenic\npathogenically\npathogenicity\npathogenies\npathogens\npathogeny\npathognomonic\npathography\npathologic\npathological\npathologically\npathologies\npathologist\npathologists\npathology\npathophysiologic\npathophysiological\npathophysiologist\npathophysiologists\npathophysiology\npathos\npaths\npathway\npathways\npathétique\npatience\npatient\npatiently\npatients\npatin\npatina\npatinae\npatinaed\npatinas\npatinate\npatinated\npatinates\npatinating\npatination\npatinations\npatine\npatined\npatines\npatining\npatins\npatio\npatios\npatisserie\npatisseries\npatissier\npatissiers\npatly\npatmos\npatna\npatness\npatois\npatresfamilias\npatriarch\npatriarchal\npatriarchalism\npatriarchally\npatriarchate\npatriarchates\npatriarchic\npatriarchies\npatriarchs\npatriarchy\npatricia\npatrician\npatricianly\npatricians\npatriciate\npatriciates\npatricidal\npatricide\npatricides\npatrick\npatriclinous\npatrilineage\npatrilineages\npatrilineal\npatrilocal\npatrilocally\npatrimonial\npatrimonially\npatrimonies\npatrimony\npatriot\npatriotic\npatriotically\npatriotism\npatriots\npatristic\npatristical\npatristically\npatristics\npatroclinous\npatroclus\npatrol\npatrolled\npatroller\npatrollers\npatrolling\npatrolman\npatrolmen\npatrols\npatrolwoman\npatrolwomen\npatron\npatronage\npatronal\npatroness\npatronesses\npatronization\npatronizations\npatronize\npatronized\npatronizer\npatronizers\npatronizes\npatronizing\npatronizingly\npatrons\npatronymic\npatronymically\npatronymics\npatroon\npatroons\npats\npatsies\npatsy\npatted\npatten\npattens\npatter\npattered\npatterer\npatterers\npattering\npattern\npatterned\npatterning\npatternings\npatternless\npatternmaker\npatternmakers\npatternmaking\npatterns\npatters\npattie\npatties\npatting\npatty\npattypan\npattypans\npatulent\npatulous\npatulously\npatulousness\npatzer\npatzers\npaucity\npaul\npauline\npaulist\npaulists\npaulo\npaulownia\npaulownias\npaunch\npaunches\npaunchier\npaunchiest\npaunchiness\npaunchy\npauper\npauperism\npauperization\npauperizations\npauperize\npauperized\npauperizes\npauperizing\npaupers\npaupiette\npaupiettes\npausanias\npause\npaused\npauses\npausing\npavan\npavane\npavanes\npavans\npavarotti\npave\npaved\npaveed\npavement\npavements\npaver\npavers\npaves\npavia\npavid\npavilion\npavilioned\npavilioning\npavilions\npaving\npavings\npavis\npavises\npavisse\npavisses\npavlov\npavlova\npavlovian\npavo\npavonine\npavé\npaw\npawed\npawer\npawers\npawing\npawkier\npawkiest\npawky\npawl\npawls\npawn\npawnable\npawnage\npawnages\npawnbroker\npawnbrokers\npawnbroking\npawned\npawnee\npawnees\npawner\npawners\npawning\npawnor\npawnors\npawns\npawnshop\npawnshops\npawpaw\npawpaws\npaws\npax\npay\npayable\npayables\npayback\npaybacks\npaycheck\npaychecks\npayday\npaydays\npayed\npayee\npayees\npayer\npayers\npaying\npayload\npayloader\npayloads\npaymaster\npaymasters\npayment\npayments\npaynim\npaynims\npayoff\npayoffs\npayola\npayolas\npayor\npayors\npayout\npayouts\npayphone\npayphones\npayroll\npayrolls\npays\npc\npcs\npe\npea\npeabody\npeace\npeaceable\npeaceableness\npeaceably\npeaceful\npeacefully\npeacefulness\npeacekeeper\npeacekeepers\npeacekeeping\npeacemaker\npeacemakers\npeacemaking\npeacenik\npeaceniks\npeacetime\npeacetimes\npeach\npeached\npeaches\npeachick\npeachicks\npeachier\npeachiest\npeachiness\npeaching\npeachy\npeacock\npeacocked\npeacocking\npeacockish\npeacocks\npeacocky\npeafowl\npeafowls\npeag\npeage\npeages\npeags\npeahen\npeahens\npeak\npeaked\npeakedness\npeaking\npeaks\npeaky\npeal\npealed\npealike\npealing\npeals\npean\npeans\npeanut\npeanuts\npear\npearl\npearled\npearler\npearlers\npearlescence\npearlescent\npearlier\npearliest\npearliness\npearling\npearlite\npearlites\npearlitic\npearlized\npearls\npearly\npears\npeart\npeartly\npeas\npeasant\npeasantry\npeasants\npeascod\npeascods\npease\npeasecod\npeasecods\npeashooter\npeashooters\npeat\npeats\npeaty\npeavey\npeaveys\npeavies\npeavy\npeavys\npebble\npebbled\npebbles\npebbling\npebbly\npec\npecan\npecans\npeccability\npeccable\npeccadillo\npeccadilloes\npeccadillos\npeccancies\npeccancy\npeccant\npeccantly\npeccaries\npeccary\npeccavi\npeccavis\npeck\npecked\npecker\npeckers\npeckerwood\npeckerwoods\npecking\npeckish\npecks\npecksniffian\npecky\npecorino\npecorinos\npecs\npectase\npectases\npectate\npectates\npecten\npectens\npectic\npectin\npectinaceous\npectinate\npectinated\npectination\npectinations\npectines\npectinesterase\npectinesterases\npectinous\npectins\npectoral\npectorals\npectoris\npeculate\npeculated\npeculates\npeculating\npeculation\npeculations\npeculator\npeculators\npeculiar\npeculiarities\npeculiarity\npeculiarly\npeculiars\npecuniarily\npecuniary\nped\npedagog\npedagogic\npedagogical\npedagogically\npedagogics\npedagogs\npedagogue\npedagogues\npedagoguish\npedagogy\npedal\npedaled\npedaler\npedalers\npedalfer\npedalfers\npedaling\npedalled\npedaller\npedallers\npedalling\npedalo\npedalos\npedals\npedant\npedantic\npedantically\npedantries\npedantry\npedants\npedate\npeddle\npeddled\npeddler\npeddlers\npeddles\npeddling\npederast\npederastic\npederasties\npederasts\npederasty\npedes\npedestal\npedestaled\npedestaling\npedestalled\npedestalling\npedestals\npedestrian\npedestrianism\npedestrianization\npedestrianizations\npedestrianize\npedestrianized\npedestrianizes\npedestrianizing\npedestrians\npediatric\npediatrician\npediatricians\npediatrics\npediatrist\npediatrists\npedicab\npedicabs\npedicel\npedicellar\npedicellate\npedicels\npedicle\npedicled\npedicles\npedicular\npediculate\npediculates\npediculosis\npediculous\npedicure\npedicured\npedicures\npedicuring\npedicurist\npedicurists\npediform\npedigree\npedigreed\npedigrees\npediment\npedimental\npedimented\npediments\npedipalp\npedipalps\npedlar\npedlars\npedocal\npedocalic\npedocals\npedodontia\npedodontias\npedodontics\npedodontists\npedogeneses\npedogenesis\npedogenetic\npedogenic\npedologic\npedological\npedologically\npedologist\npedologists\npedology\npedometer\npedometers\npedomorph\npedomorphism\npedomorphisms\npedomorphoses\npedomorphosis\npedomorphs\npedophile\npedophiles\npedophilia\npedophiliac\npedophiliacs\npedophilic\npeduncle\npeduncled\npeduncles\npeduncular\npedunculate\npedunculated\npee\npeed\npeeing\npeek\npeekaboo\npeeked\npeeking\npeeks\npeel\npeelable\npeeled\npeeler\npeelers\npeeling\npeelings\npeels\npeen\npeened\npeening\npeens\npeep\npeeped\npeeper\npeepers\npeephole\npeepholes\npeeping\npeeps\npeepshow\npeepshows\npeepul\npeepuls\npeer\npeerage\npeerages\npeered\npeeress\npeeresses\npeering\npeerless\npeerlessly\npeerlessness\npeers\npees\npeetweet\npeetweets\npeeve\npeeved\npeeves\npeeving\npeevish\npeevishly\npeevishness\npeewee\npeewees\npeewit\npeewits\npeg\npegasus\npegboard\npegboards\npegged\npegging\npegmatite\npegmatitic\npegs\npehlevi\npeignoir\npeignoirs\npein\npeined\npeining\npeins\npejoration\npejorations\npejorative\npejoratively\npejoratives\npekan\npekans\npeke\npekes\npekin\npekinese\npeking\npekingese\npekins\npekoe\npekoes\npelage\npelages\npelagian\npelagianism\npelagians\npelagic\npelargonic\npelargonium\npelargoniums\npelasgian\npelasgians\npelasgic\npelecypod\npelecypods\npelerine\npelerines\npelew\npelf\npelican\npelicans\npelion\npelisse\npelisses\npelite\npelites\npelitic\npell\npellagra\npellagrin\npellagrins\npellagrous\npellet\npelletal\npelleted\npelleting\npelletization\npelletizations\npelletize\npelletized\npelletizer\npelletizers\npelletizes\npelletizing\npellets\npellicle\npellicles\npellicular\npellitories\npellitory\npellucid\npellucida\npellucidae\npellucidity\npellucidly\npellucidness\npelmet\npelmets\npeloponnese\npeloponnesian\npeloponnesians\npeloponnesos\npeloponnesus\npeloria\npelorias\npeloric\npelorus\npeloruses\npelota\npelotas\npelt\npeltate\npeltately\npelted\npelter\npelters\npelting\npeltries\npeltry\npelts\npelves\npelvic\npelvimeter\npelvimeters\npelvimetry\npelvis\npelvises\npelycosaur\npelycosaurs\npelée\npemba\npembroke\npemican\npemicans\npemmican\npemmicans\npemoline\npemolines\npemphigous\npemphigus\npemphiguses\npen\npenal\npenalization\npenalizations\npenalize\npenalized\npenalizes\npenalizing\npenally\npenalties\npenalty\npenance\npenanced\npenances\npenancing\npenang\npenates\npence\npencel\npencels\npenchant\npenchants\npencil\npenciled\npenciler\npencilers\npenciling\npencilled\npenciller\npencillers\npencilling\npencils\npendant\npendants\npendelikón\npendency\npendent\npendentive\npendently\npendents\npending\npendular\npendulous\npendulously\npendulousness\npendulum\npendulums\npenelope\npeneplain\npeneplains\npeneplane\npeneplanes\npenes\npenetrability\npenetrable\npenetrably\npenetralia\npenetrameter\npenetrameters\npenetrance\npenetrances\npenetrant\npenetrants\npenetrate\npenetrated\npenetrates\npenetrating\npenetratingly\npenetration\npenetrations\npenetrative\npenetrator\npenetrators\npenetrometer\npenetrometers\npenghu\npengo\npengos\npenguin\npenguins\npenh\npenholder\npenholders\npenicillamine\npenicillamines\npenicillate\npenicillately\npenicillation\npenicillations\npenicillia\npenicillin\npenicillinase\npenicillinases\npenicillium\npenicilliums\npenicuik\npenile\npeninsula\npeninsular\npeninsulas\npenis\npenises\npenitence\npenitences\npenitent\npenitente\npenitentes\npenitential\npenitentially\npenitentials\npenitentiaries\npenitentiary\npenitently\npenitents\npenknife\npenknives\npenlight\npenlights\npenlite\npenlites\npenman\npenmanship\npenmen\npenn\npenna\npennaceous\npennae\npenname\npennames\npennant\npennants\npennate\npennated\npenne\npenned\npenner\npenners\npenni\npennia\npennies\npenniless\npennilessly\npennilessness\npennine\npennines\npenning\npennis\npennon\npennoncel\npennoncelle\npennoncelles\npennoncels\npennoned\npennons\npennsylvania\npennsylvanian\npennsylvanians\npenny\npennycress\npennycresses\npennyroyal\npennyroyals\npennyweight\npennyweights\npennywhistle\npennywhistles\npennywise\npennywort\npennyworth\npennyworths\npennyworts\npenobscot\npenobscots\npenoche\npenological\npenologically\npenologist\npenologists\npenology\npenoncel\npenoncels\npens\npensil\npensile\npensils\npension\npensionable\npensionaries\npensionary\npensione\npensioned\npensioner\npensioners\npensiones\npensioning\npensionless\npensions\npensive\npensively\npensiveness\npenstemon\npenstemons\npenstock\npenstocks\npensée\npensées\npent\npentachlorophenol\npentachlorophenols\npentacle\npentacles\npentad\npentadactyl\npentadactylate\npentadactylism\npentads\npentagon\npentagonal\npentagonally\npentagonese\npentagons\npentagram\npentagrams\npentagynous\npentahedra\npentahedral\npentahedron\npentahedrons\npentamerism\npentamerous\npentameter\npentameters\npentamidine\npentandrous\npentane\npentanes\npentangle\npentangles\npentangular\npentapeptide\npentapeptides\npentaploid\npentaploids\npentaploidy\npentaquin\npentaquine\npentaquines\npentaquins\npentarchical\npentarchies\npentarchy\npentastich\npentastiches\npentastome\npentastomes\npentateuch\npentateuchal\npentathlete\npentathletes\npentathlon\npentathlons\npentatonic\npentavalent\npentazocine\npentazocines\npentecost\npentecostal\npentecostalism\npentecostalist\npentecostalists\npentecostals\npenthouse\npenthouses\npentimenti\npentimento\npentlandite\npentlandites\npentobarbital\npentobarbitone\npentobarbitones\npentosan\npentosans\npentose\npentoses\npentothal\npentoxide\npentoxides\npentstemon\npentstemons\npentyl\npentylenetetrazol\npentylenetetrazols\npentyls\npenuche\npenuches\npenuchi\npenuchis\npenuchle\npenuckle\npenult\npenultima\npenultimas\npenultimate\npenultimately\npenultimates\npenults\npenumbra\npenumbrae\npenumbral\npenumbras\npenumbrous\npenurious\npenuriously\npenuriousness\npenury\npenutian\npeon\npeonage\npeones\npeonies\npeons\npeony\npeople\npeopled\npeoplehood\npeopleless\npeopler\npeoplers\npeoples\npeopling\npeoria\npeorias\npep\npeperomia\npeperomias\npepier\npepiest\npepino\npepinos\npeplos\npeploses\npeplum\npeplumed\npeplums\npeplus\npepluses\npepo\npepos\npepped\npepper\npepperbox\npepperboxes\npepperbush\npepperbushes\npeppercorn\npeppercorns\npeppercress\npeppercresses\npeppered\npepperer\npepperers\npeppergrass\npeppergrasses\npepperidge\npepperidges\npepperiness\npeppering\npeppermint\npeppermints\npepperminty\npepperoni\npepperonis\npeppers\npeppershaker\npeppershakers\npeppertree\npeppertrees\npepperwood\npepperwoods\npepperwort\npepperworts\npeppery\npeppier\npeppiest\npeppily\npeppiness\npepping\npeppy\npeps\npepsi\npepsin\npepsine\npepsines\npepsinogen\npepsinogens\npepsins\npeptic\npeptics\npeptidase\npeptidases\npeptide\npeptides\npeptidic\npeptidically\npeptidoglycan\npeptidoglycans\npeptization\npeptizations\npeptize\npeptized\npeptizer\npeptizers\npeptizes\npeptizing\npeptone\npeptones\npeptonic\npeptonization\npeptonizations\npeptonize\npeptonized\npeptonizes\npeptonizing\npepys\npequot\npequots\nper\nperacid\nperacids\nperadventure\nperadventures\nperambulate\nperambulated\nperambulates\nperambulating\nperambulation\nperambulations\nperambulator\nperambulators\nperambulatory\nperborate\nperborates\npercale\npercales\npercaline\npercalines\nperceivable\nperceivably\nperceive\nperceived\nperceiver\nperceivers\nperceives\nperceiving\npercent\npercentage\npercentages\npercenter\npercenters\npercentile\npercentiles\npercentism\npercents\npercept\nperceptibility\nperceptible\nperceptibly\nperception\nperceptional\nperceptions\nperceptive\nperceptively\nperceptiveness\nperceptivity\npercepts\nperceptual\nperceptually\nperch\nperchance\nperched\npercher\npercheron\npercherons\nperchers\nperches\nperching\nperchlorate\nperchlorates\nperchloric\nperchlorid\nperchloride\nperchlorides\nperchlorids\nperchloroethylene\nperchloroethylenes\nperciatelli\npercipience\npercipiency\npercipient\npercipiently\npercipients\npercodan\npercoid\npercoidean\npercoids\npercolate\npercolated\npercolates\npercolating\npercolation\npercolations\npercolator\npercolators\npercurrent\npercuss\npercussed\npercusses\npercussing\npercussion\npercussionist\npercussionists\npercussions\npercussive\npercussively\npercussiveness\npercutaneous\npercutaneously\npercy\nperdie\nperdita\nperdition\nperdu\nperdue\nperdues\nperdurability\nperdurable\nperdurably\nperdure\nperdured\nperdures\nperduring\nperdus\nperegrinate\nperegrinated\nperegrinates\nperegrinating\nperegrination\nperegrinations\nperegrinator\nperegrinators\nperegrine\nperegrines\npereion\npereiopod\npereiopods\nperemptorily\nperemptoriness\nperemptory\nperennate\nperennated\nperennates\nperennating\nperennation\nperennations\nperennial\nperennially\nperennials\nperentie\nperenties\npereon\npereopod\npereopods\nperestroika\nperfect\nperfecta\nperfectas\nperfected\nperfecter\nperfecters\nperfectibility\nperfectible\nperfecting\nperfection\nperfectionism\nperfectionist\nperfectionistic\nperfectionists\nperfections\nperfective\nperfectively\nperfectiveness\nperfectives\nperfectivity\nperfectly\nperfectness\nperfecto\nperfectos\nperfects\nperfervid\nperfervidly\nperfervidness\nperfidies\nperfidious\nperfidiously\nperfidiousness\nperfidy\nperfoliate\nperfoliation\nperforable\nperforate\nperforated\nperforates\nperforating\nperforation\nperforations\nperforative\nperforator\nperforators\nperforce\nperform\nperformability\nperformable\nperformance\nperformances\nperformative\nperformatory\nperformed\nperformer\nperformers\nperforming\nperforms\nperfume\nperfumed\nperfumer\nperfumeries\nperfumers\nperfumery\nperfumes\nperfuming\nperfunctorily\nperfunctoriness\nperfunctory\nperfusate\nperfusates\nperfuse\nperfused\nperfuses\nperfusing\nperfusion\nperfusionist\nperfusionists\nperfusions\nperfusive\npergamum\npergola\npergolas\nperhaps\nperianth\nperianths\nperiapt\nperiapts\nperiaqueductal\npericardia\npericardiac\npericardial\npericarditis\npericardium\npericarp\npericarpial\npericarps\nperichondral\nperichondria\nperichondrial\nperichondrium\npericlase\npericlases\npericlean\npericles\npericline\npericlines\npericope\npericopes\npericrania\npericranial\npericranium\npericycle\npericycles\npericyclic\nperiderm\nperidermal\nperidermic\nperiderms\nperidia\nperidial\nperidium\nperidot\nperidotic\nperidotite\nperidotites\nperidotitic\nperidots\nperigeal\nperigean\nperigee\nperigees\nperigynous\nperigyny\nperihelia\nperihelial\nperihelion\nperikarya\nperikaryal\nperikaryon\nperil\nperiled\nperiling\nperilla\nperillas\nperilled\nperilling\nperilous\nperilously\nperilousness\nperils\nperilune\nperilunes\nperilymph\nperilymphatic\nperilymphs\nperimeter\nperimeters\nperimetric\nperimetrical\nperimetrically\nperimorph\nperimorphic\nperimorphism\nperimorphous\nperimorphs\nperimysia\nperimysium\nperinatal\nperinatally\nperinatology\nperinea\nperineal\nperinephral\nperinephria\nperinephrial\nperinephric\nperinephrium\nperineum\nperineuria\nperineurial\nperineurium\nperiod\nperiodic\nperiodical\nperiodically\nperiodicals\nperiodicities\nperiodicity\nperiodization\nperiodizations\nperiodontal\nperiodontally\nperiodontia\nperiodontias\nperiodontic\nperiodontical\nperiodontics\nperiodontist\nperiodontists\nperiodontology\nperiods\nperionychia\nperionychium\nperiostea\nperiosteal\nperiosteous\nperiosteum\nperiostitic\nperiostitis\nperiostitises\nperiostraca\nperiostracum\nperiotic\nperipatetic\nperipatetically\nperipateticism\nperipatetics\nperipatus\nperipatuses\nperipeteia\nperipeteias\nperipetia\nperipetias\nperipeties\nperipety\nperipheral\nperipherally\nperipherals\nperipheries\nperiphery\nperiphrases\nperiphrasis\nperiphrastic\nperiphrastically\nperiphytic\nperiphytics\nperiphyton\nperiphytons\nperiplasm\nperiplasmic\nperiplasms\nperiplast\nperiplasts\nperiproct\nperiprocts\nperipteral\nperique\nperiques\nperisarc\nperisarcal\nperisarcous\nperisarcs\nperiscope\nperiscopes\nperiscopic\nperiscopical\nperish\nperishability\nperishable\nperishableness\nperishables\nperishably\nperished\nperishes\nperishing\nperisperm\nperisperms\nperissodactyl\nperissodactyla\nperissodactylous\nperissodactyls\nperistalses\nperistalsis\nperistaltic\nperistaltically\nperistomal\nperistome\nperistomes\nperistomial\nperistylar\nperistyle\nperistyles\nperithecia\nperithecial\nperithecium\nperitonaea\nperitonaeum\nperitonea\nperitoneal\nperitoneally\nperitoneum\nperitoneums\nperitonitis\nperitrich\nperitricha\nperitrichous\nperitrichously\nperitrichs\nperivisceral\nperiwig\nperiwigged\nperiwigs\nperiwinkle\nperiwinkles\nperjure\nperjured\nperjurer\nperjurers\nperjures\nperjuries\nperjuring\nperjurious\nperjuriously\nperjury\nperk\nperked\nperkier\nperkiest\nperkily\nperkiness\nperking\nperks\nperky\nperlite\nperlites\nperlitic\nperm\npermaculture\npermacultures\npermafrost\npermalloy\npermanence\npermanencies\npermanency\npermanent\npermanently\npermanentness\npermanents\npermanganate\npermanganates\npermanganic\npermeabilities\npermeability\npermeable\npermeably\npermeance\npermeances\npermeant\npermease\npermeases\npermeate\npermeated\npermeates\npermeating\npermeation\npermeations\npermeative\npermed\npermethrin\npermian\npermillage\nperming\npermissibility\npermissible\npermissibleness\npermissibly\npermission\npermissions\npermissive\npermissively\npermissiveness\npermit\npermits\npermitted\npermittee\npermittees\npermitter\npermitters\npermitting\npermittivities\npermittivity\nperms\npermutability\npermutable\npermutably\npermutation\npermutational\npermutations\npermute\npermuted\npermutes\npermuting\npernambuco\npernicious\nperniciously\nperniciousness\npernickety\npernod\nperoneal\nperoral\nperorally\nperorate\nperorated\nperorates\nperorating\nperoration\nperorational\nperorations\nperovskite\nperovskites\nperoxidase\nperoxidases\nperoxide\nperoxided\nperoxides\nperoxidic\nperoxiding\nperoxisomal\nperoxisome\nperoxisomes\nperoxyacetyl\nperp\nperpend\nperpended\nperpendicular\nperpendicularity\nperpendicularly\nperpendiculars\nperpending\nperpends\nperpetrate\nperpetrated\nperpetrates\nperpetrating\nperpetration\nperpetrations\nperpetrator\nperpetrators\nperpetual\nperpetually\nperpetuance\nperpetuances\nperpetuate\nperpetuated\nperpetuates\nperpetuating\nperpetuation\nperpetuations\nperpetuator\nperpetuators\nperpetuities\nperpetuity\nperphenazine\nperphenazines\nperpignan\nperplex\nperplexed\nperplexedly\nperplexes\nperplexing\nperplexingly\nperplexities\nperplexity\nperps\nperquisite\nperquisites\nperrault\nperries\nperron\nperrons\nperry\nperse\npersecute\npersecuted\npersecutee\npersecutees\npersecutes\npersecuting\npersecution\npersecutional\npersecutions\npersecutive\npersecutor\npersecutors\npersecutory\nperseid\nperseides\nperseids\npersephone\npersepolis\nperseus\nperseverance\nperseverant\nperseverate\nperseverated\nperseverates\nperseverating\nperseveration\nperseverations\nperseverative\npersevere\npersevered\nperseveres\npersevering\nperseveringly\npersia\npersian\npersians\npersiflage\npersimmon\npersimmons\npersist\npersisted\npersistence\npersistency\npersistent\npersistently\npersister\npersisters\npersisting\npersists\npersnicketiness\npersnickety\nperson\npersona\npersonable\npersonableness\npersonably\npersonae\npersonage\npersonages\npersonal\npersonalia\npersonalism\npersonalisms\npersonalist\npersonalistic\npersonalists\npersonalities\npersonality\npersonalization\npersonalizations\npersonalize\npersonalized\npersonalizes\npersonalizing\npersonally\npersonals\npersonalties\npersonalty\npersonas\npersonate\npersonated\npersonates\npersonating\npersonation\npersonations\npersonative\npersonator\npersonators\npersonhood\npersonification\npersonifications\npersonified\npersonifier\npersonifiers\npersonifies\npersonify\npersonifying\npersonnel\npersons\nperspectival\nperspective\nperspectively\nperspectives\nperspex\nperspicacious\nperspicaciously\nperspicaciousness\nperspicacity\nperspicuity\nperspicuous\nperspicuously\nperspicuousness\nperspiration\nperspiratory\nperspire\nperspired\nperspires\nperspiring\npersuadable\npersuadably\npersuade\npersuaded\npersuader\npersuaders\npersuades\npersuading\npersuasibility\npersuasible\npersuasibleness\npersuasion\npersuasions\npersuasive\npersuasively\npersuasiveness\npert\npertain\npertained\npertaining\npertains\nperter\npertest\nperth\npertinacious\npertinaciously\npertinaciousness\npertinacity\npertinence\npertinency\npertinent\npertinently\npertly\npertness\nperturb\nperturbable\nperturbation\nperturbational\nperturbations\nperturbed\nperturbing\nperturbs\npertussal\npertussis\nperu\nperugia\nperuke\nperuked\nperukes\nperusable\nperusal\nperusals\nperuse\nperused\nperuser\nperusers\nperuses\nperusing\nperuvian\nperuvians\npervade\npervaded\npervader\npervaders\npervades\npervading\npervasion\npervasions\npervasive\npervasively\npervasiveness\nperverse\nperversely\nperverseness\nperversion\nperversions\nperversities\nperversity\nperversive\npervert\nperverted\npervertedly\npervertedness\nperverter\nperverters\npervertible\nperverting\nperverts\npervious\nperviously\nperviousness\npes\npesach\npesade\npesades\npescadores\npeseta\npesetas\npesewa\npesewas\npeshawar\npeskier\npeskiest\npeskily\npeskiness\npesky\npeso\npesos\npessaries\npessary\npessimism\npessimist\npessimistic\npessimistically\npessimists\npest\npester\npestered\npesterer\npesterers\npestering\npesters\npesthole\npestholes\npesthouse\npesthouses\npesticidal\npesticide\npesticides\npestiferous\npestiferously\npestiferousness\npestilence\npestilences\npestilent\npestilential\npestilentially\npestilently\npestle\npestled\npestles\npestling\npesto\npestos\npests\npesty\npet\npetaampere\npetaamperes\npetabecquerel\npetabecquerels\npetabit\npetabits\npetabyte\npetabytes\npetacandela\npetacandelas\npetacoulomb\npetacoulombs\npetafarad\npetafarads\npetagram\npetagrams\npetahenries\npetahenry\npetahenrys\npetahertz\npetajoule\npetajoules\npetakelvin\npetakelvins\npetal\npetaled\npetaliferous\npetaline\npetalled\npetallike\npetaloid\npetalous\npetals\npetalumen\npetalumens\npetalux\npetameter\npetameters\npetamole\npetamoles\npetanewton\npetanewtons\npetaohm\npetaohms\npetapascal\npetapascals\npetaradian\npetaradians\npetard\npetards\npetasecond\npetaseconds\npetasiemens\npetasievert\npetasieverts\npetasos\npetasoses\npetasteradian\npetasteradians\npetasus\npetasuses\npetatesla\npetateslas\npetavolt\npetavolts\npetawatt\npetawatts\npetaweber\npetawebers\npetcock\npetcocks\npetechia\npetechiae\npetechial\npetechiate\npeter\npeter's\npetered\npetering\npeters\npetersburg\npetiolar\npetiolate\npetiole\npetioled\npetioles\npetiolule\npetiolules\npetit\npetite\npetiteness\npetites\npetition\npetitionary\npetitioned\npetitioner\npetitioners\npetitioning\npetitions\npetits\npetnapper\npetnappers\npetnapping\npetnappings\npetrale\npetrarch\npetrarchan\npetrel\npetrels\npetri\npetrifaction\npetrifactions\npetrification\npetrifications\npetrified\npetrifies\npetrify\npetrifying\npetrine\npetrochemical\npetrochemicals\npetrochemistries\npetrochemistry\npetrodollar\npetrodollars\npetrogenesis\npetrogenetic\npetroglyph\npetroglyphic\npetroglyphs\npetrograd\npetrographer\npetrographers\npetrographic\npetrographical\npetrographically\npetrography\npetrol\npetrolatum\npetroleum\npetrolic\npetroliferous\npetrologic\npetrological\npetrologically\npetrologist\npetrologists\npetrology\npetronel\npetronels\npetronius\npetropolitics\npetrosal\npetrous\npets\npetted\npetter\npetters\npetti\npetticoat\npetticoated\npetticoats\npettier\npettiest\npettifog\npettifogged\npettifogger\npettifoggers\npettifoggery\npettifogging\npettifogs\npettily\npettiness\npettinesses\npetting\npettis\npettish\npettishly\npettishness\npettiskirt\npettiskirts\npettislip\npettislips\npettitoes\npetty\npetulance\npetulancy\npetulant\npetulantly\npetunia\npetunias\npetuntse\npetuntses\npetuntze\npetuntzes\npeugeot\npew\npewee\npewees\npewholder\npewholders\npewit\npewits\npews\npewter\npewterer\npewterers\npeyote\npeyotl\npeyotls\npfennig\npfennige\npfennigs\npfft\nph\nphacoemulsification\nphacoemulsifications\nphaedra\nphaedrus\nphaeton\nphaetons\nphage\nphages\nphagocyte\nphagocytes\nphagocytic\nphagocytize\nphagocytized\nphagocytizes\nphagocytizing\nphagocytose\nphagocytosed\nphagocytoses\nphagocytosing\nphagocytosis\nphagocytotic\nphagosome\nphagosomes\nphalangal\nphalange\nphalangeal\nphalangean\nphalanger\nphalangers\nphalanges\nphalangist\nphalangists\nphalansterian\nphalansterianism\nphalansterians\nphalansteries\nphalanstery\nphalanx\nphalanxes\nphalarope\nphalaropes\nphalli\nphallic\nphallically\nphallicism\nphallocentric\nphallus\nphalluses\nphanerogam\nphanerogamic\nphanerogamous\nphanerogams\nphanerophyte\nphanerophytes\nphanerozoic\nphantasies\nphantasm\nphantasma\nphantasmagoria\nphantasmagorias\nphantasmagoric\nphantasmagorical\nphantasmagorically\nphantasmagories\nphantasmagory\nphantasmal\nphantasmata\nphantasmic\nphantasms\nphantasy\nphantom\nphantomlike\nphantoms\npharaoh\npharaohs\npharaonic\npharisaic\npharisaical\npharisaically\npharisaicalness\npharisaism\npharisaisms\npharisee\nphariseeism\nphariseeisms\npharisees\npharmaceutic\npharmaceutical\npharmaceutically\npharmaceuticals\npharmaceutics\npharmacies\npharmacist\npharmacists\npharmacodynamic\npharmacodynamically\npharmacodynamics\npharmacogenetic\npharmacogenetics\npharmacogenomic\npharmacogenomics\npharmacognosist\npharmacognosists\npharmacognostic\npharmacognostical\npharmacognosy\npharmacokinetic\npharmacokinetics\npharmacologic\npharmacological\npharmacologically\npharmacologist\npharmacologists\npharmacology\npharmacopeia\npharmacopeial\npharmacopeias\npharmacopoeia\npharmacopoeial\npharmacopoeias\npharmacopoeist\npharmacopoeists\npharmacotherapies\npharmacotherapy\npharmacy\npharos\npharoses\npharyngal\npharyngals\npharyngeal\npharyngeals\npharyngectomies\npharyngectomy\npharynges\npharyngitis\npharyngitises\npharyngocele\npharyngoceles\npharyngology\npharyngoscope\npharyngoscopes\npharyngoscopy\npharynx\npharynxes\nphase\nphased\nphasedown\nphasedowns\nphaseout\nphaseouts\nphases\nphasic\nphasing\nphasmid\nphasmids\nphatic\nphatically\nphaëthon\npheasant\npheasants\nphellem\nphellems\nphelloderm\nphellodermal\nphelloderms\nphellogen\nphellogenic\nphellogens\nphenacaine\nphenacaines\nphenacetin\nphenacetins\nphenacite\nphenacites\nphenakite\nphenakites\nphenanthrene\nphenanthrenes\nphenarsazine\nphenazin\nphenazine\nphenazines\nphenazins\nphencyclidine\nphencyclidines\nphenelzine\nphenelzines\nphenetic\nphenetically\npheneticist\npheneticists\nphenetics\nphenix\nphenixes\nphenmetrazine\nphenmetrazines\nphenobarbital\nphenobarbitone\nphenobarbitones\nphenocopies\nphenocopy\nphenocryst\nphenocrystic\nphenocrysts\nphenol\nphenolate\nphenolates\nphenolic\nphenolics\nphenological\nphenologically\nphenologist\nphenologists\nphenology\nphenolphthalein\nphenolphthaleins\nphenols\nphenom\nphenomena\nphenomenal\nphenomenalism\nphenomenalisms\nphenomenalist\nphenomenalistic\nphenomenalistically\nphenomenalists\nphenomenally\nphenomenological\nphenomenologically\nphenomenologist\nphenomenologists\nphenomenology\nphenomenon\nphenomenons\nphenoms\nphenothiazine\nphenothiazines\nphenotype\nphenotypes\nphenotypic\nphenotypical\nphenotypically\nphenoxide\nphenoxides\nphenoxybenzamine\nphenoxybenzamines\nphentolamine\nphentolamines\nphenyl\nphenylalanine\nphenylalanines\nphenylbutazone\nphenylbutazones\nphenylene\nphenylenes\nphenylenevinylene\nphenylephrine\nphenylephrines\nphenylethylamine\nphenylethylamines\nphenylic\nphenylketonuria\nphenylketonurias\nphenylketonuric\nphenylketonurics\nphenylpropanolamine\nphenylpropanolamines\nphenyls\nphenylthiocarbamide\nphenylthiocarbamides\nphenylthiourea\nphenylthioureas\nphenytoin\nphenytoins\npheochromocytoma\npheochromocytomas\npheochromocytomata\npheresis\npheromonal\npheromone\npheromones\nphew\nphi\nphial\nphials\nphidias\nphiladelphia\nphiladelphian\nphiladelphians\nphiladelphus\nphilander\nphilandered\nphilanderer\nphilanderers\nphilandering\nphilanders\nphilanthropic\nphilanthropical\nphilanthropically\nphilanthropies\nphilanthropist\nphilanthropists\nphilanthropoid\nphilanthropoids\nphilanthropy\nphilatelic\nphilatelical\nphilatelically\nphilatelist\nphilatelists\nphilately\nphilemon\nphilharmonic\nphilharmonics\nphilhellene\nphilhellenes\nphilhellenic\nphilhellenism\nphilhellenist\nphilhellenists\nphilip\nphilippi\nphilippians\nphilippic\nphilippics\nphilippine\nphilippines\nphilistia\nphilistine\nphilistines\nphilistinism\nphilistinisms\nphillips\nphillumenist\nphillumenists\nphiloctetes\nphilodendra\nphilodendron\nphilodendrons\nphilologer\nphilologers\nphilologic\nphilological\nphilologically\nphilologist\nphilologists\nphilology\nphilomel\nphilomela\nphilomels\nphiloprogenitive\nphiloprogenitively\nphiloprogenitiveness\nphilosophe\nphilosopher\nphilosophers\nphilosophes\nphilosophic\nphilosophical\nphilosophically\nphilosophies\nphilosophize\nphilosophized\nphilosophizer\nphilosophizers\nphilosophizes\nphilosophizing\nphilosophy\nphilter\nphiltered\nphiltering\nphilters\nphiltre\nphiltred\nphiltres\nphiltring\nphimoses\nphimosis\nphiz\nphizes\nphlebitic\nphlebitides\nphlebitis\nphlebogram\nphlebograms\nphlebographic\nphlebography\nphlebology\nphlebosclerosis\nphlebotomic\nphlebotomical\nphlebotomies\nphlebotomist\nphlebotomists\nphlebotomize\nphlebotomized\nphlebotomizes\nphlebotomizing\nphlebotomus\nphlebotomy\nphlegethon\nphlegm\nphlegmatic\nphlegmatical\nphlegmatically\nphlegmy\nphloem\nphlogistic\nphlogiston\nphlogistons\nphlogopite\nphlogopites\nphlox\nphloxes\nphlyctaena\nphlyctaenae\nphlyctena\nphlyctenae\nphlyctenar\nphnom\nphobia\nphobias\nphobic\nphobics\nphobos\nphocine\nphocomelia\nphocomelias\nphoebe\nphoebes\nphoebus\nphoenicia\nphoenician\nphoenicians\nphoenix\nphoenixes\nphoenixlike\nphon\nphonate\nphonated\nphonates\nphonating\nphonation\nphonations\nphone\nphoned\nphonematic\nphoneme\nphonemes\nphonemic\nphonemically\nphonemicist\nphonemicists\nphonemics\nphones\nphonetic\nphonetical\nphonetically\nphonetician\nphoneticians\nphoneticist\nphoneticists\nphonetics\nphoney\nphoneyed\nphoneying\nphoneys\nphonic\nphonically\nphonics\nphonied\nphonier\nphonies\nphoniest\nphonily\nphoniness\nphoning\nphono\nphonocardiogram\nphonocardiograms\nphonocardiograph\nphonocardiographic\nphonocardiographs\nphonocardiography\nphonogram\nphonogramic\nphonogramically\nphonogrammic\nphonogrammically\nphonograms\nphonograph\nphonographer\nphonographers\nphonographic\nphonographically\nphonographist\nphonographists\nphonographs\nphonography\nphonolite\nphonolites\nphonolitic\nphonologic\nphonological\nphonologically\nphonologies\nphonologist\nphonologists\nphonology\nphonometric\nphonon\nphonons\nphonoreception\nphonoreceptions\nphonoreceptor\nphonoreceptors\nphonos\nphonoscope\nphonoscopes\nphonotactic\nphonotactics\nphonotype\nphonotypes\nphonotypic\nphonotypical\nphonotypically\nphonotypist\nphonotypists\nphonotypy\nphons\nphony\nphonying\nphooey\nphorate\nphorates\nphoresies\nphoresy\nphoronid\nphoronids\nphosgene\nphosphamidon\nphosphamidons\nphosphatase\nphosphatases\nphosphate\nphosphates\nphosphatic\nphosphatide\nphosphatides\nphosphatidic\nphosphatization\nphosphatizations\nphosphatize\nphosphatized\nphosphatizes\nphosphatizing\nphosphaturia\nphosphaturias\nphosphaturic\nphosphene\nphosphenes\nphosphid\nphosphide\nphosphides\nphosphids\nphosphin\nphosphine\nphosphines\nphosphins\nphosphite\nphosphites\nphosphocreatin\nphosphocreatine\nphosphocreatines\nphosphocreatins\nphosphofructokinase\nphosphofructokinases\nphosphoinositide\nphospholipid\nphospholipids\nphosphonium\nphosphoniums\nphosphoprotein\nphosphoproteins\nphosphor\nphosphorate\nphosphorated\nphosphorates\nphosphorating\nphosphore\nphosphores\nphosphoresce\nphosphoresced\nphosphorescence\nphosphorescent\nphosphorescently\nphosphoresces\nphosphorescing\nphosphoric\nphosphorism\nphosphorisms\nphosphorite\nphosphorites\nphosphoritic\nphosphorolysis\nphosphorolytic\nphosphorous\nphosphors\nphosphorus\nphosphoryl\nphosphorylase\nphosphorylases\nphosphorylate\nphosphorylated\nphosphorylates\nphosphorylating\nphosphorylation\nphosphorylations\nphosphorylative\nphosphoryls\nphot\nphotic\nphotically\nphoto\nphotoactive\nphotoactivity\nphotoautotroph\nphotoautotrophic\nphotoautotrophically\nphotoautotrophs\nphotobiologic\nphotobiological\nphotobiologist\nphotobiologists\nphotobiology\nphotobiotic\nphotocathode\nphotocathodes\nphotocell\nphotocells\nphotochemical\nphotochemically\nphotochemist\nphotochemistry\nphotochemists\nphotochromic\nphotochromism\nphotocoagulate\nphotocoagulated\nphotocoagulates\nphotocoagulating\nphotocoagulation\nphotocoagulations\nphotocompose\nphotocomposed\nphotocomposer\nphotocomposers\nphotocomposes\nphotocomposing\nphotocomposition\nphotoconduction\nphotoconductive\nphotoconductivities\nphotoconductivity\nphotocopied\nphotocopier\nphotocopiers\nphotocopies\nphotocopy\nphotocopying\nphotocurrent\nphotocurrents\nphotodecomposition\nphotodecompositions\nphotodegradable\nphotodetector\nphotodetectors\nphotodiode\nphotodiodes\nphotodisintegrate\nphotodisintegrated\nphotodisintegrates\nphotodisintegrating\nphotodisintegration\nphotodisintegrations\nphotodissociate\nphotodissociated\nphotodissociates\nphotodissociating\nphotodissociation\nphotodissociations\nphotodrama\nphotodramas\nphotoduplicate\nphotoduplicated\nphotoduplicates\nphotoduplicating\nphotoduplication\nphotoduplications\nphotodynamic\nphotodynamically\nphotodynamics\nphotoed\nphotoelectric\nphotoelectrical\nphotoelectrically\nphotoelectron\nphotoelectronic\nphotoelectrons\nphotoemission\nphotoemissions\nphotoemissive\nphotoengrave\nphotoengraved\nphotoengraver\nphotoengravers\nphotoengraves\nphotoengraving\nphotoengravings\nphotoexcitation\nphotoexcitations\nphotoexcited\nphotofinisher\nphotofinishers\nphotofinishing\nphotofinishings\nphotoflash\nphotoflashes\nphotoflood\nphotofloods\nphotofluorogram\nphotofluorograms\nphotofluorographic\nphotofluorography\nphotog\nphotogelatin\nphotogene\nphotogenes\nphotogenic\nphotogenically\nphotogeologic\nphotogeological\nphotogeologist\nphotogeologists\nphotogeology\nphotogram\nphotogrammetric\nphotogrammetrist\nphotogrammetrists\nphotogrammetry\nphotograms\nphotograph\nphotographable\nphotographed\nphotographer\nphotographers\nphotographic\nphotographical\nphotographically\nphotographing\nphotographs\nphotography\nphotogravure\nphotogravures\nphotogs\nphotoheliograph\nphotoheliographs\nphotoinduced\nphotoinduction\nphotoinductions\nphotoinductive\nphotoing\nphotointerpretation\nphotointerpreter\nphotointerpreters\nphotoionization\nphotoionizations\nphotoionize\nphotoionized\nphotoionizes\nphotoionizing\nphotojournalism\nphotojournalist\nphotojournalistic\nphotojournalists\nphotokinesis\nphotokinetic\nphotolithograph\nphotolithographed\nphotolithographer\nphotolithographers\nphotolithographic\nphotolithographically\nphotolithographing\nphotolithographs\nphotolithography\nphotoluminescence\nphotolysis\nphotolytic\nphotolytically\nphotolyzable\nphotolyze\nphotolyzed\nphotolyzes\nphotolyzing\nphotomap\nphotomapped\nphotomapping\nphotomaps\nphotomask\nphotomasks\nphotomechanical\nphotomechanically\nphotometer\nphotometers\nphotometric\nphotometrical\nphotometrically\nphotometrist\nphotometrists\nphotometry\nphotomicrograph\nphotomicrographed\nphotomicrographer\nphotomicrographers\nphotomicrographic\nphotomicrographing\nphotomicrographs\nphotomicrography\nphotomicroscope\nphotomicroscopes\nphotomicroscopic\nphotomontage\nphotomontages\nphotomorphogenesis\nphotomorphogenic\nphotomosaic\nphotomosaics\nphotomultiplier\nphotomural\nphotomuralist\nphotomuralists\nphotomurals\nphoton\nphotonegative\nphotonic\nphotonics\nphotons\nphotonuclear\nphotooxidation\nphotooxidations\nphotooxidative\nphotooxidize\nphotooxidized\nphotooxidizes\nphotooxidizing\nphotoperiod\nphotoperiodic\nphotoperiodical\nphotoperiodically\nphotoperiodicities\nphotoperiodicity\nphotoperiodism\nphotoperiodisms\nphotoperiods\nphotophase\nphotophases\nphotophilic\nphotophilous\nphotophobia\nphotophobias\nphotophobic\nphotophore\nphotophores\nphotophosphorylation\nphotophosphorylations\nphotopia\nphotopias\nphotopic\nphotoplay\nphotoplays\nphotopolarimeter\nphotopolarimeters\nphotopolymer\nphotopolymers\nphotopositive\nphotoproduct\nphotoproduction\nphotoproductions\nphotoproducts\nphotoreaction\nphotoreactions\nphotoreactivating\nphotoreactivation\nphotoreactivations\nphotoreception\nphotoreceptive\nphotoreceptor\nphotoreceptors\nphotoreconnaissance\nphotoreduce\nphotoreduced\nphotoreduces\nphotoreducing\nphotoreduction\nphotoreductions\nphotoreproduction\nphotoreproductions\nphotoresist\nphotoresists\nphotorespiration\nphotorespirations\nphotos\nphotosensitive\nphotosensitivities\nphotosensitivity\nphotosensitization\nphotosensitizations\nphotosensitize\nphotosensitized\nphotosensitizer\nphotosensitizers\nphotosensitizes\nphotosensitizing\nphotoset\nphotosets\nphotosetter\nphotosetters\nphotosetting\nphotosphere\nphotospheres\nphotospheric\nphotostat\nphotostatic\nphotostats\nphotostatted\nphotostatting\nphotosynthate\nphotosynthates\nphotosynthesis\nphotosynthesize\nphotosynthesized\nphotosynthesizes\nphotosynthesizing\nphotosynthetic\nphotosynthetically\nphotosystem\nphotosystems\nphototactic\nphototactically\nphototaxis\nphototaxises\nphototelegraphy\nphototherapeutic\nphototherapies\nphototherapy\nphototonic\nphototonus\nphototonuses\nphototoxic\nphototoxicity\nphototransistor\nphototransistors\nphototroph\nphototrophic\nphototrophically\nphototrophs\nphototropic\nphototropically\nphototropism\nphototube\nphototubes\nphototypeset\nphototypesets\nphototypesetter\nphototypesetters\nphototypesetting\nphototypographic\nphototypographical\nphototypographically\nphototypography\nphotovoltaic\nphotovoltaics\nphots\nphragmites\nphragmoplast\nphragmoplasts\nphrasal\nphrasally\nphrase\nphrased\nphrasemaker\nphrasemakers\nphrasemaking\nphrasemonger\nphrasemongering\nphrasemongers\nphraseogram\nphraseograms\nphraseograph\nphraseographic\nphraseographs\nphraseological\nphraseologies\nphraseologist\nphraseologists\nphraseology\nphrases\nphrasing\nphrasings\nphratric\nphratries\nphratry\nphreatic\nphreatophyte\nphreatophytes\nphreatophytic\nphrenetic\nphrenetical\nphrenic\nphrenitic\nphrenitis\nphrenologic\nphrenological\nphrenologist\nphrenologists\nphrenology\nphrensy\nphrenzied\nphrenzies\nphrenzy\nphrenzying\nphrygia\nphrygian\nphrygians\nphthalate\nphthalates\nphthalein\nphthaleine\nphthaleines\nphthaleins\nphthalic\nphthalin\nphthalins\nphthalocyanine\nphthalocyanines\nphthiriasis\nphthises\nphthisic\nphthisical\nphthisics\nphthisis\nphycobilin\nphycobilins\nphycocyanin\nphycocyanins\nphycoerythrin\nphycoerythrins\nphycological\nphycologist\nphycologists\nphycology\nphycomycete\nphycomycetes\nphycomycetous\nphyla\nphylacteries\nphylactery\nphylae\nphyle\nphyletic\nphyletically\nphylic\nphyllaries\nphyllary\nphyllite\nphyllites\nphyllitic\nphyllo\nphylloclad\nphylloclade\nphylloclades\nphylloclads\nphyllode\nphyllodes\nphyllodia\nphyllodial\nphyllodium\nphylloid\nphyllome\nphyllomes\nphyllomic\nphyllophagous\nphyllopod\nphyllopodan\nphyllopodans\nphyllopodous\nphyllopods\nphyllotactic\nphyllotactical\nphyllotaxes\nphyllotaxies\nphyllotaxis\nphyllotaxy\nphylloxera\nphylloxerae\nphylloxeran\nphylloxerans\nphylogenesis\nphylogenetic\nphylogenetically\nphylogenetics\nphylogenic\nphylogenies\nphylogeny\nphylum\nphysiatrics\nphysiatrist\nphysiatrists\nphysiatry\nphysic\nphysical\nphysicalism\nphysicalist\nphysicalistic\nphysicalists\nphysicality\nphysicalization\nphysicalizations\nphysicalize\nphysicalized\nphysicalizes\nphysicalizing\nphysically\nphysicalness\nphysicals\nphysician\nphysicians\nphysicist\nphysicists\nphysicked\nphysicking\nphysicochemical\nphysicochemically\nphysics\nphysiochemical\nphysiocrat\nphysiocratic\nphysiocrats\nphysiognomic\nphysiognomical\nphysiognomically\nphysiognomies\nphysiognomist\nphysiognomists\nphysiognomy\nphysiographer\nphysiographers\nphysiographic\nphysiographical\nphysiographically\nphysiography\nphysiologic\nphysiological\nphysiologically\nphysiologist\nphysiologists\nphysiology\nphysiopathologic\nphysiopathological\nphysiopathologist\nphysiopathologists\nphysiopathology\nphysiotherapeutic\nphysiotherapist\nphysiotherapists\nphysiotherapy\nphysique\nphysiqued\nphysiques\nphysostigmin\nphysostigmine\nphysostigmines\nphysostigmins\nphysostomous\nphytane\nphytanes\nphytoalexin\nphytoalexins\nphytochemical\nphytochemically\nphytochemist\nphytochemistry\nphytochemists\nphytochrome\nphytochromes\nphytoflagellate\nphytoflagellates\nphytogenesis\nphytogenetic\nphytogenetical\nphytogenetically\nphytogenic\nphytogenous\nphytogeny\nphytogeographer\nphytogeographers\nphytogeographic\nphytogeographical\nphytogeographically\nphytogeography\nphytography\nphytohemagglutinin\nphytohemagglutinins\nphytohormone\nphytohormones\nphytol\nphytologic\nphytological\nphytology\nphytols\nphyton\nphytonic\nphytons\nphytopathogen\nphytopathogenic\nphytopathogens\nphytopathologic\nphytopathological\nphytopathologist\nphytopathologists\nphytopathology\nphytophagous\nphytoplankter\nphytoplankters\nphytoplankton\nphytoplanktonic\nphytoplanktons\nphytosociological\nphytosociologically\nphytosociologist\nphytosociologists\nphytosociology\nphytosterol\nphytosterols\nphytotoxic\nphytotoxicity\npi\npia\npiacenza\npiacular\npiaffe\npiaffed\npiaffer\npiaffers\npiaffes\npiaffing\npiaget\npial\npianism\npianissimo\npianissimos\npianist\npianistic\npianistically\npianistics\npianists\npiano\npianoforte\npianofortes\npianos\npias\npiassaba\npiassabas\npiassava\npiassavas\npiaster\npiasters\npiastre\npiastres\npiazza\npiazzas\npiazze\npibroch\npibrochs\npic\npica\npicador\npicadores\npicadors\npicaninnies\npicaninny\npicante\npicara\npicaras\npicardy\npicaresque\npicaro\npicaroon\npicarooned\npicarooning\npicaroons\npicaros\npicas\npicasso\npicayune\npicayunes\npicayunish\npiccadilly\npiccalilli\npiccalillis\npiccata\npiccolo\npiccoloist\npiccoloists\npiccolos\npice\npiceous\npichiciego\npichiciegos\npick\npickaninnies\npickaninny\npickax\npickaxe\npickaxed\npickaxes\npickaxing\npicked\npicker\npickerel\npickerels\npickerelweed\npickerelweeds\npickers\npicket\npicketboat\npicketboats\npicketed\npicketer\npicketers\npicketing\npickets\npickier\npickiest\npicking\npickings\npickle\npickled\npickles\npickleworm\npickleworms\npickling\npicklock\npicklocks\npickoff\npickoffs\npickpocket\npickpockets\npickproof\npicks\npickthank\npickthanks\npickup\npickups\npickwick\npickwickian\npicky\npicloram\npiclorams\npicnic\npicnicked\npicnicker\npicnickers\npicnicking\npicnicky\npicnics\npicoampere\npicoamperes\npicobecquerel\npicobecquerels\npicocandela\npicocandelas\npicocoulomb\npicocoulombs\npicofarad\npicofarads\npicogram\npicograms\npicohenries\npicohenry\npicohenrys\npicohertz\npicojoule\npicojoules\npicokelvin\npicokelvins\npicoline\npicolines\npicolumen\npicolumens\npicolux\npicometer\npicometers\npicomole\npicomoles\npiconewton\npiconewtons\npicoohm\npicoohms\npicopascal\npicopascals\npicoradian\npicoradians\npicornavirus\npicornaviruses\npicosecond\npicoseconds\npicosiemens\npicosievert\npicosieverts\npicosteradian\npicosteradians\npicot\npicoted\npicotee\npicotees\npicotesla\npicoteslas\npicoting\npicots\npicovolt\npicovolts\npicowatt\npicowatts\npicowave\npicowaved\npicowaves\npicowaving\npicoweber\npicowebers\npicquet\npicquets\npicrate\npicrates\npicric\npicrotoxic\npicrotoxin\npicrotoxins\npics\npict\npictish\npictogram\npictograms\npictograph\npictographic\npictographically\npictographs\npictography\npictor\npictorial\npictorialism\npictorialist\npictorialists\npictoriality\npictorialization\npictorializations\npictorialize\npictorialized\npictorializes\npictorializing\npictorially\npictorialness\npictorials\npicts\npicture\npictured\npicturephone\npicturephones\npictures\npicturesque\npicturesquely\npicturesqueness\npicturing\npicturization\npicturizations\npicturize\npicturized\npicturizes\npicturizing\npicul\npiculs\npiddle\npiddled\npiddles\npiddling\npiddock\npiddocks\npidgin\npidginization\npidginizations\npidginize\npidginized\npidginizes\npidginizing\npidgins\npie\npiebald\npiebalds\npiece\npieced\npiecemeal\npiecer\npiecers\npieces\npiecewise\npiecework\npieceworker\npieceworkers\npiecing\npiecrust\npiecrusts\npied\npiedmont\npiedmontese\npiedmonts\npiegan\npiegans\npieing\npieplant\npieplants\npier\npierce\npierced\npiercer\npiercers\npierces\npiercing\npiercingly\npierian\npierogi\npierogies\npierre\npierrot\npiers\npies\npieta\npietas\npietermaritzburg\npieties\npietism\npietist\npietistic\npietistical\npietistically\npietists\npiety\npietà\npiezoelectric\npiezoelectrical\npiezoelectrically\npiezoelectricity\npiezometer\npiezometers\npiezometric\npiezometrical\npiezometry\npiffle\npiffled\npiffles\npiffling\npig\npigboat\npigboats\npigeon\npigeonhole\npigeonholed\npigeonholer\npigeonholers\npigeonholes\npigeonholing\npigeonite\npigeonites\npigeons\npigeonwing\npigeonwings\npigfish\npigfishes\npigged\npiggeries\npiggery\npiggier\npiggies\npiggiest\npiggin\npigging\npiggins\npiggish\npiggishly\npiggishness\npiggledy\npiggy\npiggyback\npiggybacked\npiggybacking\npiggybacks\npigheaded\npigheadedly\npigheadedness\npiglet\npiglets\npiglike\npigment\npigmentary\npigmentation\npigmentations\npigmented\npigmenting\npigmentosa\npigments\npigmies\npigmy\npignoli\npignolia\npignut\npignuts\npigpen\npigpens\npigs\npigskin\npigskins\npigsney\npigsneys\npigstick\npigsticked\npigsticker\npigstickers\npigsticking\npigsticks\npigsties\npigsty\npigtail\npigtailed\npigtails\npigweed\npigweeds\npiing\npika\npikake\npikakes\npikas\npike\npiked\npikeman\npikemen\npikeperch\npikeperches\npiker\npikers\npikes\npikestaff\npikestaffs\npiki\npiking\npilaf\npilaff\npilaffs\npilafs\npilar\npilaster\npilasters\npilate\npilatus\npilau\npilaw\npilchard\npilchards\npile\npilea\npileate\npileated\npiled\npilei\npileless\npiles\npileum\npileup\npileups\npileus\npilewort\npileworts\npilfer\npilferable\npilferage\npilfered\npilferer\npilferers\npilfering\npilferproof\npilfers\npilgarlic\npilgarlics\npilgrim\npilgrimage\npilgrimaged\npilgrimages\npilgrimaging\npilgrims\npili\npiliferous\npiliform\npiling\npilings\npilipino\npill\npillage\npillaged\npillager\npillagers\npillages\npillaging\npillar\npillared\npillaring\npillarless\npillars\npillbox\npillboxes\npilled\npilling\npillion\npillions\npilloried\npillories\npillory\npillorying\npillow\npillowcase\npillowcases\npillowed\npillowing\npillows\npillowslip\npillowslips\npillowy\npills\npilocarpine\npilocarpines\npilose\npilosity\npilot\npilotage\npiloted\npilothouse\npilothouses\npiloting\npilotings\npilotless\npilots\npilous\npilsener\npilseners\npilsner\npilsners\npiltdown\npilular\npilule\npilules\npilus\npima\npiman\npimas\npimento\npimentos\npimiento\npimientos\npiminy\npimp\npimped\npimpernel\npimpernels\npimping\npimple\npimpled\npimples\npimply\npimpmobile\npimpmobiles\npimps\npin\npinafore\npinafored\npinafores\npinaster\npinasters\npinball\npinballs\npinbone\npinbones\npince\npincer\npincerlike\npincers\npinch\npinchbeck\npinchbecks\npinchcock\npinchcocks\npinched\npincher\npinchers\npinches\npinching\npinchpennies\npinchpenny\npincushion\npincushions\npindar\npindaric\npindling\npine\npineal\npinealectomize\npinealectomized\npinealectomizes\npinealectomizing\npinealectomy\npineapple\npineapples\npinecone\npinecones\npined\npinedrops\npineland\npinelands\npinene\npinenes\npineries\npinery\npines\npinesap\npinesaps\npineta\npinetum\npinewood\npinewoods\npiney\npinfeather\npinfeathers\npinfish\npinfishes\npinfold\npinfolded\npinfolding\npinfolds\nping\npinged\npinger\npingers\npinging\npingo\npingoes\npingos\npings\npinguid\npinhead\npinheaded\npinheadedness\npinheads\npinhole\npinholes\npinier\npiniest\npining\npinion\npinioned\npinioning\npinions\npinite\npinites\npink\npinked\npinker\npinkest\npinkeye\npinkie\npinkies\npinking\npinkish\npinkishness\npinkly\npinkness\npinko\npinkoes\npinkos\npinkroot\npinkroots\npinks\npinkster\npinksters\npinky\npinna\npinnace\npinnaces\npinnacle\npinnacled\npinnacles\npinnacling\npinnae\npinnal\npinnas\npinnate\npinnated\npinnately\npinnatifid\npinnatifidly\npinnatiped\npinnatisect\npinned\npinner\npinners\npinnigrade\npinning\npinniped\npinnipeds\npinnula\npinnulae\npinnular\npinnule\npinnules\npinocchio\npinochle\npinocle\npinocytic\npinocytosis\npinocytotic\npinocytotically\npinole\npinoles\npinot\npinots\npinpoint\npinpointed\npinpointing\npinpoints\npinprick\npinpricked\npinpricking\npinpricks\npins\npinscher\npinschers\npinsetter\npinsetters\npinspotter\npinspotters\npinstripe\npinstriped\npinstripes\npint\npinta\npintail\npintails\npintano\npintanos\npintas\npintle\npintles\npinto\npintoes\npintos\npints\npintsize\npintsized\npinup\npinups\npinwale\npinweed\npinweeds\npinwheel\npinwheels\npinwork\npinworm\npinworms\npinwrench\npinwrenches\npinxter\npinxters\npiny\npinyin\npinyon\npinyons\npiolet\npiolets\npion\npioneer\npioneered\npioneering\npioneers\npionic\npions\npiosities\npiosity\npious\npiously\npiousness\npip\npipal\npipals\npipe\npiped\npipefish\npipefishes\npipefitting\npipefittings\npipeful\npipefuls\npipeless\npipelike\npipeline\npipelined\npipelines\npipelining\npiper\npiperazine\npiperazines\npiperidine\npiperidines\npiperine\npiperines\npiperonal\npiperonals\npiperonyl\npipers\npipes\npipestone\npipestones\npipet\npipets\npipette\npipetted\npipettes\npipetting\npiping\npipings\npipistrel\npipistrelle\npipistrelles\npipistrels\npipit\npipits\npipkin\npipkins\npipped\npippin\npipping\npippins\npips\npipsissewa\npipsissewas\npipsqueak\npipsqueaks\npiquance\npiquancy\npiquant\npiquantly\npiquantness\npique\npiqued\npiques\npiquet\npiquets\npiquing\npiqué\npiracies\npiracy\npiraeus\npiragua\npiraguas\npiranesi\npiranha\npiranhas\npirarucu\npirarucus\npirate\npirated\npirates\npiratic\npiratical\npiratically\npirating\npiraña\npirañas\npirog\npiroghi\npirogi\npirogue\npirogues\npiroplasm\npiroplasma\npiroplasmata\npiroplasmoses\npiroplasmosis\npiroplasms\npiroshki\npirouette\npirouetted\npirouettes\npirouetting\npirozhki\npis\npisa\npisan\npisans\npiscaries\npiscary\npiscatorial\npiscatorially\npiscatory\npiscean\npisceans\npisces\npiscicultural\npisciculture\npisciculturist\npisciculturists\npisciform\npiscina\npiscinae\npiscinal\npiscine\npiscis\npiscivorous\npish\npishoge\npishoges\npishogue\npishogues\npisiform\npisiforms\npismire\npismires\npismo\npiso\npisolite\npisolites\npisolith\npisoliths\npisolitic\npisos\npiss\npissant\npissants\npissarro\npissed\npisser\npissers\npisses\npissing\npissoir\npissoirs\npistachio\npistachios\npistareen\npistareens\npiste\npistes\npistil\npistillate\npistils\npistol\npistole\npistoled\npistoleer\npistoleers\npistoles\npistoling\npistols\npiston\npistons\npistou\npistous\npit\npita\npitapat\npitapats\npitapatted\npitapatting\npitas\npitcairn\npitch\npitchblende\npitched\npitcher\npitcherful\npitcherfuls\npitchers\npitches\npitchfork\npitchforked\npitchforking\npitchforks\npitchier\npitchiest\npitchiness\npitching\npitchman\npitchmen\npitchout\npitchouts\npitchpole\npitchpoled\npitchpoles\npitchpoling\npitchstone\npitchstones\npitchwoman\npitchwomen\npitchy\npiteous\npiteously\npiteousness\npitfall\npitfalls\npith\npithead\npitheads\npithecanthropi\npithecanthropic\npithecanthropine\npithecanthropus\npithecoid\npithed\npithier\npithiest\npithily\npithiness\npithing\npiths\npithy\npitiable\npitiableness\npitiably\npitied\npitier\npitiers\npities\npitiful\npitifully\npitifulness\npitiless\npitilessly\npitilessness\npitman\npitmans\npitmen\npiton\npitons\npitot\npits\npitsaw\npitsaws\npitta\npittance\npittances\npittas\npitted\npitter\npitting\npittosporum\npittosporums\npittsburgh\npituicyte\npituicytes\npituitaries\npituitary\npity\npitying\npityingly\npityriases\npityriasis\npiute\npiutes\npivot\npivotable\npivotal\npivotally\npivoted\npivoting\npivotman\npivotmen\npivots\npix\npixel\npixelate\npixelated\npixelates\npixelating\npixelation\npixels\npixes\npixie\npixieish\npixies\npixilated\npixilation\npixilations\npixillated\npixiness\npixy\npixyish\npizarro\npizazz\npizazzy\npizza\npizzalike\npizzas\npizzaz\npizzazes\npizzazz\npizzazzes\npizzazzy\npizzeria\npizzerias\npizzicati\npizzicato\npizzicatos\npizzle\npizzles\npièce\npièces\npiña\npiñata\npiñon\npiñones\npiñons\npiù\npkwy\nplacability\nplacable\nplacably\nplacard\nplacarded\nplacarder\nplacarders\nplacarding\nplacards\nplacate\nplacated\nplacater\nplacaters\nplacates\nplacating\nplacatingly\nplacation\nplacations\nplacative\nplacatory\nplace\nplaceable\nplacebo\nplaceboes\nplacebos\nplaced\nplaceholder\nplaceholders\nplacekick\nplacekicked\nplacekicker\nplacekickers\nplacekicking\nplacekicks\nplaceless\nplacelessly\nplaceman\nplacemen\nplacement\nplacements\nplacenta\nplacentae\nplacental\nplacentas\nplacentation\nplacentations\nplacer\nplacers\nplaces\nplacid\nplacidity\nplacidly\nplacidness\nplacing\nplacket\nplackets\nplacoid\nplafond\nplafonds\nplagal\nplage\nplages\nplagiaries\nplagiarism\nplagiarisms\nplagiarist\nplagiaristic\nplagiarists\nplagiarize\nplagiarized\nplagiarizer\nplagiarizers\nplagiarizes\nplagiarizing\nplagiary\nplagioclase\nplagioclases\nplagiotropic\nplagiotropically\nplagiotropism\nplagiotropisms\nplague\nplagued\nplaguer\nplaguers\nplagues\nplaguey\nplaguily\nplaguing\nplaguy\nplaice\nplaices\nplaid\nplaided\nplaids\nplain\nplainchant\nplainchants\nplainclothes\nplainclothesman\nplainclothesmen\nplainer\nplainest\nplainly\nplainness\nplains\nplainsman\nplainsmen\nplainsong\nplainsongs\nplainspoken\nplainspokenness\nplainswoman\nplainswomen\nplaint\nplaintext\nplaintexts\nplaintful\nplaintiff\nplaintiffs\nplaintive\nplaintively\nplaintiveness\nplaints\nplait\nplaited\nplaiter\nplaiters\nplaiting\nplaits\nplan\nplanar\nplanaria\nplanarian\nplanarians\nplanarity\nplanate\nplanation\nplanations\nplanchet\nplanchets\nplanchette\nplanchettes\nplanck\nplane\nplaned\nplaneload\nplaneloads\nplaneness\nplaner\nplaners\nplanes\nplaneside\nplanesides\nplanet\nplanetaria\nplanetarium\nplanetariums\nplanetary\nplanetesimal\nplanetesimals\nplanetlike\nplanetoid\nplanetoidal\nplanetoids\nplanetological\nplanetologist\nplanetologists\nplanetology\nplanets\nplanetwide\nplanform\nplanforms\nplangency\nplangent\nplangently\nplanimeter\nplanimeters\nplanimetric\nplanimetrical\nplanimetrically\nplanimetry\nplaning\nplanish\nplanished\nplanisher\nplanishers\nplanishes\nplanishing\nplanisphere\nplanispheres\nplanispheric\nplanispherical\nplank\nplanked\nplanking\nplankings\nplanks\nplankter\nplankters\nplankton\nplanktonic\nplanless\nplanlessly\nplanlessness\nplanned\nplanner\nplanners\nplanning\nplano\nplanoblast\nplanoblasts\nplanoconcave\nplanoconvex\nplanogamete\nplanogametes\nplanographic\nplanographically\nplanography\nplanometer\nplanometers\nplanometry\nplanosol\nplanosols\nplans\nplant\nplantable\nplantagenet\nplantagenets\nplantain\nplantains\nplantar\nplantation\nplantations\nplanted\nplanter\nplanters\nplantigrade\nplantigrades\nplanting\nplantings\nplantlet\nplantlets\nplantlike\nplantocracy\nplants\nplantsman\nplantsmen\nplanula\nplanulae\nplanular\nplanulate\nplaque\nplaques\nplash\nplashed\nplashes\nplashing\nplasm\nplasma\nplasmablast\nplasmablasts\nplasmacyte\nplasmacytes\nplasmagel\nplasmagels\nplasmagene\nplasmagenes\nplasmagenic\nplasmalemma\nplasmalemmas\nplasmapheresis\nplasmas\nplasmasol\nplasmasols\nplasmatic\nplasmic\nplasmid\nplasmids\nplasmin\nplasminogen\nplasminogens\nplasmins\nplasmodesm\nplasmodesma\nplasmodesmas\nplasmodesmata\nplasmodesms\nplasmodia\nplasmodial\nplasmodium\nplasmogamies\nplasmogamy\nplasmolyses\nplasmolysis\nplasmolytic\nplasmolytically\nplasmolyze\nplasmolyzed\nplasmolyzes\nplasmolyzing\nplasmon\nplasmons\nplasms\nplassey\nplaster\nplasterboard\nplasterboards\nplastered\nplasterer\nplasterers\nplastering\nplasterings\nplasters\nplasterwork\nplasterworks\nplastery\nplastic\nplastically\nplasticene\nplasticenes\nplasticine\nplasticines\nplasticity\nplasticization\nplasticizations\nplasticize\nplasticized\nplasticizer\nplasticizers\nplasticizes\nplasticizing\nplasticky\nplastics\nplastid\nplastidial\nplastids\nplastique\nplastisol\nplastisols\nplastocyanin\nplastocyanins\nplastoquinone\nplastoquinones\nplastral\nplastron\nplastrons\nplat\nplatan\nplatans\nplate\nplateau\nplateaued\nplateauing\nplateaus\nplateaux\nplated\nplateful\nplatefuls\nplateglass\nplatelet\nplatelets\nplatelike\nplatemaker\nplatemakers\nplatemaking\nplaten\nplatens\nplater\nplateresque\nplaters\nplates\nplatform\nplatforms\nplatier\nplaties\nplatiest\nplatina\nplatinas\nplating\nplatings\nplatinic\nplatinize\nplatinized\nplatinizes\nplatinizing\nplatinocyanide\nplatinocyanides\nplatinoid\nplatinoids\nplatinotype\nplatinotypes\nplatinous\nplatinum\nplatitude\nplatitudes\nplatitudinal\nplatitudinarian\nplatitudinarians\nplatitudinize\nplatitudinized\nplatitudinizes\nplatitudinizing\nplatitudinous\nplatitudinously\nplato\nplatonic\nplatonical\nplatonically\nplatonism\nplatonist\nplatonistic\nplatonists\nplatonize\nplatonized\nplatonizes\nplatonizing\nplatoon\nplatooned\nplatooning\nplatoons\nplats\nplattdeutsch\nplatted\nplatter\nplatterful\nplatterfuls\nplatters\nplatting\nplaty\nplatyfish\nplatyfishes\nplatyhelminth\nplatyhelminthic\nplatyhelminths\nplatypi\nplatypus\nplatypuses\nplatyrrhine\nplatyrrhinian\nplatyrrhiny\nplatys\nplaudit\nplaudits\nplausibility\nplausible\nplausibleness\nplausibly\nplausive\nplautus\nplay\nplaya\nplayability\nplayable\nplayact\nplayacted\nplayacting\nplayacts\nplayas\nplayback\nplaybacks\nplaybill\nplaybills\nplaybook\nplaybooks\nplayboy\nplayboys\nplayed\nplayer\nplayers\nplayfellow\nplayfellows\nplayfield\nplayfields\nplayful\nplayfully\nplayfulness\nplaygirl\nplaygirls\nplaygoer\nplaygoers\nplaygoing\nplayground\nplaygrounds\nplayhouse\nplayhouses\nplaying\nplayland\nplaylands\nplaylet\nplaylets\nplaylist\nplaylists\nplaymaker\nplaymakers\nplaymaking\nplaymate\nplaymates\nplayoff\nplayoffs\nplaypen\nplaypens\nplayroom\nplayrooms\nplays\nplaysuit\nplaysuits\nplaything\nplaythings\nplaytime\nplaytimes\nplaywear\nplaywright\nplaywrighting\nplaywrights\nplaywriting\nplaza\nplazas\nplaît\nplea\npleach\npleached\npleaches\npleaching\nplead\npleadable\npleaded\npleader\npleaders\npleading\npleadingly\npleadings\npleads\npleas\npleasance\npleasances\npleasant\npleasanter\npleasantest\npleasantly\npleasantness\npleasantries\npleasantry\nplease\npleased\npleaser\npleasers\npleases\npleasing\npleasingly\npleasingness\npleasurability\npleasurable\npleasurableness\npleasurably\npleasure\npleasured\npleasureless\npleasures\npleasuring\npleat\npleated\npleater\npleaters\npleating\npleatless\npleats\npleb\nplebe\nplebeian\nplebeianism\nplebeianly\nplebeians\nplebes\nplebianly\nplebiscitary\nplebiscite\nplebiscites\nplebs\nplecopteran\nplecopterans\nplectognath\nplectognaths\nplectra\nplectrum\nplectrums\npled\npledge\npledged\npledgee\npledgees\npledgeor\npledgeors\npledger\npledgers\npledges\npledget\npledgets\npledging\npledgor\npledgors\npleiad\npleiades\nplein\npleinairism\npleinairist\npleinairists\npleiotaxies\npleiotaxy\npleiotropic\npleiotropically\npleiotropies\npleiotropism\npleiotropisms\npleiotropy\npleistocene\nplena\nplenarily\nplenariness\nplenary\nplenipotent\nplenipotentiaries\nplenipotentiary\nplenish\nplenished\nplenishes\nplenishing\nplenitude\nplenitudinous\nplenteous\nplenteously\nplenteousness\nplentiful\nplentifully\nplentifulness\nplentitude\nplenty\nplenum\nplenums\npleochroic\npleochroism\npleochroisms\npleomorphic\npleomorphism\npleomorphisms\npleonasm\npleonasms\npleonastic\npleonastically\npleopod\npleopods\nplerocercoid\nplerocercoids\nplesiosaur\nplesiosauri\nplesiosaurs\nplesiosaurus\nplessimeter\nplessimeters\nplessor\nplessors\nplethora\nplethoric\nplethorically\nplethysmogram\nplethysmograms\nplethysmograph\nplethysmographic\nplethysmographically\nplethysmographs\nplethysmography\npleura\npleurae\npleural\npleuras\npleurisy\npleuritic\npleurodont\npleurodonts\npleurodynia\npleurodynias\npleuron\npleuropneumonia\npleurotomies\npleurotomy\npleuston\npleustonic\npleustons\nplexiform\nplexiglas\npleximeter\npleximeters\npleximetric\npleximetry\nplexor\nplexors\nplexus\nplexuses\npliability\npliable\npliableness\npliably\npliancy\npliant\npliantly\npliantness\nplica\nplicae\nplical\nplicate\nplicated\nplicately\nplicateness\nplication\nplications\nplicature\nplicatures\nplied\nplier\npliers\nplies\nplight\nplighted\nplighter\nplighters\nplighting\nplights\nplimsol\nplimsole\nplimsoles\nplimsoll\nplimsolls\nplimsols\nplink\nplinked\nplinker\nplinkers\nplinking\nplinks\nplinth\nplinths\npliny\npliocene\npliofilm\npliskie\npliskies\nplisky\nplisse\nplisses\nplissé\nplissés\nplié\nplod\nplodded\nplodder\nplodders\nplodding\nploddingly\nplods\nploidies\nploidy\nplonk\nplonked\nplonking\nplonks\nplop\nplopped\nplopping\nplops\nplosion\nplosions\nplosive\nplosives\nplot\nplotinism\nplotinist\nplotinists\nplotinus\nplotless\nplotlessness\nplotline\nplotlines\nplots\nplottage\nplottages\nplotted\nplotter\nplotters\nplottier\nplottiest\nplotting\nplotty\nplough\nploughed\nploughing\nploughman\nploughs\nplover\nplovers\nplow\nplowable\nplowback\nplowbacks\nplowboy\nplowboys\nplowed\nplower\nplowers\nplowing\nplowman\nplowmen\nplows\nplowshare\nplowshares\nploy\nploys\npluck\nplucked\nplucker\npluckers\npluckier\npluckiest\npluckily\npluckiness\nplucking\nplucks\nplucky\nplug\nplugged\nplugger\npluggers\nplugging\nplugola\nplugs\nplum\nplumage\nplumaged\nplumate\nplumb\nplumbable\nplumbago\nplumbagos\nplumbean\nplumbed\nplumber\nplumberies\nplumbers\nplumbery\nplumbic\nplumbiferous\nplumbing\nplumbism\nplumbisms\nplumbs\nplume\nplumed\nplumelet\nplumelets\nplumeria\nplumes\nplumier\nplumiest\npluming\nplumlike\nplummet\nplummeted\nplummeting\nplummets\nplummier\nplummiest\nplummy\nplumose\nplumosely\nplumosity\nplump\nplumped\nplumpen\nplumpened\nplumpening\nplumpens\nplumper\nplumpest\nplumping\nplumpish\nplumply\nplumpness\nplumps\nplums\nplumule\nplumules\nplumulose\nplumy\nplunder\nplunderable\nplundered\nplunderer\nplunderers\nplundering\nplunderous\nplunders\nplunge\nplunged\nplunger\nplungers\nplunges\nplunging\nplunk\nplunked\nplunker\nplunkers\nplunking\nplunks\nplunky\npluperfect\npluperfects\nplural\npluralism\npluralist\npluralistic\npluralistically\npluralists\npluralities\nplurality\npluralization\npluralizations\npluralize\npluralized\npluralizes\npluralizing\nplurally\nplurals\npluribus\npluripotent\nplus\npluses\nplush\nplusher\nplushest\nplushier\nplushiest\nplushily\nplushiness\nplushly\nplushness\nplushy\nplussage\nplusses\nplutarch\nplutarchan\nplutarchian\npluto\nplutocracies\nplutocracy\nplutocrat\nplutocratic\nplutocratical\nplutocratically\nplutocrats\nplutographic\nplutography\npluton\nplutonian\nplutonic\nplutonium\nplutons\npluvial\npluviograph\npluviographs\npluviometer\npluviometers\npluviometric\npluviometrical\npluviometrically\npluviometry\npluviose\npluviosity\npluvious\nply\nplyer\nplyers\nplying\nplymouth\nplymouths\nplywood\npneuma\npneumas\npneumatic\npneumatical\npneumatically\npneumaticity\npneumatics\npneumatograph\npneumatographs\npneumatologic\npneumatological\npneumatologist\npneumatologists\npneumatology\npneumatolysis\npneumatolytic\npneumatometer\npneumatometers\npneumatometry\npneumatophore\npneumatophores\npneumatophoric\npneumectomy\npneumobacilli\npneumobacillus\npneumococcal\npneumococci\npneumococcus\npneumoconiosis\npneumoconiotic\npneumoconiotics\npneumocystis\npneumocystises\npneumogastric\npneumograph\npneumographic\npneumographs\npneumonectomies\npneumonectomy\npneumonia\npneumonic\npneumonitis\npneumostome\npneumostomes\npneumotachogram\npneumotachograms\npneumotachograph\npneumotachographic\npneumotachographs\npneumotachography\npneumothorax\npneumothoraxes\npo\npoach\npoachable\npoached\npoacher\npoachers\npoaches\npoaching\npoblano\npocahontas\npochard\npochards\npock\npocked\npocket\npocketable\npocketbook\npocketbooks\npocketed\npocketful\npocketfuls\npocketing\npocketknife\npocketknives\npocketless\npockets\npocketsful\npocketsize\npocking\npockmark\npockmarked\npockmarking\npockmarks\npocks\npocky\npoco\npococurante\npococurantes\npococurantism\npocono\npoconos\npocosin\npocosins\npocus\npocused\npocuses\npocusing\npocussed\npocusses\npocussing\npod\npodagra\npodagral\npodagras\npodagric\npodded\npodding\npodesta\npodestas\npodetia\npodetium\npodgier\npodgiest\npodgy\npodia\npodiatric\npodiatrist\npodiatrists\npodiatry\npodite\npodites\npoditic\npodium\npodiums\npodophylli\npodophyllin\npodophyllins\npodophyllum\npodophyllums\npodrida\npodridas\npods\npodsol\npodsolization\npodsolizations\npodsols\npodunk\npodzol\npodzolic\npodzolization\npodzolizations\npodzolize\npodzolized\npodzolizes\npodzolizing\npodzols\npoem\npoems\npoenology\npoesies\npoesy\npoet\npoetaster\npoetasters\npoetess\npoetesses\npoetic\npoetical\npoeticality\npoetically\npoeticalness\npoeticism\npoeticisms\npoeticize\npoeticized\npoeticizes\npoeticizing\npoetics\npoetize\npoetized\npoetizer\npoetizers\npoetizes\npoetizing\npoetry\npoets\npogies\npogo\npogonia\npogonias\npogonip\npogonips\npogonomyrmex\npogonophoran\npogonophorans\npogonophore\npogonophores\npogonophorous\npogrom\npogromed\npogroming\npogromist\npogromists\npogroms\npogy\npoi\npoignance\npoignancy\npoignant\npoignantly\npoikilotherm\npoikilothermal\npoikilothermia\npoikilothermic\npoikilothermism\npoikilothermous\npoikilotherms\npoilu\npoilus\npoincaré\npoinciana\npoinsettia\npoinsettias\npoint\npointblank\npointe\npointed\npointedly\npointedness\npointelle\npointer\npointers\npointes\npointier\npointiest\npointillism\npointillist\npointillistic\npointillists\npointing\npointless\npointlessly\npointlessness\npoints\npointtillist\npointy\npois\npoise\npoised\npoises\npoisha\npoising\npoison\npoisoned\npoisoner\npoisoners\npoisoning\npoisonings\npoisonous\npoisonously\npoisonousness\npoisons\npoisonwood\npoisonwoods\npoisson\npoitiers\npoitou\npoivre\npoke\npokeberries\npokeberry\npoked\npoker\npokerfaced\npokeroot\npokeroots\npokers\npokery\npokes\npokeweed\npokeweeds\npokey\npokeys\npokier\npokies\npokiest\npokily\npokiness\npoking\npoky\npol\npolab\npolabian\npolabians\npolabs\npolack\npolacks\npoland\npolar\npolarimeter\npolarimeters\npolarimetric\npolarimetry\npolaris\npolariscope\npolariscopes\npolariscopic\npolarities\npolarity\npolarizability\npolarizable\npolarization\npolarizations\npolarize\npolarized\npolarizer\npolarizers\npolarizes\npolarizing\npolarographic\npolarographically\npolarography\npolaroid\npolaron\npolarons\npolder\npolders\npole\npoleax\npoleaxe\npoleaxed\npoleaxes\npoleaxing\npolecat\npolecats\npoled\npoleis\npoleless\npolemic\npolemical\npolemically\npolemicist\npolemicists\npolemicize\npolemicized\npolemicizes\npolemicizing\npolemics\npolemist\npolemists\npolemize\npolemized\npolemizes\npolemizing\npolemonium\npolenta\npolentas\npoler\npolers\npoles\npolestar\npolestars\npoleward\npolice\npoliceable\npoliced\npoliceman\npolicemen\npolicer\npolicers\npolices\npolicewoman\npolicewomen\npolicies\npolicing\npoliclinic\npoliclinics\npolicy\npolicyholder\npolicyholders\npolicymaker\npolicymakers\npolicymaking\npoling\npolio\npoliomyelitic\npoliomyelitis\npoliovirus\npolioviruses\npolis\npolish\npolished\npolisher\npolishers\npolishes\npolishing\npolishings\npolitburo\npolitburos\npolite\npolitely\npoliteness\npolitenesses\npoliter\npolitesse\npolitest\npolitic\npolitical\npoliticalization\npoliticalizations\npoliticalize\npoliticalized\npoliticalizes\npoliticalizing\npolitically\npolitician\npoliticians\npoliticization\npoliticizations\npoliticize\npoliticized\npoliticizes\npoliticizing\npolitick\npoliticked\npoliticker\npolitickers\npoliticking\npoliticks\npoliticly\npolitico\npoliticos\npolitics\npolities\npolity\npolka\npolkaed\npolkaing\npolkas\npoll\npollack\npollacks\npollard\npollarded\npollarding\npollards\npolled\npollen\npollenate\npollenated\npollenates\npollenating\npolleniferous\npollenosis\npollens\npoller\npollers\npollex\npollices\npollinate\npollinated\npollinates\npollinating\npollination\npollinations\npollinator\npollinators\npolling\npollinia\npolliniferous\npollinium\npollinization\npollinizations\npollinize\npollinized\npollinizer\npollinizers\npollinizes\npollinizing\npollinosis\npolliwog\npolliwogs\npollo\npollock\npollocks\npolloi\npolls\npollster\npollsters\npolltaker\npolltakers\npollutant\npollutants\npollute\npolluted\npolluter\npolluters\npollutes\npolluting\npollution\npollutive\npollux\npollyanna\npollyannaish\npollyannaism\npollyannas\npollyannish\npollywog\npollywogs\npolo\npoloist\npoloists\npolonaise\npolonaises\npolonia\npolonium\npolonius\npols\npoltergeist\npoltergeists\npoltroon\npoltrooneries\npoltroonery\npoltroons\npoly\npolyacetylene\npolyacrylamide\npolyacrylamides\npolyacrylonitrile\npolyadenylic\npolyalcohol\npolyalcohols\npolyamide\npolyamides\npolyamine\npolyamines\npolyandric\npolyandrous\npolyandry\npolyantha\npolyanthas\npolyanthus\npolyanthuses\npolyatomic\npolybasic\npolybasite\npolybasites\npolybius\npolybrominated\npolybutadiene\npolybutadienes\npolycarbonate\npolycarbonates\npolycarpellary\npolycarpic\npolycarpous\npolycarpy\npolycentric\npolycentrics\npolycentrism\npolychaete\npolychaetes\npolychete\npolychetes\npolychetous\npolychlorinated\npolychotomous\npolychotomy\npolychromatic\npolychromatophile\npolychromatophilia\npolychromatophilic\npolychrome\npolychromes\npolychromic\npolychromies\npolychromophilia\npolychromous\npolychromy\npolycistronic\npolyclinic\npolyclinics\npolyclonal\npolyclonally\npolyclone\npolyclones\npolycondensation\npolycondensations\npolyconic\npolycot\npolycots\npolycotyledon\npolycotyledonous\npolycotyledons\npolycrystal\npolycrystalline\npolycrystals\npolycyclic\npolycystic\npolycythemia\npolycythemias\npolycythemic\npolycytidylic\npolydactyl\npolydactylism\npolydactylous\npolydactyly\npolydemic\npolydiacetylene\npolydipsia\npolydipsic\npolydisperse\npolydispersity\npolydorus\npolyelectrolyte\npolyelectrolytes\npolyembryonic\npolyembryonies\npolyembryony\npolyene\npolyenes\npolyenic\npolyester\npolyesterification\npolyesterifications\npolyesters\npolyestrous\npolyether\npolyethers\npolyethylene\npolygala\npolygalas\npolygamic\npolygamist\npolygamists\npolygamize\npolygamized\npolygamizes\npolygamizing\npolygamous\npolygamously\npolygamy\npolygene\npolygenes\npolygenesis\npolygenesist\npolygenesists\npolygenetic\npolygenic\npolygenically\npolyglot\npolyglotism\npolyglots\npolyglottism\npolygon\npolygonal\npolygonally\npolygons\npolygonum\npolygonums\npolygraph\npolygraphed\npolygrapher\npolygraphers\npolygraphic\npolygraphing\npolygraphist\npolygraphists\npolygraphs\npolygynous\npolygyny\npolyhedra\npolyhedral\npolyhedron\npolyhedrons\npolyhedroses\npolyhedrosis\npolyhistor\npolyhistoric\npolyhistors\npolyhydric\npolyhydroxy\npolyhydroxybutyrate\npolyhymnia\npolyimide\npolyimides\npolyinosinic\npolylysine\npolylysines\npolymath\npolymathic\npolymaths\npolymathy\npolymer\npolymerase\npolymerases\npolymeric\npolymerically\npolymerism\npolymerization\npolymerizations\npolymerize\npolymerized\npolymerizes\npolymerizing\npolymerous\npolymers\npolymethyl\npolymnia\npolymorph\npolymorphic\npolymorphically\npolymorphism\npolymorphisms\npolymorphonuclear\npolymorphonuclears\npolymorphous\npolymorphously\npolymorphs\npolymyxin\npolymyxins\npolynesia\npolynesian\npolynesians\npolyneuritic\npolyneuritis\npolyneuritises\npolynices\npolynomial\npolynomials\npolynuclear\npolynucleotide\npolynucleotides\npolynya\npolynyas\npolynyi\npolyolefin\npolyolefins\npolyoma\npolyomas\npolyonymous\npolyp\npolyparia\npolyparies\npolyparium\npolypary\npolypeptide\npolypeptides\npolypeptidic\npolypetalous\npolyphagia\npolyphagian\npolyphagous\npolyphagy\npolyphase\npolyphasic\npolyphemus\npolyphenol\npolyphenolic\npolyphenols\npolyphiloprogenitive\npolyphone\npolyphones\npolyphonic\npolyphonically\npolyphonies\npolyphonous\npolyphonously\npolyphony\npolyphosphate\npolyphosphates\npolyphyletic\npolyphyletically\npolypide\npolypides\npolyploid\npolyploids\npolyploidy\npolypnea\npolypneas\npolypneic\npolypod\npolypodies\npolypodous\npolypody\npolypoid\npolypore\npolypores\npolyposes\npolyposis\npolypropylene\npolypropylenes\npolyprotic\npolyps\npolyptych\npolyptyches\npolyrhythm\npolyrhythmic\npolyrhythmically\npolyrhythms\npolyribonucleotide\npolyribonucleotides\npolyribosomal\npolyribosome\npolyribosomes\npolys\npolysaccharid\npolysaccharide\npolysaccharides\npolysaccharids\npolysaccharose\npolysaccharoses\npolysemous\npolysemy\npolysepalous\npolysome\npolysomes\npolysomic\npolysomics\npolysorbate\npolysorbates\npolyspermic\npolyspermies\npolyspermy\npolystichous\npolystyrene\npolystyrenes\npolysulfide\npolysulfides\npolysyllabic\npolysyllabically\npolysyllable\npolysyllables\npolysynaptic\npolysynaptically\npolysyndeton\npolysyndetons\npolysynthetic\npolytechnic\npolytechnics\npolytene\npolytenic\npolyteny\npolytetrafluoroethylene\npolytetrafluoroethylenes\npolytheism\npolytheist\npolytheistic\npolytheistical\npolytheists\npolythene\npolythenes\npolytocous\npolytonal\npolytonality\npolytonally\npolytrophic\npolytypic\npolytypical\npolyunsaturate\npolyunsaturated\npolyunsaturates\npolyurethane\npolyurethanes\npolyuria\npolyurias\npolyuric\npolyvalence\npolyvalency\npolyvalent\npolyvinyl\npolywater\npolyzoan\npolyzoans\npolyzoaria\npolyzoaries\npolyzoarium\npolyzoary\npolyzoic\npom\npomace\npomaceous\npomaces\npomade\npomaded\npomades\npomading\npomander\npomanders\npomatum\npomatums\npome\npomegranate\npomegranates\npomelo\npomelos\npomerania\npomeranian\npomeranians\npomes\npomiculture\npomicultures\npomiferous\npommee\npommel\npommeled\npommeling\npommelled\npommelling\npommels\npommie\npommies\npommy\npomo\npomological\npomologically\npomologist\npomologists\npomology\npomona\npomos\npomp\npompadour\npompadoured\npompadours\npompano\npompanos\npompei\npompeian\npompeians\npompeii\npompeiian\npompeiians\npompelmous\npompelmouses\npompey\npompidou\npompom\npompoms\npompon\npompons\npomposity\npompous\npompously\npompousness\npoms\nponca\nponcas\nponce\nponces\nponcho\nponchos\npond\nponder\nponderability\nponderable\npondered\nponderer\nponderers\npondering\nponderosa\nponderosas\nponderosity\nponderous\nponderously\nponderousness\nponders\npondicherry\nponds\npondweed\npondweeds\npone\npones\npong\npongee\npongees\npongid\npongids\nponiard\nponiarded\nponiarding\nponiards\nponied\nponies\npons\npontes\nponthieu\npontiac\npontic\npontifex\npontiff\npontiffs\npontifical\npontifically\npontificals\npontificate\npontificated\npontificates\npontificating\npontification\npontifications\npontificator\npontificators\npontifices\npontil\npontils\npontine\npontonier\npontoniers\npontoon\npontoons\npontus\npony\nponying\nponytail\nponytailed\nponytails\nponzi\npooch\npooches\npood\npoodle\npoodled\npoodles\npoodling\npoods\npoof\npoofs\npooftah\npoofter\npoofters\npooh\npoohed\npoohing\npoohs\npool\npooled\npooler\npoolers\npooling\npoolroom\npoolrooms\npools\npoolside\npoolsides\npoon\npoona\npoons\npoop\npooped\npooper\npooping\npoops\npoor\npoorer\npoorest\npoorhouse\npoorhouses\npoori\npooris\npoorish\npoorly\npoormouth\npoormouthed\npoormouthing\npoormouths\npoorness\npoove\npooves\npop\npopcorn\npope\npopedom\npopedoms\npopery\npopes\npopeyed\npopgun\npopguns\npopinjay\npopinjays\npopish\npopishly\npopishness\npoplar\npoplars\npoplin\npoplins\npopliteal\npopocatépetl\npopover\npopovers\npoppa\npoppas\npopped\npopper\npoppers\npoppet\npoppets\npoppied\npoppies\npopping\npopple\npoppled\npopples\npoppling\npoppy\npoppycock\npoppyhead\npoppyheads\npops\npopsicle\npopsicles\npopulace\npopulaces\npopular\npopularity\npopularization\npopularizations\npopularize\npopularized\npopularizer\npopularizers\npopularizes\npopularizing\npopularly\npopulate\npopulated\npopulates\npopulating\npopulation\npopulational\npopulations\npopuli\npopulism\npopulist\npopulistic\npopulists\npopulous\npopulously\npopulousness\npopup\nporbeagle\nporbeagles\nporcelain\nporcelainize\nporcelainized\nporcelainizes\nporcelainizing\nporcelainlike\nporcelains\nporcelaneous\nporcellaneous\nporch\nporches\nporcine\nporcini\nporcino\nporcupine\nporcupines\npore\npored\npores\nporgies\nporgy\nporiferal\nporiferan\nporiferans\nporiferous\nporing\npork\nporker\nporkers\nporkier\nporkies\nporkiest\nporkpie\nporkpies\nporky\nporn\npornier\nporniest\nporno\npornographer\npornographers\npornographic\npornographically\npornography\nporny\nporomeric\nporomerics\nporosities\nporosity\nporous\nporously\nporousness\nporphyria\nporphyrias\nporphyric\nporphyries\nporphyrin\nporphyrins\nporphyritic\nporphyritical\nporphyroid\nporphyroids\nporphyropsin\nporphyropsins\nporphyry\nporpoise\nporpoises\nporrect\nporridge\nporridges\nporridgy\nporringer\nporringers\nport\nportability\nportable\nportableness\nportables\nportably\nportage\nportaged\nportages\nportaging\nportal\nportals\nportamenti\nportamento\nportamentos\nportapack\nportapacks\nportapak\nportapaks\nportative\nportcullis\nportcullises\nporte\nported\nportend\nportended\nportending\nportends\nportent\nportentous\nportentously\nportentousness\nportents\nporter\nporterage\nporterages\nporteress\nporteresses\nporterhouse\nporterhouses\nporters\nportfolio\nportfolios\nporthole\nportholes\nportia\nportico\nporticoed\nporticoes\nporticos\nportiere\nportieres\nporting\nportion\nportionable\nportioned\nportioner\nportioners\nportioning\nportionless\nportions\nportière\nportières\nportland\nportlander\nportlanders\nportlier\nportliest\nportliness\nportly\nportmanteau\nportmanteaus\nportmanteaux\nportofino\nportrait\nportraitist\nportraitists\nportraits\nportraiture\nportraitures\nportray\nportrayable\nportrayal\nportrayals\nportrayed\nportrayer\nportrayers\nportraying\nportrays\nportress\nportresses\nports\nportside\nportugal\nportuguese\nportulaca\nportulacas\nposable\nposada\nposadas\npose\nposed\nposeidon\nposer\nposers\nposes\nposeur\nposeurs\nposh\nposhly\nposhness\nposies\nposigrade\nposing\nposit\npositano\nposited\npositing\nposition\npositional\npositionally\npositioned\npositioner\npositioners\npositioning\npositions\npositive\npositively\npositiveness\npositives\npositivism\npositivist\npositivistic\npositivistically\npositivists\npositivity\npositron\npositronium\npositrons\nposits\nposology\nposse\nposses\npossess\npossessed\npossessedly\npossessedness\npossesses\npossessing\npossession\npossessional\npossessionless\npossessions\npossessive\npossessively\npossessiveness\npossessives\npossessor\npossessors\npossessory\nposset\npossets\npossibilities\npossibility\npossible\npossibly\npossum\npossums\npost\npostabortion\npostaccident\npostadolescent\npostage\npostages\npostal\npostally\npostamputation\npostapocalyptic\npostarrest\npostatomic\npostattack\npostaxial\npostaxially\npostbaccalaureate\npostbag\npostbags\npostbase\npostbellum\npostbiblical\npostbourgeois\npostbox\npostboxes\npostboy\npostboys\npostburn\npostcapitalist\npostcard\npostcardlike\npostcards\npostcava\npostcaval\npostcavas\npostclassic\npostclassical\npostcode\npostcodes\npostcoital\npostcollege\npostcollegiate\npostcolonial\npostconception\npostconcert\npostcondition\npostconditions\npostconquest\npostconsonantal\npostconvention\npostcopulatory\npostcoronary\npostcoup\npostcranial\npostcranially\npostcrash\npostcrisis\npostdate\npostdated\npostdates\npostdating\npostdeadline\npostdebate\npostdebutante\npostdelivery\npostdepositional\npostdepression\npostdevaluation\npostdiluvial\npostdiluvian\npostdive\npostdivestiture\npostdivorce\npostdoc\npostdocs\npostdoctoral\npostdoctorate\npostdrug\nposte\nposted\npostediting\npostelection\npostembryonal\npostembryonic\npostemergence\npostemergency\npostencephalitic\npostepileptic\nposter\nposterior\nposteriori\nposteriority\nposteriorly\nposteriors\nposterity\npostern\nposterns\nposterolateral\nposters\nposteruptive\npostexercise\npostexilian\npostexilic\npostexperience\npostexperimental\npostexposure\npostface\npostfaces\npostfault\npostfeminist\npostfire\npostfix\npostfixal\npostfixed\npostfixes\npostfixial\npostfixing\npostflight\npostfracture\npostfreeze\npostfrontal\npostgame\npostganglionic\npostglacial\npostgraduate\npostgraduates\npostgraduation\npostharvest\nposthaste\nposthemorrhagic\nposthole\npostholes\npostholiday\npostholocaust\nposthospital\nposthumous\nposthumously\nposthumousness\nposthypnotic\npostiche\npostiches\npostilion\npostilions\npostillion\npostillions\npostimpact\npostimperial\npostimpressionism\npostimpressionist\npostimpressionistic\npostimpressionists\npostinaugural\npostindependence\npostindustrial\npostinfection\nposting\npostings\npostinjection\npostinoculation\npostirradiation\npostischemic\npostisolation\npostlanding\npostlapsarian\npostlaunch\npostliberation\npostliterate\npostlude\npostludes\npostman\npostmarital\npostmark\npostmarked\npostmarking\npostmarks\npostmastectomy\npostmaster\npostmasters\npostmastership\npostmasterships\npostmating\npostmedieval\npostmen\npostmenopausal\npostmenstrual\npostmeridian\npostmidnight\npostmillenarian\npostmillenarianism\npostmillenarians\npostmillennial\npostmillennialism\npostmillennialist\npostmillennialists\npostmillennian\npostmistress\npostmistresses\npostmodern\npostmodernism\npostmodernist\npostmodernists\npostmortem\npostmortems\npostnasal\npostnatal\npostnatally\npostneonatal\npostnuptial\npostnuptially\npostoperative\npostoperatively\npostorbital\npostorgasmic\npostovulatory\npostpaid\npostpartum\npostpollination\npostponable\npostpone\npostponed\npostponement\npostponements\npostponer\npostponers\npostpones\npostponing\npostpose\npostposed\npostposes\npostposing\npostposition\npostpositional\npostpositionally\npostpositions\npostpositive\npostpositively\npostpositives\npostprandial\npostprandially\npostpresidential\npostprimary\npostprison\npostprocessor\npostprocessors\npostproduction\npostproductions\npostpsychoanalytic\npostpuberty\npostpubescent\npostrace\npostrecession\npostresurrection\npostretirement\npostrevolutionary\npostriot\npostromantic\nposts\npostscript\npostscripts\npostseason\npostsecondary\npostshow\npoststimulation\npoststimulatory\npoststimulus\npoststrike\npostsurgical\npostsynaptic\npostsynaptically\nposttax\npostteen\nposttension\nposttensioned\nposttensioning\nposttensions\nposttest\nposttests\nposttranscriptional\nposttransfusion\nposttranslational\nposttraumatic\nposttreatment\nposttrial\npostulancy\npostulant\npostulants\npostulantship\npostulate\npostulated\npostulates\npostulating\npostulation\npostulational\npostulations\npostulator\npostulators\npostural\nposture\npostured\nposturer\nposturers\npostures\nposturing\nposturist\nposturists\npostvaccinal\npostvaccination\npostvagotomy\npostvasectomy\npostvertebral\npostvocalic\npostwar\npostweaning\npostworkshop\nposy\npot\npotability\npotable\npotableness\npotables\npotage\npotages\npotamoplankton\npotamoplanktons\npotash\npotashes\npotassic\npotassium\npotation\npotations\npotato\npotatoes\npotatory\npotawatomi\npotawatomis\npotbellied\npotbellies\npotbelly\npotboil\npotboiled\npotboiler\npotboilers\npotboiling\npotboils\npotbound\npotboy\npotboys\npoteen\npoteens\npotemkin\npotence\npotences\npotencies\npotency\npotent\npotentate\npotentates\npotential\npotentialities\npotentiality\npotentialize\npotentialized\npotentializes\npotentializing\npotentially\npotentials\npotentiate\npotentiated\npotentiates\npotentiating\npotentiation\npotentiations\npotentiator\npotentiators\npotentilla\npotentillas\npotentiometer\npotentiometers\npotentiometric\npotently\npotentness\npotful\npotfuls\npothead\npotheads\npotheen\npotheens\npother\npotherb\npotherbs\npothered\npothering\npothers\npotholder\npotholders\npothole\npotholed\npotholes\npothook\npothooks\npothouse\npothouses\npothunter\npothunters\npothunting\npotiche\npotiches\npotion\npotions\npotiphar\npotlatch\npotlatches\npotline\npotlines\npotluck\npotlucks\npotomac\npotometer\npotometers\npotpie\npotpies\npotpourri\npotpourris\npots\npotsdam\npotshard\npotshards\npotsherd\npotsherds\npotshot\npotshots\npotshotting\npotstone\npotstones\npottage\npotted\npotter\npottered\npotterer\npotterers\npotteries\npottering\npotteringly\npotters\npottery\npottier\npotties\npottiest\npotting\npottle\npottles\npotto\npottos\npotty\npotzer\npotzers\npouch\npouched\npouches\npouchier\npouchiest\npouching\npouchy\npouf\npoufed\npouffe\npouffed\npouffes\npouffy\npoufs\npouilly\npoulard\npoularde\npoulardes\npoulards\npoult\npoulter\npoulterer\npoulterers\npoultice\npoulticed\npoultices\npoulticing\npoultry\npoultryman\npoultrymen\npoults\npounce\npounced\npouncer\npouncers\npounces\npouncet\npouncets\npouncing\npound\npoundage\npoundal\npoundals\npounded\npounder\npounders\npounding\npounds\npour\npourable\npourboire\npourboires\npoured\npourer\npourers\npouring\npouringly\npourparler\npourparlers\npourpoint\npourpoints\npours\npousse\npoussette\npoussetted\npoussettes\npoussetting\npoussin\npout\npouted\npouter\npouters\npouting\npouts\npouty\npoverty\npow\npowder\npowdered\npowderer\npowderers\npowdering\npowderless\npowderlike\npowders\npowdery\npowell\npower\npowerboat\npowerboats\npowered\npowerful\npowerfully\npowerfulness\npowerhouse\npowerhouses\npowering\npowerless\npowerlessly\npowerlessness\npowerlifting\npowerliftings\npowers\npowerwalking\npowhatan\npowhatans\npows\npowwow\npowwowed\npowwowing\npowwows\npowys\npox\npoxes\npoxvirus\npoxviruses\npozzolan\npozzolana\npozzolanas\npozzolanic\npozzolans\npozzuolana\npozzuolanas\npozzuolanic\npozzuoli\nppm\npq\npraam\npraams\npracticability\npracticable\npracticableness\npracticably\npractical\npracticalities\npracticality\npractically\npracticalness\npractice\npracticed\npracticer\npracticers\npractices\npracticing\npracticum\npracticums\npractise\npractised\npractises\npractising\npractitioner\npractitioners\npradesh\nprado\npraecipe\npraecipes\npraecox\npraedial\npraemunire\npraemunires\npraenomen\npraenomens\npraenomina\npraenominal\npraesidium\npraesidiums\npraetor\npraetorial\npraetorian\npraetorians\npraetors\npraetorship\npraetorships\npragmatic\npragmatical\npragmatically\npragmaticism\npragmaticist\npragmaticists\npragmatics\npragmatism\npragmatist\npragmatistic\npragmatists\nprague\nprahu\nprahus\nprairie\nprairies\npraise\npraised\npraiseful\npraiser\npraisers\npraises\npraiseworthier\npraiseworthiest\npraiseworthily\npraiseworthiness\npraiseworthy\npraising\nprakrit\nprakritic\nprakrits\npraline\npralines\npralltriller\npralltrillers\npram\nprams\nprance\npranced\nprancer\nprancers\nprances\nprancing\nprancingly\nprandial\nprandially\nprang\npranged\npranging\nprangs\nprank\npranked\npranking\nprankish\nprankishly\nprankishness\npranks\nprankster\npranksters\nprase\npraseodymium\nprases\nprat\nprate\nprated\nprater\npraters\nprates\npratfall\npratfalls\npratincole\npratincoles\nprating\npratingly\npratique\npratiques\nprato\nprats\nprattle\nprattled\nprattler\nprattlers\nprattles\nprattling\nprattlingly\nprau\npraus\nprawn\nprawned\nprawner\nprawners\nprawning\nprawns\npraxeological\npraxeology\npraxes\npraxiology\npraxis\npraxiteles\npray\nprayed\nprayer\nprayerful\nprayerfully\nprayerfulness\nprayerlessness\nprayers\npraying\nprays\nprazosin\nprazosins\npre\npreach\npreached\npreacher\npreachers\npreaches\npreachier\npreachiest\npreachification\npreachifications\npreachified\npreachifies\npreachify\npreachifying\npreachily\npreachiness\npreaching\npreachingly\npreachment\npreachments\npreachy\npreadaptation\npreadaptations\npreadapted\npreadaptive\npreadmission\npreadmissions\npreadolescence\npreadolescent\npreadolescents\npreadult\npreagricultural\npreamble\npreambles\npreambulary\npreamp\npreamplified\npreamplifier\npreamplifiers\npreamps\npreanesthetic\npreannounce\npreannounced\npreannounces\npreannouncing\npreapprehension\npreapprove\npreapproved\npreapproves\npreapproving\nprearrange\nprearranged\nprearrangement\nprearrangements\nprearranges\nprearranging\npreassembled\npreassign\npreassigned\npreassigning\npreassigns\npreatomic\npreaxial\npreaxially\nprebake\nprebaked\nprebakes\nprebaking\nprebattle\nprebattled\nprebattles\nprebattling\nprebend\nprebendal\nprebendaries\nprebendary\nprebends\nprebiblical\nprebiologic\nprebiological\nprebiologist\nprebiologists\nprebiology\nprebiotic\nprebook\nprebooked\nprebooking\nprebooks\nprebreakfast\nprebreakfasts\nprebuilt\nprecalculus\nprecambrian\nprecancel\nprecanceled\nprecanceling\nprecancellation\nprecancellations\nprecancelled\nprecancelling\nprecancels\nprecancer\nprecancerous\nprecancers\nprecapitalist\nprecarious\nprecariously\nprecariousness\nprecast\nprecasting\nprecasts\nprecative\nprecatory\nprecaution\nprecautional\nprecautionary\nprecautions\nprecava\nprecavae\nprecaval\nprecede\npreceded\nprecedence\nprecedency\nprecedent\nprecedential\nprecedents\nprecedes\npreceding\nprecensor\nprecensored\nprecensoring\nprecensors\nprecentor\nprecentorial\nprecentors\nprecentorship\nprecentorships\nprecept\npreceptive\npreceptively\npreceptor\npreceptorial\npreceptorially\npreceptories\npreceptors\npreceptorship\npreceptorships\npreceptory\nprecepts\nprecess\nprecessed\nprecesses\nprecessing\nprecession\nprecessional\nprecessions\nprechill\nprechilled\nprechilling\nprechills\nprechristmas\nprecieuse\nprecieux\nprecinct\nprecincts\npreciosities\npreciosity\nprecious\npreciously\npreciousness\nprecipe\nprecipes\nprecipice\nprecipices\nprecipitable\nprecipitance\nprecipitancy\nprecipitant\nprecipitantly\nprecipitantness\nprecipitants\nprecipitate\nprecipitated\nprecipitately\nprecipitateness\nprecipitates\nprecipitating\nprecipitation\nprecipitations\nprecipitative\nprecipitator\nprecipitators\nprecipitin\nprecipitinogen\nprecipitinogens\nprecipitins\nprecipitous\nprecipitously\nprecipitousness\nprecise\nprecisely\npreciseness\nprecisian\nprecisianism\nprecisians\nprecision\nprecisionism\nprecisionist\nprecisionists\nprecisions\npreclear\npreclearance\nprecleared\npreclearing\npreclears\npreclinical\npreclude\nprecluded\nprecludes\nprecluding\npreclusion\npreclusive\npreclusively\nprecocial\nprecocious\nprecociously\nprecociousness\nprecocity\nprecode\nprecoded\nprecodes\nprecoding\nprecognition\nprecognitions\nprecognitive\nprecognizant\nprecoital\nprecollege\nprecollegiate\nprecolonial\nprecombustion\nprecommitment\nprecommitments\nprecompute\nprecomputed\nprecomputer\nprecomputes\nprecomputing\npreconceive\npreconceived\npreconceives\npreconceiving\npreconception\npreconceptions\npreconcert\npreconcerted\npreconcerting\npreconcerts\nprecondition\npreconditioned\npreconditioning\npreconditions\npreconquest\npreconscious\npreconsciously\npreconsonantal\npreconstructed\nprecontact\nprecontract\nprecontracted\nprecontracting\nprecontracts\nprecontrived\npreconvention\npreconviction\npreconvictions\nprecook\nprecooked\nprecooking\nprecooks\nprecool\nprecooled\nprecooling\nprecools\nprecopulatory\nprecrash\nprecrease\nprecreased\nprecreases\nprecreasing\nprecrisis\nprecritical\nprecursive\nprecursor\nprecursors\nprecursory\nprecut\nprecuts\nprecutting\npredaceous\npredaceousness\npredacious\npredaciousness\npredacity\npredate\npredated\npredates\npredating\npredation\npredations\npredator\npredatorily\npredatoriness\npredators\npredatory\npredawn\npredawns\npredecease\npredeceased\npredeceases\npredeceasing\npredecessor\npredecessors\npredefine\npredefined\npredefines\npredefining\npredefinition\npredefinitions\npredelivery\npredeparture\npredesignate\npredesignated\npredesignates\npredesignating\npredesignation\npredesignations\npredestinarian\npredestinarianism\npredestinarians\npredestinate\npredestinated\npredestinates\npredestinating\npredestination\npredestinator\npredestinators\npredestine\npredestined\npredestines\npredestining\npredeterminate\npredetermination\npredeterminations\npredetermine\npredetermined\npredeterminer\npredeterminers\npredetermines\npredetermining\npredevaluation\npredevelopment\nprediabetes\nprediabetic\nprediabetics\npredial\npredicability\npredicable\npredicableness\npredicables\npredicament\npredicamental\npredicamentally\npredicaments\npredicate\npredicated\npredicates\npredicating\npredication\npredicational\npredications\npredicative\npredicatively\npredicator\npredicators\npredicatory\npredict\npredictability\npredictable\npredictably\npredicted\npredicting\nprediction\npredictions\npredictive\npredictively\npredictiveness\npredictor\npredictors\npredicts\npredigest\npredigested\npredigesting\npredigestion\npredigestions\npredigests\npredilection\npredilections\npredinner\npredischarge\nprediscoveries\nprediscovery\npredispose\npredisposed\npredisposes\npredisposing\npredisposition\npredispositions\npredive\nprednisolone\nprednisolones\nprednisone\nprednisones\npredoctoral\npredominance\npredominancy\npredominant\npredominantly\npredominate\npredominated\npredominately\npredominates\npredominating\npredominatingly\npredomination\npredominations\npredominator\npredominators\npredrill\npredrilled\npredrilling\npredrills\npredynastic\npreeclampsia\npreeclamptic\npreelection\npreelectric\npreembargo\npreemergence\npreemergent\npreemie\npreemies\npreeminence\npreeminent\npreeminently\npreemployment\npreemployments\npreempt\npreempted\npreempting\npreemption\npreemptions\npreemptive\npreemptively\npreemptor\npreemptors\npreemptory\npreempts\npreen\npreened\npreener\npreeners\npreengineered\npreening\npreenrollment\npreens\npreerect\npreerected\npreerecting\npreerects\npreestablish\npreestablished\npreestablishes\npreestablishing\npreethical\npreexilian\npreexilic\npreexist\npreexisted\npreexistence\npreexistent\npreexisting\npreexists\npreexperiment\nprefab\nprefabed\nprefabing\nprefabricate\nprefabricated\nprefabricates\nprefabricating\nprefabrication\nprefabrications\nprefabricator\nprefabricators\nprefabs\npreface\nprefaced\nprefacer\nprefacers\nprefaces\nprefacing\nprefade\nprefaded\nprefades\nprefading\nprefascist\nprefatorily\nprefatory\nprefect\nprefects\nprefectural\nprefecture\nprefectures\nprefer\npreferability\npreferable\npreferableness\npreferably\npreference\npreferences\npreferential\npreferentialism\npreferentialist\npreferentialists\npreferentially\npreferment\npreferments\npreferred\npreferrer\npreferrers\npreferring\nprefers\nprefeudal\nprefight\nprefiguration\nprefigurations\nprefigurative\nprefiguratively\nprefigurativeness\nprefigure\nprefigured\nprefigurement\nprefigurements\nprefigures\nprefiguring\nprefile\nprefiled\nprefiles\nprefiling\nprefilled\nprefinance\nprefinanced\nprefinances\nprefinancing\nprefinished\nprefire\nprefix\nprefixal\nprefixally\nprefixed\nprefixes\nprefixing\npreflame\npreflight\npreflighted\npreflighting\npreflights\nprefocus\nprefocused\nprefocuses\nprefocusing\npreform\npreformat\npreformation\npreformationist\npreformationists\npreformations\npreformats\npreformatted\npreformatting\npreformed\npreforming\npreforms\npreformulate\npreformulated\npreformulates\npreformulating\nprefreshman\nprefreshmen\nprefrontal\nprefrozen\npregame\npreganglionic\npregenital\npregnability\npregnable\npregnancies\npregnancy\npregnant\npregnantly\npregnenolone\npregnenolones\npreharvest\npreheadache\npreheat\npreheated\npreheater\npreheaters\npreheating\npreheats\nprehensile\nprehensility\nprehension\nprehensions\nprehiring\nprehistorian\nprehistorians\nprehistoric\nprehistorical\nprehistorically\nprehistories\nprehistory\npreholiday\nprehominid\nprehominids\nprehuman\npreignition\npreignitions\npreimplantation\npreinaugural\npreincorporation\npreinduction\npreindustrial\npreinstall\npreinstalled\npreinstalling\npreinstalls\npreinterview\npreinvasion\nprejudge\nprejudged\nprejudgement\nprejudgements\nprejudger\nprejudgers\nprejudges\nprejudging\nprejudgment\nprejudgments\nprejudice\nprejudiced\nprejudices\nprejudicial\nprejudicially\nprejudicialness\nprejudicing\nprejudicious\nprejudiciously\nprekindergarten\nprelacies\nprelacy\nprelapsarian\nprelate\nprelates\nprelateship\nprelateships\nprelatic\nprelature\nprelatures\nprelaunch\nprelaw\nprelect\nprelected\nprelecting\nprelection\nprelections\nprelector\nprelectors\nprelects\nprelibation\nprelibations\nprelife\nprelim\npreliminaries\npreliminarily\npreliminary\nprelims\npreliterary\npreliterate\npreliterates\npreloaded\nprelogical\nprelude\npreluded\npreluder\npreluders\npreludes\npreludial\npreluding\nprelunch\npreluncheon\nprelusion\nprelusions\nprelusive\nprelusively\npremade\npremalignant\npreman\npremanufacture\npremarital\npremaritally\npremarket\npremarketed\npremarketing\npremarkets\npremarriage\npremature\nprematurely\nprematureness\nprematurity\npremaxilla\npremaxillae\npremaxillary\npremeal\npremeasure\npremeasured\npremeasures\npremeasuring\npremed\npremedical\npremedieval\npremeditate\npremeditated\npremeditatedly\npremeditates\npremeditating\npremeditation\npremeditative\npremeditator\npremeditators\npremeds\npremeet\npremeiotic\npremenopausal\npremenstrual\npremenstrually\npremerger\npremie\npremier\npremiere\npremiered\npremieres\npremiering\npremiers\npremiership\npremierships\npremies\npremigration\npremillenarian\npremillenarianism\npremillenarians\npremillennial\npremillennialism\npremillennialist\npremillennialists\npremillennially\npremise\npremised\npremises\npremising\npremiss\npremisses\npremium\npremiums\npremix\npremixed\npremixes\npremixing\npremière\npremièred\npremières\npremièring\npremodern\npremodification\npremodified\npremodifies\npremodify\npremodifying\npremoisten\npremoistened\npremoistening\npremoistens\npremolar\npremolars\npremold\npremolded\npremolding\npremolds\npremolt\npremonish\npremonished\npremonishes\npremonishing\npremonition\npremonitions\npremonitorily\npremonitory\npremonstratensian\npremonstratensians\npremoral\npremorse\npremune\npremunition\npremunitions\npremycotic\nprename\nprenames\nprenatal\nprenatally\nprenominate\nprenominated\nprenominates\nprenominating\nprenomination\nprenominations\nprenoon\nprenotification\nprenotifications\nprenotified\nprenotifies\nprenotify\nprenotifying\nprenotion\nprenotions\nprentice\nprenticed\nprentices\nprenticing\nprenumber\nprenumbered\nprenumbering\nprenumbers\nprenuptial\npreoccupancy\npreoccupation\npreoccupations\npreoccupied\npreoccupies\npreoccupy\npreoccupying\npreopening\npreoperational\npreoperative\npreoperatively\npreoral\npreorbital\npreordain\npreordained\npreordaining\npreordainment\npreordainments\npreordains\npreorder\npreordered\npreordering\npreorders\npreordination\npreordinations\npreovulatory\npreowned\nprep\nprepack\nprepackage\nprepackaged\nprepackages\nprepackaging\nprepacked\nprepacking\nprepacks\nprepaid\npreparation\npreparations\npreparative\npreparatively\npreparatives\npreparator\npreparatorily\npreparators\npreparatory\nprepare\nprepared\npreparedly\npreparedness\npreparer\npreparers\nprepares\npreparing\nprepaste\nprepasted\nprepastes\nprepasting\nprepay\nprepaying\nprepayment\nprepayments\nprepays\nprepense\nprepensely\npreperformance\nprepill\npreplan\npreplanned\npreplanning\npreplans\npreplant\npreplanting\npreponderance\npreponderancy\npreponderant\npreponderantly\npreponderate\npreponderated\npreponderately\npreponderates\npreponderating\npreponderation\npreponderations\npreportion\npreportioned\npreportioning\npreportions\npreposition\nprepositional\nprepositionally\nprepositioned\nprepositioning\nprepositions\nprepositive\nprepositively\nprepositives\nprepossess\nprepossessed\nprepossesses\nprepossessing\nprepossessingly\nprepossessingness\nprepossession\nprepossessions\npreposterous\npreposterously\npreposterousness\nprepotencies\nprepotency\nprepotent\nprepotently\nprepped\npreppie\npreppies\npreppily\npreppiness\nprepping\npreppy\npreprandial\nprepreg\npreprepared\nprepresidential\npreprice\nprepriced\npreprices\nprepricing\npreprimaries\npreprimary\npreprint\npreprinted\npreprinting\npreprints\npreprocess\npreprocessed\npreprocesses\npreprocessing\npreprocessor\npreprocessors\npreproduction\npreproductions\npreprofessional\npreprogram\npreprogramed\npreprograming\npreprogrammed\npreprogramming\npreprograms\npreps\nprepsychedelic\nprepuberal\nprepubertal\nprepuberty\nprepubescence\nprepubescent\nprepubescents\nprepublication\nprepuce\nprepuces\nprepunch\nprepunched\nprepunches\nprepunching\nprepupa\nprepupae\nprepupal\nprepupas\nprepurchase\nprepurchased\nprepurchases\nprepurchasing\npreputial\nprequalification\nprequalified\nprequalifies\nprequalify\nprequalifying\nprequel\nprequels\nprerace\nprerecession\nprerecord\nprerecorded\nprerecording\nprerecords\npreregister\npreregistered\npreregistering\npreregisters\npreregistration\npreregistrations\nprerehearsal\nprerelease\nprereleases\nprerequire\nprerequired\nprerequires\nprerequiring\nprerequisite\nprerequisites\npreretirement\npreretirements\nprereturn\nprereview\nprerevisionist\nprerevolution\nprerevolutionary\nprerinse\nprerinsed\nprerinses\nprerinsing\npreriot\nprerock\nprerogative\nprerogatived\nprerogatives\npreromantic\npresage\npresaged\npresageful\npresager\npresagers\npresages\npresaging\npresale\npresales\npresanctified\npresbyope\npresbyopes\npresbyopia\npresbyopic\npresbyter\npresbyterate\npresbyterates\npresbyterial\npresbyterially\npresbyterian\npresbyterianism\npresbyterians\npresbyteries\npresbyters\npresbytery\npreschedule\nprescheduled\npreschedules\nprescheduling\npreschool\npreschooler\npreschoolers\npreschooling\npreschools\nprescience\nprescient\nprescientific\npresciently\nprescind\nprescinded\nprescinding\nprescinds\nprescore\nprescored\nprescores\nprescoring\nprescreen\nprescreened\nprescreening\nprescreens\nprescribe\nprescribed\nprescriber\nprescribers\nprescribes\nprescribing\nprescript\nprescriptibility\nprescriptible\nprescription\nprescriptions\nprescriptive\nprescriptively\nprescriptiveness\nprescriptivist\nprescriptivists\nprescripts\npreseason\npreseasons\npreselect\npreselected\npreselecting\npreselection\npreselections\npreselects\npresell\npreselling\npresells\npresence\npresent\npresentability\npresentable\npresentableness\npresentably\npresentation\npresentational\npresentations\npresentative\npresentativeness\npresented\npresentee\npresentees\npresentence\npresentencing\npresenter\npresenters\npresentient\npresentiment\npresentimental\npresentiments\npresenting\npresentism\npresentist\npresentists\npresently\npresentment\npresentments\npresentness\npresents\npreservability\npreservable\npreservation\npreservationism\npreservationist\npreservationists\npreservations\npreservative\npreservatives\npreserve\npreserved\npreserver\npreservers\npreserves\npreservice\npreserving\npreset\npresets\npresettable\npresetting\npresettlement\npreshow\npreshrank\npreshrink\npreshrinks\npreshrunk\npreside\npresided\npresidencies\npresidency\npresident\npresidential\npresidentially\npresidents\npresidentship\npresidentships\npresider\npresiders\npresides\npresidia\npresidial\npresidiary\npresiding\npresidio\npresidios\npresidium\npresidiums\npresignified\npresignifies\npresignify\npresignifying\npreslaughter\npresleep\npreslice\npresliced\npreslices\npreslicing\npresoak\npresoaked\npresoaking\npresoaks\npresold\npresong\npresort\npresorted\npresorting\npresorts\nprespecified\nprespecifies\nprespecify\nprespecifying\npresplit\npress\npressboard\npressboards\npressed\npresser\npressers\npresses\npressing\npressingly\npressings\npressman\npressmark\npressmarks\npressmen\npressor\npressroom\npressrooms\npressrun\npressruns\npressure\npressured\npressureless\npressures\npressuring\npressurization\npressurizations\npressurize\npressurized\npressurizer\npressurizers\npressurizes\npressurizing\npresswork\nprest\nprestamp\nprestamped\nprestamping\nprestamps\nprestellar\nprester\npresterilize\npresterilized\npresterilizes\npresterilizing\npresternum\npresternums\nprestidigitation\nprestidigitations\nprestidigitator\nprestidigitators\nprestige\nprestigeful\nprestigious\nprestigiously\nprestigiousness\nprestissimo\nprestissimos\npresto\nprestorage\nprestos\nprestress\nprestressed\nprestresses\nprestressing\nprestrike\nprestructure\nprestructured\nprestructures\nprestructuring\npresumable\npresumably\npresume\npresumed\npresumedly\npresumer\npresumers\npresumes\npresuming\npresumingly\npresummit\npresumption\npresumptions\npresumptive\npresumptively\npresumptuous\npresumptuously\npresumptuousness\npresuppose\npresupposed\npresupposes\npresupposing\npresupposition\npresuppositional\npresuppositions\npresurgery\npresweeten\npresweetened\npresweetening\npresweetens\npresymptomatic\npresynaptic\npresynaptically\npretape\npretaped\npretapes\npretaping\npretax\npretechnological\npreteen\npreteenager\npreteenagers\npreteens\npretelevision\npretence\npretences\npretend\npretended\npretendedly\npretender\npretenders\npretending\npretends\npretense\npretenses\npretension\npretensionless\npretensions\npretentious\npretentiously\npretentiousness\npreterit\npreterite\npreterition\npreteritions\npreterits\npreterm\npreterminal\npretermination\npretermission\npretermissions\npretermit\npretermits\npretermitted\npretermitter\npretermitters\npretermitting\npreterms\npreternatural\npreternaturalism\npreternaturally\npreternaturalness\npretest\npretested\npretesting\npretests\npretext\npretexted\npretexting\npretexts\npretheater\npreticket\npreticketed\npreticketing\npretickets\npretor\npretoria\npretorian\npretorians\npretors\npretournament\npretrain\npretravel\npretreat\npretreated\npretreating\npretreatment\npretreatments\npretreats\npretrial\npretrials\npretrimmed\nprettied\nprettier\npretties\nprettiest\nprettification\nprettifications\nprettified\nprettifier\nprettifiers\nprettifies\nprettify\nprettifying\nprettily\nprettiness\npretty\nprettying\nprettyish\npretype\npretyped\npretypes\npretyping\npretzel\npretzels\npreunification\npreuniversity\nprevail\nprevailed\nprevailer\nprevailers\nprevailing\nprevailingly\nprevailingness\nprevails\nprevalence\nprevalent\nprevalently\nprevaricate\nprevaricated\nprevaricates\nprevaricating\nprevarication\nprevarications\nprevaricator\nprevaricators\nprevenience\npreveniences\nprevenient\npreveniently\nprevent\npreventability\npreventable\npreventative\npreventatively\npreventatives\nprevented\npreventer\npreventers\npreventibility\npreventible\npreventing\nprevention\npreventions\npreventive\npreventively\npreventiveness\npreventives\nprevents\npreverb\npreverbal\npreverbs\npreviable\npreview\npreviewed\npreviewer\npreviewers\npreviewing\npreviews\nprevious\npreviously\npreviousness\nprevise\nprevised\nprevises\nprevising\nprevision\nprevisional\nprevisionary\nprevisioned\nprevisioning\nprevisions\nprevisor\nprevisors\nprevocalic\nprevocational\nprevue\nprevued\nprevues\nprevuing\nprewar\nprewarn\nprewarned\nprewarning\nprewarns\nprewash\nprewashed\nprewashes\nprewashing\npreweaning\nprework\nprewrap\nprewrapped\nprewrapping\nprewraps\nprewriting\nprex\nprexes\nprexies\nprexy\nprey\npreyed\npreyer\npreyers\npreying\npreys\nprez\nprezes\npriam\npriapean\npriapic\npriapism\npriapus\npriapuses\npribilof\nprice\npriceable\npriced\npriceless\npricelessly\npricer\npricers\nprices\npricey\npriceyness\npricier\npriciest\npricily\npricing\nprick\npricked\npricker\nprickers\npricket\nprickets\nprickier\nprickiest\npricking\nprickle\nprickled\nprickles\npricklier\nprickliest\nprickliness\nprickling\nprickly\npricks\npricky\npricy\npride\nprided\nprideful\npridefully\npridefulness\nprides\npriding\npried\nprier\npriers\npries\npriest\npriested\npriestess\npriestesses\npriesthood\npriesting\npriestley\npriestlier\npriestliest\npriestliness\npriestly\npriests\nprig\nprigged\npriggery\nprigging\npriggish\npriggishly\npriggishness\npriggism\nprigs\nprill\nprilled\nprilling\nprills\nprim\nprima\nprimacies\nprimacy\nprimal\nprimality\nprimaries\nprimarily\nprimary\nprimate\nprimates\nprimateship\nprimatial\nprimatological\nprimatologist\nprimatologists\nprimatology\nprimavera\nprimaveras\nprime\nprimed\nprimely\nprimeness\nprimer\nprimero\nprimers\nprimes\nprimeval\nprimevally\nprimi\npriming\nprimings\nprimipara\nprimiparae\nprimiparas\nprimiparity\nprimiparous\nprimitive\nprimitively\nprimitiveness\nprimitives\nprimitivism\nprimitivist\nprimitivistic\nprimitivists\nprimitivity\nprimly\nprimmed\nprimmer\nprimmest\nprimming\nprimness\nprimo\nprimogenital\nprimogenitary\nprimogenitor\nprimogenitors\nprimogeniture\nprimogenitures\nprimordia\nprimordial\nprimordially\nprimordials\nprimordium\nprimos\nprimp\nprimped\nprimping\nprimps\nprimrose\nprimroses\nprims\nprimula\nprimus\nprimuses\nprince\nprincedom\nprincedoms\nprincelet\nprincelets\nprincelier\nprinceliest\nprinceliness\nprinceling\nprincelings\nprincely\nprinces\nprinceship\nprinceships\nprincess\nprincesse\nprincesses\nprinceton\nprincipal\nprincipalities\nprincipality\nprincipally\nprincipals\nprincipalship\nprincipalships\nprincipe\nprincipia\nprincipium\nprinciple\nprincipled\nprinciples\nprincox\nprink\nprinked\nprinker\nprinkers\nprinking\nprinks\nprint\nprintability\nprintable\nprinted\nprinter\nprinter's\nprinteries\nprinters\nprintery\nprinthead\nprintheads\nprinting\nprintings\nprintless\nprintmaker\nprintmakers\nprintmaking\nprintout\nprintouts\nprints\nprion\nprions\nprior\npriorate\npriorates\nprioress\nprioresses\npriori\npriories\npriorities\nprioritization\nprioritizations\nprioritize\nprioritized\nprioritizes\nprioritizing\npriority\npriorly\npriors\npriorship\npriorships\npriory\npris\nprise\nprised\nprises\nprising\nprism\nprismatic\nprismatical\nprismatically\nprismatoid\nprismatoidal\nprismatoids\nprismoid\nprismoidal\nprismoids\nprisms\nprison\nprisoned\nprisoner\nprisoners\nprisoning\nprisons\nprissier\nprissiest\nprissily\nprissiness\nprissy\npristane\npristanes\npristine\npristinely\nprithee\nprivacy\nprivatdocent\nprivatdocents\nprivate\nprivateer\nprivateered\nprivateering\nprivateers\nprivately\nprivateness\nprivates\nprivation\nprivations\nprivatism\nprivatist\nprivatistic\nprivatists\nprivative\nprivatively\nprivatives\nprivatization\nprivatizations\nprivatize\nprivatized\nprivatizes\nprivatizing\nprivet\nprivets\nprivies\nprivilege\nprivileged\nprivileges\nprivileging\nprivily\nprivities\nprivity\nprivy\nprix\nprize\nprized\nprizefight\nprizefighter\nprizefighters\nprizefighting\nprizefights\nprizer\nprizers\nprizes\nprizewinner\nprizewinners\nprizewinning\nprizing\npro\nproa\nproabortion\nproaction\nproactions\nproactive\nproactively\nproas\nprobabilism\nprobabilist\nprobabilistic\nprobabilistically\nprobabilists\nprobabilities\nprobability\nprobable\nprobably\nproband\nprobands\nprobang\nprobangs\nprobate\nprobated\nprobates\nprobating\nprobation\nprobational\nprobationally\nprobationary\nprobationer\nprobationers\nprobations\nprobative\nprobatory\nprobe\nprobed\nprobenecid\nprobenecids\nprober\nprobers\nprobes\nprobing\nprobingly\nprobit\nprobits\nprobity\nproblem\nproblematic\nproblematical\nproblematically\nproblematization\nproblematize\nproblematized\nproblematizes\nproblematizing\nproblems\nproboscidean\nproboscideans\nproboscides\nproboscidian\nproboscidians\nproboscis\nproboscises\nprocaine\nprocaines\nprocambial\nprocambium\nprocambiums\nprocarbazine\nprocarbazines\nprocaryote\nprocaryotes\nprocathedral\nprocathedrals\nprocedural\nprocedurally\nprocedurals\nprocedure\nprocedures\nproceed\nproceeded\nproceeder\nproceeders\nproceeding\nproceedings\nproceeds\nprocephalic\nprocercoid\nprocercoids\nprocess\nprocessability\nprocessable\nprocessed\nprocesses\nprocessibility\nprocessible\nprocessing\nprocession\nprocessional\nprocessionally\nprocessionals\nprocessioned\nprocessioning\nprocessions\nprocessor\nprocessors\nproclaim\nproclaimed\nproclaimer\nproclaimers\nproclaiming\nproclaims\nproclamation\nproclamations\nproclamatory\nproclitic\nproclitics\nproclivities\nproclivity\nprocoagulant\nprocoagulants\nprocommunist\nprocommunists\nproconsul\nproconsular\nproconsulate\nproconsulates\nproconsuls\nproconsulship\nproconsulships\nprocrastinate\nprocrastinated\nprocrastinates\nprocrastinating\nprocrastination\nprocrastinations\nprocrastinative\nprocrastinator\nprocrastinators\nprocrastinatory\nprocreant\nprocreate\nprocreated\nprocreates\nprocreating\nprocreation\nprocreations\nprocreative\nprocreativity\nprocreator\nprocreators\nprocrustean\nprocryptic\nproctitis\nproctodaea\nproctodaeum\nproctodaeums\nproctodea\nproctodeum\nproctodeums\nproctologic\nproctological\nproctologically\nproctologist\nproctologists\nproctology\nproctor\nproctored\nproctorial\nproctoring\nproctors\nproctorship\nproctorships\nproctoscope\nproctoscopes\nproctoscopic\nproctoscopy\nprocumbent\nprocurable\nprocurance\nprocuration\nprocurations\nprocurator\nprocuratorial\nprocurators\nprocure\nprocured\nprocurement\nprocurements\nprocurer\nprocurers\nprocures\nprocuress\nprocuresses\nprocuring\nprocyon\nprocès\nprod\nprodded\nprodder\nprodders\nprodding\nprodigal\nprodigalities\nprodigality\nprodigally\nprodigals\nprodigies\nprodigious\nprodigiously\nprodigiousness\nprodigy\nprodromal\nprodromata\nprodrome\nprodromes\nprodromic\nprodrug\nprodrugs\nprods\nproduce\nproduceable\nproduced\nproducer\nproducers\nproduces\nproducible\nproducing\nproduct\nproduction\nproductional\nproductions\nproductive\nproductively\nproductiveness\nproductivity\nproducts\nproem\nproemial\nproems\nproenzyme\nproenzymes\nproestrus\nproestruses\nprof\nprofanation\nprofanations\nprofanatory\nprofane\nprofaned\nprofanely\nprofaneness\nprofaner\nprofaners\nprofanes\nprofaning\nprofanities\nprofanity\nprofess\nprofessed\nprofessedly\nprofesses\nprofessing\nprofession\nprofessional\nprofessionalism\nprofessionalization\nprofessionalizations\nprofessionalize\nprofessionalized\nprofessionalizes\nprofessionalizing\nprofessionally\nprofessionals\nprofessions\nprofessor\nprofessorate\nprofessorates\nprofessorial\nprofessorially\nprofessoriat\nprofessoriate\nprofessoriates\nprofessoriats\nprofessors\nprofessorship\nprofessorships\nproffer\nproffered\nprofferer\nprofferers\nproffering\nproffers\nproficiencies\nproficiency\nproficient\nproficiently\nproficients\nprofile\nprofiled\nprofiler\nprofilers\nprofiles\nprofiling\nprofit\nprofitability\nprofitable\nprofitableness\nprofitably\nprofited\nprofiteer\nprofiteered\nprofiteering\nprofiteers\nprofiterole\nprofiteroles\nprofiting\nprofitless\nprofits\nprofitwise\nprofligacy\nprofligate\nprofligately\nprofligates\nprofluent\nprofound\nprofounder\nprofoundest\nprofoundly\nprofoundness\nprofs\nprofundis\nprofundities\nprofundity\nprofundo\nprofundos\nprofuse\nprofusely\nprofuseness\nprofusion\nprogenies\nprogenitor\nprogenitors\nprogeny\nprogeria\nprogestational\nprogesterone\nprogestin\nprogestins\nprogestogen\nprogestogenic\nprogestogens\nproglottic\nproglottid\nproglottidean\nproglottides\nproglottids\nproglottis\nprognathic\nprognathism\nprognathous\nprognoses\nprognosis\nprognostic\nprognosticate\nprognosticated\nprognosticates\nprognosticating\nprognostication\nprognostications\nprognosticative\nprognosticator\nprognosticators\nprognosticatory\nprognostics\nprograde\nprogram\nprogramed\nprogramer\nprogramers\nprograming\nprogrammability\nprogrammable\nprogrammatic\nprogrammatically\nprogrammed\nprogrammer\nprogrammers\nprogramming\nprograms\nprogress\nprogressed\nprogresses\nprogressing\nprogression\nprogressional\nprogressions\nprogressive\nprogressively\nprogressiveness\nprogressives\nprogressivism\nprogressivist\nprogressivistic\nprogressivists\nprogressivities\nprogressivity\nprohibit\nprohibited\nprohibiting\nprohibition\nprohibitionism\nprohibitionist\nprohibitionists\nprohibitions\nprohibitive\nprohibitively\nprohibitiveness\nprohibitory\nprohibits\nproinsulin\nproinsulins\nproject\nprojectable\nprojected\nprojectile\nprojectiles\nprojecting\nprojection\nprojectional\nprojectionist\nprojectionists\nprojections\nprojective\nprojectively\nprojector\nprojectors\nprojects\nprojet\nprojets\nprokaryote\nprokaryotes\nprokaryotic\nprokofiev\nprolactin\nprolactins\nprolamin\nprolamine\nprolamines\nprolamins\nprolan\nprolans\nprolapse\nprolapsed\nprolapses\nprolapsing\nprolapsus\nprolate\nprolately\nprolateness\nprole\nproleg\nprolegomena\nprolegomenon\nprolegomenous\nprolegs\nprolepses\nprolepsis\nproleptic\nproleptical\nproleptically\nproles\nproletarian\nproletarianism\nproletarianization\nproletarianizations\nproletarianize\nproletarianized\nproletarianizes\nproletarianizing\nproletarians\nproletariat\nproletariats\nproliferate\nproliferated\nproliferates\nproliferating\nproliferation\nproliferations\nproliferative\nproliferator\nproliferators\nproliferous\nproliferously\nprolific\nprolificacy\nprolifically\nprolificity\nprolificness\nproline\nprolines\nprolix\nprolixity\nprolixly\nprolocutor\nprolocutors\nprolog\nprologize\nprologized\nprologizes\nprologizing\nprologs\nprologue\nprologues\nprologuize\nprologuized\nprologuizes\nprologuizing\nprolong\nprolongate\nprolongated\nprolongates\nprolongating\nprolongation\nprolongations\nprolonged\nprolonger\nprolongers\nprolonging\nprolongs\nprolusion\nprolusions\nprolusory\nprom\npromenade\npromenaded\npromenader\npromenaders\npromenades\npromenading\npromethean\nprometheans\nprometheus\npromethium\nprominence\nprominences\nprominency\nprominent\nprominently\npromiscuities\npromiscuity\npromiscuous\npromiscuously\npromiscuousness\npromise\npromised\npromisee\npromisees\npromiser\npromisers\npromises\npromising\npromisingly\npromisor\npromisors\npromissory\npromo\npromontories\npromontory\npromos\npromotability\npromotable\npromote\npromoted\npromoter\npromoters\npromotes\npromoting\npromotion\npromotional\npromotionally\npromotions\npromotive\npromotiveness\nprompt\npromptbook\npromptbooks\nprompted\nprompter\nprompters\npromptest\nprompting\npromptitude\npromptly\npromptness\nprompts\nproms\npromulgate\npromulgated\npromulgates\npromulgating\npromulgation\npromulgations\npromulgator\npromulgators\npronatalism\npronatalist\npronatalistic\npronatalists\npronate\npronated\npronates\npronating\npronation\npronations\npronator\npronators\nprone\npronely\nproneness\npronephra\npronephric\npronephroi\npronephros\nprong\npronged\npronghorn\npronghorns\npronging\nprongs\npronograde\npronominal\npronominally\npronoun\npronounce\npronounceability\npronounceable\npronounced\npronouncedly\npronouncedness\npronouncement\npronouncements\npronouncer\npronouncers\npronounces\npronouncing\npronouns\npronto\nprontosil\npronuclear\npronuclei\npronucleus\npronunciamento\npronunciamentoes\npronunciamentos\npronunciation\npronunciational\npronunciations\nproof\nproofed\nproofer\nproofers\nproofing\nproofread\nproofreader\nproofreaders\nproofreading\nproofreads\nproofroom\nproofrooms\nproofs\nprop\npropaedeutic\npropaedeutics\npropagable\npropaganda\npropagandism\npropagandist\npropagandistic\npropagandistically\npropagandists\npropagandize\npropagandized\npropagandizer\npropagandizers\npropagandizes\npropagandizing\npropagate\npropagated\npropagates\npropagating\npropagation\npropagational\npropagations\npropagative\npropagator\npropagators\npropagule\npropagules\npropane\npropanoate\npropanoic\npropanol\npropel\npropellant\npropellants\npropelled\npropellent\npropellents\npropeller\npropellers\npropelling\npropellor\npropellors\npropels\npropend\npropended\npropending\npropends\npropene\npropenes\npropense\npropensities\npropensity\nproper\nproperdin\nproperdins\nproperly\nproperness\npropertied\nproperties\npropertius\nproperty\npropertyless\npropertylessness\nprophage\nprophages\nprophase\nprophases\nprophasic\nprophecies\nprophecy\nprophesied\nprophesier\nprophesiers\nprophesies\nprophesy\nprophesying\nprophet\nprophetess\nprophetesses\nprophethood\nprophetic\nprophetical\nprophetically\npropheticalness\nprophets\nprophylactic\nprophylactically\nprophylactics\nprophylaxes\nprophylaxis\npropinquity\npropionaldehyde\npropionaldehydes\npropionate\npropionates\npropionic\npropitiable\npropitiate\npropitiated\npropitiates\npropitiating\npropitiatingly\npropitiation\npropitiations\npropitiative\npropitiator\npropitiatorily\npropitiators\npropitiatory\npropitious\npropitiously\npropitiousness\npropjet\npropjets\nproplastid\nproplastids\npropman\npropmen\npropolis\npropolises\npropone\nproponed\nproponent\nproponents\npropones\nproponing\nproportion\nproportionable\nproportionably\nproportional\nproportionality\nproportionally\nproportionals\nproportionate\nproportionated\nproportionately\nproportionateness\nproportionates\nproportionating\nproportioned\nproportioner\nproportioners\nproportioning\nproportionment\nproportionments\nproportions\nproposal\nproposals\npropose\nproposed\nproposer\nproposers\nproposes\nproposing\npropositi\nproposition\npropositional\npropositionally\npropositioned\npropositioning\npropositions\npropositus\npropound\npropounded\npropounder\npropounders\npropounding\npropounds\npropoxyphene\npropoxyphenes\npropped\npropping\npropraetor\npropraetorial\npropraetorian\npropraetors\npropranolol\npropranolols\npropre\npropretor\npropretors\npropria\npropriae\nproprietaries\nproprietarily\nproprietary\nproprieties\nproprietor\nproprietorial\nproprietorially\nproprietors\nproprietorship\nproprietorships\nproprietress\nproprietresses\npropriety\nproprioception\nproprioceptions\nproprioceptive\nproprioceptor\nproprioceptors\nprops\nproptoses\nproptosis\npropulsion\npropulsions\npropulsive\npropulsory\npropyl\npropyla\npropylaea\npropylaeum\npropylene\npropylic\npropylon\npropyls\nproratable\nprorate\nprorated\nprorates\nprorating\nproration\nprorations\nprorogate\nprorogated\nprorogates\nprorogating\nprorogation\nprorogations\nprorogue\nprorogued\nprorogues\nproroguing\npros\nprosaic\nprosaically\nprosaicness\nprosaism\nprosaisms\nprosaist\nprosaists\nprosateur\nprosateurs\nprosauropod\nprosauropods\nproscenia\nproscenium\nprosceniums\nprosciutti\nprosciutto\nprosciuttos\nproscribe\nproscribed\nproscriber\nproscribers\nproscribes\nproscribing\nproscription\nproscriptions\nproscriptive\nproscriptively\nprose\nprosector\nprosectors\nprosecutable\nprosecute\nprosecuted\nprosecutes\nprosecuting\nprosecution\nprosecutions\nprosecutor\nprosecutorial\nprosecutors\nprosed\nproselyte\nproselyted\nproselyter\nproselyters\nproselytes\nproselytical\nproselyting\nproselytism\nproselytisms\nproselytization\nproselytizations\nproselytize\nproselytized\nproselytizer\nproselytizers\nproselytizes\nproselytizing\nproseminar\nproseminars\nprosencephalic\nprosencephalon\nprosencephalons\nprosenchyma\nprosenchymas\nprosenchymatous\nprosequi\nprosequitur\nproser\nproserpine\nprosers\nproses\nprosier\nprosiest\nprosily\nprosimian\nprosimians\nprosiness\nprosing\nprosit\nproslavery\nproso\nprosobranch\nprosobranchs\nprosodic\nprosodical\nprosodically\nprosodies\nprosodist\nprosodists\nprosody\nprosoma\nprosomal\nprosomas\nprosopographical\nprosopography\nprosopopeia\nprosopopeial\nprosopopeias\nprosopopoeia\nprosopopoeias\nprospect\nprospected\nprospecting\nprospective\nprospectively\nprospector\nprospectors\nprospects\nprospectus\nprospectuses\nprosper\nprospered\nprospering\nprosperity\nprosperous\nprosperously\nprosperousness\nprospers\nprost\nprostacyclin\nprostacyclins\nprostaglandin\nprostaglandins\nprostate\nprostatectomies\nprostatectomy\nprostates\nprostatic\nprostatism\nprostatisms\nprostatitis\nprostheses\nprosthesis\nprosthetic\nprosthetically\nprosthetics\nprosthetist\nprosthetists\nprosthodontia\nprosthodontic\nprosthodontics\nprosthodontist\nprosthodontists\nprostitute\nprostituted\nprostitutes\nprostituting\nprostitution\nprostitutions\nprostitutor\nprostitutors\nprostomia\nprostomial\nprostomium\nprostrate\nprostrated\nprostrates\nprostrating\nprostration\nprostrations\nprostrator\nprostrators\nprostyle\nprosy\nprotactinium\nprotagonist\nprotagonists\nprotamin\nprotamine\nprotamines\nprotamins\nprotandrous\nprotandry\nprotanopia\nprotanopias\nprotanopic\nprotases\nprotasis\nprotatic\nprotea\nprotean\nproteas\nprotease\nproteases\nprotect\nprotectant\nprotectants\nprotected\nprotecter\nprotecters\nprotecting\nprotectingly\nprotection\nprotectional\nprotectionism\nprotectionist\nprotectionists\nprotections\nprotective\nprotectively\nprotectiveness\nprotectives\nprotector\nprotectoral\nprotectorate\nprotectorates\nprotectories\nprotectors\nprotectorship\nprotectorships\nprotectory\nprotectress\nprotectresses\nprotects\nprotei\nproteid\nproteids\nprotein\nproteinaceous\nproteinase\nproteinases\nproteinic\nproteinoid\nproteinoids\nproteins\nproteinuria\nproteinurias\nprotend\nprotended\nprotending\nprotends\nprotensive\nprotensively\nproteoclastic\nproteoglycan\nproteoglycans\nproteolyses\nproteolysis\nproteolytic\nproteolytically\nproteose\nproteoses\nproteron\nproterozoic\nprotest\nprotestant\nprotestantism\nprotestants\nprotestation\nprotestations\nprotested\nprotester\nprotesters\nprotesting\nprotestingly\nprotestor\nprotestors\nprotests\nproteus\nprothalamia\nprothalamion\nprothalamium\nprothalli\nprothallia\nprothallial\nprothallium\nprothallus\nprotheses\nprothesis\nprothetic\nprothetically\nprothonotarial\nprothonotaries\nprothonotary\nprothoraces\nprothoracic\nprothorax\nprothoraxes\nprothrombin\nprothrombins\nprotist\nprotista\nprotistan\nprotistans\nprotistology\nprotists\nprotium\nprotiums\nprotocol\nprotocolar\nprotocolary\nprotocoled\nprotocoling\nprotocolled\nprotocolling\nprotocols\nprotocontinent\nprotocontinents\nprotoctist\nprotoctists\nprotoderm\nprotodermal\nprotoderms\nprotogalaxies\nprotogalaxy\nprotogynous\nprotogyny\nprotohistorian\nprotohistorians\nprotohistoric\nprotohistory\nprotohuman\nprotohumans\nprotolanguage\nprotolanguages\nprotolithic\nprotomartyr\nprotomartyrs\nprotomorph\nprotomorphic\nprotomorphs\nproton\nprotonate\nprotonated\nprotonates\nprotonating\nprotonation\nprotonations\nprotonema\nprotonemal\nprotonemata\nprotonematal\nprotonic\nprotonotaries\nprotonotary\nprotons\nprotopathic\nprotopathy\nprotophloem\nprotophloems\nprotoplanet\nprotoplanetary\nprotoplanets\nprotoplasm\nprotoplasmal\nprotoplasmatic\nprotoplasmic\nprotoplast\nprotoplastic\nprotoplasts\nprotoporphyrin\nprotoporphyrins\nprotostar\nprotostars\nprotostele\nprotosteles\nprotostelic\nprotostome\nprotostomes\nprototroph\nprototrophic\nprototrophs\nprototrophy\nprototypal\nprototype\nprototyped\nprototypes\nprototypic\nprototypical\nprototypically\nprototyping\nprotoxylem\nprotoxylems\nprotozoa\nprotozoal\nprotozoan\nprotozoans\nprotozoic\nprotozoological\nprotozoologist\nprotozoologists\nprotozoology\nprotozoon\nprotract\nprotracted\nprotractedly\nprotractedness\nprotractible\nprotractile\nprotractility\nprotracting\nprotraction\nprotractions\nprotractive\nprotractor\nprotractors\nprotracts\nprotreptic\nprotreptics\nprotrude\nprotruded\nprotrudent\nprotrudes\nprotruding\nprotrusible\nprotrusile\nprotrusility\nprotrusion\nprotrusions\nprotrusive\nprotrusively\nprotrusiveness\nprotuberance\nprotuberances\nprotuberancies\nprotuberancy\nprotuberant\nprotuberantly\nprotuberate\nprotuberated\nprotuberates\nprotuberating\nprotuberation\nprotuberations\nprotégé\nprotégée\nprotégées\nprotégés\nproud\nprouder\nproudest\nproudful\nproudhearted\nproudly\nproudness\nproust\nproustian\nproustite\nproustites\nprovability\nprovable\nprovableness\nprovably\nprovascular\nprove\nproved\nproven\nprovenance\nprovenances\nprovence\nprovender\nprovenience\nproveniences\nprovenly\nproventricular\nproventriculi\nproventriculus\nprovençal\nprovençale\nprovençals\nprovençaux\nprover\nproverb\nproverbial\nproverbially\nproverbs\nprovers\nproves\nprovide\nprovided\nprovidence\nprovident\nprovidential\nprovidentially\nprovidently\nprovider\nproviders\nprovides\nproviding\nprovince\nprovinces\nprovincial\nprovincialism\nprovincialist\nprovincialists\nprovinciality\nprovincialization\nprovincializations\nprovincialize\nprovincialized\nprovincializes\nprovincializing\nprovincially\nprovincials\nproving\nproviral\nprovirus\nproviruses\nprovision\nprovisional\nprovisionally\nprovisionals\nprovisionary\nprovisioned\nprovisioner\nprovisioners\nprovisioning\nprovisions\nproviso\nprovisoes\nprovisorily\nprovisory\nprovisos\nprovitamin\nprovitamins\nprovo\nprovocateur\nprovocateurs\nprovocation\nprovocations\nprovocative\nprovocatively\nprovocativeness\nprovocatives\nprovoke\nprovoked\nprovoker\nprovokers\nprovokes\nprovoking\nprovokingly\nprovolone\nprovos\nprovost\nprovosts\nprow\nprowess\nprowl\nprowled\nprowler\nprowlers\nprowling\nprowls\nprows\nproxemic\nproxemics\nproxies\nproximal\nproximally\nproximate\nproximately\nproximateness\nproximity\nproximo\nproxy\nprude\nprudence\nprudent\nprudential\nprudentially\nprudently\npruderies\nprudery\nprudes\nprudish\nprudishly\nprudishness\npruinose\nprune\npruned\nprunella\nprunellas\nprunelle\nprunelles\nprunello\nprunellos\npruner\npruners\nprunes\npruning\nprunus\nprurience\npruriency\nprurient\npruriently\npruriginous\nprurigo\nprurigos\npruritic\npruritus\nprurituses\nprussia\nprussian\nprussianism\nprussianization\nprussianizations\nprussianize\nprussianized\nprussianizes\nprussianizing\nprussians\nprussiate\nprussiates\nprussic\npruta\nprutah\nprutot\nprutoth\npry\npryer\npryers\nprying\npryingly\nprzewalski\nprécis\nprécised\nprécises\nprécising\npríncipe\nps\npsalm\npsalmbook\npsalmbooks\npsalmed\npsalming\npsalmist\npsalmists\npsalmodies\npsalmodist\npsalmodists\npsalmody\npsalms\npsalter\npsalteria\npsalterial\npsalteries\npsalterium\npsalters\npsaltery\npsaltries\npsaltry\npsephological\npsephologist\npsephologists\npsephology\npseudaxis\npseudaxises\npseudepigraph\npseudepigrapha\npseudepigraphal\npseudepigraphic\npseudepigraphical\npseudepigraphon\npseudepigraphous\npseudepigraphs\npseudepigraphy\npseudo\npseudoallele\npseudoalleles\npseudobulb\npseudobulbs\npseudocarp\npseudocarpous\npseudocarps\npseudocholinesterase\npseudocholinesterases\npseudoclassic\npseudoclassicism\npseudoclassics\npseudocoel\npseudocoelom\npseudocoelomate\npseudocoelomates\npseudocoeloms\npseudocoels\npseudocyesis\npseudogene\npseudogenes\npseudohermaphrodite\npseudohermaphrodites\npseudohermaphroditic\npseudohermaphroditism\npseudomonad\npseudomonades\npseudomonads\npseudomonas\npseudomorph\npseudomorphic\npseudomorphism\npseudomorphous\npseudomorphs\npseudonym\npseudonymity\npseudonymous\npseudonymously\npseudonymousness\npseudonyms\npseudoparenchyma\npseudoparenchymatous\npseudopod\npseudopodal\npseudopodia\npseudopodial\npseudopodium\npseudopods\npseudopregnancies\npseudopregnancy\npseudopregnant\npseudorandom\npseudoscience\npseudoscientific\npseudoscientist\npseudoscientists\npseudoscorpion\npseudoscorpions\npseudosophisticated\npseudosophistication\npseudotuberculosis\npshaw\npsi\npsilocin\npsilocins\npsilocybin\npsilomelane\npsilomelanes\npsilophyte\npsilophytes\npsilophytic\npsittacine\npsittacoses\npsittacosis\npsittacotic\npsoas\npsoases\npsocid\npsocids\npsoralen\npsoralens\npsoriases\npsoriasis\npsoriatic\npsych\npsychasthenia\npsychasthenias\npsychasthenic\npsyche\npsyched\npsychedelia\npsychedelias\npsychedelic\npsychedelically\npsychedelics\npsyches\npsychiatric\npsychiatrical\npsychiatrically\npsychiatrist\npsychiatrists\npsychiatry\npsychic\npsychical\npsychically\npsychics\npsyching\npsycho\npsychoacoustic\npsychoacoustical\npsychoacoustics\npsychoactive\npsychoanalyses\npsychoanalysis\npsychoanalyst\npsychoanalysts\npsychoanalytic\npsychoanalytical\npsychoanalytically\npsychoanalyze\npsychoanalyzed\npsychoanalyzes\npsychoanalyzing\npsychobabble\npsychobabbler\npsychobabblers\npsychobabbles\npsychobiographer\npsychobiographers\npsychobiographic\npsychobiographical\npsychobiographies\npsychobiography\npsychobiologic\npsychobiological\npsychobiologically\npsychobiologist\npsychobiologists\npsychobiology\npsychochemical\npsychochemicals\npsychodrama\npsychodramas\npsychodramatic\npsychodynamic\npsychodynamically\npsychodynamics\npsychogenesis\npsychogenetic\npsychogenetically\npsychogenic\npsychogenically\npsychograph\npsychographic\npsychographics\npsychographs\npsychohistorian\npsychohistorians\npsychohistorical\npsychohistories\npsychohistory\npsychokineses\npsychokinesis\npsychokinetic\npsychokinetically\npsycholinguist\npsycholinguistic\npsycholinguistics\npsycholinguists\npsychologic\npsychological\npsychologically\npsychologies\npsychologism\npsychologist\npsychologists\npsychologize\npsychologized\npsychologizes\npsychologizing\npsychology\npsychometric\npsychometrical\npsychometrically\npsychometrician\npsychometricians\npsychometrics\npsychometrist\npsychometrists\npsychometry\npsychomotor\npsychoneuroses\npsychoneurosis\npsychoneurotic\npsychoneurotics\npsychopath\npsychopathic\npsychopathically\npsychopathologic\npsychopathological\npsychopathologically\npsychopathologist\npsychopathologists\npsychopathology\npsychopaths\npsychopathy\npsychopharmacologic\npsychopharmacological\npsychopharmacologist\npsychopharmacologists\npsychopharmacology\npsychophysical\npsychophysically\npsychophysicist\npsychophysicists\npsychophysics\npsychophysiologic\npsychophysiological\npsychophysiologically\npsychophysiologist\npsychophysiologists\npsychophysiology\npsychos\npsychoses\npsychosexual\npsychosexuality\npsychosexually\npsychosis\npsychosocial\npsychosocially\npsychosomatic\npsychosomatically\npsychosomatics\npsychosurgeon\npsychosurgeons\npsychosurgeries\npsychosurgery\npsychosurgical\npsychosynthesis\npsychotechnical\npsychotechnician\npsychotechnicians\npsychotechnics\npsychotherapeutic\npsychotherapeutically\npsychotherapeutics\npsychotherapies\npsychotherapist\npsychotherapists\npsychotherapy\npsychotic\npsychotically\npsychotics\npsychotomimetic\npsychotomimetically\npsychotomimetics\npsychotropic\npsychotropics\npsychrometer\npsychrometers\npsychrometric\npsychrometry\npsychrophile\npsychrophiles\npsychrophilic\npsylla\npsyllas\npsyllid\npsyllids\npsyllium\npsylliums\npsywar\npsywars\npt\npta\nptarmigan\nptarmigans\nptas\npteranodon\npteranodons\npteridine\npteridines\npteridological\npteridologist\npteridologists\npteridology\npteridophyte\npteridophytes\npteridophytic\npteridophytous\npteridosperm\npteridosperms\npterin\npterins\npterodactyl\npterodactyloid\npterodactylous\npterodactyls\npteropod\npteropodan\npteropodans\npteropods\npterosaur\npterosaurs\npteroylglutamic\npterygia\npterygial\npterygium\npterygiums\npterygoid\npterygoids\npteryla\npterylae\nptisan\nptisans\nptolemaic\nptolemaist\nptolemaists\nptolemies\nptolemy\nptomaine\nptoses\nptosis\nptotic\nptyalin\nptyalism\nptyalisms\npub\npuberal\npubertal\npuberty\npuberulent\npuberulous\npubes\npubescence\npubescent\npubic\npubis\npublic\npublica\npublically\npublican\npublicans\npublication\npublications\npublicist\npublicists\npublicity\npublicize\npublicized\npublicizes\npublicizing\npublicly\npublicness\npublico\npublics\npublish\npublishable\npublished\npublisher\npublishers\npublishes\npublishing\npubs\npuccini\npuccoon\npuccoons\npuce\npuck\npucka\npucker\npuckered\npuckering\npuckers\npuckery\npuckish\npuckishly\npuckishness\npucks\npudding\npuddings\npuddingstone\npuddingstones\npuddle\npuddled\npuddler\npuddlers\npuddles\npuddling\npuddlings\npuddly\npudency\npudenda\npudendal\npudendum\npudgier\npudgiest\npudginess\npudgy\npudibund\npueblo\npueblos\npuerile\npuerilely\npuerileness\npuerilism\npuerilisms\npuerilities\npuerility\npuerperal\npuerperia\npuerperium\npuerto\npuff\npuffball\npuffballs\npuffed\npuffer\npuffers\npuffery\npuffier\npuffiest\npuffily\npuffin\npuffiness\npuffing\npuffins\npuffs\npuffy\npug\npugaree\npugarees\npuget\npuggaree\npuggarees\npugged\npugging\npuggree\npuggrees\npugil\npugilism\npugilist\npugilistic\npugilists\npugmark\npugmarks\npugnacious\npugnaciously\npugnaciousness\npugnacity\npugs\npuisne\npuisnes\npuissance\npuissant\npuissantly\npuke\npuked\npukes\npuking\npukka\npul\npula\npulas\npulaski\npulchritude\npulchritudinous\npule\npuled\npuler\npulers\npules\npuli\npulik\npuling\npulis\npulitzer\npull\npullback\npullbacks\npulled\npuller\npullers\npullet\npullets\npulley\npulleys\npulling\npullman\npullmans\npullorum\npullout\npullouts\npullover\npullovers\npulls\npullulate\npullulated\npullulates\npullulating\npullulation\npullulations\npullulative\npulmonale\npulmonalia\npulmonary\npulmonate\npulmonates\npulmonic\npulmotor\npulmotors\npulp\npulpal\npulpally\npulped\npulper\npulpers\npulpier\npulpiest\npulpiness\npulping\npulpit\npulpits\npulpous\npulps\npulpwood\npulpy\npulque\npulques\npuls\npulsant\npulsar\npulsars\npulsate\npulsated\npulsates\npulsatile\npulsating\npulsation\npulsations\npulsator\npulsators\npulsatory\npulse\npulsed\npulsejet\npulsejets\npulser\npulsers\npulses\npulsing\npulsometer\npulsometers\npulverable\npulverizable\npulverization\npulverizations\npulverizator\npulverizators\npulverize\npulverized\npulverizer\npulverizers\npulverizes\npulverizing\npulverous\npulverulent\npulvilli\npulvillus\npulvinate\npulvinated\npulvini\npulvinus\npuma\npumas\npumelo\npumelos\npumice\npumiced\npumiceous\npumicer\npumicers\npumices\npumicing\npumicite\npumicites\npummel\npummeled\npummeling\npummelled\npummelling\npummelo\npummelos\npummels\npump\npumped\npumper\npumpernickel\npumpernickels\npumpers\npumping\npumpkin\npumpkins\npumpkinseed\npumpkinseeds\npumps\npun\npuna\npunch\npunchball\npunchboard\npunchboards\npunchbowl\npunchbowls\npunched\npuncheon\npuncheons\npuncher\npunchers\npunches\npunchier\npunchiest\npunchily\npunchinello\npunchinelloes\npunchinellos\npunchiness\npunching\npunchless\npunchy\npunctate\npunctated\npunctation\npunctations\npunctilio\npunctilios\npunctilious\npunctiliously\npunctiliousness\npunctual\npunctuality\npunctually\npunctualness\npunctuate\npunctuated\npunctuates\npunctuating\npunctuation\npunctuations\npunctuative\npunctuator\npunctuators\npuncturable\npuncture\npunctured\npunctures\npuncturing\npundit\npunditry\npundits\npung\npungency\npungent\npungently\npungle\npungled\npungles\npungling\npungs\npunic\npunier\npuniest\npunily\npuniness\npunish\npunishability\npunishable\npunishably\npunished\npunisher\npunishers\npunishes\npunishing\npunishment\npunishments\npunition\npunitions\npunitive\npunitively\npunitiveness\npunitory\npunjab\npunjabi\npunjabis\npunji\npunk\npunka\npunkah\npunkahs\npunkas\npunker\npunkers\npunkie\npunkier\npunkies\npunkiest\npunkin\npunkiness\npunkins\npunkish\npunks\npunky\npunned\npunnet\npunnets\npunnier\npunniest\npunning\npunningly\npunny\npuns\npunster\npunsters\npunt\npunted\npunter\npunters\npunties\npunting\npunts\npunty\npunxsutawney\npuny\npup\npupa\npupae\npupal\npuparia\npuparium\npupas\npupate\npupated\npupates\npupating\npupation\npupations\npupfish\npupfishes\npupil\npupilage\npupilages\npupilar\npupillage\npupillages\npupillary\npupils\npupiparous\npupped\npuppet\npuppeteer\npuppeteers\npuppetlike\npuppetries\npuppetry\npuppets\npuppies\npupping\npuppis\npuppy\npuppyhood\npuppyish\npuppylike\npups\npurana\npuranas\npuranic\npurblind\npurblindly\npurblindness\npurcell\npurchasability\npurchasable\npurchase\npurchased\npurchaser\npurchasers\npurchases\npurchasing\npurdah\npurdahs\npure\npureblood\npureblooded\npurebloods\npurebred\npurebreds\npuree\npureed\npureeing\npurees\npurely\npureness\npurer\npurest\npurfle\npurfled\npurfles\npurfling\npurgation\npurgations\npurgative\npurgatives\npurgatorial\npurgatories\npurgatory\npurge\npurgeable\npurged\npurger\npurgers\npurges\npurging\npuri\npurification\npurifications\npurificator\npurificators\npurificatory\npurified\npurifier\npurifiers\npurifies\npurify\npurifying\npurim\npurine\npurines\npuris\npurism\npurisms\npurist\npuristic\npuristically\npurists\npuritan\npuritanical\npuritanically\npuritanicalness\npuritanism\npuritans\npurity\npurkinje\npurl\npurled\npurlieu\npurlieus\npurlin\npurline\npurlines\npurling\npurlins\npurloin\npurloined\npurloiner\npurloiners\npurloining\npurloins\npurls\npuromycin\npuromycins\npurple\npurpled\npurpleheart\npurplehearts\npurpler\npurples\npurplest\npurpling\npurplish\npurply\npurport\npurported\npurportedly\npurporting\npurports\npurpose\npurposed\npurposeful\npurposefully\npurposefulness\npurposeless\npurposelessly\npurposelessness\npurposely\npurposes\npurposing\npurposive\npurposively\npurposiveness\npurpura\npurpuras\npurpure\npurpures\npurpuric\npurpurin\npurpurins\npurr\npurred\npurring\npurringly\npurrs\npurse\npursed\npurselike\npurser\npursers\npurses\npursestrings\npursier\npursiest\npursiness\npursing\npurslane\npursuable\npursuance\npursuant\npursue\npursued\npursuer\npursuers\npursues\npursuing\npursuit\npursuits\npursuivant\npursuivants\npursy\npurtenance\npurtenances\npurty\npurulence\npurulent\npurulently\npurvey\npurveyance\npurveyed\npurveying\npurveyor\npurveyors\npurveys\npurview\npurviews\npurée\npuréed\npuréeing\npurées\npuréing\npus\npusey\npuseyism\npuseyite\npuseyites\npush\npushback\npushbacks\npushball\npushballs\npushbutton\npushbuttons\npushcart\npushcarts\npushchair\npushchairs\npushdown\npushdowns\npushed\npusher\npushers\npushes\npushful\npushfulness\npushier\npushiest\npushily\npushiness\npushing\npushingly\npushkin\npushover\npushovers\npushpin\npushpins\npushrod\npushrods\npushtu\npushtun\npushtuns\npushup\npushups\npushy\npusillanimity\npusillanimous\npusillanimously\npuss\npusses\npussier\npussies\npussiest\npussley\npussy\npussycat\npussycats\npussyfoot\npussyfooted\npussyfooter\npussyfooters\npussyfooting\npussyfoots\npussytoes\npustulant\npustulants\npustular\npustulate\npustulated\npustulates\npustulating\npustulation\npustulations\npustule\npustules\nput\nputamen\nputamina\nputaminous\nputative\nputatively\nputdown\nputdownable\nputdowns\nputlog\nputlogs\nputnam\nputoff\nputoffs\nputonghua\nputout\nputouts\nputrefacient\nputrefaction\nputrefactive\nputrefied\nputrefies\nputrefy\nputrefying\nputrescence\nputrescent\nputrescible\nputrescine\nputrescines\nputrid\nputridity\nputridly\nputridness\nputs\nputsch\nputsches\nputschist\nputschists\nputt\nputted\nputtee\nputtees\nputter\nputtered\nputterer\nputterers\nputtering\nputters\nputti\nputtied\nputties\nputting\nputtingly\nputto\nputtrefied\nputtrefies\nputtrefying\nputts\nputty\nputtying\nputtyless\nputtylike\nputtyroot\nputtyroots\nputz\nputzed\nputzes\nputzing\npuzzle\npuzzled\npuzzleheaded\npuzzleheadedness\npuzzlement\npuzzler\npuzzlers\npuzzles\npuzzling\npuzzlingly\npvc\npycnidia\npycnidial\npycnidium\npycnogonid\npycnogonids\npycnometer\npycnometers\npyelitic\npyelitis\npyelitises\npyelogram\npyelograms\npyelographic\npyelography\npyelonephritic\npyelonephritis\npyelonephritises\npyemia\npyemic\npygidia\npygidial\npygidium\npygmaean\npygmalion\npygmean\npygmies\npygmoid\npygmy\npyknic\npyknics\npylon\npylons\npylori\npyloric\npylorus\npylos\npyoderma\npyodermas\npyodermic\npyogenesis\npyogenic\npyoid\npyongyang\npyorrhea\npyorrheal\npyorrheas\npyorrhoea\npyorrhoeas\npyosis\npyracantha\npyracanthas\npyralid\npyralidid\npyralidids\npyralids\npyramid\npyramidal\npyramidally\npyramided\npyramidic\npyramidical\npyramiding\npyramids\npyramus\npyran\npyrans\npyrargyrite\npyrargyrites\npyre\npyrene\npyrenean\npyrenees\npyrenes\npyrenoid\npyrenoids\npyres\npyrethrin\npyrethrins\npyrethroid\npyrethroids\npyrethrum\npyrethrums\npyretic\npyrex\npyrexia\npyrexial\npyrexias\npyrexic\npyrheliometer\npyrheliometers\npyrheliometric\npyric\npyridic\npyridine\npyridines\npyridoxal\npyridoxals\npyridoxamine\npyridoxamines\npyridoxin\npyridoxine\npyridoxines\npyridoxins\npyriform\npyrimethamine\npyrimethamines\npyrimidine\npyrimidines\npyrite\npyrites\npyritic\npyritical\npyrocellulose\npyrocelluloses\npyrochemical\npyrochemically\npyroclastic\npyroelectric\npyroelectricity\npyroelectrics\npyrogallic\npyrogallol\npyrogallols\npyrogen\npyrogenic\npyrogenicity\npyrogenous\npyrogens\npyrograph\npyrographer\npyrographers\npyrographic\npyrographies\npyrographs\npyrography\npyroligneous\npyrolusite\npyrolusites\npyrolysis\npyrolytic\npyrolytically\npyrolyze\npyrolyzed\npyrolyzes\npyrolyzing\npyromancy\npyromania\npyromaniac\npyromaniacal\npyromaniacs\npyromantic\npyrometallurgical\npyrometallurgies\npyrometallurgy\npyrometer\npyrometers\npyrometric\npyrometrical\npyrometrically\npyrometry\npyromorphite\npyromorphites\npyronine\npyronines\npyrope\npyropes\npyrophoric\npyrophosphate\npyrophosphates\npyrophosphatic\npyrophosphoric\npyrophyllite\npyrophyllites\npyrosis\npyrostat\npyrostats\npyrosulfate\npyrosulfates\npyrosulfuric\npyrotechnic\npyrotechnical\npyrotechnically\npyrotechnics\npyrotechnist\npyrotechnists\npyrotechny\npyroxene\npyroxenes\npyroxenic\npyroxenite\npyroxenites\npyroxenitic\npyroxenoid\npyroxenoids\npyroxylin\npyroxyline\npyroxylines\npyroxylins\npyrrhic\npyrrhics\npyrrhonism\npyrrhonist\npyrrhonists\npyrrhotine\npyrrhotines\npyrrhotite\npyrrhotites\npyrrhuloxia\npyrrhuloxias\npyrrhus\npyrrole\npyrroles\npyrrolic\npyruvate\npyruvates\npyruvic\npythagoras\npythagorean\npythagoreanism\npythagoreans\npythiad\npythiads\npythian\npythias\npythic\npython\npythoness\npythonesses\npythonic\npythons\npyuria\npyurias\npyx\npyxes\npyxides\npyxidia\npyxidium\npyxie\npyxies\npyxis\npáros\npátmos\npâte\npâté\npâtés\npépin\npérigord\npétanque\npère\nq\nqantas\nqatar\nqatari\nqataris\nqattara\nqed\nqilian\nqindarka\nqindarkas\nqindars\nqinghai\nqintar\nqintars\nqiviut\nqiviuts\nqoph\nqophs\nqt\nqty\nqua\nquaalude\nquaaludes\nquack\nquacked\nquackery\nquacking\nquackish\nquackishly\nquacks\nquacksalver\nquacksalvers\nquacky\nquad\nquadded\nquadding\nquadragenarian\nquadragesima\nquadragesimal\nquadrangle\nquadrangles\nquadrangular\nquadrangularly\nquadrangularness\nquadrant\nquadrantal\nquadrantid\nquadrants\nquadraphonic\nquadraphonically\nquadraphonics\nquadraphony\nquadrasonic\nquadrat\nquadrate\nquadrated\nquadrates\nquadratic\nquadratically\nquadratics\nquadrating\nquadrats\nquadrature\nquadratures\nquadrennia\nquadrennial\nquadrennially\nquadrennials\nquadrennium\nquadrenniums\nquadric\nquadricentennial\nquadricentennials\nquadriceps\nquadricipital\nquadrics\nquadrifid\nquadriga\nquadrigae\nquadrilateral\nquadrilaterals\nquadrille\nquadrilles\nquadrillion\nquadrillions\nquadrillionth\nquadrillionths\nquadrinomial\nquadripartite\nquadriphonic\nquadriphonics\nquadriphony\nquadriplegia\nquadriplegic\nquadriplegics\nquadrisect\nquadrivalence\nquadrivalency\nquadrivalent\nquadrivia\nquadrivial\nquadrivium\nquadroon\nquadroons\nquadrophonic\nquadrumanal\nquadrumanous\nquadrumvir\nquadrumvirate\nquadrumvirates\nquadrumvirs\nquadruped\nquadrupedal\nquadrupeds\nquadruple\nquadrupled\nquadruples\nquadruplet\nquadruplets\nquadruplicate\nquadruplicated\nquadruplicately\nquadruplicates\nquadruplicating\nquadruplication\nquadruplications\nquadruplicity\nquadrupling\nquadruply\nquadrupole\nquadrupoles\nquads\nquaere\nquaeres\nquaestor\nquaestorial\nquaestors\nquaestorship\nquaestorships\nquaff\nquaffed\nquaffer\nquaffers\nquaffing\nquaffs\nquag\nquagga\nquaggas\nquaggier\nquaggiest\nquaggy\nquagmire\nquagmires\nquags\nquahaug\nquahaugs\nquahog\nquahogs\nquai\nquaich\nquaiches\nquaigh\nquaighs\nquail\nquailed\nquailing\nquails\nquaint\nquainter\nquaintest\nquaintly\nquaintness\nquake\nquaked\nquakeproof\nquakeproofed\nquakeproofing\nquakeproofs\nquaker\nquakerish\nquakerism\nquakerly\nquakers\nquakes\nquaking\nquaky\nquale\nqualia\nqualifiable\nqualification\nqualifications\nqualificatory\nqualified\nqualifiedly\nqualifier\nqualifiers\nqualifies\nqualify\nqualifying\nqualitative\nqualitatively\nqualities\nquality\nqualm\nqualmish\nqualmishly\nqualmishness\nqualms\nqualmy\nquamash\nquamashes\nquandang\nquandangs\nquandaries\nquandary\nquandong\nquandongs\nquango\nquangos\nquant\nquanta\nquantal\nquantally\nquantasome\nquantasomes\nquanted\nquantic\nquantics\nquantifiability\nquantifiable\nquantifiably\nquantification\nquantificational\nquantificationally\nquantifications\nquantified\nquantifier\nquantifiers\nquantifies\nquantify\nquantifying\nquanting\nquantitate\nquantitated\nquantitates\nquantitating\nquantitation\nquantitations\nquantitative\nquantitatively\nquantitativeness\nquantities\nquantity\nquantization\nquantizations\nquantize\nquantized\nquantizer\nquantizers\nquantizes\nquantizing\nquants\nquantum\nquapaw\nquapaws\nquarantinable\nquarantine\nquarantined\nquarantines\nquarantining\nquark\nquarks\nquarrel\nquarreled\nquarreler\nquarrelers\nquarreling\nquarrelled\nquarreller\nquarrellers\nquarrelling\nquarrels\nquarrelsome\nquarrelsomely\nquarrelsomeness\nquarried\nquarrier\nquarriers\nquarries\nquarry\nquarrying\nquarryman\nquarrymen\nquart\nquartan\nquartans\nquarter\nquarterage\nquarterages\nquarterback\nquarterbacked\nquarterbacking\nquarterbacks\nquarterdeck\nquarterdecks\nquartered\nquarterfinal\nquarterfinalist\nquarterfinalists\nquarterfinals\nquartering\nquarterlies\nquarterly\nquartermaster\nquartermasters\nquartern\nquarterns\nquarters\nquartersaw\nquartersawed\nquartersawing\nquartersawn\nquartersaws\nquarterstaff\nquarterstaves\nquartertone\nquartertones\nquartet\nquartets\nquartette\nquartettes\nquartic\nquartics\nquartile\nquartiles\nquarto\nquartos\nquarts\nquartz\nquartzes\nquartziferous\nquartzite\nquartzitic\nquartzose\nquasar\nquasars\nquash\nquashed\nquashes\nquashing\nquasi\nquasiliquid\nquasimodo\nquasiparticle\nquasiparticles\nquasiperiodic\nquasiperiodicity\nquassia\nquassias\nquatercentenaries\nquatercentenary\nquaternaries\nquaternary\nquaternion\nquaternions\nquaternities\nquaternity\nquatorze\nquatrain\nquatrains\nquatre\nquatrefoil\nquatrefoils\nquattrocento\nquattrocentos\nquattuordecillion\nquattuordecillions\nquaver\nquavered\nquavering\nquaveringly\nquavers\nquavery\nquay\nquayage\nquayages\nquays\nquayside\nquaysides\nquean\nqueans\nqueasier\nqueasiest\nqueasily\nqueasiness\nqueasy\nqueazier\nqueaziest\nqueazy\nquebec\nquebecer\nquebecers\nquebecker\nquebeckers\nquebecois\nquebracho\nquebrachos\nquechan\nquechua\nquechuan\nquechuas\nquechumaran\nquechumarans\nqueen\nqueen's\nqueened\nqueening\nqueenlier\nqueenliest\nqueenliness\nqueenly\nqueens\nqueensberry\nqueenship\nqueenships\nqueenside\nqueensides\nqueensland\nqueer\nqueered\nqueerer\nqueerest\nqueering\nqueerish\nqueerly\nqueerness\nqueers\nqueleas\nquell\nquelled\nqueller\nquellers\nquelling\nquells\nquem\nquench\nquenchable\nquenched\nquencher\nquenchers\nquenches\nquenching\nquenchless\nquenelle\nquenelles\nquercetin\nquercetins\nquercitron\nquercitrons\nqueried\nquerier\nqueriers\nqueries\nquerist\nquerists\nquern\nquerns\nquerulous\nquerulously\nquerulousness\nquery\nquerying\nquesadilla\nquesadillas\nquest\nquested\nquester\nquesters\nquesting\nquestion\nquestionability\nquestionable\nquestionableness\nquestionably\nquestionaries\nquestionary\nquestioned\nquestioner\nquestioners\nquestioning\nquestioningly\nquestionings\nquestionless\nquestionnaire\nquestionnaires\nquestions\nquestor\nquestors\nquests\nquetzal\nquetzalcoatl\nquetzales\nquetzals\nqueue\nqueued\nqueueing\nqueuer\nqueuers\nqueues\nqueuing\nquibble\nquibbled\nquibbler\nquibblers\nquibbles\nquibbling\nquiberon\nquiche\nquiches\nquiché\nquichés\nquick\nquicken\nquickened\nquickener\nquickeners\nquickening\nquickens\nquicker\nquickest\nquickie\nquickies\nquicklime\nquickly\nquickness\nquicks\nquicksand\nquicksands\nquickset\nquicksets\nquicksilver\nquickstep\nquickstepped\nquickstepping\nquicksteps\nquid\nquiddities\nquiddity\nquidnunc\nquidnuncs\nquids\nquiescence\nquiescent\nquiescently\nquiet\nquieted\nquieten\nquietened\nquietening\nquietens\nquieter\nquietest\nquieting\nquietism\nquietisms\nquietist\nquietistic\nquietists\nquietly\nquietness\nquiets\nquietude\nquietus\nquietuses\nquiff\nquiffs\nquill\nquillback\nquillbacks\nquilled\nquiller\nquilling\nquills\nquillwork\nquillworks\nquillwort\nquillworts\nquilt\nquilted\nquilter\nquilters\nquilting\nquilts\nquinacrine\nquinalizarin\nquinalizarins\nquinary\nquinate\nquince\nquincentenary\nquincentennial\nquinces\nquincey\nquincuncial\nquincuncially\nquincunx\nquincunxes\nquincunxial\nquincy\nquindecennial\nquindecennials\nquindecillion\nquindecillions\nquinella\nquinellas\nquinidine\nquinidines\nquiniela\nquinielas\nquinine\nquinines\nquinnat\nquinoa\nquinoas\nquinoid\nquinoidine\nquinoidines\nquinoids\nquinoline\nquinolines\nquinone\nquinones\nquinonoid\nquinquagenarian\nquinquagenarians\nquinquagesima\nquinquagesimas\nquinquennia\nquinquennial\nquinquennially\nquinquennials\nquinquennium\nquinquenniums\nquinquevalence\nquinquevalent\nquinsy\nquint\nquinta\nquintain\nquintains\nquintal\nquintals\nquintan\nquintas\nquintessence\nquintessential\nquintessentially\nquintet\nquintets\nquintette\nquintettes\nquintic\nquintics\nquintile\nquintiles\nquintilian\nquintillion\nquintillions\nquintillionth\nquintillionths\nquints\nquintuple\nquintupled\nquintuples\nquintuplet\nquintuplets\nquintuplicate\nquintuplicated\nquintuplicates\nquintuplicating\nquintupling\nquintuply\nquinze\nquip\nquipped\nquipper\nquippers\nquipping\nquippy\nquips\nquipster\nquipsters\nquipu\nquipus\nquire\nquires\nquirinal\nquirinus\nquirk\nquirked\nquirkier\nquirkiest\nquirkily\nquirkiness\nquirking\nquirkish\nquirks\nquirky\nquirt\nquirts\nquisling\nquislingism\nquislings\nquit\nquitch\nquitclaim\nquitclaimed\nquitclaiming\nquitclaims\nquite\nquito\nquitrent\nquitrents\nquits\nquittance\nquittances\nquitted\nquitter\nquitters\nquitting\nquittor\nquittors\nquiver\nquivered\nquivering\nquiveringly\nquivers\nquivery\nquixote\nquixotes\nquixotic\nquixotical\nquixotically\nquixotism\nquixotry\nquiz\nquizmaster\nquizmasters\nquizzed\nquizzer\nquizzers\nquizzes\nquizzical\nquizzicality\nquizzically\nquizzing\nquo\nquod\nquodlibet\nquodlibets\nquoi\nquoin\nquoined\nquoining\nquoins\nquoit\nquoits\nquokka\nquokkas\nquondam\nquonset\nquorum\nquorums\nquos\nquota\nquotability\nquotable\nquotably\nquotas\nquotation\nquotational\nquotationally\nquotations\nquote\nquoted\nquoter\nquoters\nquotes\nquoth\nquotha\nquotidian\nquotient\nquotients\nquoting\nquran\nqurush\nqurushes\nquébec\nquébecois\nqwerty\nr\nra\nrabat\nrabato\nrabatos\nrabats\nrabbet\nrabbeted\nrabbeting\nrabbets\nrabbi\nrabbin\nrabbinate\nrabbinates\nrabbinic\nrabbinical\nrabbinically\nrabbinism\nrabbinist\nrabbinistic\nrabbinists\nrabbinitic\nrabbins\nrabbis\nrabbit\nrabbitbrush\nrabbited\nrabbiter\nrabbiters\nrabbiting\nrabbitries\nrabbitry\nrabbits\nrabbity\nrabble\nrabbled\nrabblement\nrabblements\nrabbler\nrabblers\nrabbles\nrabbling\nrabe\nrabelais\nrabelaisian\nrabi\nrabia\nrabic\nrabid\nrabidity\nrabidly\nrabidness\nrabies\nrabietic\nraccoon\nraccoons\nrace\nracecar\nracecars\nracecourse\nracecourses\nraced\nracehorse\nracehorses\nracemate\nracemates\nraceme\nracemes\nracemic\nracemiform\nracemism\nracemization\nracemizations\nracemize\nracemized\nracemizes\nracemizing\nracemose\nracemosely\nracer\nracers\nracerunner\nracerunners\nraces\nracetrack\nracetracker\nracetrackers\nracetracks\nracewalker\nracewalkers\nracewalking\nraceway\nraceways\nrachel\nrachial\nrachides\nrachilla\nrachillae\nrachis\nrachises\nrachitic\nrachitis\nrachmaninoff\nrachmanism\nracial\nracialism\nracialist\nracialistic\nracialists\nracially\nracier\nraciest\nracily\nracine\nraciness\nracing\nracism\nracist\nracists\nrack\nracked\nracker\nrackers\nracket\nracketed\nracketeer\nracketeered\nracketeering\nracketeers\nracketing\nrackets\nrackety\nrackful\nrackfuls\nracking\nrackingly\nracks\nraclette\nraclettes\nraclopride\nracon\nracons\nraconteur\nraconteurs\nracoon\nracoons\nracquet\nracquetball\nracquets\nracy\nrad\nradar\nradars\nradarscope\nradarscopes\nraddle\nraddled\nraddles\nraddling\nradial\nradially\nradials\nradian\nradiance\nradiancy\nradians\nradiant\nradiantly\nradiants\nradiate\nradiated\nradiately\nradiates\nradiating\nradiation\nradiational\nradiationless\nradiations\nradiative\nradiator\nradiators\nradical\nradicalism\nradicalization\nradicalizations\nradicalize\nradicalized\nradicalizes\nradicalizing\nradically\nradicalness\nradicals\nradicand\nradicands\nradicchio\nradicchios\nradices\nradicle\nradicles\nradicular\nradii\nradio\nradioactive\nradioactively\nradioactivity\nradioallergosorbent\nradioastronomy\nradioautograph\nradioautographic\nradioautographs\nradioautography\nradiobiologic\nradiobiological\nradiobiologically\nradiobiologist\nradiobiologists\nradiobiology\nradiobroadcast\nradiobroadcasted\nradiobroadcaster\nradiobroadcasters\nradiobroadcasting\nradiobroadcasts\nradiocarbon\nradiocast\nradiocasts\nradiochemical\nradiochemically\nradiochemist\nradiochemistry\nradiochemists\nradiochromatogram\nradiochromatograms\nradioecological\nradioecologist\nradioecologists\nradioecology\nradioed\nradioelement\nradioelements\nradiogenic\nradiogram\nradiograms\nradiograph\nradiographed\nradiographer\nradiographers\nradiographic\nradiographically\nradiographing\nradiographs\nradiography\nradioimmunoassay\nradioimmunoassayable\nradioimmunological\nradioimmunology\nradioing\nradioiodine\nradioiodines\nradioisotope\nradioisotopes\nradioisotopic\nradioisotopically\nradiolabel\nradiolabeled\nradiolabeling\nradiolabelled\nradiolabelling\nradiolabels\nradiolarian\nradiolarians\nradiolocation\nradiologic\nradiological\nradiologically\nradiologist\nradiologists\nradiology\nradiolucency\nradiolucent\nradiolyses\nradiolysis\nradiolytic\nradioman\nradiomen\nradiometer\nradiometers\nradiometric\nradiometrically\nradiometry\nradiomimetic\nradionuclide\nradionuclides\nradiopacity\nradiopaque\nradiopharmaceutical\nradiopharmaceuticals\nradiophone\nradiophones\nradiophonic\nradiophoto\nradiophotograph\nradiophotographs\nradiophotography\nradiophotos\nradioprotection\nradioprotections\nradioprotective\nradios\nradioscopic\nradioscopical\nradioscopy\nradiosensitive\nradiosensitivity\nradiosonde\nradiosondes\nradiostrontium\nradiotelegraph\nradiotelegraphic\nradiotelegraphs\nradiotelegraphy\nradiotelemetric\nradiotelemetry\nradiotelephone\nradiotelephones\nradiotelephonic\nradiotelephony\nradiotherapies\nradiotherapist\nradiotherapists\nradiotherapy\nradiothorium\nradiotoxic\nradiotoxicity\nradiotracer\nradiotracers\nradish\nradishes\nradium\nradius\nradiuses\nradix\nradixes\nradome\nradomes\nradon\nrads\nradula\nradulae\nradular\nradwaste\nraeburn\nraff\nraffia\nraffias\nraffinate\nraffinates\nraffinose\nraffinoses\nraffish\nraffishly\nraffishness\nraffle\nraffled\nraffler\nrafflers\nraffles\nrafflesia\nrafflesias\nraffling\nraft\nrafted\nrafter\nraftered\nrafters\nrafting\nrafts\nraftsman\nraftsmen\nrag\nraga\nragamuffin\nragamuffins\nragas\nragbag\nragbags\nrage\nraged\nrages\nragged\nraggedier\nraggediest\nraggedly\nraggedness\nraggedy\nragging\nraggle\nragi\nraging\nragis\nraglan\nraglans\nragman\nragmen\nragnarok\nragout\nragouts\nragpicker\nragpickers\nrags\nragtag\nragtime\nragtop\nragtops\nragusa\nragweed\nragwort\nragworts\nrah\nraiatea\nraid\nraided\nraider\nraiders\nraiding\nraids\nrail\nrailbird\nrailbirds\nrailbus\nrailcar\nrailcars\nrailed\nrailer\nrailers\nrailhead\nrailheads\nrailing\nrailings\nrailleries\nraillery\nrailroad\nrailroaded\nrailroader\nrailroaders\nrailroading\nrailroadings\nrailroads\nrails\nrailway\nrailways\nraiment\nrain\nrainbird\nrainbirds\nrainbow\nrainbowlike\nrainbows\nraincoat\nraincoats\nraindrop\nraindrops\nrained\nrainfall\nrainfalls\nrainforest\nrainforests\nrainier\nrainiest\nraininess\nraining\nrainless\nrainmaker\nrainmakers\nrainmaking\nrainout\nrainouts\nrainproof\nrains\nrainspout\nrainspouts\nrainsquall\nrainsqualls\nrainstorm\nrainstorms\nrainwash\nrainwater\nrainwear\nrainy\nraise\nraised\nraiser\nraisers\nraises\nraisin\nraising\nraisingly\nraisings\nraisins\nraison\nraisonné\nraisonnés\nraisons\nraj\nraja\nrajab\nrajabs\nrajah\nrajahs\nrajas\nrajasthan\nrajasthani\nrajpoot\nrajpoots\nrajput\nrajputana\nrajputs\nrajs\nrake\nraked\nrakee\nrakees\nrakehell\nrakehells\nrakehelly\nraker\nrakers\nrakes\nraki\nraking\nrakis\nrakish\nrakishly\nrakishness\nrale\nraleigh\nrales\nralik\nrallentando\nrallentandos\nrallied\nrallies\nralliform\nrally\nrallye\nrallyes\nrallying\nralph\nralphed\nralphing\nralphs\nram\nrama\nramada\nramadan\nramadas\nramadhan\nramakrishna\nraman\nramate\nramayana\nramble\nrambled\nrambler\nramblers\nrambles\nrambling\nramblingly\nramblings\nrambo\nrambos\nrambouillet\nrambouillets\nrambunctious\nrambunctiously\nrambunctiousness\nrambutan\nrambutans\nramekin\nramekins\nramequin\nramequins\nrameses\nramet\nramets\nrami\nramie\nramification\nramifications\nramified\nramifies\nramiform\nramify\nramifying\nramillies\nramism\nramist\nramists\nramjet\nramjets\nrammed\nrammer\nrammers\nramming\nramona\nramonas\nramose\nramous\nramp\nrampage\nrampaged\nrampageous\nrampageously\nrampageousness\nrampager\nrampagers\nrampages\nrampaging\nrampancy\nrampant\nrampantly\nrampart\nramparted\nramparting\nramparts\nramped\nrampike\nrampikes\nramping\nrampion\nrampions\nramps\nramrod\nramrodded\nramrodding\nramrods\nrams\nramses\nramshackle\nramshorn\nramshorns\nramson\nramsons\nramtil\nramtilla\nramtillas\nramtils\nramulose\nramus\nran\nranch\nranched\nrancher\nrancheria\nrancherias\nranchero\nrancheros\nranchers\nranches\nranching\nranchman\nranchmen\nrancho\nranchos\nrancid\nrancidity\nrancidness\nrancor\nrancorous\nrancorously\nrancorousness\nrancors\nrand\nrandan\nrandans\nrandier\nrandiest\nrandom\nrandomization\nrandomizations\nrandomize\nrandomized\nrandomizer\nrandomizers\nrandomizes\nrandomizing\nrandomly\nrandomness\nrands\nrandy\nranee\nranees\nrang\nrange\nranged\nrangefinder\nrangefinders\nrangeland\nrangelands\nranger\nrangers\nranges\nrangier\nrangiest\nranginess\nranging\nrangoon\nrangy\nrani\nranid\nranids\nranis\nrank\nranked\nranker\nrankers\nrankest\nrankine\nranking\nrankings\nrankle\nrankled\nrankles\nrankling\nrankly\nrankness\nranks\nransack\nransacked\nransacker\nransackers\nransacking\nransacks\nransom\nransomed\nransomer\nransomers\nransoming\nransoms\nrant\nranted\nranter\nranters\nranting\nrantingly\nrantings\nrants\nranula\nranulas\nranunculi\nranunculus\nranunculuses\nrap\nrapacious\nrapaciously\nrapaciousness\nrapacity\nrapallo\nrape\nraped\nraper\nrapers\nrapes\nrapeseed\nrapeseeds\nraphae\nraphael\nraphaelesque\nraphaelite\nraphaelites\nraphaelitism\nraphe\nraphia\nraphias\nraphide\nraphides\nraphis\nrapid\nrapider\nrapidest\nrapidity\nrapidly\nrapidness\nrapids\nrapier\nrapierlike\nrapiers\nrapine\nrapines\nraping\nrapini\nrapist\nrapists\nrapparee\nrapparees\nrapped\nrappee\nrappees\nrappel\nrappelled\nrappelling\nrappels\nrappen\nrapper\nrappers\nrapping\nrappini\nrapport\nrapporteur\nrapporteurs\nrapprochement\nrapprochements\nraps\nrapscallion\nrapscallions\nrapt\nraptly\nraptness\nraptor\nraptorial\nraptors\nrapture\nraptured\nraptures\nrapturing\nrapturous\nrapturously\nrapturousness\nrara\nrarae\nrare\nrarebit\nrarebits\nraree\nrarefaction\nrarefactional\nrarefactions\nrarefactive\nrarefiable\nrarefication\nrarefied\nrarefies\nrarefy\nrarefying\nrarely\nrareness\nrarer\nrareripe\nrareripes\nrarest\nrarified\nrarifies\nrarify\nrarifying\nraring\nrarities\nrarity\nrarotonga\nrasa\nrasae\nrasbora\nrasboras\nrascal\nrascalities\nrascality\nrascally\nrascals\nrase\nrased\nrases\nrash\nrasher\nrashers\nrashes\nrashest\nrashly\nrashness\nrasing\nrasorial\nrasp\nraspberries\nraspberry\nrasped\nrasper\nraspers\nraspier\nraspiest\nrasping\nraspingly\nrasps\nrasputin\nraspy\nrasselas\nrasta\nrastafarian\nrastafarianism\nrastafarians\nrastas\nraster\nrasters\nrat\nrata\nratability\nratable\nratableness\nratables\nratably\nratafee\nratafees\nratafia\nratafias\nratak\nrataplan\nrataplans\nratatouille\nratatouilles\nratbag\nratbags\nratchet\nratcheted\nratcheting\nratchets\nrate\nrateable\nrated\nratel\nratels\nratemaking\nratemakings\nratemeter\nratemeters\nratepayer\nratepayers\nrater\nraters\nrates\nratfink\nratfinks\nratfish\nratfishes\nrathe\nrather\nrathskeller\nrathskellers\nraticide\nraticides\nratifiable\nratification\nratifications\nratified\nratifier\nratifiers\nratifies\nratify\nratifying\nratine\nratines\nrating\nratings\nratiné\nratio\nratiocinate\nratiocinated\nratiocinates\nratiocinating\nratiocination\nratiocinations\nratiocinative\nratiocinator\nratiocinators\nration\nrational\nrationale\nrationales\nrationalism\nrationalist\nrationalistic\nrationalistically\nrationalists\nrationalities\nrationality\nrationalizable\nrationalization\nrationalizations\nrationalize\nrationalized\nrationalizer\nrationalizers\nrationalizes\nrationalizing\nrationally\nrationalness\nrationed\nrationing\nrations\nratios\nratite\nratites\nratlike\nratlin\nratline\nratlines\nratlins\nratoon\nratooned\nratooning\nratoons\nrats\nratsbane\nratsbanes\nrattail\nrattails\nrattan\nrattans\nratted\nratteen\nratteens\nratter\nratters\nrattier\nrattiest\nratting\nrattle\nrattlebox\nrattleboxes\nrattlebrain\nrattlebrained\nrattlebrains\nrattled\nrattler\nrattlers\nrattles\nrattlesnake\nrattlesnakes\nrattletrap\nrattletraps\nrattling\nrattlingly\nrattly\nrattoon\nrattooned\nrattooning\nrattoons\nrattrap\nrattraps\nratty\nraucity\nraucous\nraucously\nraucousness\nraunch\nraunchier\nraunchiest\nraunchily\nraunchiness\nraunchy\nrauwolfia\nrauwolfias\nravage\nravaged\nravagement\nravagements\nravager\nravagers\nravages\nravaging\nrave\nraved\nravel\nraveled\nraveler\nravelers\nraveling\nravelings\nravelled\nravelling\nravellings\nravello\nravelment\nravelments\nravels\nraven\nravened\nravener\nraveners\nravening\nraveningly\nravenings\nravenna\nravenous\nravenously\nravenousness\nravens\nraver\nravers\nraves\nravigote\nravigotes\nravigotte\nravigottes\nravin\nravine\nravined\nravines\nraving\nravingly\nravings\nravins\nravioli\nraviolis\nravish\nravished\nravisher\nravishers\nravishes\nravishing\nravishingly\nravishment\nravishments\nraw\nrawalpindi\nrawboned\nrawer\nrawest\nrawhide\nrawhided\nrawhides\nrawhiding\nrawinsonde\nrawinsondes\nrawly\nrawness\nray\nrayed\nraying\nrayleigh\nrayless\nraylessness\nraynaud\nrayon\nrayonism\nrayonist\nrayonistic\nrayonists\nrays\nraze\nrazed\nrazee\nrazees\nrazer\nrazers\nrazes\nrazing\nrazor\nrazorback\nrazorbacks\nrazorbill\nrazorbills\nrazorblade\nrazorblades\nrazors\nrazz\nrazzed\nrazzes\nrazzing\nrazzle\nrazzmatazz\nrca\nrd\nre\nrea\nreabsorb\nreabsorbed\nreabsorbing\nreabsorbs\nreabsorption\nreabsorptions\nreaccelerate\nreaccelerated\nreaccelerates\nreaccelerating\nreaccept\nreaccepted\nreaccepting\nreaccepts\nreaccession\nreaccessioned\nreaccessioning\nreaccessions\nreacclimatize\nreacclimatized\nreacclimatizes\nreacclimatizing\nreaccredit\nreaccreditation\nreaccreditations\nreaccredited\nreaccrediting\nreaccredits\nreach\nreachable\nreached\nreacher\nreachers\nreaches\nreaching\nreacquaint\nreacquainted\nreacquainting\nreacquaints\nreacquire\nreacquired\nreacquires\nreacquiring\nreacquisition\nreacquisitions\nreact\nreactance\nreactant\nreactants\nreacted\nreacting\nreaction\nreactionaries\nreactionary\nreactionaryism\nreactions\nreactivate\nreactivated\nreactivates\nreactivating\nreactivation\nreactivations\nreactive\nreactively\nreactiveness\nreactivity\nreactor\nreactors\nreacts\nread\nreadability\nreadable\nreadableness\nreadably\nreadapt\nreadapted\nreadapting\nreadapts\nreaddress\nreaddressed\nreaddresses\nreaddressing\nreader\nreaderly\nreaders\nreadership\nreaderships\nreadied\nreadier\nreadies\nreadiest\nreadily\nreadiness\nreading\nreadings\nreadjust\nreadjusted\nreadjuster\nreadjusters\nreadjusting\nreadjustment\nreadjustments\nreadjusts\nreadmission\nreadmissions\nreadmit\nreadmits\nreadmitted\nreadmitting\nreadopt\nreadopted\nreadopting\nreadopts\nreadout\nreadouts\nreads\nready\nreadying\nreadymade\nreaffirm\nreaffirmation\nreaffirmations\nreaffirmed\nreaffirming\nreaffirms\nreaffix\nreaffixed\nreaffixes\nreaffixing\nreagent\nreagents\nreaggregate\nreaggregated\nreaggregates\nreaggregating\nreaggregation\nreaggregations\nreagin\nreaginic\nreaginically\nreagins\nreal\nrealer\nreales\nrealest\nrealgar\nrealgars\nrealia\nrealign\nrealigned\nrealigning\nrealignment\nrealignments\nrealigns\nrealism\nrealist\nrealistic\nrealistically\nrealists\nrealities\nreality\nrealizability\nrealizable\nrealizably\nrealization\nrealizationism\nrealizationist\nrealizationists\nrealizations\nrealize\nrealized\nrealizer\nrealizers\nrealizes\nrealizing\nreallocate\nreallocated\nreallocates\nreallocating\nreallocation\nreallocations\nreally\nrealm\nrealms\nrealness\nrealpolitik\nrealpolitiker\nrealpolitikers\nrealpolitiks\nreals\nrealties\nrealtor\nrealtors\nrealty\nream\nreamed\nreamer\nreamers\nreaming\nreams\nreanalyses\nreanalysis\nreanalyze\nreanalyzed\nreanalyzes\nreanalyzing\nreanimate\nreanimated\nreanimates\nreanimating\nreanimation\nreanimations\nreannex\nreannexation\nreannexations\nreannexed\nreannexes\nreannexing\nreap\nreaped\nreaper\nreapers\nreaphook\nreaphooks\nreaping\nreappear\nreappearance\nreappearances\nreappeared\nreappearing\nreappears\nreapplication\nreapplications\nreapplied\nreapplies\nreapply\nreapplying\nreappoint\nreappointed\nreappointing\nreappointment\nreappointments\nreappoints\nreapportion\nreapportioned\nreapportioning\nreapportionment\nreapportionments\nreapportions\nreappraisal\nreappraisals\nreappraise\nreappraised\nreappraises\nreappraising\nreappropriate\nreappropriated\nreappropriates\nreappropriating\nreapprove\nreapproved\nreapproves\nreapproving\nreaps\nrear\nreared\nrearer\nrearers\nrearguard\nrearguards\nreargue\nreargued\nreargues\nrearguing\nreargument\nrearguments\nrearing\nrearm\nrearmament\nrearmaments\nrearmed\nrearming\nrearmost\nrearms\nrearousal\nrearousals\nrearouse\nrearoused\nrearouses\nrearousing\nrearrange\nrearranged\nrearrangement\nrearrangements\nrearranges\nrearranging\nrearrest\nrearrested\nrearresting\nrearrests\nrears\nrearticulate\nrearticulated\nrearticulates\nrearticulating\nrearview\nrearward\nrearwards\nreascend\nreascended\nreascending\nreascends\nreascent\nreascents\nreason\nreasonability\nreasonable\nreasonableness\nreasonably\nreasoned\nreasoner\nreasoners\nreasoning\nreasonings\nreasonless\nreasonlessly\nreasons\nreassemblage\nreassemblages\nreassemble\nreassembled\nreassembles\nreassemblies\nreassembling\nreassembly\nreassert\nreasserted\nreasserting\nreassertion\nreassertions\nreasserts\nreassess\nreassessed\nreassesses\nreassessing\nreassessment\nreassessments\nreassign\nreassigned\nreassigning\nreassignment\nreassignments\nreassigns\nreassume\nreassumed\nreassumes\nreassuming\nreassurance\nreassurances\nreassure\nreassured\nreassures\nreassuring\nreassuringly\nreata\nreatas\nreattach\nreattached\nreattaches\nreattaching\nreattachment\nreattachments\nreattain\nreattained\nreattaining\nreattains\nreattempt\nreattempted\nreattempting\nreattempts\nreattribute\nreattributed\nreattributes\nreattributing\nreattribution\nreattributions\nreaumur\nreauthorization\nreauthorizations\nreauthorize\nreauthorized\nreauthorizes\nreauthorizing\nreave\nreaved\nreaver\nreavers\nreaves\nreaving\nreawake\nreawaked\nreawaken\nreawakened\nreawakening\nreawakens\nreawakes\nreawaking\nreb\nrebait\nrebaited\nrebaiting\nrebaits\nrebalance\nrebalanced\nrebalances\nrebalancing\nrebaptism\nrebaptisms\nrebaptize\nrebaptized\nrebaptizes\nrebaptizing\nrebar\nrebarbative\nrebarbatively\nrebars\nrebate\nrebated\nrebater\nrebaters\nrebates\nrebating\nrebato\nrebatos\nrebbe\nrebbes\nrebec\nrebecca\nrebeck\nrebecks\nrebecs\nrebegan\nrebegin\nrebeginning\nrebegins\nrebegun\nrebel\nrebelled\nrebelling\nrebellion\nrebellions\nrebellious\nrebelliously\nrebelliousness\nrebels\nrebid\nrebidden\nrebidding\nrebids\nrebilling\nrebind\nrebinding\nrebinds\nrebirth\nrebirths\nreblend\nreblended\nreblending\nreblends\nreblochon\nrebloom\nrebloomed\nreblooming\nreblooms\nreboant\nreboard\nreboarded\nreboarding\nreboards\nreboil\nreboiled\nreboiling\nreboils\nrebook\nrebooked\nrebooking\nrebooks\nreboot\nrebooted\nrebooting\nreboots\nrebore\nrebored\nrebores\nreboring\nreborn\nrebottle\nrebottled\nrebottles\nrebottling\nrebought\nrebound\nrebounded\nrebounder\nrebounders\nrebounding\nrebounds\nrebozo\nrebozos\nrebranch\nrebranched\nrebranches\nrebranching\nrebred\nrebreed\nrebreeding\nrebreeds\nrebroadcast\nrebroadcasted\nrebroadcasting\nrebroadcasts\nrebs\nrebuff\nrebuffed\nrebuffing\nrebuffs\nrebuild\nrebuilding\nrebuilds\nrebuilt\nrebuke\nrebuked\nrebuker\nrebukers\nrebukes\nrebuking\nreburial\nreburials\nreburied\nreburies\nrebury\nreburying\nrebus\nrebuses\nrebut\nrebuts\nrebuttable\nrebuttal\nrebuttals\nrebutted\nrebutter\nrebutters\nrebutting\nrebuy\nrebuying\nrebuys\nrec\nrecalcitrance\nrecalcitrancy\nrecalcitrant\nrecalcitrants\nrecalculate\nrecalculated\nrecalculates\nrecalculating\nrecalculation\nrecalculations\nrecalescence\nrecalescences\nrecalescent\nrecalibrate\nrecalibrated\nrecalibrates\nrecalibrating\nrecalibration\nrecalibrations\nrecall\nrecallability\nrecallable\nrecalled\nrecaller\nrecallers\nrecalling\nrecalls\nrecamier\nrecamiers\nrecanalization\nrecanalizations\nrecanalize\nrecanalized\nrecanalizes\nrecanalizing\nrecant\nrecantation\nrecantations\nrecanted\nrecanter\nrecanters\nrecanting\nrecants\nrecap\nrecapitalization\nrecapitalizations\nrecapitalize\nrecapitalized\nrecapitalizes\nrecapitalizing\nrecapitulate\nrecapitulated\nrecapitulates\nrecapitulating\nrecapitulation\nrecapitulations\nrecapitulative\nrecapitulatory\nrecappable\nrecapped\nrecapping\nrecaps\nrecapture\nrecaptured\nrecaptures\nrecapturing\nrecast\nrecasting\nrecasts\nrecce\nrecces\nrecd\nrecede\nreceded\nrecedes\nreceding\nreceipt\nreceipted\nreceipting\nreceipts\nreceivable\nreceivables\nreceive\nreceived\nreceiver\nreceivers\nreceivership\nreceiverships\nreceives\nreceiving\nrecency\nrecension\nrecensions\nrecent\nrecently\nrecentness\nrecentralization\nrecentrifuge\nrecentrifuged\nrecentrifuges\nrecentrifuging\nreceptacle\nreceptacles\nreception\nreceptionist\nreceptionists\nreceptions\nreceptive\nreceptively\nreceptiveness\nreceptivity\nreceptor\nreceptors\nrecertification\nrecertifications\nrecertified\nrecertifies\nrecertify\nrecertifying\nrecess\nrecessed\nrecesses\nrecessing\nrecession\nrecessional\nrecessionals\nrecessionary\nrecessions\nrecessive\nrecessively\nrecessiveness\nrecessives\nrechallenge\nrechallenged\nrechallenges\nrechallenging\nrechannel\nrechanneled\nrechanneling\nrechannels\nrecharge\nrechargeable\nrecharged\nrecharger\nrechargers\nrecharges\nrecharging\nrecharter\nrechartered\nrechartering\nrecharters\nrecheat\nrecheats\nrecheck\nrechecked\nrechecking\nrechecks\nrecherché\nrechoreograph\nrechoreographed\nrechoreographing\nrechoreographs\nrechristen\nrechristened\nrechristening\nrechristens\nrechromatograph\nrechromatography\nrecidivate\nrecidivism\nrecidivist\nrecidivistic\nrecidivists\nrecidivous\nrecipe\nrecipes\nrecipience\nrecipiency\nrecipient\nrecipients\nreciprocal\nreciprocality\nreciprocally\nreciprocalness\nreciprocals\nreciprocate\nreciprocated\nreciprocates\nreciprocating\nreciprocation\nreciprocations\nreciprocative\nreciprocator\nreciprocators\nreciprocities\nreciprocity\nrecirculate\nrecirculated\nrecirculates\nrecirculating\nrecirculation\nrecirculations\nrecision\nrecisions\nrecital\nrecitalist\nrecitalists\nrecitals\nrecitation\nrecitations\nrecitative\nrecitatives\nrecitativi\nrecitativo\nrecitativos\nrecite\nrecited\nreciter\nreciters\nrecites\nreciting\nreck\nrecked\nrecking\nreckless\nrecklessly\nrecklessness\nreckon\nreckoned\nreckoner\nreckoners\nreckoning\nreckonings\nreckons\nrecks\nreclad\nrecladding\nreclads\nreclaim\nreclaimable\nreclaimant\nreclaimants\nreclaimed\nreclaimer\nreclaimers\nreclaiming\nreclaims\nreclamation\nreclamations\nreclassification\nreclassifications\nreclassified\nreclassifies\nreclassify\nreclassifying\nreclinate\nreclination\nreclinations\nrecline\nreclined\nrecliner\nrecliners\nreclines\nreclining\nreclosable\nreclothe\nreclothed\nreclothes\nreclothing\nrecluse\nrecluses\nreclusion\nreclusions\nreclusive\nreclusively\nreclusiveness\nrecock\nrecocked\nrecocking\nrecocks\nrecodification\nrecodifications\nrecodified\nrecodifies\nrecodify\nrecodifying\nrecognition\nrecognitions\nrecognitive\nrecognitory\nrecognizability\nrecognizable\nrecognizably\nrecognizance\nrecognizances\nrecognizant\nrecognize\nrecognized\nrecognizer\nrecognizers\nrecognizes\nrecognizing\nrecoil\nrecoiled\nrecoiler\nrecoilers\nrecoiling\nrecoilless\nrecoils\nrecoin\nrecoinage\nrecoined\nrecoining\nrecoins\nrecollect\nrecollected\nrecollecting\nrecollection\nrecollections\nrecollective\nrecollectively\nrecollects\nrecolonization\nrecolonize\nrecolonized\nrecolonizes\nrecolonizing\nrecolor\nrecolored\nrecoloring\nrecolors\nrecombinant\nrecombinants\nrecombinase\nrecombinases\nrecombination\nrecombinational\nrecombinations\nrecombine\nrecombined\nrecombines\nrecombining\nrecommence\nrecommenced\nrecommencement\nrecommencements\nrecommences\nrecommencing\nrecommend\nrecommendable\nrecommendation\nrecommendations\nrecommendatory\nrecommended\nrecommender\nrecommenders\nrecommending\nrecommends\nrecommission\nrecommissioned\nrecommissioning\nrecommissions\nrecommit\nrecommitment\nrecommitments\nrecommits\nrecommittal\nrecommittals\nrecommitted\nrecommitting\nrecompense\nrecompensed\nrecompenses\nrecompensing\nrecompilation\nrecompilations\nrecompile\nrecompiled\nrecompiles\nrecompiling\nrecompose\nrecomposed\nrecomposes\nrecomposing\nrecomposition\nrecompositions\nrecompress\nrecompressed\nrecompresses\nrecompressing\nrecompression\nrecompressions\nrecomputation\nrecomputations\nrecompute\nrecomputed\nrecomputes\nrecomputing\nrecon\nreconceive\nreconceived\nreconceives\nreconceiving\nreconcentrate\nreconcentrated\nreconcentrates\nreconcentrating\nreconcentration\nreconcentrations\nreconception\nreconceptions\nreconceptualization\nreconceptualizations\nreconceptualize\nreconceptualized\nreconceptualizes\nreconceptualizing\nreconcilability\nreconcilable\nreconcilableness\nreconcilably\nreconcile\nreconciled\nreconcilement\nreconcilements\nreconciler\nreconcilers\nreconciles\nreconciliation\nreconciliations\nreconciliatory\nreconciling\nrecondense\nrecondensed\nrecondenses\nrecondensing\nrecondite\nreconditely\nreconditeness\nrecondition\nreconditioned\nreconditioning\nreconditions\nreconfiguration\nreconfigurations\nreconfigure\nreconfigured\nreconfigures\nreconfiguring\nreconfirm\nreconfirmation\nreconfirmations\nreconfirmed\nreconfirming\nreconfirms\nreconnaissance\nreconnaissances\nreconnect\nreconnected\nreconnecting\nreconnection\nreconnections\nreconnects\nreconnoissance\nreconnoissances\nreconnoiter\nreconnoitered\nreconnoiterer\nreconnoiterers\nreconnoitering\nreconnoiters\nreconnoitre\nreconnoitred\nreconnoitres\nreconnoitring\nreconquer\nreconquered\nreconquering\nreconquers\nreconquest\nreconquests\nrecons\nreconsecrate\nreconsecrated\nreconsecrates\nreconsecrating\nreconsecration\nreconsecrations\nreconsider\nreconsideration\nreconsiderations\nreconsidered\nreconsidering\nreconsiders\nreconsolidate\nreconsolidated\nreconsolidates\nreconsolidating\nreconsolidation\nreconsolidations\nreconstitute\nreconstituted\nreconstitutes\nreconstituting\nreconstitution\nreconstitutions\nreconstruct\nreconstructed\nreconstructible\nreconstructing\nreconstruction\nreconstructionism\nreconstructionist\nreconstructionists\nreconstructions\nreconstructive\nreconstructor\nreconstructors\nreconstructs\nrecontact\nrecontacted\nrecontacting\nrecontacts\nrecontaminate\nrecontaminated\nrecontaminates\nrecontaminating\nrecontamination\nrecontextualize\nrecontextualized\nrecontextualizes\nrecontextualizing\nrecontour\nrecontoured\nrecontouring\nrecontours\nreconvene\nreconvened\nreconvenes\nreconvening\nreconvention\nreconversion\nreconversions\nreconvert\nreconverted\nreconverting\nreconverts\nreconvey\nreconveyance\nreconveyances\nreconveyed\nreconveying\nreconveys\nreconvict\nreconvicted\nreconvicting\nreconviction\nreconvictions\nreconvicts\nreconvince\nreconvinced\nreconvinces\nreconvincing\nrecopied\nrecopies\nrecopy\nrecopying\nrecord\nrecordable\nrecordation\nrecordations\nrecorded\nrecorder\nrecorders\nrecording\nrecordings\nrecordist\nrecordists\nrecords\nrecork\nrecorked\nrecorking\nrecorks\nrecount\nrecountal\nrecountals\nrecounted\nrecounter\nrecounters\nrecounting\nrecounts\nrecoup\nrecoupable\nrecouped\nrecouping\nrecoupment\nrecoupments\nrecoups\nrecourse\nrecourses\nrecover\nrecoverability\nrecoverable\nrecoverably\nrecovered\nrecoverer\nrecoverers\nrecoveries\nrecovering\nrecovers\nrecovery\nrecreance\nrecreancy\nrecreant\nrecreantly\nrecreants\nrecreate\nrecreated\nrecreates\nrecreating\nrecreation\nrecreational\nrecreationally\nrecreationist\nrecreationists\nrecreations\nrecreative\nrecrement\nrecremental\nrecrements\nrecriminate\nrecriminated\nrecriminates\nrecriminating\nrecrimination\nrecriminations\nrecriminative\nrecriminator\nrecriminators\nrecriminatory\nrecross\nrecrossed\nrecrosses\nrecrossing\nrecrudesce\nrecrudesced\nrecrudescence\nrecrudescent\nrecrudesces\nrecrudescing\nrecruit\nrecruited\nrecruiter\nrecruiters\nrecruiting\nrecruitment\nrecruitments\nrecruits\nrecrystallization\nrecrystallizations\nrecrystallize\nrecrystallized\nrecrystallizes\nrecrystallizing\nrecta\nrectal\nrectally\nrectangle\nrectangles\nrectangular\nrectangularity\nrectangularly\nrecti\nrectifiability\nrectifiable\nrectification\nrectifications\nrectified\nrectifier\nrectifiers\nrectifies\nrectify\nrectifying\nrectilinear\nrectilinearly\nrectitude\nrectitudinous\nrecto\nrector\nrectorate\nrectorates\nrectorial\nrectories\nrectors\nrectorship\nrectorships\nrectory\nrectos\nrectrices\nrectrix\nrectum\nrectums\nrectus\nrecultivate\nrecultivated\nrecultivates\nrecultivating\nrecumbence\nrecumbency\nrecumbent\nrecumbently\nrecuperate\nrecuperated\nrecuperates\nrecuperating\nrecuperation\nrecuperations\nrecuperative\nrecuperatory\nrecur\nrecurred\nrecurrence\nrecurrences\nrecurrent\nrecurrently\nrecurring\nrecurs\nrecursion\nrecursions\nrecursive\nrecursively\nrecursiveness\nrecurvate\nrecurvation\nrecurvations\nrecurve\nrecurved\nrecurves\nrecurving\nrecusal\nrecusancies\nrecusancy\nrecusant\nrecusants\nrecuse\nrecused\nrecuses\nrecusing\nrecut\nrecuts\nrecutting\nrecyclable\nrecyclables\nrecycle\nrecycled\nrecycler\nrecyclers\nrecycles\nrecycling\nred\nredact\nredacted\nredacting\nredaction\nredactional\nredactor\nredactors\nredacts\nredargue\nredargued\nredargues\nredarguing\nredate\nredated\nredates\nredating\nredbait\nredbaited\nredbaiter\nredbaiters\nredbaiting\nredbaitings\nredbaits\nredbelly\nredbird\nredbirds\nredbone\nredbones\nredbreast\nredbreasts\nredbrick\nredbud\nredbuds\nredbug\nredbugs\nredcap\nredcaps\nredcoat\nredcoats\nredden\nreddened\nreddener\nreddeners\nreddening\nreddens\nredder\nreddest\nreddish\nreddishness\nreddle\nreddled\nreddles\nreddling\nrede\nredear\nredecorate\nredecorated\nredecorates\nredecorating\nredecoration\nredecorations\nredecorator\nredecorators\nreded\nrededicate\nrededicated\nrededicates\nrededicating\nrededication\nrededications\nredeem\nredeemable\nredeemably\nredeemed\nredeemer\nredeemers\nredeeming\nredeems\nredefect\nredefine\nredefined\nredefines\nredefining\nredefinition\nredefinitions\nredeliver\nredelivered\nredeliveries\nredelivering\nredelivers\nredelivery\nredemption\nredemptional\nredemptioner\nredemptioners\nredemptions\nredemptive\nredemptorist\nredemptorists\nredemptory\nredeploy\nredeployed\nredeploying\nredeployment\nredeployments\nredeploys\nredeposit\nredeposited\nredepositing\nredeposits\nredes\nredescribe\nredescribed\nredescribes\nredescribing\nredescription\nredescriptions\nredesign\nredesigned\nredesigning\nredesigns\nredetect\nredetected\nredetects\nredetermination\nredeterminations\nredetermine\nredetermined\nredetermines\nredetermining\nredevelop\nredeveloped\nredeveloper\nredevelopers\nredeveloping\nredevelopment\nredevelopments\nredevelops\nredeye\nredeyes\nredfish\nredfishes\nredhead\nredheaded\nredheads\nredhorse\nredhorses\nredia\nrediae\nredial\nredialed\nredialing\nredialled\nredialling\nredials\nredias\nredid\nredifferentiation\nredifferentiations\nredigestion\nreding\nredingote\nredingotes\nredintegrate\nredintegrated\nredintegrates\nredintegrating\nredintegration\nredintegrations\nredintegrative\nredintegrator\nredintegrators\nredirect\nredirected\nredirecting\nredirection\nredirections\nredirector\nredirectors\nredirects\nrediscount\nrediscountable\nrediscounted\nrediscounting\nrediscounts\nrediscover\nrediscovered\nrediscoveries\nrediscovering\nrediscovers\nrediscovery\nrediscuss\nrediscussed\nrediscusses\nrediscussing\nredisplay\nredisplayed\nredisplaying\nredisplays\nredispose\nredisposed\nredisposes\nredisposing\nredisposition\nredispositions\nredissolve\nredissolved\nredissolves\nredissolving\nredistill\nredistillation\nredistillations\nredistilled\nredistilling\nredistills\nredistribute\nredistributed\nredistributes\nredistributing\nredistribution\nredistributional\nredistributionist\nredistributionists\nredistributions\nredistributive\nredistrict\nredistricted\nredistricting\nredistricts\nredivide\nredivided\nredivides\nredividing\nredivision\nredivisions\nredivivus\nredleg\nredlegs\nredline\nredlined\nredlines\nredlining\nredly\nredneck\nrednecked\nrednecks\nredness\nredo\nredoes\nredoing\nredolence\nredolency\nredolent\nredolently\nredon\nredone\nredonned\nredonning\nredons\nredouble\nredoubled\nredoubles\nredoubling\nredoubt\nredoubtable\nredoubtably\nredoubts\nredound\nredounded\nredounding\nredounds\nredout\nredouts\nredox\nredoxes\nredpoll\nredpolls\nredraft\nredrafted\nredrafting\nredrafts\nredraw\nredrawing\nredrawn\nredraws\nredream\nredreamed\nredreaming\nredreams\nredreamt\nredress\nredressed\nredresser\nredressers\nredresses\nredressing\nredressor\nredressors\nredrew\nredrill\nredrilled\nredrilling\nredrills\nredroot\nredroots\nreds\nredshank\nredshanks\nredshift\nredshifted\nredshifts\nredshirt\nredshirted\nredshirting\nredshirts\nredshouldered\nredskin\nredskins\nredstart\nredstarts\nredtop\nredtops\nredub\nredubbed\nredubbing\nredubs\nreduce\nreduced\nreducer\nreducers\nreduces\nreducibility\nreducible\nreducibly\nreducing\nreductant\nreductants\nreductase\nreductases\nreductio\nreduction\nreductional\nreductiones\nreductionism\nreductionist\nreductionistic\nreductionists\nreductions\nreductive\nreductively\nreductiveness\nreductivism\nreductivist\nreductivists\nredundancies\nredundancy\nredundant\nredundantly\nreduplicate\nreduplicated\nreduplicates\nreduplicating\nreduplication\nreduplications\nreduplicative\nreduplicatively\nreduviid\nreduviids\nredux\nredware\nredwing\nredwings\nredwood\nredwoods\nreecho\nreechoed\nreechoes\nreechoing\nreed\nreedbird\nreedbirds\nreedbuck\nreedbucks\nreeded\nreedier\nreediest\nreedified\nreedifies\nreedify\nreedifying\nreediness\nreeding\nreedings\nreedit\nreedited\nreediting\nreedition\nreeditions\nreedits\nreedlike\nreedling\nreedlings\nreedman\nreedmen\nreeds\nreeducate\nreeducated\nreeducates\nreeducating\nreeducation\nreeducations\nreeducative\nreedy\nreef\nreefable\nreefed\nreefer\nreefers\nreefing\nreefs\nreefy\nreek\nreeked\nreeker\nreekers\nreeking\nreeks\nreeky\nreel\nreelable\nreelect\nreelected\nreelecting\nreelection\nreelections\nreelects\nreeled\nreeler\nreelers\nreeligibility\nreeligible\nreeling\nreels\nreembroider\nreembroidered\nreembroidering\nreembroiders\nreemerge\nreemerged\nreemergence\nreemergences\nreemerges\nreemerging\nreemission\nreemissions\nreemit\nreemits\nreemitted\nreemitting\nreemphases\nreemphasis\nreemphasize\nreemphasized\nreemphasizes\nreemphasizing\nreemploy\nreemployed\nreemploying\nreemployment\nreemployments\nreemploys\nreenact\nreenacted\nreenacting\nreenactment\nreenactments\nreenacts\nreencounter\nreencountered\nreencountering\nreencounters\nreendow\nreendowed\nreendowing\nreendows\nreenergize\nreenergized\nreenergizes\nreenergizing\nreenforce\nreenforced\nreenforces\nreenforcing\nreengage\nreengaged\nreengagement\nreengagements\nreengages\nreengaging\nreengineer\nreengineered\nreengineering\nreengineers\nreengrave\nreengraved\nreengraves\nreengraving\nreenlist\nreenlisted\nreenlisting\nreenlistment\nreenlistments\nreenlists\nreenroll\nreenrolled\nreenrolling\nreenrolls\nreenter\nreentered\nreentering\nreenters\nreenthrone\nreenthroned\nreenthrones\nreenthroning\nreentrance\nreentrances\nreentrant\nreentrants\nreentries\nreentry\nreequip\nreequipment\nreequipped\nreequipping\nreequips\nreerect\nreerected\nreerecting\nreerects\nreescalate\nreescalated\nreescalates\nreescalating\nreescalation\nreescalations\nreestablish\nreestablished\nreestablishes\nreestablishing\nreestablishment\nreestimate\nreestimated\nreestimates\nreestimating\nreevaluate\nreevaluated\nreevaluates\nreevaluating\nreevaluation\nreevaluations\nreeve\nreeved\nreeves\nreeving\nreexamination\nreexaminations\nreexamine\nreexamined\nreexamines\nreexamining\nreexperience\nreexperienced\nreexperiences\nreexperiencing\nreexplore\nreexplored\nreexplores\nreexploring\nreexport\nreexportation\nreexportations\nreexported\nreexporting\nreexports\nreexpose\nreexposed\nreexposes\nreexposing\nreexposure\nreexposures\nreexpress\nreexpressed\nreexpresses\nreexpressing\nref\nreface\nrefaced\nrefaces\nrefacing\nrefashion\nrefashioned\nrefashioning\nrefashions\nrefasten\nrefastened\nrefastening\nrefastens\nrefect\nrefected\nrefecting\nrefection\nrefections\nrefectories\nrefectory\nrefects\nrefed\nrefeed\nrefeeding\nrefeeds\nrefeel\nrefeeling\nrefeels\nrefelt\nrefence\nrefenced\nrefences\nrefencing\nrefer\nreferable\nreferee\nrefereed\nrefereeing\nreferees\nreference\nreferenced\nreferencer\nreferencers\nreferences\nreferencing\nreferenda\nreferendum\nreferendums\nreferent\nreferential\nreferentiality\nreferentially\nreferents\nreferral\nreferrals\nreferred\nreferrer\nreferrers\nreferring\nrefers\nrefight\nrefighting\nrefights\nrefigure\nrefigured\nrefigures\nrefiguring\nrefile\nrefiled\nrefiles\nrefiling\nrefill\nrefillable\nrefilled\nrefilling\nrefills\nrefinance\nrefinanced\nrefinancer\nrefinancers\nrefinances\nrefinancier\nrefinanciers\nrefinancing\nrefind\nrefinding\nrefinds\nrefine\nrefined\nrefinement\nrefinements\nrefiner\nrefineries\nrefiners\nrefinery\nrefines\nrefining\nrefinish\nrefinished\nrefinisher\nrefinishers\nrefinishes\nrefinishing\nrefire\nrefired\nrefires\nrefiring\nrefit\nrefits\nrefitted\nrefitting\nrefix\nrefixed\nrefixes\nrefixing\nreflag\nreflagged\nreflagging\nreflags\nreflate\nreflated\nreflates\nreflating\nreflation\nreflationary\nreflect\nreflectance\nreflected\nreflecting\nreflection\nreflectional\nreflections\nreflective\nreflectively\nreflectiveness\nreflectivities\nreflectivity\nreflectometer\nreflectometers\nreflectometry\nreflector\nreflectorize\nreflectorized\nreflectorizes\nreflectorizing\nreflectors\nreflects\nreflex\nreflexed\nreflexes\nreflexing\nreflexive\nreflexively\nreflexiveness\nreflexives\nreflexivity\nreflexly\nreflexologist\nreflexologists\nreflexology\nrefloat\nrefloated\nrefloating\nrefloats\nreflow\nreflowed\nreflowing\nreflows\nrefluence\nrefluent\nreflux\nrefluxed\nrefluxes\nrefluxing\nrefocus\nrefocused\nrefocuses\nrefocusing\nrefocussed\nrefocussing\nrefold\nrefolded\nrefolding\nrefolds\nreforecast\nreforecasting\nreforecasts\nreforest\nreforestation\nreforestations\nreforested\nreforesting\nreforests\nreforge\nreforged\nreforges\nreforging\nreform\nreformability\nreformable\nreformat\nreformate\nreformates\nreformation\nreformational\nreformations\nreformative\nreformatories\nreformatory\nreformats\nreformatted\nreformatting\nreformed\nreformer\nreformers\nreforming\nreformism\nreformist\nreformists\nreforms\nreformulate\nreformulated\nreformulates\nreformulating\nreformulation\nreformulations\nrefortification\nrefortified\nrefortifies\nrefortify\nrefortifying\nrefought\nrefound\nrefoundation\nrefoundations\nrefounded\nrefounding\nrefounds\nrefract\nrefracted\nrefractile\nrefracting\nrefraction\nrefractional\nrefractive\nrefractively\nrefractiveness\nrefractivity\nrefractometer\nrefractometers\nrefractometric\nrefractometry\nrefractor\nrefractories\nrefractorily\nrefractoriness\nrefractors\nrefractory\nrefracts\nrefrain\nrefrained\nrefrainer\nrefrainers\nrefraining\nrefrainment\nrefrainments\nrefrains\nreframe\nreframed\nreframes\nreframing\nrefrangibility\nrefrangible\nrefrangibleness\nrefreeze\nrefreezes\nrefreezing\nrefresh\nrefreshed\nrefreshen\nrefreshened\nrefreshening\nrefreshens\nrefresher\nrefreshers\nrefreshes\nrefreshing\nrefreshingly\nrefreshment\nrefreshments\nrefried\nrefries\nrefrigerant\nrefrigerants\nrefrigerate\nrefrigerated\nrefrigerates\nrefrigerating\nrefrigeration\nrefrigerations\nrefrigerative\nrefrigerator\nrefrigerators\nrefrigeratory\nrefringence\nrefringences\nrefringent\nrefroze\nrefrozen\nrefry\nrefrying\nrefs\nreft\nrefuel\nrefueled\nrefueling\nrefuelled\nrefuelling\nrefuels\nrefuge\nrefuged\nrefugee\nrefugeeism\nrefugees\nrefuges\nrefugia\nrefuging\nrefugium\nrefulgence\nrefulgency\nrefulgent\nrefulgently\nrefund\nrefundability\nrefundable\nrefunded\nrefunder\nrefunders\nrefunding\nrefundment\nrefundments\nrefunds\nrefurbish\nrefurbished\nrefurbisher\nrefurbishers\nrefurbishes\nrefurbishing\nrefurbishment\nrefurbishments\nrefurnish\nrefurnished\nrefurnishes\nrefurnishing\nrefusal\nrefusals\nrefuse\nrefused\nrefusednik\nrefusedniks\nrefusenik\nrefuseniks\nrefuser\nrefusers\nrefuses\nrefusing\nrefusnik\nrefusniks\nrefutability\nrefutable\nrefutably\nrefutal\nrefutals\nrefutation\nrefutations\nrefute\nrefuted\nrefuter\nrefuters\nrefutes\nrefuting\nregain\nregained\nregainer\nregainers\nregaining\nregains\nregal\nregale\nregaled\nregalement\nregalements\nregales\nregalia\nregaling\nregalities\nregality\nregally\nregard\nregardant\nregarded\nregardful\nregardfully\nregardfulness\nregarding\nregardless\nregardlessly\nregardlessness\nregards\nregather\nregathered\nregathering\nregathers\nregatta\nregattas\nregave\nregear\nregeared\nregearing\nregears\nregelate\nregelated\nregelates\nregelating\nregelation\nregelations\nregencies\nregency\nregenerable\nregeneracy\nregenerate\nregenerated\nregenerately\nregenerateness\nregenerates\nregenerating\nregeneration\nregenerations\nregenerative\nregeneratively\nregenerator\nregenerators\nregensburg\nregent\nregental\nregents\nregerminate\nregerminated\nregerminates\nregerminating\nregermination\nreggae\nreggaes\nreggio\nregicidal\nregicide\nregicides\nregild\nregilded\nregilding\nregilds\nregime\nregimen\nregimens\nregiment\nregimental\nregimentally\nregimentals\nregimentation\nregimentations\nregimented\nregimenting\nregiments\nregimes\nregina\nregion\nregional\nregionalism\nregionalisms\nregionalist\nregionalistic\nregionalists\nregionalization\nregionalizations\nregionalize\nregionalized\nregionalizes\nregionalizing\nregionally\nregionals\nregions\nregisseurs\nregister\nregisterable\nregistered\nregisterer\nregisterers\nregistering\nregisters\nregistrable\nregistrant\nregistrants\nregistrar\nregistrars\nregistration\nregistrations\nregistries\nregistry\nregius\nregive\nregiven\nregives\nregiving\nreglaze\nreglazed\nreglazes\nreglazing\nreglet\nreglets\nregna\nregnal\nregnant\nregnum\nregolith\nregoliths\nregorge\nregorged\nregorges\nregorging\nregosol\nregosols\nregrade\nregraded\nregrades\nregrading\nregraft\nregrafted\nregrafting\nregrafts\nregrant\nregranted\nregranting\nregrants\nregreen\nregreened\nregreening\nregreens\nregress\nregressed\nregresses\nregressing\nregression\nregressions\nregressive\nregressively\nregressiveness\nregressivity\nregressor\nregressors\nregret\nregretful\nregretfully\nregretfulness\nregretless\nregrets\nregrettable\nregrettably\nregretted\nregretter\nregretters\nregretting\nregrew\nregrind\nregrinding\nregrinds\nregroom\nregroomed\nregrooming\nregrooms\nregroove\nregrooved\nregrooves\nregrooving\nreground\nregroup\nregrouped\nregrouping\nregroups\nregrow\nregrowing\nregrown\nregrows\nregrowth\nregrowths\nregular\nregularities\nregularity\nregularization\nregularizations\nregularize\nregularized\nregularizer\nregularizers\nregularizes\nregularizing\nregularly\nregulars\nregulate\nregulated\nregulates\nregulating\nregulation\nregulations\nregulative\nregulator\nregulators\nregulatory\nreguli\nreguline\nregulus\nreguluses\nregurgitant\nregurgitate\nregurgitated\nregurgitates\nregurgitating\nregurgitation\nregurgitations\nregurgitative\nrehab\nrehabbed\nrehabber\nrehabbers\nrehabbing\nrehabilitant\nrehabilitants\nrehabilitatable\nrehabilitate\nrehabilitated\nrehabilitates\nrehabilitating\nrehabilitation\nrehabilitations\nrehabilitative\nrehabilitator\nrehabilitators\nrehabs\nrehandle\nrehandled\nrehandles\nrehandling\nrehang\nrehanged\nrehanging\nrehangs\nrehash\nrehashed\nrehashes\nrehashing\nrehear\nreheard\nrehearing\nrehearings\nrehears\nrehearsal\nrehearsals\nrehearse\nrehearsed\nrehearser\nrehearsers\nrehearses\nrehearsing\nreheat\nreheated\nreheating\nreheats\nrehinge\nrehinged\nrehinges\nrehinging\nrehire\nrehired\nrehires\nrehiring\nrehospitalization\nrehospitalizations\nrehospitalize\nrehospitalized\nrehospitalizes\nrehospitalizing\nrehouse\nrehoused\nrehouses\nrehousing\nrehumanize\nrehumanized\nrehumanizes\nrehumanizing\nrehung\nrehydratable\nrehydrate\nrehydrated\nrehydrates\nrehydrating\nrehydration\nrehydrations\nrehypnotize\nrehypnotized\nrehypnotizes\nrehypnotizing\nreich\nreichsmark\nreichsmarks\nreichstag\nreidentified\nreidentifies\nreidentify\nreidentifying\nreification\nreifications\nreificatory\nreified\nreifier\nreifiers\nreifies\nreify\nreifying\nreign\nreigned\nreigning\nreignite\nreignited\nreignites\nreigniting\nreignition\nreigns\nreimage\nreimagine\nreimagined\nreimagines\nreimagining\nreimbursable\nreimburse\nreimbursed\nreimbursement\nreimbursements\nreimburses\nreimbursing\nreimmerse\nreimmersed\nreimmerses\nreimmersing\nreimplant\nreimplantation\nreimplanted\nreimplanting\nreimplants\nreimport\nreimportation\nreimportations\nreimported\nreimporting\nreimports\nreimpose\nreimposed\nreimposes\nreimposing\nreimposition\nreimpositions\nreimpression\nreimpressions\nrein\nreincarnate\nreincarnated\nreincarnates\nreincarnating\nreincarnation\nreincarnations\nreincorporate\nreincorporated\nreincorporates\nreincorporating\nreincorporation\nreincorporations\nreindeer\nreindeers\nreindict\nreindicted\nreindicting\nreindictment\nreindictments\nreindicts\nreindustrialization\nreindustrialize\nreindustrialized\nreindustrializes\nreindustrializing\nreined\nreinfection\nreinfections\nreinfestation\nreinfestations\nreinflate\nreinflated\nreinflates\nreinflating\nreinflation\nreinforce\nreinforceable\nreinforced\nreinforcement\nreinforcements\nreinforcer\nreinforcers\nreinforces\nreinforcing\nreinhabit\nreinhabited\nreinhabiting\nreinhabits\nreining\nreinitialization\nreinitializations\nreinitialize\nreinitialized\nreinitializer\nreinitializers\nreinitializes\nreinitializing\nreinitiate\nreinitiated\nreinitiates\nreinitiating\nreinject\nreinjected\nreinjecting\nreinjection\nreinjections\nreinjects\nreinjure\nreinjured\nreinjures\nreinjuries\nreinjuring\nreinjury\nreink\nreinked\nreinking\nreinks\nreinnervate\nreinnervated\nreinnervates\nreinnervating\nreinnervation\nreinoculate\nreinoculated\nreinoculates\nreinoculating\nreinoculation\nreinoculations\nreins\nreinsert\nreinserted\nreinserting\nreinsertion\nreinsertions\nreinserts\nreinsman\nreinsmen\nreinspect\nreinspected\nreinspecting\nreinspection\nreinspections\nreinspects\nreinspire\nreinspired\nreinspires\nreinspiring\nreinstall\nreinstallation\nreinstalled\nreinstalling\nreinstalls\nreinstate\nreinstated\nreinstatement\nreinstatements\nreinstates\nreinstating\nreinstitute\nreinstituted\nreinstitutes\nreinstituting\nreinstitution\nreinstitutionalization\nreinsurance\nreinsurances\nreinsure\nreinsured\nreinsurer\nreinsurers\nreinsures\nreinsuring\nreintegrate\nreintegrated\nreintegrates\nreintegrating\nreintegration\nreintegrations\nreintegrative\nreinter\nreinterpret\nreinterpretation\nreinterpretations\nreinterpreted\nreinterpreting\nreinterprets\nreinterred\nreinterring\nreinterrogate\nreinterrogated\nreinterrogates\nreinterrogating\nreinterrogation\nreinterrogations\nreinters\nreinterview\nreinterviewed\nreinterviewing\nreinterviews\nreintroduce\nreintroduced\nreintroduces\nreintroducing\nreintroduction\nreintroductions\nreinvade\nreinvaded\nreinvades\nreinvading\nreinvasion\nreinvasions\nreinvent\nreinvented\nreinventing\nreinvention\nreinvents\nreinvest\nreinvested\nreinvestigate\nreinvestigated\nreinvestigates\nreinvestigating\nreinvestigation\nreinvestigations\nreinvesting\nreinvestment\nreinvestments\nreinvests\nreinvigorate\nreinvigorated\nreinvigorates\nreinvigorating\nreinvigoration\nreinvigorations\nreinvigorator\nreinvigorators\nreis\nreissue\nreissued\nreissues\nreissuing\nreiter\nreiterate\nreiterated\nreiterates\nreiterating\nreiteration\nreiterations\nreiterative\nreiteratively\nreiterator\nreiterators\nreith\nrejacket\nrejacketed\nrejacketing\nrejackets\nreject\nrejected\nrejectee\nrejectees\nrejecter\nrejecters\nrejecting\nrejectingly\nrejection\nrejections\nrejective\nrejectivist\nrejector\nrejectors\nrejects\nrejig\nrejigged\nrejigger\nrejiggered\nrejiggering\nrejiggers\nrejigging\nrejigs\nrejoice\nrejoiced\nrejoicer\nrejoicers\nrejoices\nrejoicing\nrejoicingly\nrejoicings\nrejoin\nrejoinder\nrejoinders\nrejoined\nrejoining\nrejoins\nrejudge\nrejudged\nrejudges\nrejudging\nrejuggle\nrejuggled\nrejuggles\nrejuggling\nrejuvenate\nrejuvenated\nrejuvenates\nrejuvenating\nrejuvenation\nrejuvenations\nrejuvenator\nrejuvenators\nrejuvenescence\nrejuvenescences\nrejuvenescent\nrekey\nrekeyboard\nrekeyed\nrekeying\nrekeys\nrekindle\nrekindled\nrekindles\nrekindling\nreknit\nreknits\nreknitted\nreknitting\nrelabel\nrelabeled\nrelabeling\nrelabels\nrelacquer\nrelacquered\nrelacquering\nrelacquers\nrelaid\nrelandscape\nrelandscaped\nrelandscapes\nrelandscaping\nrelapse\nrelapsed\nrelapser\nrelapsers\nrelapses\nrelapsing\nrelatable\nrelate\nrelated\nrelatedly\nrelatedness\nrelater\nrelaters\nrelates\nrelating\nrelation\nrelational\nrelationally\nrelations\nrelationship\nrelationships\nrelative\nrelatively\nrelativeness\nrelatives\nrelativism\nrelativist\nrelativistic\nrelativistically\nrelativists\nrelativity\nrelativize\nrelativized\nrelativizes\nrelativizing\nrelator\nrelators\nrelaunch\nrelaunched\nrelaunches\nrelaunching\nrelax\nrelaxable\nrelaxant\nrelaxants\nrelaxation\nrelaxations\nrelaxed\nrelaxedly\nrelaxedness\nrelaxer\nrelaxers\nrelaxes\nrelaxin\nrelaxing\nrelay\nrelayed\nrelaying\nrelays\nrelearn\nrelearned\nrelearning\nrelearns\nrelearnt\nreleasability\nreleasable\nreleasably\nrelease\nreleased\nreleaser\nreleasers\nreleases\nreleasing\nrelegate\nrelegated\nrelegates\nrelegating\nrelegation\nrelegations\nrelend\nrelending\nrelends\nrelent\nrelented\nrelenting\nrelentless\nrelentlessly\nrelentlessness\nrelents\nrelevance\nrelevancy\nrelevant\nrelevantly\nreliability\nreliable\nreliableness\nreliably\nreliance\nreliant\nreliantly\nrelic\nrelicense\nrelicensed\nrelicenses\nrelicensing\nrelicensure\nrelics\nrelict\nreliction\nrelictions\nrelicts\nrelied\nrelief\nreliefs\nrelier\nreliers\nrelies\nrelievable\nrelieve\nrelieved\nrelievedly\nreliever\nrelievers\nrelieves\nrelieving\nrelievo\nrelievos\nrelight\nrelighted\nrelighting\nrelights\nreligion\nreligionism\nreligionist\nreligionists\nreligionless\nreligions\nreligiose\nreligiosity\nreligious\nreligiously\nreligiousness\nreline\nrelined\nrelines\nrelining\nrelink\nrelinked\nrelinking\nrelinks\nrelinquish\nrelinquished\nrelinquisher\nrelinquishers\nrelinquishes\nrelinquishing\nrelinquishment\nrelinquishments\nreliquaries\nreliquary\nreliquefied\nreliquefies\nreliquefy\nreliquefying\nreliquiae\nrelish\nrelishable\nrelished\nrelishes\nrelishing\nrelit\nrelive\nrelived\nrelives\nreliving\nreload\nreloaded\nreloading\nreloads\nrelocatable\nrelocate\nrelocated\nrelocatee\nrelocatees\nrelocates\nrelocating\nrelocation\nrelocations\nrelock\nrelocked\nrelocking\nrelocks\nrelook\nrelooked\nrelooking\nrelooks\nrelubricate\nrelubricated\nrelubricates\nrelubricating\nrelubrication\nrelubrications\nrelucent\nreluct\nreluctance\nreluctancy\nreluctant\nreluctantly\nreluctate\nreluctated\nreluctates\nreluctating\nreluctation\nreluctations\nrelucted\nrelucting\nreluctivity\nrelucts\nrelume\nrelumed\nrelumes\nreluming\nrely\nrelying\nrem\nremade\nremain\nremainder\nremaindered\nremaindering\nremainders\nremained\nremaining\nremains\nremake\nremaker\nremakers\nremakes\nremaking\nreman\nremand\nremanded\nremanding\nremandment\nremandments\nremands\nremanence\nremanent\nremanned\nremanning\nremans\nremanufacture\nremanufactured\nremanufacturer\nremanufacturers\nremanufactures\nremanufacturing\nremap\nremapped\nremapping\nremaps\nremark\nremarkable\nremarkableness\nremarkably\nremarked\nremarker\nremarkers\nremarket\nremarketed\nremarketing\nremarkets\nremarking\nremarks\nremarque\nremarques\nremarriage\nremarriages\nremarried\nremarries\nremarry\nremarrying\nremaster\nremastered\nremastering\nremasters\nrematch\nrematches\nremate\nremated\nrematerialize\nrematerialized\nrematerializes\nrematerializing\nremates\nremating\nrembrandt\nremeasure\nremeasured\nremeasurement\nremeasurements\nremeasures\nremeasuring\nremediability\nremediable\nremediableness\nremediably\nremedial\nremedially\nremediate\nremediated\nremediates\nremediating\nremediation\nremediations\nremedied\nremedies\nremediless\nremedy\nremedying\nremeet\nremeeting\nremeets\nremelt\nremelted\nremelting\nremelts\nremember\nrememberability\nrememberable\nremembered\nrememberer\nrememberers\nremembering\nremembers\nremembrance\nremembrancer\nremembrancers\nremembrances\nremerge\nremerged\nremerges\nremerging\nremet\nremex\nremiges\nremigial\nremigration\nremigrations\nremilitarization\nremilitarizations\nremilitarize\nremilitarized\nremilitarizes\nremilitarizing\nremind\nreminded\nreminder\nreminders\nremindful\nreminding\nreminds\nremington\nreminisce\nreminisced\nreminiscence\nreminiscences\nreminiscent\nreminiscential\nreminiscently\nreminiscer\nreminiscers\nreminisces\nreminiscing\nremint\nreminted\nreminting\nremints\nremise\nremised\nremises\nremising\nremiss\nremissibility\nremissible\nremissibly\nremission\nremissions\nremissly\nremissness\nremit\nremitment\nremitments\nremits\nremittable\nremittal\nremittals\nremittance\nremittances\nremitted\nremittence\nremittency\nremittent\nremittently\nremitter\nremitters\nremitting\nremix\nremixed\nremixes\nremixing\nremnant\nremnants\nremo\nremobilization\nremobilizations\nremobilize\nremobilized\nremobilizes\nremobilizing\nremodel\nremodeled\nremodeler\nremodelers\nremodeling\nremodelled\nremodelling\nremodels\nremodification\nremodifications\nremodified\nremodifies\nremodify\nremodifying\nremoisten\nremoistened\nremoistening\nremoistens\nremold\nremolded\nremolding\nremolds\nremonetization\nremonetizations\nremonetize\nremonetized\nremonetizes\nremonetizing\nremonstrance\nremonstrances\nremonstrant\nremonstrantly\nremonstrants\nremonstrate\nremonstrated\nremonstrates\nremonstrating\nremonstration\nremonstrations\nremonstrative\nremonstratively\nremonstrator\nremonstrators\nremora\nremoras\nremorse\nremorseful\nremorsefully\nremorsefulness\nremorseless\nremorselessly\nremorselessness\nremote\nremotely\nremoteness\nremoter\nremotes\nremotest\nremotion\nremotions\nremotivate\nremotivated\nremotivates\nremotivating\nremotivation\nremotivations\nremoulins\nremount\nremounted\nremounting\nremounts\nremovability\nremovable\nremovableness\nremovably\nremoval\nremovals\nremove\nremoved\nremovedly\nremovedness\nremover\nremovers\nremoves\nremoving\nrems\nremuda\nremudas\nremunerability\nremunerable\nremunerably\nremunerate\nremunerated\nremunerates\nremunerating\nremuneration\nremunerations\nremunerative\nremuneratively\nremunerativeness\nremunerator\nremunerators\nremuneratory\nremus\nremy\nremythologize\nremythologized\nremythologizes\nremythologizing\nrenail\nrenailed\nrenailing\nrenails\nrenaissance\nrenal\nrename\nrenamed\nrenames\nrenaming\nrenascence\nrenascences\nrenascent\nrenationalization\nrenationalizations\nrenationalize\nrenationalized\nrenationalizes\nrenationalizing\nrenaturation\nrenaturations\nrenature\nrenatured\nrenatures\nrenaturing\nrencontre\nrencontres\nrencounter\nrencountered\nrencountering\nrencounters\nrend\nrended\nrender\nrenderable\nrendered\nrenderer\nrenderers\nrendering\nrenderings\nrenders\nrendezvous\nrendezvoused\nrendezvousing\nrending\nrendition\nrenditions\nrends\nrendzina\nrendzinas\nrenegade\nrenegaded\nrenegades\nrenegading\nrenege\nreneged\nreneger\nrenegers\nreneges\nreneging\nrenegotiable\nrenegotiate\nrenegotiated\nrenegotiates\nrenegotiating\nrenegotiation\nrenegotiations\nrenest\nrenested\nrenesting\nrenests\nrenew\nrenewability\nrenewable\nrenewably\nrenewal\nrenewals\nrenewed\nrenewedly\nrenewer\nrenewers\nrenewing\nrenews\nreniform\nrenin\nrenins\nrenitence\nrenitency\nrenitent\nrenminbi\nrennet\nrennin\nrenninogen\nrenninogens\nreno\nrenogram\nrenograms\nrenographic\nrenography\nrenoir\nrenominate\nrenominated\nrenominates\nrenominating\nrenomination\nrenominations\nrenormalization\nrenormalizations\nrenormalize\nrenormalized\nrenormalizes\nrenormalizing\nrenounce\nrenounced\nrenouncement\nrenouncements\nrenouncer\nrenouncers\nrenounces\nrenouncing\nrenovascular\nrenovate\nrenovated\nrenovates\nrenovating\nrenovation\nrenovations\nrenovative\nrenovator\nrenovators\nrenown\nrenowned\nrent\nrentability\nrentable\nrental\nrentals\nrented\nrenter\nrenters\nrentier\nrentiers\nrenting\nrents\nrenumber\nrenumbered\nrenumbering\nrenumbers\nrenunciation\nrenunciations\nrenunciative\nrenunciatory\nreobserve\nreobserved\nreobserves\nreobserving\nreoccupation\nreoccupied\nreoccupies\nreoccupy\nreoccupying\nreoccur\nreoccurred\nreoccurrence\nreoccurrences\nreoccurring\nreoccurs\nreoffer\nreoffered\nreoffering\nreoffers\nreoil\nreoiled\nreoiling\nreoils\nreopen\nreopened\nreopening\nreopens\nreoperate\nreoperated\nreoperates\nreoperating\nreoperation\nreoperations\nreorchestrate\nreorchestrated\nreorchestrates\nreorchestrating\nreorchestration\nreorchestrations\nreorder\nreordered\nreordering\nreorders\nreorganization\nreorganizational\nreorganizations\nreorganize\nreorganized\nreorganizer\nreorganizers\nreorganizes\nreorganizing\nreorient\nreorientate\nreorientated\nreorientates\nreorientating\nreorientation\nreorientations\nreoriented\nreorienting\nreorients\nreoutfit\nreoutfits\nreoutfitted\nreoutfitting\nreovirus\nreoviruses\nreoxidation\nreoxidations\nreoxidize\nreoxidized\nreoxidizes\nreoxidizing\nrep\nrepack\nrepackage\nrepackaged\nrepackager\nrepackagers\nrepackages\nrepackaging\nrepacked\nrepacking\nrepacks\nrepaginate\nrepaginated\nrepaginates\nrepaginating\nrepagination\nrepaid\nrepaint\nrepainted\nrepainting\nrepaints\nrepair\nrepairability\nrepairable\nrepairably\nrepaired\nrepairer\nrepairers\nrepairing\nrepairman\nrepairmen\nrepairperson\nrepairpersons\nrepairs\nrepairwoman\nrepairwomen\nrepand\nreparability\nreparable\nreparably\nreparation\nreparations\nreparative\nreparatory\nrepark\nreparked\nreparking\nreparks\nrepartee\nrepartees\nrepartition\nrepartitioned\nrepartitioning\nrepartitions\nrepass\nrepassage\nrepassages\nrepassed\nrepasses\nrepassing\nrepast\nrepasted\nrepasting\nrepasts\nrepatch\nrepatched\nrepatches\nrepatching\nrepatriate\nrepatriated\nrepatriates\nrepatriating\nrepatriation\nrepatriations\nrepattern\nrepatterned\nrepatterning\nrepatterns\nrepave\nrepaved\nrepaves\nrepaving\nrepay\nrepayable\nrepaying\nrepayment\nrepayments\nrepays\nrepeal\nrepealable\nrepealed\nrepealer\nrepealers\nrepealing\nrepeals\nrepeat\nrepeatability\nrepeatable\nrepeated\nrepeatedly\nrepeater\nrepeaters\nrepeating\nrepeats\nrepechage\nrepechages\nrepeg\nrepegged\nrepegging\nrepegs\nrepel\nrepellant\nrepelled\nrepellence\nrepellency\nrepellent\nrepellently\nrepellents\nrepeller\nrepellers\nrepelling\nrepels\nrepent\nrepentance\nrepentant\nrepentantly\nrepented\nrepenter\nrepenters\nrepenting\nrepents\nrepeople\nrepeopled\nrepeoples\nrepeopling\nrepercussion\nrepercussions\nrepercussive\nrepertoire\nrepertoires\nrepertorial\nrepertories\nrepertory\nrepetend\nrepetends\nrepetition\nrepetitional\nrepetitions\nrepetitious\nrepetitiously\nrepetitiousness\nrepetitive\nrepetitively\nrepetitiveness\nrephotograph\nrephotographed\nrephotographing\nrephotographs\nrephrase\nrephrased\nrephrases\nrephrasing\nrepine\nrepined\nrepiner\nrepiners\nrepines\nrepining\nreplace\nreplaceable\nreplaced\nreplacement\nreplacements\nreplacer\nreplacers\nreplaces\nreplacing\nreplan\nreplanned\nreplanning\nreplans\nreplant\nreplantation\nreplantations\nreplanted\nreplanting\nreplants\nreplaster\nreplastered\nreplastering\nreplasters\nreplate\nreplated\nreplates\nreplating\nreplay\nreplayed\nreplaying\nreplays\nrepleader\nrepleaders\nrepledge\nrepledged\nrepledges\nrepledging\nreplenish\nreplenishable\nreplenished\nreplenisher\nreplenishers\nreplenishes\nreplenishing\nreplenishment\nreplenishments\nreplete\nrepleteness\nrepletion\nrepleviable\nreplevied\nreplevies\nreplevin\nreplevined\nreplevines\nreplevining\nreplevins\nreplevy\nreplevying\nreplica\nreplicability\nreplicable\nreplicas\nreplicase\nreplicases\nreplicate\nreplicated\nreplicates\nreplicating\nreplication\nreplications\nreplicative\nreplicon\nreplicons\nreplied\nreplier\nrepliers\nreplies\nreplot\nreplots\nreplotted\nreplotting\nreplumb\nreplumbed\nreplumbing\nreplumbs\nreply\nreplying\nrepo\nrepolarization\nrepolarizations\nrepolarize\nrepolarized\nrepolarizes\nrepolarizing\nrepolish\nrepolished\nrepolishes\nrepolishing\nrepoll\nrepolled\nrepolling\nrepolls\nrepopularize\nrepopularized\nrepopularizes\nrepopularizing\nrepopulate\nrepopulated\nrepopulates\nrepopulating\nrepopulation\nreport\nreportable\nreportage\nreported\nreportedly\nreporter\nreporters\nreporting\nreportorial\nreportorially\nreports\nrepos\nreposal\nreposals\nrepose\nreposed\nreposeful\nreposefully\nreposefulness\nreposer\nreposers\nreposes\nreposing\nreposit\nreposited\nrepositing\nreposition\nrepositioned\nrepositioning\nrepositions\nrepositories\nrepository\nreposits\nrepossess\nrepossessed\nrepossesses\nrepossessing\nrepossession\nrepossessions\nrepossessor\nrepossessors\nrepot\nrepots\nrepotted\nrepotting\nrepoussé\nrepower\nrepowered\nrepowering\nrepowers\nrepp\nrepps\nreprehend\nreprehended\nreprehending\nreprehends\nreprehensibility\nreprehensible\nreprehensibleness\nreprehensibly\nreprehension\nreprehensions\nreprehensive\nrepresent\nrepresentability\nrepresentable\nrepresentation\nrepresentational\nrepresentationalism\nrepresentationalist\nrepresentationalists\nrepresentationally\nrepresentations\nrepresentative\nrepresentatively\nrepresentativeness\nrepresentatives\nrepresentativity\nrepresented\nrepresenter\nrepresenters\nrepresenting\nrepresents\nrepress\nrepressed\nrepresser\nrepressers\nrepresses\nrepressibility\nrepressible\nrepressing\nrepression\nrepressionist\nrepressionists\nrepressions\nrepressive\nrepressively\nrepressiveness\nrepressor\nrepressors\nrepressurize\nrepressurized\nrepressurizes\nrepressurizing\nreprice\nrepriced\nreprices\nrepricing\nreprievable\nreprieval\nreprievals\nreprieve\nreprieved\nreprieves\nreprieving\nreprimand\nreprimanded\nreprimanding\nreprimands\nreprint\nreprinted\nreprinter\nreprinters\nreprinting\nreprints\nreprisal\nreprisals\nreprise\nreprised\nreprises\nreprising\nrepristinate\nrepristinated\nrepristinates\nrepristinating\nrepristination\nrepristinations\nreprivatization\nreprivatizations\nreprivatize\nreprivatized\nreprivatizes\nreprivatizing\nrepro\nreproach\nreproachable\nreproachableness\nreproachably\nreproached\nreproacher\nreproachers\nreproaches\nreproachful\nreproachfully\nreproachfulness\nreproaching\nreproachingly\nreprobance\nreprobances\nreprobate\nreprobated\nreprobates\nreprobating\nreprobation\nreprobations\nreprobative\nreprobatory\nreprocess\nreprocessed\nreprocesses\nreprocessing\nreproduce\nreproduced\nreproducer\nreproducers\nreproduces\nreproducibility\nreproducible\nreproducibly\nreproducing\nreproduction\nreproductions\nreproductive\nreproductively\nreproductiveness\nreproductives\nreprogram\nreprogramed\nreprograming\nreprogrammability\nreprogrammable\nreprogrammed\nreprogramming\nreprograms\nreprographer\nreprographers\nreprographic\nreprographics\nreprography\nreproof\nreproofing\nreproofs\nrepros\nreprovable\nreprove\nreproved\nreprover\nreprovers\nreproves\nreproving\nreprovingly\nreprovision\nreprovisioned\nreprovisioning\nreprovisions\nreps\nreptant\nreptile\nreptilelike\nreptiles\nreptilia\nreptilian\nreptilians\nreptilium\nrepublic\nrepublican\nrepublicanism\nrepublicanization\nrepublicanizations\nrepublicanize\nrepublicanized\nrepublicanizes\nrepublicanizing\nrepublicans\nrepublication\nrepublications\nrepublics\nrepublish\nrepublished\nrepublisher\nrepublishers\nrepublishes\nrepublishing\nrepudiate\nrepudiated\nrepudiates\nrepudiating\nrepudiation\nrepudiationist\nrepudiationists\nrepudiations\nrepudiative\nrepudiator\nrepudiators\nrepugn\nrepugnance\nrepugnancies\nrepugnancy\nrepugnant\nrepugnantly\nrepugned\nrepugning\nrepugns\nrepulse\nrepulsed\nrepulser\nrepulsers\nrepulses\nrepulsing\nrepulsion\nrepulsions\nrepulsive\nrepulsively\nrepulsiveness\nrepump\nrepumped\nrepumping\nrepumps\nrepunctuation\nrepurchase\nrepurchased\nrepurchases\nrepurchasing\nrepurified\nrepurifies\nrepurify\nrepurifying\nreputability\nreputable\nreputably\nreputation\nreputational\nreputations\nrepute\nreputed\nreputedly\nreputes\nreputing\nrequest\nrequested\nrequester\nrequesters\nrequesting\nrequestor\nrequestors\nrequests\nrequiem\nrequiems\nrequiescat\nrequiescats\nrequirable\nrequire\nrequired\nrequirement\nrequirements\nrequirer\nrequirers\nrequires\nrequiring\nrequisite\nrequisitely\nrequisiteness\nrequisites\nrequisition\nrequisitioned\nrequisitioning\nrequisitions\nrequitable\nrequital\nrequitals\nrequite\nrequited\nrequiter\nrequiters\nrequites\nrequiting\nrerack\nreracked\nreracking\nreracks\nreradiate\nreradiated\nreradiates\nreradiating\nreradiation\nreradiations\nreraise\nreraised\nreraises\nreraising\nreran\nreread\nrereading\nrereadings\nrereads\nrerecord\nrerecorded\nrerecording\nrerecords\nreredos\nreredoses\nreregister\nreregistered\nreregistering\nreregisters\nreregistration\nreregistrations\nreregulate\nreregulated\nreregulates\nreregulating\nreregulation\nrerelease\nrereleased\nrereleases\nrereleasing\nreremind\nrereminded\nrereminding\nrereminds\nrerepeat\nrerepeated\nrerepeating\nrerepeats\nrereview\nrereviewed\nrereviewing\nrereviews\nrereward\nrerewards\nrerig\nrerigged\nrerigging\nrerigs\nreroof\nreroofed\nreroofing\nreroofs\nreroute\nrerouted\nreroutes\nrerouting\nrerun\nrerunning\nreruns\nres\nresail\nresailed\nresailing\nresails\nresalable\nresale\nresales\nresample\nresampled\nresamples\nresampling\nresat\nresaw\nresawed\nresawing\nresawn\nresaws\nrescale\nrescaled\nrescales\nrescaling\nrescan\nrescanned\nrescanning\nrescans\nreschedule\nrescheduled\nreschedules\nrescheduling\nreschool\nreschooled\nreschooling\nreschools\nrescind\nrescindable\nrescinded\nrescinder\nrescinders\nrescinding\nrescindment\nrescindments\nrescinds\nrescission\nrescissions\nrescissory\nrescore\nrescored\nrescores\nrescoring\nrescreen\nrescreened\nrescreening\nrescreens\nrescript\nrescripts\nrescuable\nrescue\nrescued\nrescuer\nrescuers\nrescues\nrescuing\nresculpt\nresculpted\nresculpting\nresculpts\nreseal\nresealable\nresealed\nresealing\nreseals\nresearch\nresearchable\nresearched\nresearcher\nresearchers\nresearches\nresearching\nresearchist\nresearchists\nreseason\nreseasoned\nreseasoning\nreseasons\nreseat\nreseated\nreseating\nreseats\nreseau\nresect\nresectability\nresectable\nresected\nresecting\nresection\nresections\nresectoscope\nresectoscopes\nresects\nresecure\nresecured\nresecures\nresecuring\nreseda\nresedas\nresee\nreseed\nreseeded\nreseeding\nreseeds\nreseeing\nreseen\nresees\nresegregate\nresegregated\nresegregates\nresegregating\nresegregation\nresegregations\nreselect\nreselected\nreselecting\nreselection\nreselections\nreselects\nresell\nreseller\nresellers\nreselling\nresells\nresemblance\nresemblances\nresemblant\nresemble\nresembled\nresembler\nresemblers\nresembles\nresembling\nresend\nresending\nresends\nresensitize\nresensitized\nresensitizes\nresensitizing\nresent\nresented\nresentence\nresentenced\nresentences\nresentencing\nresentful\nresentfully\nresentfulness\nresenting\nresentment\nresentments\nresents\nreserpine\nreserpines\nreservable\nreservation\nreservationist\nreservationists\nreservations\nreserve\nreserved\nreservedly\nreservedness\nreserver\nreservers\nreserves\nreservice\nreserviced\nreservices\nreservicing\nreserving\nreservist\nreservists\nreservoir\nreservoirs\nreset\nresets\nresettable\nresetter\nresetters\nresetting\nresettle\nresettled\nresettlement\nresettlements\nresettles\nresettling\nresew\nresewed\nresewing\nresewn\nresews\nresh\nreshape\nreshaped\nreshaper\nreshapers\nreshapes\nreshaping\nreshes\nreshingle\nreshingled\nreshingles\nreshingling\nreship\nreshipment\nreshipments\nreshipped\nreshipping\nreships\nreshod\nreshoe\nreshoed\nreshoeing\nreshoes\nreshoot\nreshooting\nreshoots\nreshot\nreshow\nreshowed\nreshowing\nreshown\nreshows\nreshuffle\nreshuffled\nreshuffles\nreshuffling\nresid\nreside\nresided\nresidence\nresidences\nresidencies\nresidency\nresident\nresidential\nresidentially\nresidentiaries\nresidentiary\nresidents\nresider\nresiders\nresides\nresiding\nresids\nresidua\nresidual\nresidually\nresiduals\nresiduary\nresidue\nresidues\nresiduum\nresift\nresifted\nresifting\nresifts\nresight\nresighted\nresighting\nresights\nresign\nresignation\nresignations\nresigned\nresignedly\nresignedness\nresigner\nresigners\nresigning\nresigns\nresile\nresiled\nresiles\nresilience\nresiliency\nresilient\nresiliently\nresilin\nresiling\nresilins\nresilver\nresilvered\nresilvering\nresilvers\nresin\nresinate\nresinated\nresinates\nresinating\nresined\nresines\nresiniferous\nresining\nresinoid\nresinoids\nresinous\nresins\nresist\nresistance\nresistances\nresistant\nresisted\nresister\nresisters\nresistibility\nresistible\nresistibly\nresisting\nresistive\nresistively\nresistiveness\nresistivities\nresistivity\nresistless\nresistlessly\nresistlessness\nresistor\nresistors\nresists\nresit\nresite\nresited\nresites\nresiting\nresits\nresitting\nresittings\nresituate\nresituated\nresituates\nresituating\nresize\nresized\nresizes\nresizing\nreslate\nreslated\nreslates\nreslating\nresoak\nresoaked\nresoaking\nresoaks\nresocialization\nresocialize\nresocialized\nresocializes\nresocializing\nresod\nresodded\nresodding\nresods\nresold\nresolder\nresoldered\nresoldering\nresolders\nresole\nresoled\nresoles\nresolidification\nresolidified\nresolidifies\nresolidify\nresolidifying\nresoling\nresolubility\nresoluble\nresolubleness\nresolute\nresolutely\nresoluteness\nresolution\nresolutions\nresolvability\nresolvable\nresolvableness\nresolve\nresolved\nresolvedly\nresolvent\nresolvents\nresolver\nresolvers\nresolves\nresolving\nresonance\nresonances\nresonant\nresonantly\nresonate\nresonated\nresonates\nresonating\nresonation\nresonations\nresonator\nresonators\nresorb\nresorbed\nresorbing\nresorbs\nresorcin\nresorcinol\nresorcinols\nresorcins\nresorption\nresorptions\nresorptive\nresort\nresorted\nresorter\nresorters\nresorting\nresorts\nresound\nresounded\nresounding\nresoundingly\nresounds\nresource\nresourceful\nresourcefully\nresourcefulness\nresources\nresow\nresowed\nresowing\nresown\nresows\nrespect\nrespectability\nrespectable\nrespectableness\nrespectably\nrespected\nrespecter\nrespecters\nrespectful\nrespectfully\nrespectfulness\nrespecting\nrespective\nrespectively\nrespectiveness\nrespects\nrespell\nrespelled\nrespelling\nrespells\nrespelt\nrespirability\nrespirable\nrespiration\nrespirational\nrespirations\nrespirator\nrespirators\nrespiratory\nrespire\nrespired\nrespires\nrespiring\nrespiritualize\nrespiritualized\nrespiritualizes\nrespiritualizing\nrespirometer\nrespirometers\nrespirometric\nrespirometry\nrespite\nrespited\nrespites\nrespiting\nresplendence\nresplendency\nresplendent\nresplendently\nrespond\nresponded\nrespondence\nrespondency\nrespondent\nrespondents\nresponder\nresponders\nresponding\nresponds\nresponsa\nresponse\nresponses\nresponsibilities\nresponsibility\nresponsible\nresponsibleness\nresponsibly\nresponsions\nresponsive\nresponsively\nresponsiveness\nresponsorial\nresponsories\nresponsory\nresponsum\nrespot\nrespots\nrespotted\nrespotting\nrespray\nresprayed\nrespraying\nresprays\nrespring\nrespringing\nresprings\nresprout\nresprouted\nresprouting\nresprouts\nresprung\nressentiment\nressentiments\nrest\nrestabilize\nrestabilized\nrestabilizes\nrestabilizing\nrestack\nrestacked\nrestacking\nrestacks\nrestage\nrestaged\nrestages\nrestaging\nrestamp\nrestamped\nrestamping\nrestamps\nrestante\nrestart\nrestartable\nrestarted\nrestarting\nrestarts\nrestate\nrestated\nrestatement\nrestatements\nrestates\nrestating\nrestaurant\nrestauranteur\nrestauranteurs\nrestaurants\nrestaurateur\nrestaurateurs\nrested\nrester\nresters\nrestful\nrestfully\nrestfulness\nrestharrow\nrestharrows\nrestick\nresticking\nresticks\nrestiform\nrestimulate\nrestimulated\nrestimulates\nrestimulating\nrestimulation\nresting\nrestitute\nrestituted\nrestitutes\nrestituting\nrestitution\nrestitutions\nrestive\nrestively\nrestiveness\nrestless\nrestlessly\nrestlessness\nrestock\nrestocked\nrestocking\nrestocks\nrestoke\nrestoked\nrestokes\nrestoking\nrestorability\nrestorable\nrestoral\nrestorals\nrestoration\nrestorations\nrestorative\nrestoratively\nrestorativeness\nrestoratives\nrestore\nrestored\nrestorer\nrestorers\nrestores\nrestoring\nrestrain\nrestrainable\nrestrained\nrestrainedly\nrestrainer\nrestrainers\nrestraining\nrestrains\nrestraint\nrestraints\nrestrengthen\nrestrengthened\nrestrengthening\nrestrengthens\nrestress\nrestressed\nrestresses\nrestressing\nrestrict\nrestricted\nrestrictedly\nrestricter\nrestricters\nrestricting\nrestriction\nrestrictionism\nrestrictionist\nrestrictionists\nrestrictions\nrestrictive\nrestrictively\nrestrictiveness\nrestrictor\nrestrictors\nrestricts\nrestrike\nrestrikes\nrestriking\nrestring\nrestringing\nrestrings\nrestroom\nrestrooms\nrestruck\nrestructure\nrestructured\nrestructures\nrestructuring\nrestrung\nrests\nrestuck\nrestudied\nrestudies\nrestudy\nrestudying\nrestuff\nrestuffed\nrestuffing\nrestuffs\nrestyle\nrestyled\nrestyles\nrestyling\nresublime\nresublimed\nresublimes\nresubliming\nresubmission\nresubmissions\nresubmit\nresubmits\nresubmitted\nresubmitting\nresult\nresultant\nresultantly\nresultants\nresulted\nresultful\nresultfulness\nresulting\nresultless\nresults\nresumable\nresume\nresumed\nresumer\nresumers\nresumes\nresuming\nresummon\nresummoned\nresummoning\nresummons\nresumption\nresumptions\nresumé\nresumés\nresupinate\nresupination\nresupinations\nresupine\nresupplied\nresupplies\nresupply\nresupplying\nresurface\nresurfaced\nresurfacer\nresurfacers\nresurfaces\nresurfacing\nresurge\nresurged\nresurgence\nresurgent\nresurgently\nresurges\nresurging\nresurrect\nresurrected\nresurrecting\nresurrection\nresurrectional\nresurrectionist\nresurrectionists\nresurrections\nresurrector\nresurrectors\nresurrects\nresurvey\nresurveyed\nresurveying\nresurveys\nresuscitable\nresuscitate\nresuscitated\nresuscitates\nresuscitating\nresuscitation\nresuscitations\nresuscitative\nresuscitator\nresuscitators\nresveratrol\nresynchronization\nresynchronize\nresyntheses\nresynthesis\nresynthesize\nresynthesized\nresynthesizes\nresynthesizing\nresystematize\nresystematized\nresystematizes\nresystematizing\nret\nretable\nretables\nretackle\nretackled\nretackles\nretackling\nretag\nretagged\nretagging\nretags\nretail\nretailed\nretailer\nretailers\nretailing\nretails\nretain\nretainability\nretainable\nretained\nretainer\nretainers\nretaining\nretainment\nretainments\nretains\nretake\nretaken\nretakes\nretaking\nretaliate\nretaliated\nretaliates\nretaliating\nretaliation\nretaliations\nretaliative\nretaliator\nretaliators\nretaliatory\nretard\nretardant\nretardants\nretardate\nretardates\nretardation\nretardations\nretarded\nretarder\nretarders\nretarding\nretards\nretarget\nretargeted\nretargeting\nretargets\nretaste\nretasted\nretastes\nretasting\nretaught\nretch\nretched\nretches\nretching\nrete\nreteach\nreteaches\nreteaching\nreteam\nreteamed\nreteaming\nreteams\nretell\nretelling\nretellings\nretells\nretene\nretenes\nretention\nretentions\nretentive\nretentively\nretentiveness\nretentivity\nretest\nretested\nretesting\nretests\nretexture\nretextured\nretextures\nretexturing\nrethink\nrethinker\nrethinkers\nrethinking\nrethinks\nrethought\nrethread\nrethreaded\nrethreading\nrethreads\nretia\nretiary\nreticence\nreticencies\nreticency\nreticent\nreticently\nreticle\nreticles\nreticula\nreticular\nreticulate\nreticulated\nreticulately\nreticulates\nreticulating\nreticulation\nreticulations\nreticule\nreticules\nreticulocyte\nreticulocytes\nreticulocytic\nreticuloendothelial\nreticulum\nretie\nretied\nreties\nretiform\nretighten\nretightened\nretightening\nretightens\nretile\nretiled\nretiles\nretiling\nretime\nretimed\nretimes\nretiming\nretina\nretinacula\nretinacular\nretinaculum\nretinae\nretinal\nretinas\nretinene\nretinenes\nretinitis\nretinoblastoma\nretinoblastomas\nretinoblastomata\nretinoic\nretinoid\nretinoids\nretinol\nretinols\nretinopathic\nretinopathies\nretinopathy\nretinoscope\nretinoscopes\nretinoscopic\nretinoscopies\nretinoscopy\nretinotectal\nretinue\nretinues\nretinula\nretinulae\nretinular\nretirant\nretirants\nretire\nretired\nretiredly\nretiredness\nretiree\nretirees\nretirement\nretirements\nretires\nretiring\nretiringly\nretiringness\nretold\nretook\nretool\nretooled\nretooling\nretools\nretorsion\nretorsions\nretort\nretorted\nretorter\nretorters\nretorting\nretortion\nretortions\nretorts\nretouch\nretouched\nretoucher\nretouchers\nretouches\nretouching\nretrace\nretraceable\nretraced\nretracement\nretracements\nretracer\nretracers\nretraces\nretracing\nretract\nretractability\nretractable\nretractation\nretractations\nretracted\nretractibility\nretractible\nretractile\nretractility\nretracting\nretraction\nretractions\nretractive\nretractively\nretractiveness\nretractor\nretractors\nretracts\nretrain\nretrainable\nretrained\nretrainee\nretrainees\nretraining\nretrains\nretral\nretrally\nretransfer\nretransferred\nretransferring\nretransfers\nretransform\nretransformation\nretransformations\nretransformed\nretransforming\nretransforms\nretranslate\nretranslated\nretranslates\nretranslating\nretranslation\nretranslations\nretransmission\nretransmissions\nretransmit\nretransmits\nretransmitted\nretransmitting\nretread\nretreaded\nretreading\nretreads\nretreat\nretreatant\nretreatants\nretreated\nretreater\nretreaters\nretreating\nretreats\nretrench\nretrenched\nretrencher\nretrenchers\nretrenches\nretrenching\nretrenchment\nretrenchments\nretrial\nretrials\nretribution\nretributions\nretributive\nretributively\nretributory\nretried\nretries\nretrievability\nretrievable\nretrievably\nretrieval\nretrievals\nretrieve\nretrieved\nretriever\nretrievers\nretrieves\nretrieving\nretro\nretroact\nretroacted\nretroacting\nretroaction\nretroactions\nretroactive\nretroactively\nretroactivity\nretroacts\nretrocede\nretroceded\nretrocedes\nretroceding\nretrocession\nretrocessions\nretrodict\nretrodicted\nretrodicting\nretrodiction\nretrodictions\nretrodictive\nretrodicts\nretrofire\nretrofired\nretrofires\nretrofiring\nretrofit\nretrofits\nretrofittable\nretrofitted\nretrofitter\nretrofitters\nretrofitting\nretroflection\nretroflections\nretroflex\nretroflexed\nretroflexes\nretroflexion\nretroflexions\nretrogradation\nretrogradations\nretrograde\nretrograded\nretrogradely\nretrogrades\nretrograding\nretrogress\nretrogressed\nretrogresses\nretrogressing\nretrogression\nretrogressions\nretrogressive\nretrogressively\nretrolental\nretroocular\nretropack\nretropacks\nretroperitoneal\nretroperitoneally\nretropharyngeal\nretroreflection\nretroreflections\nretroreflective\nretroreflector\nretroreflectors\nretrorocket\nretrorockets\nretrorse\nretrorsely\nretros\nretrospect\nretrospected\nretrospecting\nretrospection\nretrospections\nretrospective\nretrospectively\nretrospectives\nretrospects\nretroussé\nretroversion\nretroversions\nretroviral\nretrovirus\nretroviruses\nretry\nretrying\nrets\nretsina\nretted\nretting\nretune\nretuned\nretunes\nretuning\nreturn\nreturnable\nreturnables\nreturned\nreturnee\nreturnees\nreturner\nreturners\nreturning\nreturns\nretuse\nretying\nretype\nretyped\nretypes\nretyping\nreuben\nreunification\nreunifications\nreunified\nreunifies\nreunify\nreunifying\nreunion\nreunionism\nreunionist\nreunionistic\nreunionists\nreunions\nreunite\nreunited\nreunites\nreuniting\nreupholster\nreupholstered\nreupholstering\nreupholsters\nreusability\nreusable\nreuse\nreused\nreuses\nreusing\nreuter\nreutilization\nreutilize\nreutilized\nreutilizes\nreutilizing\nrev\nrevaccinate\nrevaccinated\nrevaccinates\nrevaccinating\nrevaccination\nrevaccinations\nrevalidate\nrevalidated\nrevalidates\nrevalidating\nrevalidation\nrevalidations\nrevalorization\nrevalorizations\nrevalorize\nrevalorized\nrevalorizes\nrevalorizing\nrevaluate\nrevaluated\nrevaluates\nrevaluating\nrevaluation\nrevaluations\nrevalue\nrevalued\nrevalues\nrevaluing\nrevamp\nrevamped\nrevamping\nrevampment\nrevampments\nrevamps\nrevanche\nrevanches\nrevanchism\nrevanchist\nrevanchistic\nrevanchists\nrevascularization\nrevascularizations\nreveal\nrevealable\nrevealed\nrevealer\nrevealers\nrevealing\nrevealingly\nrevealment\nrevealments\nreveals\nrevegetate\nrevegetated\nrevegetates\nrevegetating\nrevegetation\nrevegetations\nreveille\nreveilles\nrevel\nrevelation\nrevelations\nrevelator\nrevelators\nrevelatory\nreveled\nreveler\nrevelers\nreveling\nrevelled\nreveller\nrevellers\nrevelling\nrevelries\nrevelrous\nrevelry\nrevels\nrevenant\nrevenants\nrevenge\nrevenged\nrevengeful\nrevengefully\nrevengefulness\nrevenger\nrevengers\nrevenges\nrevenging\nrevenue\nrevenuer\nrevenuers\nrevenues\nreverb\nreverbed\nreverberant\nreverberantly\nreverberate\nreverberated\nreverberates\nreverberating\nreverberation\nreverberations\nreverberative\nreverberatively\nreverberator\nreverberatories\nreverberators\nreverberatory\nreverbing\nreverbs\nrevere\nrevered\nreverence\nreverenced\nreverencer\nreverencers\nreverences\nreverencing\nreverend\nreverends\nreverent\nreverential\nreverentially\nreverently\nreveres\nreverie\nreveries\nreverification\nrevering\nrevers\nreversal\nreversals\nreverse\nreversed\nreversely\nreverser\nreversers\nreverses\nreversibility\nreversible\nreversibleness\nreversibles\nreversibly\nreversing\nreversion\nreversional\nreversionary\nreversioner\nreversioners\nreversions\nrevert\nrevertant\nrevertants\nreverted\nreverter\nreverters\nrevertible\nreverting\nrevertive\nreverts\nrevery\nrevest\nrevested\nrevesting\nrevests\nrevet\nrevetment\nrevetments\nrevets\nrevetted\nrevetting\nrevictual\nrevictualed\nrevictualing\nrevictuals\nreview\nreviewable\nreviewed\nreviewer\nreviewers\nreviewing\nreviews\nrevile\nreviled\nrevilement\nrevilements\nreviler\nrevilers\nreviles\nreviling\nrevilingly\nrevillagigedo\nrevisable\nrevisal\nrevisals\nrevise\nrevised\nreviser\nrevisers\nrevises\nrevising\nrevision\nrevisionary\nrevisionism\nrevisionist\nrevisionists\nrevisions\nrevisit\nrevisitation\nrevisitations\nrevisited\nrevisiting\nrevisits\nrevisor\nrevisors\nrevisory\nrevisualization\nrevisualizations\nrevitalization\nrevitalizations\nrevitalize\nrevitalized\nrevitalizes\nrevitalizing\nrevivable\nrevival\nrevivalism\nrevivalist\nrevivalistic\nrevivalists\nrevivals\nrevive\nrevived\nreviver\nrevivers\nrevives\nrevivification\nrevivifications\nrevivified\nrevivifies\nrevivify\nrevivifying\nreviving\nreviviscence\nreviviscent\nrevocability\nrevocable\nrevocation\nrevocations\nrevocatory\nrevoir\nrevoirs\nrevokable\nrevoke\nrevoked\nrevoker\nrevokers\nrevokes\nrevoking\nrevolt\nrevolted\nrevolter\nrevolters\nrevolting\nrevoltingly\nrevolts\nrevolute\nrevolution\nrevolutionaries\nrevolutionarily\nrevolutionariness\nrevolutionary\nrevolutionist\nrevolutionists\nrevolutionize\nrevolutionized\nrevolutionizer\nrevolutionizers\nrevolutionizes\nrevolutionizing\nrevolutions\nrevolvable\nrevolve\nrevolved\nrevolver\nrevolvers\nrevolves\nrevolving\nrevote\nrevoted\nrevotes\nrevoting\nrevs\nrevue\nrevues\nrevulsed\nrevulsion\nrevulsive\nrevved\nrevving\nrewake\nrewaked\nrewaken\nrewakened\nrewakening\nrewakens\nrewakes\nrewaking\nreward\nrewardable\nrewarded\nrewarder\nrewarders\nrewarding\nrewardingly\nrewards\nrewarm\nrewarmed\nrewarming\nrewarms\nrewash\nrewashed\nrewashes\nrewashing\nreweave\nreweaves\nreweaving\nreweigh\nreweighed\nreweighing\nreweighs\nrewet\nrewets\nrewetted\nrewetting\nrewind\nrewinder\nrewinders\nrewinding\nrewinds\nrewire\nrewired\nrewires\nrewiring\nrewoke\nrewoken\nreword\nreworded\nrewording\nrewordings\nrewords\nrework\nreworked\nreworking\nreworks\nrewound\nrewove\nrewoven\nrewrap\nrewrapped\nrewrapping\nrewraps\nrewrite\nrewriter\nrewriters\nrewrites\nrewriting\nrewritten\nrewrote\nrex\nrexes\nreye\nreykjavik\nreykjavík\nreynard\nreynards\nreynolds\nrezone\nrezoned\nrezones\nrezoning\nrhabdocoele\nrhabdocoeles\nrhabdom\nrhabdomancer\nrhabdomancers\nrhabdomancy\nrhabdome\nrhabdomere\nrhabdomeres\nrhabdomes\nrhabdoms\nrhabdomyoma\nrhabdomyomas\nrhabdomyomata\nrhabdomyosarcoma\nrhabdomyosarcomas\nrhabdomyosarcomata\nrhabdovirus\nrhabdoviruses\nrhadamanthine\nrhadamanthus\nrhadamanthys\nrhaetia\nrhaetian\nrhaetians\nrhamnose\nrhamnoses\nrhaphe\nrhapsode\nrhapsodes\nrhapsodic\nrhapsodical\nrhapsodically\nrhapsodies\nrhapsodist\nrhapsodists\nrhapsodize\nrhapsodized\nrhapsodizes\nrhapsodizing\nrhapsody\nrhatanies\nrhatany\nrhea\nrheas\nrhebok\nrheboks\nrhenish\nrhenishes\nrhenium\nrheological\nrheologically\nrheologist\nrheologists\nrheology\nrheometer\nrheometers\nrheostat\nrheostatic\nrheostats\nrheotactic\nrheotaxis\nrheotaxises\nrhesus\nrhesuses\nrhetor\nrhetoric\nrhetorical\nrhetorically\nrhetorician\nrhetoricians\nrhetors\nrheum\nrheumatic\nrheumatically\nrheumatics\nrheumatism\nrheumatoid\nrheumatoidal\nrheumatoidally\nrheumatologist\nrheumatologists\nrheumatology\nrheumy\nrhinal\nrhine\nrhineland\nrhinencephala\nrhinencephalic\nrhinencephalon\nrhinestone\nrhinestoned\nrhinestones\nrhinitis\nrhino\nrhinoceros\nrhinoceroses\nrhinologist\nrhinologists\nrhinology\nrhinopharyngitis\nrhinoplastic\nrhinoplasties\nrhinoplasty\nrhinos\nrhinoscopies\nrhinoscopy\nrhinovirus\nrhinoviruses\nrhizanthous\nrhizobia\nrhizobial\nrhizobium\nrhizocephalan\nrhizocephalans\nrhizocephalous\nrhizoctonia\nrhizoctonias\nrhizogenetic\nrhizogenic\nrhizoid\nrhizoidal\nrhizoids\nrhizomatous\nrhizome\nrhizomes\nrhizomic\nrhizophagous\nrhizoplane\nrhizoplanes\nrhizopod\nrhizopodan\nrhizopodans\nrhizopodous\nrhizopods\nrhizopus\nrhizopuses\nrhizosphere\nrhizospheres\nrhizotomies\nrhizotomy\nrho\nrhodamine\nrhodamines\nrhode\nrhodes\nrhodesia\nrhodesian\nrhodesians\nrhodium\nrhodochrosite\nrhodochrosites\nrhododendron\nrhododendrons\nrhodolite\nrhodolites\nrhodomontade\nrhodomontaded\nrhodomontades\nrhodomontading\nrhodonite\nrhodonites\nrhodope\nrhodopsin\nrhodopsins\nrhodora\nrhodoras\nrhomb\nrhombencephalic\nrhombencephalon\nrhombencephalons\nrhombi\nrhombic\nrhombohedra\nrhombohedral\nrhombohedron\nrhombohedrons\nrhomboid\nrhomboidal\nrhomboidei\nrhomboideus\nrhomboids\nrhombs\nrhombus\nrhombuses\nrhonchal\nrhonchi\nrhonchial\nrhonchus\nrhone\nrhos\nrhubarb\nrhubarbs\nrhumb\nrhumba\nrhumbaed\nrhumbaing\nrhumbas\nrhumbs\nrhus\nrhuses\nrhyme\nrhymed\nrhymeless\nrhymer\nrhymers\nrhymes\nrhymester\nrhymesters\nrhyming\nrhynchocephalian\nrhynchocephalians\nrhyolite\nrhyolites\nrhyolitic\nrhythm\nrhythmic\nrhythmical\nrhythmically\nrhythmicity\nrhythmics\nrhythmist\nrhythmists\nrhythmization\nrhythmizations\nrhythmize\nrhythmized\nrhythmizes\nrhythmizing\nrhythms\nrhytidectomies\nrhytidectomy\nrhytidome\nrhytidomes\nrhyton\nrhytons\nrhône\nrial\nrials\nrialto\nrialtos\nriant\nriantly\nriata\nriatas\nrib\nribald\nribaldries\nribaldry\nribalds\nriband\nribands\nribavirin\nribavirins\nribband\nribbands\nribbed\nribbentrop\nribber\nribbers\nribbing\nribbings\nribbon\nribboned\nribbonfish\nribbonfishes\nribboning\nribbonlike\nribbons\nribbony\nribby\nribcage\nribcages\nribes\nribgrass\nribgrasses\nriblet\nriblets\nriboflavin\nribonuclease\nribonucleases\nribonucleic\nribonucleoprotein\nribonucleoproteins\nribonucleoside\nribonucleosides\nribonucleotide\nribonucleotides\nribose\nribosomal\nribosome\nribosomes\nribozymes\nribs\nribwort\nribworts\nrica\nrican\nricans\nriccio\nriccocheted\nriccocheting\nriccochets\nrice\nricebird\nricebirds\nriced\nricer\nricercar\nricercare\nricercari\nricercars\nricers\nrices\nrich\nrichard\nriche\nrichelieu\nrichen\nrichened\nrichening\nrichens\nricher\nriches\nrichest\nrichfield\nrichly\nrichmond\nrichness\nrichter\nrichweed\nrichweeds\nricin\nricing\nricinoleic\nricins\nrick\nricked\nricketier\nricketiest\nricketiness\nrickets\nrickettsia\nrickettsiae\nrickettsial\nrickettsioses\nrickettsiosis\nrickety\nrickey\nrickeys\nricking\nrickrack\nricks\nricksha\nrickshas\nrickshaw\nrickshaws\nrico\nricochet\nricocheted\nricocheting\nricochets\nricotta\nricottas\nricrac\nrictal\nrictus\nrictuses\nrid\nridable\nriddance\nridded\nridden\nridder\nridders\nridding\nriddle\nriddled\nriddler\nriddlers\nriddles\nriddling\nride\nrideable\nrider\nriderless\nriders\nridership\nriderships\nrides\nridesharing\nridesharings\nridge\nridgeback\nridgebacks\nridged\nridgeline\nridgelines\nridgeling\nridgelings\nridgepole\nridgepoles\nridges\nridgier\nridgiest\nridging\nridgling\nridglings\nridgy\nridicule\nridiculed\nridiculer\nridiculers\nridicules\nridiculing\nridiculous\nridiculously\nridiculousness\nriding\nridings\nridley\nridleys\nridotto\nridottos\nrids\nriel\nriels\nriemann\nriemannian\nriesling\nrieslings\nrifampicin\nrifampicins\nrifampin\nrifampins\nrifamycin\nrifamycins\nrife\nrifely\nrifer\nrifest\nriff\nriffed\nriffian\nriffians\nriffing\nriffle\nriffled\nriffler\nrifflers\nriffles\nriffling\nriffraff\nriffs\nrifle\nriflebird\nriflebirds\nrifled\nrifleman\nriflemen\nrifler\nriflers\nriflery\nrifles\nriflescope\nriflescopes\nrifling\nrift\nrifted\nrifting\nrifts\nrig\nrigadoon\nrigadoons\nrigamarole\nrigamaroles\nrigatoni\nrigaudon\nrigaudons\nrigel\nrigged\nrigger\nriggers\nrigging\nriggings\nright\nrighted\nrighteous\nrighteously\nrighteousness\nrighter\nrighters\nrightest\nrightful\nrightfully\nrightfulness\nrighties\nrighting\nrightish\nrightism\nrightist\nrightists\nrightly\nrightmost\nrightness\nrighto\nrights\nrightward\nrightwards\nrighty\nrigid\nrigidification\nrigidifications\nrigidified\nrigidifies\nrigidify\nrigidifying\nrigidities\nrigidity\nrigidly\nrigidness\nrigmarole\nrigmaroles\nrigor\nrigorism\nrigorist\nrigoristic\nrigorists\nrigorous\nrigorously\nrigorousness\nrigors\nrigs\nrigueur\nrijstafel\nrijstafels\nrijstaffel\nrijstaffels\nrijsttafel\nrijsttaffel\nrijsttaffels\nriksmaal\nriksmal\nrile\nriled\nriles\nriley\nriling\nrill\nrille\nrilles\nrillet\nrillets\nrillettes\nrills\nrim\nrima\nrimbaud\nrime\nrimed\nrimer\nrimers\nrimes\nrimester\nrimesters\nrimfire\nrimier\nrimiest\nriming\nrimini\nrimland\nrimlands\nrimless\nrimmed\nrimming\nrimose\nrimosely\nrimosity\nrimple\nrimpled\nrimples\nrimpling\nrimrock\nrims\nrimsky\nrimy\nrind\nrinded\nrinderpest\nrinderpests\nrinds\nrinforzando\nring\nringbark\nringbarked\nringbarking\nringbarks\nringbolt\nringbolts\nringbone\nringbones\nringdove\nringdoves\nringed\nringent\nringer\nringers\nringgit\nringgits\nringhals\nringhalses\nringing\nringingly\nringleader\nringleaders\nringlet\nringleted\nringlets\nringlike\nringmaster\nringmasters\nringneck\nringnecks\nrings\nringside\nringsider\nringsiders\nringsides\nringstraked\nringtail\nringtails\nringtaw\nringtoss\nringworm\nringworms\nrink\nrinks\nrinky\nrinsable\nrinse\nrinsed\nrinser\nrinsers\nrinses\nrinsible\nrinsing\nrio\nrioja\nriot\nrioted\nrioter\nrioters\nrioting\nriotous\nriotously\nriotousness\nriots\nrip\nriparian\nripcord\nripcords\nripe\nripely\nripen\nripened\nripener\nripeners\nripeness\nripening\nripens\nriper\nripest\nripieni\nripieno\nripienos\nriposte\nriposted\nripostes\nriposting\nripped\nripper\nrippers\nripping\nripple\nrippled\nripplegrass\nripplegrasses\nrippler\nripplers\nripples\nripplet\nripplets\nripplier\nrippliest\nrippling\nripplingly\nripply\nriprap\nriprapped\nriprapping\nripraps\nrips\nripsaw\nripsaws\nripsnorter\nripsnorters\nripsnorting\nripstop\nriptide\nriptides\nripuarian\nripuarians\nrise\nrisen\nriser\nrisers\nrises\nrisibilities\nrisibility\nrisible\nrisibles\nrisibly\nrising\nrisings\nrisk\nrisked\nrisker\nriskers\nriskier\nriskiest\nriskiness\nrisking\nriskless\nrisks\nrisky\nrisorgimento\nrisotto\nrisottos\nrisqué\nrissole\nrissoles\nrissolé\nritalin\nritard\nritardando\nritards\nrite\nrites\nritornelli\nritornello\nritornellos\nritter\nritual\nritualism\nritualist\nritualistic\nritualistically\nritualists\nrituality\nritualization\nritualizations\nritualize\nritualized\nritualizes\nritualizing\nritually\nrituals\nritz\nritzier\nritziest\nritziness\nritzy\nrivage\nrivages\nrival\nrivaled\nrivaling\nrivalled\nrivalling\nrivalries\nrivalrous\nrivalry\nrivals\nrive\nrived\nriven\nriver\nriverbank\nriverbanks\nriverbed\nriverbeds\nriverboat\nriverboats\nriverfront\nriverfronts\nriverhead\nriverheads\nriverine\nriverines\nrivers\nriverside\nriversides\nriverward\nriverwards\nriverweed\nriverweeds\nrives\nrivet\nriveted\nriveter\nriveters\nriveting\nrivetingly\nrivets\nriviera\nriving\nrivière\nrivulet\nrivulets\nriyadh\nriyal\nrizzio\nrna\nrns\nroach\nroached\nroaches\nroaching\nroad\nroadability\nroadbed\nroadbeds\nroadblock\nroadblocks\nroadholding\nroadhouse\nroadhouses\nroadie\nroadies\nroadkill\nroadkills\nroadless\nroadrunner\nroadrunners\nroads\nroadside\nroadsides\nroadstead\nroadsteads\nroadster\nroadsters\nroadway\nroadways\nroadwork\nroadworthier\nroadworthiest\nroadworthiness\nroadworthy\nroady\nroam\nroamed\nroamer\nroamers\nroaming\nroams\nroan\nroanoke\nroans\nroar\nroared\nroarer\nroarers\nroaring\nroaringly\nroars\nroast\nroasted\nroaster\nroasters\nroasting\nroasts\nrob\nrobalo\nrobalos\nroband\nrobands\nrobbed\nrobber\nrobberies\nrobbers\nrobbery\nrobbing\nrobe\nrobed\nrobert\nrobertson\nrobes\nrobespierre\nrobin\nrobing\nrobins\nrobinson\nroble\nrobles\nroborant\nroborants\nrobot\nrobotic\nrobotically\nroboticize\nroboticized\nroboticizes\nroboticizing\nrobotics\nrobotism\nrobotistic\nrobotization\nrobotizations\nrobotize\nrobotized\nrobotizes\nrobotizing\nrobots\nrobs\nrobust\nrobusta\nrobustious\nrobustiously\nrobustiousness\nrobustly\nrobustness\nroc\nrocaille\nrocambole\nrocamboles\nroche\nrochefoucauld\nrochelle\nroches\nrochester\nrochet\nrochets\nrock\nrock'n'roll\nrockabilly\nrockaby\nrockabye\nrockaway\nrockaways\nrockbound\nrocked\nrockefeller\nrocker\nrockeries\nrockers\nrockery\nrocket\nrocketed\nrocketeer\nrocketeers\nrocketing\nrocketry\nrockets\nrocketsonde\nrocketsondes\nrockfall\nrockfalls\nrockfish\nrockfishes\nrockhopper\nrockhoppers\nrockhounding\nrockier\nrockies\nrockiest\nrockiness\nrocking\nrockingly\nrocklike\nrockling\nrocklings\nrockoon\nrockoons\nrockrose\nrockroses\nrocks\nrockshaft\nrockshafts\nrockslide\nrockslides\nrockweed\nrockweeds\nrockwork\nrocky\nrococo\nrocs\nrod\nrodded\nrodding\nrode\nrodent\nrodenticide\nrodenticides\nrodents\nrodeo\nrodeos\nrodes\nrodin\nrodless\nrodlike\nrodman\nrodmen\nrodomontade\nrodomontaded\nrodomontades\nrodomontading\nrods\nroe\nroebuck\nroebucks\nroentgen\nroentgenize\nroentgenized\nroentgenizes\nroentgenizing\nroentgenogram\nroentgenograms\nroentgenograph\nroentgenographic\nroentgenographically\nroentgenographs\nroentgenography\nroentgenologic\nroentgenological\nroentgenologically\nroentgenologist\nroentgenologists\nroentgenology\nroentgenoscope\nroentgenoscopes\nroentgenoscopic\nroentgenoscopy\nroentgenotherapies\nroentgenotherapy\nroentgens\nroes\nrogation\nrogations\nrogatory\nroger\nroget\nrogue\nrogued\nrogueing\nrogueries\nroguery\nrogues\nroguing\nroguish\nroguishly\nroguishness\nroil\nroiled\nroilier\nroiliest\nroiling\nroils\nroily\nroister\nroistered\nroisterer\nroisterers\nroistering\nroisterous\nroisterously\nroisters\nrolamite\nrolamites\nroland\nrole\nroles\nrolf\nrolfed\nrolfer\nrolfers\nrolfing\nrolfs\nroll\nrollaway\nrollback\nrollbacks\nrolle\nrolled\nroller\nrollers\nrollick\nrollicked\nrollicking\nrollickingly\nrollicks\nrollicksome\nrollicky\nrolling\nrollmops\nrollout\nrollouts\nrollover\nrollovers\nrolls\nrolltop\nrollway\nrollways\nrolodex\nroly\nroma\nromagna\nromaic\nromaine\nroman\nromance\nromanced\nromancer\nromancers\nromances\nromancing\nromanesque\nromania\nromanian\nromanians\nromanic\nromanics\nromanies\nromanism\nromanist\nromanistic\nromanists\nromanization\nromanizations\nromanize\nromanized\nromanizes\nromanizing\nromano\nromanoff\nromanoffs\nromanov\nromanovs\nromans\nromansch\nromansh\nromantic\nromantically\nromanticism\nromanticist\nromanticists\nromanticization\nromanticizations\nromanticize\nromanticized\nromanticizes\nromanticizing\nromantics\nromany\nromaunt\nromaunts\nromblon\nrome\nromeldale\nromeldales\nromeo\nromeos\nromish\nromishly\nromishness\nrommel\nromney\nromp\nromped\nromper\nrompers\nromping\nromps\nroms\nromulus\nroncevaux\nrondeau\nrondeaux\nrondel\nrondelet\nrondelets\nrondelle\nrondelles\nrondels\nrondo\nrondos\nrondure\nrondures\nronnel\nronnels\nronyon\nronyons\nrood\nroods\nroof\nroofed\nroofer\nroofers\nroofing\nroofless\nrooflike\nroofline\nrooflines\nroofs\nrooftop\nrooftops\nrooftree\nrooftrees\nrook\nrooked\nrookeries\nrookery\nrookie\nrookies\nrooking\nrooks\nrooky\nroom\nroomed\nroomer\nroomers\nroomette\nroomettes\nroomful\nroomfuls\nroomier\nroomiest\nroomily\nroominess\nrooming\nroommate\nroommates\nrooms\nroomy\nroorback\nroorbacks\nroosevelt\nroost\nroosted\nrooster\nroosterfish\nroosterfishes\nroosters\nroosting\nroosts\nroot\nrootage\nrootages\nrooted\nrootedness\nrooter\nrooters\nroothold\nrootholds\nrootier\nrootiest\nrootiness\nrooting\nrootless\nrootlessness\nrootlet\nrootlets\nrootlike\nroots\nrootstalk\nrootstalks\nrootstock\nrootstocks\nrootworm\nrootworms\nrooty\nrope\nroped\nropedancer\nropedancers\nropedancing\nropelike\nroper\nropers\nropery\nropes\nropewalk\nropewalker\nropewalkers\nropewalks\nropeway\nropeways\nropey\nropier\nropiest\nropily\nropiness\nroping\nropy\nroque\nroquefort\nroquelaure\nroquelaures\nroquet\nroqueted\nroqueting\nroquets\nroquette\nrorqual\nrorquals\nrorschach\nrosa\nrosacea\nrosaceous\nrosalind\nrosanilin\nrosaniline\nrosanilines\nrosanilins\nrosarian\nrosarians\nrosaries\nrosary\nroscius\nroscoe\nroscoes\nrose\nroseate\nroseately\nrosebay\nrosebays\nrosebud\nrosebuds\nrosebush\nrosebushes\nrosefish\nrosefishes\nroselle\nroselles\nrosemaries\nrosemary\nrosencrantz\nroseola\nroseolar\nroseolas\nroseroot\nroseroots\nroses\nrosetta\nrosette\nrosettes\nrosewater\nrosewood\nrosewoods\nrosh\nrosicrucian\nrosicrucianism\nrosicrucians\nrosier\nrosiest\nrosily\nrosin\nrosined\nrosiness\nrosining\nrosins\nrosinweed\nrosinweeds\nrosiny\nrossetti\nrossini\nrostella\nrostellar\nrostellate\nrostellum\nroster\nrosters\nrostock\nrostra\nrostral\nrostrally\nrostrate\nrostrum\nrostrums\nrosy\nrosé\nrosés\nrot\nrota\nrotameter\nrotameters\nrotarian\nrotarians\nrotaries\nrotary\nrotas\nrotatable\nrotate\nrotated\nrotates\nrotating\nrotation\nrotational\nrotationally\nrotations\nrotative\nrotatively\nrotator\nrotatores\nrotators\nrotatory\nrotavirus\nrotaviruses\nrote\nrotenone\nrotes\nrotgut\nrothschild\nrothschilds\nroti\nrotifer\nrotiferal\nrotiferous\nrotifers\nrotiform\nrotisserie\nrotisseries\nrotl\nrotls\nroto\nrotogravure\nrotogravures\nrotor\nrotorcraft\nrotorcrafts\nrotors\nrotos\nrototill\nrototilled\nrototiller\nrototillers\nrototilling\nrototills\nrots\nrotted\nrotten\nrottener\nrottenest\nrottenly\nrottenness\nrottenstone\nrottenstones\nrotter\nrotterdam\nrotters\nrotting\nrottweiler\nrottweilers\nrotund\nrotunda\nrotundas\nrotundity\nrotundly\nrotundness\nroturier\nroturiers\nrouble\nroubles\nrouen\nrouge\nrouged\nrouges\nrough\nroughage\nroughback\nroughbacks\nroughcast\nroughcaster\nroughcasters\nroughcasting\nroughcasts\nroughdried\nroughdries\nroughdry\nroughdrying\nroughed\nroughen\nroughened\nroughening\nroughens\nrougher\nroughers\nroughest\nroughhew\nroughhewed\nroughhewing\nroughhewn\nroughhews\nroughhouse\nroughhoused\nroughhouses\nroughhousing\nroughies\nroughing\nroughish\nroughleg\nroughlegs\nroughly\nroughneck\nroughnecks\nroughness\nroughrider\nroughriders\nroughs\nroughshod\nroughy\nrouging\nrouille\nroulade\nroulades\nrouleau\nrouleaus\nrouleaux\nroulette\nrouletted\nroulettes\nrouletting\nroumanian\nround\nroundabout\nroundaboutness\nroundabouts\nrounded\nroundedness\nroundel\nroundelay\nroundelays\nroundels\nrounder\nrounders\nroundest\nroundhead\nroundheaded\nroundheadedness\nroundheads\nroundhouse\nroundhouses\nrounding\nroundish\nroundishness\nroundlet\nroundlets\nroundly\nroundness\nroundoff\nrounds\nroundsman\nroundsmen\nroundtable\nroundtables\nroundtrip\nroundtrips\nroundup\nroundups\nroundwood\nroundworm\nroundworms\nroup\nroups\nrouse\nrouseabout\nrouseabouts\nroused\nrousement\nrousements\nrouser\nrousers\nrouses\nrousing\nrousingly\nrousseau\nrousseauism\nrousseauist\nrousseauistic\nrousseauists\nroussillon\nroust\nroustabout\nroustabouts\nrousted\nrouster\nrousters\nrousting\nrousts\nrout\nroute\nrouted\nrouteman\nroutemen\nrouter\nrouters\nroutes\nrouteway\nrouteways\nroutine\nroutinely\nroutines\nrouting\nroutings\nroutinism\nroutinist\nroutinists\nroutinization\nroutinizations\nroutinize\nroutinized\nroutinizes\nroutinizing\nrouts\nroux\nroué\nroués\nrove\nroved\nrover\nrovers\nroves\nroving\nrow\nrowan\nrowanberries\nrowanberry\nrowans\nrowboat\nrowboats\nrowdier\nrowdies\nrowdiest\nrowdily\nrowdiness\nrowdy\nrowdyish\nrowdyism\nrowed\nrowel\nroweled\nroweling\nrowels\nrowen\nrowens\nrower\nrowers\nrowing\nrowlandson\nrowlock\nrowlocks\nrows\nroyal\nroyalism\nroyalist\nroyalists\nroyally\nroyalmast\nroyalmasts\nroyals\nroyalties\nroyalty\nrpm\nrsvp\nruana\nruanas\nrub\nrubaiyat\nrubasse\nrubasses\nrubato\nrubatos\nrubbed\nrubber\nrubberier\nrubberiest\nrubberize\nrubberized\nrubberizes\nrubberizing\nrubberlike\nrubberneck\nrubbernecked\nrubbernecker\nrubberneckers\nrubbernecking\nrubbernecks\nrubbers\nrubberstamp\nrubberstamps\nrubbery\nrubbing\nrubbings\nrubbish\nrubbishing\nrubbishy\nrubble\nrubbled\nrubbles\nrubblework\nrubbling\nrubbly\nrubdown\nrubdowns\nrube\nrubefacient\nrubefacients\nrubefaction\nrubefactions\nrubella\nrubellite\nrubellites\nrubenesque\nrubens\nrubeola\nrubeolar\nrubes\nrubescence\nrubescent\nrubicon\nrubicund\nrubicundity\nrubidium\nrubies\nrubiginose\nrubiginous\nrubik\nrubious\nruble\nrubles\nruboff\nruboffs\nrubout\nrubouts\nrubredoxin\nrubredoxins\nrubric\nrubrical\nrubrically\nrubricate\nrubricated\nrubricates\nrubricating\nrubrication\nrubrications\nrubricator\nrubricators\nrubrician\nrubricians\nrubrics\nrubs\nrubus\nruby\nrubythroat\nrubythroats\nrubáiyát\nruche\nruched\nruches\nruching\nruck\nrucked\nrucking\nrucks\nrucksack\nrucksacks\nruckus\nruckuses\nruction\nructions\nrudbeckia\nrudd\nrudder\nrudderfish\nrudderfishes\nrudderless\nrudderpost\nrudderposts\nrudders\nrudderstock\nrudderstocks\nruddier\nruddiest\nruddily\nruddiness\nruddle\nruddled\nruddles\nruddling\nruddock\nruddocks\nrudds\nruddy\nrude\nrudely\nrudeness\nrudenesses\nruder\nruderal\nruderals\nrudest\nrudiment\nrudimental\nrudimentarily\nrudimentariness\nrudimentary\nrudiments\nrudolf\nrue\nrued\nrueful\nruefully\nruefulness\nruer\nruers\nrues\nrufescence\nrufescent\nruff\nruffe\nruffed\nruffes\nruffian\nruffianism\nruffianly\nruffians\nruffing\nruffle\nruffled\nruffler\nrufflers\nruffles\nruffling\nruffly\nruffs\nrufiyaa\nrufiyaas\nrufous\nrufus\nrug\nruga\nrugae\nrugate\nrugby\nrugged\nruggedization\nruggedizations\nruggedize\nruggedized\nruggedizes\nruggedizing\nruggedly\nruggedness\nrugola\nrugosa\nrugose\nrugosely\nrugosity\nrugous\nrugs\nrugulose\nruin\nruinable\nruinate\nruination\nruinations\nruined\nruiner\nruiners\nruing\nruining\nruinous\nruinously\nruinousness\nruins\nrulable\nrule\nruled\nruleless\nruler\nrulers\nrulership\nrulerships\nrules\nrulier\nruliest\nruling\nrulings\nruly\nrum\nrumaki\nrumakis\nrumania\nrumanian\nrumanians\nrumba\nrumbaed\nrumbaing\nrumbas\nrumble\nrumbled\nrumbler\nrumblers\nrumbles\nrumbling\nrumblingly\nrumblings\nrumbly\nrumbustious\nrumbustiously\nrumbustiousness\nrumen\nrumens\nrumina\nruminal\nruminant\nruminantly\nruminants\nruminate\nruminated\nruminates\nruminating\nrumination\nruminations\nruminative\nruminatively\nruminator\nruminators\nrummage\nrummaged\nrummager\nrummagers\nrummages\nrummaging\nrummer\nrummers\nrummest\nrummier\nrummies\nrummiest\nrummy\nrumor\nrumored\nrumoring\nrumormonger\nrumormongered\nrumormongering\nrumormongers\nrumors\nrump\nrumpelstiltskin\nrumple\nrumpled\nrumples\nrumplier\nrumpliest\nrumpling\nrumply\nrumps\nrumpus\nrumpuses\nrumrunner\nrumrunners\nrums\nrun\nrunabout\nrunabouts\nrunagate\nrunagates\nrunaround\nrunarounds\nrunaway\nrunaways\nrunback\nrunbacks\nruncible\nruncinate\nrundle\nrundles\nrundlet\nrundlets\nrundown\nrundowns\nrune\nrunes\nrung\nrungs\nrunic\nrunless\nrunlet\nrunlets\nrunnable\nrunnel\nrunnels\nrunner\nrunners\nrunnier\nrunniest\nrunning\nrunnings\nrunny\nrunnymede\nrunoff\nrunoffs\nrunout\nrunouts\nrunover\nrunovers\nruns\nrunt\nruntime\nruntiness\nruntish\nrunts\nrunty\nrunway\nrunways\nrunza\nrunzas\nrupee\nrupees\nrupiah\nrupiahs\nrupicolous\nrupturable\nrupture\nruptured\nruptures\nrupturing\nrural\nruralism\nruralist\nruralists\nruralities\nrurality\nruralization\nruralizations\nruralize\nruralized\nruralizes\nruralizing\nrurally\nrurban\nruritan\nruritania\nruritanian\nruritans\nruse\nruses\nrush\nrushed\nrushee\nrushees\nrusher\nrushers\nrushes\nrushier\nrushiest\nrushing\nrushlight\nrushlights\nrushmore\nrushy\nrusine\nrusk\nruskin\nruskinian\nrusks\nrussell\nrusset\nrusseting\nrussets\nrussetting\nrussia\nrussian\nrussianization\nrussianizations\nrussianize\nrussianized\nrussianizes\nrussianizing\nrussianness\nrussians\nrussification\nrussifications\nrussified\nrussifies\nrussify\nrussifying\nrusski\nrusskie\nrusskies\nrusskis\nrussky\nrusso\nrussophile\nrussophiles\nrussophilia\nrussophobe\nrussophobes\nrussophobia\nrust\nrustable\nrusted\nrustic\nrustical\nrustically\nrusticate\nrusticated\nrusticates\nrusticating\nrustication\nrustications\nrusticator\nrusticators\nrusticities\nrusticity\nrustics\nrustier\nrustiest\nrustily\nrustiness\nrusting\nrustle\nrustled\nrustler\nrustlers\nrustles\nrustless\nrustling\nrustlingly\nrustproof\nrustproofed\nrustproofing\nrustproofs\nrusts\nrusty\nrut\nrutabaga\nrutabagas\nruth\nruthenia\nruthenian\nruthenians\nruthenic\nruthenious\nruthenium\nrutherford\nrutherfordium\nrutherfords\nruthful\nruthfully\nruthfulness\nruthless\nruthlessly\nruthlessness\nrutilant\nrutile\nrutiles\nruts\nrutted\nruttier\nruttiest\nruttiness\nrutting\nruttish\nruttishly\nruttishness\nrutty\nruwenzori\nrwanda\nrwandan\nrwandans\nrya\nryas\nrye\nryegrass\nryegrasses\nryes\nryukyu\nrâle\nrâles\nréaumur\nréchauffé\nréclame\nrégime\nrégimes\nrégisseur\nrégisseurs\nrémoulade\nrépondez\nréseau\nréseaus\nréseaux\nrésistance\nrésumé\nrésumés\nréunion\nrôle\nrôles\nröntgen\nröntgens\nrügen\ns\ns'le\ns'n\ns'ns\nsaanen\nsaaremaa\nsaarland\nsaarlander\nsaarlanders\nsabadilla\nsabadillas\nsabal\nsabals\nsabaoth\nsabayon\nsabayons\nsabbat\nsabbatarian\nsabbatarianism\nsabbatarians\nsabbath\nsabbaths\nsabbatic\nsabbatical\nsabbaticals\nsabbats\nsabellian\nsabellians\nsaber\nsabered\nsabering\nsabermetrician\nsabermetricians\nsabermetrics\nsabers\nsabian\nsabians\nsabin\nsabine\nsabines\nsabins\nsable\nsablefish\nsablefishes\nsables\nsabot\nsabotage\nsabotaged\nsabotages\nsabotaging\nsaboteur\nsaboteurs\nsabots\nsabra\nsabras\nsabre\nsabred\nsabres\nsabring\nsabulose\nsabulosity\nsabulous\nsac\nsacahuista\nsacahuiste\nsacajawea\nsacaton\nsacatons\nsaccade\nsaccades\nsaccadic\nsaccate\nsaccharase\nsaccharases\nsaccharate\nsaccharates\nsaccharic\nsaccharide\nsaccharides\nsaccharification\nsaccharifications\nsaccharified\nsaccharifies\nsaccharify\nsaccharifying\nsaccharimeter\nsaccharimeters\nsaccharimetry\nsaccharin\nsaccharine\nsaccharinely\nsaccharinity\nsaccharoid\nsaccharoidal\nsaccharometer\nsaccharometers\nsaccharomyces\nsaccharomycete\nsaccharomycetes\nsaccharomycetic\nsaccharomycetous\nsaccharose\nsaccharoses\nsaccular\nsacculate\nsacculated\nsacculation\nsacculations\nsaccule\nsaccules\nsacculi\nsacculus\nsacerdotal\nsacerdotalism\nsacerdotalist\nsacerdotalists\nsacerdotally\nsachem\nsachemic\nsachems\nsacher\nsachet\nsacheted\nsachets\nsack\nsackbut\nsackbuts\nsackcloth\nsacked\nsacker\nsackers\nsackful\nsackfuls\nsacking\nsackings\nsacks\nsaclike\nsacque\nsacques\nsacra\nsacral\nsacrament\nsacramental\nsacramentalism\nsacramentalist\nsacramentalists\nsacramentally\nsacramentals\nsacramentarian\nsacramentarianism\nsacramentarians\nsacramento\nsacraments\nsacraria\nsacrarium\nsacred\nsacredly\nsacredness\nsacrifice\nsacrificed\nsacrificer\nsacrificers\nsacrifices\nsacrificial\nsacrificially\nsacrificing\nsacrificingly\nsacrilege\nsacrileges\nsacrilegious\nsacrilegiously\nsacrilegiousness\nsacrilegist\nsacrilegists\nsacristan\nsacristans\nsacristies\nsacristy\nsacrococcygeal\nsacroiliac\nsacroiliacs\nsacrolumbar\nsacrosanct\nsacrosanctity\nsacrosciatic\nsacrum\nsacs\nsad\nsadden\nsaddened\nsaddening\nsaddens\nsadder\nsaddest\nsaddhu\nsaddhus\nsaddle\nsaddleback\nsaddlebacks\nsaddlebag\nsaddlebags\nsaddlebow\nsaddlebows\nsaddlebred\nsaddlebreds\nsaddlecloth\nsaddlecloths\nsaddled\nsaddleless\nsaddler\nsaddleries\nsaddlers\nsaddlery\nsaddles\nsaddletree\nsaddletrees\nsaddling\nsadducean\nsadducee\nsadduceeism\nsadducees\nsadhe\nsadhes\nsadhu\nsadhus\nsadiron\nsadirons\nsadism\nsadist\nsadistic\nsadistically\nsadists\nsadly\nsadness\nsadnesses\nsadomasochism\nsadomasochist\nsadomasochistic\nsadomasochists\nsafar\nsafari\nsafaris\nsafe\nsafecracker\nsafecrackers\nsafecracking\nsafeguard\nsafeguarded\nsafeguarding\nsafeguards\nsafekeeping\nsafelight\nsafelights\nsafely\nsafeness\nsafer\nsafes\nsafest\nsafetied\nsafeties\nsafety\nsafetying\nsafetyman\nsafetymen\nsafflower\nsafflowers\nsaffron\nsafranin\nsafranine\nsafranines\nsafranins\nsafrole\nsafroles\nsag\nsaga\nsagacious\nsagaciously\nsagaciousness\nsagacity\nsagamore\nsagamores\nsagas\nsage\nsagebrush\nsagebrushes\nsagely\nsageness\nsager\nsages\nsagest\nsaggar\nsaggars\nsagged\nsagger\nsaggers\nsagging\nsaggy\nsagitta\nsagittal\nsagittally\nsagittarian\nsagittarians\nsagittarius\nsagittate\nsago\nsagos\nsagrada\nsags\nsaguaro\nsaguaros\nsahaptian\nsahara\nsaharan\nsahel\nsahelian\nsahib\nsahibs\nsahuaro\nsahuaros\nsaid\nsaiga\nsaigas\nsaigon\nsail\nsailable\nsailboard\nsailboarded\nsailboarder\nsailboarders\nsailboarding\nsailboards\nsailboat\nsailboater\nsailboaters\nsailboating\nsailboats\nsailcloth\nsailed\nsailer\nsailers\nsailfish\nsailfishes\nsailing\nsailor\nsailorman\nsailormen\nsailors\nsailplane\nsailplaned\nsailplaner\nsailplaners\nsailplanes\nsailplaning\nsails\nsaimin\nsaimins\nsainfoin\nsainfoins\nsaint\nsaintdom\nsainted\nsainthood\nsainting\nsaintlier\nsaintliest\nsaintlike\nsaintliness\nsaintly\nsaints\nsaintship\nsaipan\nsaipanese\nsais\nsaith\nsaithe\nsaiva\nsaivas\nsaivism\nsake\nsaker\nsakers\nsakes\nsaki\nsakishima\nsakti\nsaktism\nsal\nsalaam\nsalaamed\nsalaaming\nsalaams\nsalability\nsalable\nsalableness\nsalably\nsalacious\nsalaciously\nsalaciousness\nsalacity\nsalad\nsaladin\nsalads\nsalal\nsalals\nsalamanca\nsalamander\nsalamanders\nsalamandrine\nsalami\nsalamis\nsalariat\nsalaried\nsalaries\nsalary\nsalaryman\nsalarymen\nsalbutamol\nsalbutamols\nsalchow\nsalchows\nsale\nsaleable\nsalem\nsalep\nsaleps\nsaleratus\nsalerno\nsaleroom\nsalerooms\nsales\nsalesclerk\nsalesclerks\nsalesgirl\nsalesgirls\nsalesian\nsalesians\nsalesladies\nsaleslady\nsalesman\nsalesmanship\nsalesmen\nsalespeople\nsalesperson\nsalespersons\nsalesroom\nsalesrooms\nsaleswoman\nsaleswomen\nsalian\nsalians\nsalic\nsalicin\nsalicins\nsalicylate\nsalicylates\nsalicylic\nsalicylism\nsalience\nsaliences\nsaliencies\nsaliency\nsalient\nsalientian\nsalientians\nsaliently\nsalientness\nsalients\nsaliferous\nsalimeter\nsalimeters\nsalimetric\nsalimetry\nsalina\nsalinas\nsaline\nsalinity\nsalinization\nsalinizations\nsalinize\nsalinized\nsalinizes\nsalinizing\nsalinometer\nsalinometers\nsalinometric\nsalinometry\nsalique\nsalisbury\nsalish\nsalishan\nsaliva\nsalivary\nsalivate\nsalivated\nsalivates\nsalivating\nsalivation\nsalivator\nsalivators\nsalk\nsallet\nsallets\nsallied\nsallies\nsallow\nsallowed\nsallower\nsallowest\nsallowing\nsallowish\nsallowly\nsallowness\nsallows\nsally\nsallying\nsalmacis\nsalmagundi\nsalmagundis\nsalmi\nsalmis\nsalmon\nsalmonberries\nsalmonberry\nsalmonella\nsalmonellae\nsalmonellas\nsalmonelloses\nsalmonellosis\nsalmonid\nsalmonids\nsalmonoid\nsalmonoids\nsalmons\nsalol\nsalols\nsalome\nsalometer\nsalometers\nsalon\nsalonika\nsalons\nsaloon\nsaloonkeeper\nsaloonkeepers\nsaloons\nsaloop\nsaloops\nsalopian\nsalopians\nsalp\nsalpa\nsalpas\nsalpiform\nsalpiglossis\nsalpingectomies\nsalpingectomy\nsalpinges\nsalpingian\nsalpingitis\nsalpinx\nsalps\nsals\nsalsa\nsalsas\nsalsifies\nsalsify\nsalt\nsaltarelli\nsaltarello\nsaltarellos\nsaltation\nsaltations\nsaltatorial\nsaltatory\nsaltbox\nsaltboxes\nsaltbush\nsaltbushes\nsaltcellar\nsaltcellars\nsalted\nsalter\nsaltern\nsalterns\nsalters\nsaltgrass\nsaltier\nsaltiest\nsaltily\nsaltimbocca\nsaltimboccas\nsaltine\nsaltines\nsaltiness\nsalting\nsaltire\nsaltires\nsaltish\nsaltless\nsaltlike\nsaltness\nsaltpeter\nsalts\nsaltshaker\nsaltshakers\nsaltwater\nsaltworks\nsaltwort\nsalty\nsalubrious\nsalubriously\nsalubriousness\nsalubrity\nsaluki\nsalukis\nsaluretic\nsaluretics\nsalutarily\nsalutariness\nsalutary\nsalutation\nsalutational\nsalutations\nsalutatorian\nsalutatorians\nsalutatories\nsalutatory\nsalute\nsaluted\nsaluter\nsaluters\nsalutes\nsalutiferous\nsaluting\nsalvable\nsalvador\nsalvadoran\nsalvadorans\nsalvadorean\nsalvadoreans\nsalvadorian\nsalvage\nsalvageability\nsalvageable\nsalvaged\nsalvager\nsalvagers\nsalvages\nsalvaging\nsalvarsan\nsalvation\nsalvational\nsalvationism\nsalvationist\nsalvationists\nsalve\nsalved\nsalver\nsalverform\nsalvers\nsalves\nsalvia\nsalvias\nsalvific\nsalvifically\nsalving\nsalvo\nsalvoes\nsalvor\nsalvors\nsalvos\nsalzburg\nsamara\nsamaras\nsamaria\nsamaritan\nsamaritans\nsamarium\nsamarkand\nsamarskite\nsamarskites\nsamba\nsambaed\nsambaing\nsambal\nsambar\nsambars\nsambas\nsambo\nsambuca\nsambucas\nsambur\nsamburs\nsame\nsamekh\nsameness\nsamian\nsamians\nsamiel\nsamiels\nsamisen\nsamisens\nsamite\nsamites\nsamizdat\nsamlet\nsamlets\nsammarinese\nsammarinesi\nsamnite\nsamnites\nsamnium\nsamoa\nsamoan\nsamoans\nsamos\nsamosa\nsamosas\nsamothrace\nsamothráki\nsamovar\nsamovars\nsamoyed\nsamoyede\nsamoyedes\nsamoyedic\nsamoyeds\nsamp\nsampan\nsampans\nsamphire\nsamphires\nsample\nsampled\nsampler\nsamplers\nsamples\nsampling\nsamplings\nsamsara\nsamson\nsamsonian\nsamsons\nsamuel\nsamurai\nsamurais\nsan\nsan'a\nsana\nsanaa\nsanataria\nsanatarium\nsanatariums\nsanative\nsanatoria\nsanatorium\nsanatoriums\nsanbenito\nsanbenitos\nsancerre\nsancta\nsanctification\nsanctifications\nsanctified\nsanctifier\nsanctifiers\nsanctifies\nsanctify\nsanctifying\nsanctimonious\nsanctimoniously\nsanctimoniousness\nsanctimony\nsanction\nsanctionable\nsanctioned\nsanctioning\nsanctions\nsanctities\nsanctity\nsanctuaries\nsanctuary\nsanctum\nsanctums\nsanctus\nsanctuses\nsand\nsandal\nsandaled\nsandals\nsandalwood\nsandalwoods\nsandarac\nsandaracs\nsandbag\nsandbagged\nsandbagger\nsandbaggers\nsandbagging\nsandbags\nsandbank\nsandbanks\nsandbar\nsandbars\nsandblast\nsandblasted\nsandblaster\nsandblasters\nsandblasting\nsandblasts\nsandblindness\nsandbox\nsandboxes\nsandbur\nsandburs\nsanded\nsander\nsanderling\nsanderlings\nsanders\nsandfish\nsandfishes\nsandfly\nsandglass\nsandglasses\nsandgrouse\nsandhi\nsandhill\nsandhis\nsandhog\nsandhogs\nsandier\nsandiest\nsandiness\nsanding\nsandinista\nsandinistas\nsandlot\nsandlots\nsandlotter\nsandlotters\nsandman\nsandmen\nsandpainting\nsandpaper\nsandpapered\nsandpapering\nsandpapers\nsandpapery\nsandpile\nsandpiles\nsandpiper\nsandpipers\nsandpit\nsandpits\nsands\nsandshoe\nsandshoes\nsandsoap\nsandspur\nsandspurs\nsandstone\nsandstorm\nsandstorms\nsandwich\nsandwiched\nsandwiches\nsandwiching\nsandworm\nsandworms\nsandwort\nsandworts\nsandy\nsane\nsanely\nsaneness\nsaner\nsanest\nsanforized\nsang\nsangaree\nsangarees\nsangfroid\nsangreal\nsangria\nsangrias\nsanguicolous\nsanguinaria\nsanguinarias\nsanguinarily\nsanguinary\nsanguine\nsanguinely\nsanguineness\nsanguineous\nsanguinity\nsanguinolent\nsanhedrim\nsanhedrin\nsanicle\nsanicles\nsanidine\nsanidines\nsanies\nsanified\nsanifies\nsanify\nsanifying\nsanious\nsanitaire\nsanitaria\nsanitarian\nsanitarians\nsanitarily\nsanitarium\nsanitariums\nsanitary\nsanitate\nsanitated\nsanitates\nsanitating\nsanitation\nsanitization\nsanitizations\nsanitize\nsanitized\nsanitizer\nsanitizers\nsanitizes\nsanitizing\nsanitoria\nsanitorium\nsanitoriums\nsanity\nsank\nsankhya\nsannup\nsannups\nsannyasi\nsannyasin\nsannyasins\nsannyasis\nsanpaku\nsanpakus\nsans\nsansculotte\nsansculottes\nsansculottic\nsansculottish\nsansculottism\nsansei\nsanseis\nsanserif\nsanserifs\nsansevieria\nsansevierias\nsanskrit\nsanskritic\nsanskritist\nsanskritists\nsanta\nsantalol\nsantalols\nsantander\nsantas\nsantee\nsantees\nsanteria\nsantiago\nsantir\nsantirs\nsanto\nsantolina\nsantolinas\nsantonica\nsantonicas\nsantonin\nsantonins\nsantorini\nsantos\nsantour\nsantours\nsao\nsap\nsapajou\nsapajous\nsaphar\nsaphead\nsapheaded\nsapheads\nsaphena\nsaphenae\nsaphenous\nsapid\nsapidity\nsapience\nsapiens\nsapient\nsapiently\nsapless\nsaplessness\nsapling\nsaplings\nsapodilla\nsapogenin\nsapogenins\nsaponaceous\nsaponaceousness\nsaponated\nsaponifiable\nsaponification\nsaponified\nsaponifier\nsaponifiers\nsaponifies\nsaponify\nsaponifying\nsaponin\nsaponins\nsaponite\nsaponites\nsapor\nsaporific\nsaporous\nsapota\nsapotas\nsapote\nsapotes\nsappanwood\nsappanwoods\nsapped\nsapper\nsappers\nsapphic\nsapphics\nsapphire\nsapphires\nsapphirine\nsapphirines\nsapphism\nsappho\nsappier\nsappiest\nsappily\nsappiness\nsapping\nsappy\nsapraemia\nsapremia\nsapremic\nsaprobe\nsaprobes\nsaprobial\nsaprobic\nsaprobically\nsaprobiological\nsaprobiologist\nsaprobiologists\nsaprobiology\nsaprogenic\nsaprogenicity\nsaprogenous\nsaprolite\nsaprolites\nsapropel\nsapropelic\nsapropels\nsaprophagous\nsaprophyte\nsaprophytes\nsaprophytic\nsaprophytically\nsaprozoic\nsaps\nsapsago\nsapsagos\nsapsucker\nsapsuckers\nsapwood\nsaraband\nsarabande\nsarabandes\nsarabands\nsaracen\nsaracenic\nsaracens\nsaragossa\nsarah\nsarajevo\nsaran\nsarape\nsarapes\nsarasvati\nsaratoga\nsarawak\nsarcasm\nsarcasms\nsarcastic\nsarcastically\nsarcenet\nsarcenets\nsarcodinian\nsarcodinians\nsarcoid\nsarcoidoses\nsarcoidosis\nsarcoids\nsarcolactic\nsarcolemma\nsarcolemmal\nsarcolemmas\nsarcoma\nsarcomas\nsarcomata\nsarcomatoid\nsarcomatosis\nsarcomatous\nsarcomere\nsarcomeres\nsarcophagi\nsarcophagic\nsarcophagous\nsarcophagus\nsarcophaguses\nsarcoplasm\nsarcoplasmatic\nsarcoplasmic\nsarcoptic\nsarcosomal\nsarcosome\nsarcosomes\nsarcostyle\nsarcostyles\nsarcous\nsard\nsardanapalus\nsardar\nsardars\nsardine\nsardined\nsardines\nsardinia\nsardinian\nsardinians\nsardining\nsardius\nsardiuses\nsardonic\nsardonically\nsardonicism\nsardonyx\nsardonyxes\nsards\nsaree\nsarema\nsargasso\nsargassos\nsargassum\nsargassums\nsarge\nsarges\nsargon\nsargonid\nsari\nsarin\nsaris\nsark\nsarkese\nsarmatia\nsarmatian\nsarmatians\nsarmentose\nsarod\nsarode\nsarodes\nsarodist\nsarodists\nsarods\nsarong\nsarongs\nsarpedon\nsarracenia\nsarsaparilla\nsarsaparillas\nsarsenet\nsarsenets\nsartorial\nsartorially\nsartorii\nsartorius\nsartre\nsartrean\nsarum\nsarus\nsasanian\nsasanid\nsasanids\nsash\nsashay\nsashayed\nsashaying\nsashays\nsashed\nsashes\nsashimi\nsashimis\nsashing\nsaskatchewan\nsaskatoon\nsaskatoons\nsasquatch\nsass\nsassabies\nsassaby\nsassafras\nsassanian\nsassanid\nsassanide\nsassed\nsasses\nsassier\nsassies\nsassiest\nsassily\nsassiness\nsassing\nsassoon\nsasswood\nsasswoods\nsassy\nsastruga\nsastrugas\nsat\nsatan\nsatang\nsatangs\nsatanic\nsatanical\nsatanically\nsatanism\nsatanist\nsatanists\nsatay\nsatchel\nsatcheled\nsatchelful\nsatchelfuls\nsatchels\nsate\nsated\nsateen\nsatellite\nsatellites\nsatem\nsates\nsati\nsatiability\nsatiable\nsatiably\nsatiate\nsatiated\nsatiates\nsatiating\nsatiation\nsatiations\nsatiety\nsatin\nsatinet\nsatinets\nsating\nsatinized\nsatins\nsatinwood\nsatinwoods\nsatiny\nsatire\nsatires\nsatiric\nsatirical\nsatirically\nsatirist\nsatirists\nsatirizable\nsatirization\nsatirize\nsatirized\nsatirizes\nsatirizing\nsatis\nsatisfaction\nsatisfactions\nsatisfactorily\nsatisfactoriness\nsatisfactory\nsatisfiability\nsatisfiable\nsatisfied\nsatisfiedly\nsatisfier\nsatisfiers\nsatisfies\nsatisfy\nsatisfying\nsatisfyingly\nsatori\nsatrap\nsatrapies\nsatraps\nsatrapy\nsatsuma\nsatsumas\nsaturable\nsaturant\nsaturants\nsaturate\nsaturated\nsaturates\nsaturating\nsaturation\nsaturations\nsaturator\nsaturators\nsaturday\nsaturdays\nsaturn\nsaturnalia\nsaturnalian\nsaturnalianly\nsaturnalias\nsaturnian\nsaturniid\nsaturniids\nsaturnine\nsaturninely\nsaturnism\nsatyagraha\nsatyr\nsatyriasis\nsatyric\nsatyrical\nsatyrid\nsatyrids\nsatyrs\nsaté\nsauce\nsauceboat\nsauceboats\nsaucebox\nsauceboxes\nsauced\nsaucepan\nsaucepans\nsaucepot\nsaucepots\nsaucer\nsaucerlike\nsaucers\nsauces\nsaucier\nsauciest\nsaucily\nsauciness\nsaucing\nsaucy\nsaudi\nsaudis\nsauerbraten\nsauerkraut\nsauger\nsaugers\nsauk\nsauks\nsaul\nsault\nsaults\nsaumur\nsauna\nsaunas\nsaunter\nsauntered\nsaunterer\nsaunterers\nsauntering\nsaunters\nsaurel\nsaurels\nsaurian\nsaurians\nsauries\nsaurischian\nsaurischians\nsauropod\nsauropodous\nsauropods\nsaury\nsausage\nsausages\nsauterne\nsauternes\nsauté\nsautéed\nsautéing\nsautés\nsauvignon\nsavable\nsavage\nsavaged\nsavagely\nsavageness\nsavageries\nsavagery\nsavages\nsavaging\nsavagism\nsavagisms\nsavai'i\nsavaii\nsavanna\nsavannah\nsavannahs\nsavannas\nsavant\nsavants\nsavarin\nsavarins\nsavate\nsave\nsaveable\nsaved\nsaveloy\nsaveloys\nsaver\nsavers\nsaves\nsavin\nsavine\nsavines\nsaving\nsavings\nsavins\nsavior\nsaviors\nsaviour\nsaviours\nsavoir\nsavonarola\nsavor\nsavored\nsavorer\nsavorers\nsavories\nsavorily\nsavoriness\nsavoring\nsavorless\nsavorous\nsavors\nsavory\nsavour\nsavoured\nsavouries\nsavouring\nsavours\nsavoury\nsavoy\nsavoyard\nsavoyards\nsavvied\nsavvier\nsavvies\nsavviest\nsavvily\nsavvy\nsavvying\nsaw\nsawbones\nsawboneses\nsawbuck\nsawbucks\nsawdust\nsawdusty\nsawed\nsawer\nsawers\nsawfish\nsawfishes\nsawflies\nsawfly\nsawhorse\nsawhorses\nsawing\nsawlike\nsawlog\nsawlogs\nsawmill\nsawmills\nsawn\nsawney\nsawneys\nsaws\nsawtimber\nsawtimbers\nsawtooth\nsawyer\nsawyers\nsax\nsaxatile\nsaxe\nsaxes\nsaxhorn\nsaxhorns\nsaxicoline\nsaxicolous\nsaxifrage\nsaxifrages\nsaxitoxin\nsaxitoxins\nsaxon\nsaxondom\nsaxonies\nsaxonism\nsaxons\nsaxony\nsaxophone\nsaxophones\nsaxophonic\nsaxophonist\nsaxophonists\nsaxtuba\nsaxtubas\nsay\nsayable\nsayer\nsayers\nsayest\nsaying\nsayings\nsayonara\nsays\nsayyid\nsazerac\nsaëns\nsaône\nscab\nscabbard\nscabbarded\nscabbarding\nscabbards\nscabbed\nscabbier\nscabbiest\nscabbily\nscabbiness\nscabbing\nscabble\nscabbled\nscabbles\nscabbling\nscabby\nscabies\nscabietic\nscabiosa\nscabiosas\nscabious\nscabiouses\nscabland\nscablands\nscabrous\nscabrously\nscabrousness\nscabs\nscad\nscads\nscaffold\nscaffolded\nscaffolding\nscaffoldings\nscaffolds\nscag\nscagliola\nscagliolas\nscalability\nscalable\nscalade\nscalades\nscalado\nscalados\nscalage\nscalages\nscalar\nscalare\nscalares\nscalariform\nscalariformly\nscalars\nscalawag\nscalawags\nscald\nscalded\nscalding\nscaldingly\nscalds\nscale\nscaled\nscaleless\nscalelike\nscalene\nscaleni\nscalenus\nscaler\nscalers\nscales\nscalier\nscaliest\nscaliness\nscaling\nscall\nscallion\nscallions\nscallop\nscalloped\nscalloper\nscallopers\nscalloping\nscallopini\nscallops\nscalls\nscallywag\nscallywags\nscalogram\nscalograms\nscaloppine\nscaloppini\nscalp\nscalped\nscalpel\nscalpels\nscalper\nscalpers\nscalping\nscalps\nscaly\nscam\nscammed\nscammer\nscammers\nscamming\nscammonies\nscammony\nscamp\nscamped\nscamper\nscampered\nscampering\nscampers\nscampi\nscamping\nscampish\nscamps\nscams\nscan\nscandal\nscandale\nscandalization\nscandalizations\nscandalize\nscandalized\nscandalizer\nscandalizers\nscandalizes\nscandalizing\nscandalmonger\nscandalmongering\nscandalmongers\nscandalous\nscandalously\nscandalousness\nscandals\nscandent\nscandia\nscandian\nscandians\nscandic\nscandinavia\nscandinavian\nscandinavians\nscandium\nscannable\nscanned\nscanner\nscanners\nscanning\nscans\nscansion\nscansions\nscansorial\nscant\nscanted\nscanter\nscantest\nscantier\nscanties\nscantiest\nscantily\nscantiness\nscanting\nscantling\nscantlings\nscantly\nscantness\nscants\nscanty\nscape\nscaped\nscapegoat\nscapegoated\nscapegoating\nscapegoatism\nscapegoats\nscapegrace\nscapegraces\nscapes\nscaphocephalic\nscaphocephaly\nscaphoid\nscaphoids\nscaphopod\nscaphopods\nscaping\nscapolite\nscapolites\nscapose\nscapula\nscapulae\nscapular\nscapulars\nscapulary\nscapulas\nscapuloclavicular\nscar\nscarab\nscarabaei\nscarabaeid\nscarabaeids\nscarabaeus\nscarabaeuses\nscaraboid\nscarabs\nscaramouch\nscaramouche\nscaramouches\nscarce\nscarcely\nscarceness\nscarcer\nscarcest\nscarcities\nscarcity\nscare\nscarecrow\nscarecrows\nscared\nscaredy\nscarehead\nscareheads\nscaremonger\nscaremongering\nscaremongers\nscarer\nscarers\nscares\nscarf\nscarfed\nscarfing\nscarfpin\nscarfpins\nscarfs\nscarfskin\nscarfskins\nscarier\nscariest\nscarification\nscarifications\nscarificator\nscarificators\nscarified\nscarifier\nscarifiers\nscarifies\nscarify\nscarifying\nscarifyingly\nscarily\nscariness\nscaring\nscariose\nscarious\nscarlatina\nscarlatinal\nscarlatinoid\nscarlatti\nscarless\nscarlet\nscarlets\nscarp\nscarped\nscarping\nscarps\nscarred\nscarring\nscarry\nscars\nscarum\nscarves\nscary\nscat\nscatback\nscatbacks\nscathe\nscathed\nscatheless\nscathes\nscathing\nscathingly\nscatologic\nscatological\nscatologies\nscatologist\nscatologists\nscatology\nscats\nscatted\nscatter\nscatteration\nscatterations\nscatterbrain\nscatterbrained\nscatterbrains\nscattered\nscatterer\nscatterers\nscattergood\nscattergoods\nscattergram\nscattergrams\nscattergun\nscatterguns\nscattering\nscatteringly\nscatterings\nscatters\nscattershot\nscattier\nscattiest\nscatting\nscatty\nscaup\nscaups\nscavenge\nscavenged\nscavenger\nscavengers\nscavenges\nscavenging\nscena\nscenario\nscenarios\nscenarist\nscenarists\nscenas\nscend\nscended\nscending\nscends\nscene\nsceneries\nscenery\nscenes\nsceneshifter\nsceneshifters\nscenic\nscenical\nscenically\nscenics\nscenographer\nscenographers\nscenographic\nscenography\nscent\nscented\nscenting\nscentless\nscents\nscepter\nsceptered\nsceptering\nscepters\nsceptic\nsceptical\nscepticism\nsceptics\nschadenfreude\nschadenfreudes\nscharnhorst\nschav\nschavs\nschedular\nschedule\nscheduled\nscheduler\nschedulers\nschedules\nscheduling\nscheelite\nscheelites\nschefflera\nscheffleras\nscheherazade\nschelde\nscheldt\nschema\nschemas\nschemata\nschematic\nschematically\nschematics\nschematism\nschematization\nschematizations\nschematize\nschematized\nschematizes\nschematizing\nscheme\nschemed\nschemer\nschemers\nschemes\nscheming\nscherzando\nscherzandos\nscherzi\nscherzo\nscherzos\nscheveningen\nschick\nschiff\nschiller\nschillers\nschilling\nschillings\nschindler\nschiphol\nschipperke\nschipperkes\nschism\nschismatic\nschismatical\nschismatically\nschismatics\nschismatize\nschismatized\nschismatizes\nschismatizing\nschisms\nschist\nschistocyte\nschistocytes\nschistocytoses\nschistocytosis\nschistorrhachis\nschistorrhachises\nschistose\nschistosity\nschistosomal\nschistosome\nschistosomes\nschistosomiases\nschistosomiasis\nschistosomula\nschistosomulum\nschistous\nschists\nschizier\nschiziest\nschizo\nschizoaffective\nschizocarp\nschizocarpic\nschizocarpous\nschizocarps\nschizogamy\nschizogenesis\nschizogenous\nschizogonic\nschizogonous\nschizogony\nschizoid\nschizoids\nschizont\nschizonts\nschizophrene\nschizophrenes\nschizophrenia\nschizophrenic\nschizophrenically\nschizophrenics\nschizophreniform\nschizophrenogenic\nschizopod\nschizopodous\nschizopods\nschizos\nschizothyme\nschizothymes\nschizothymia\nschizothymic\nschizothymics\nschizy\nschizzy\nschlemiel\nschlemiels\nschlep\nschlepp\nschlepped\nschlepper\nschleppers\nschlepping\nschlepps\nschleps\nschleswig\nschliemann\nschlieren\nschlieric\nschlimazel\nschlimazels\nschlock\nschlockmeister\nschlockmeisters\nschlocky\nschmaltz\nschmaltzier\nschmaltziest\nschmaltziness\nschmaltzy\nschmalz\nschmalzy\nschmear\nschmeer\nschmidt\nschmo\nschmoe\nschmoes\nschmoose\nschmoosed\nschmooses\nschmoosing\nschmooze\nschmoozed\nschmoozes\nschmoozing\nschmos\nschmuck\nschmucks\nschnapper\nschnappers\nschnapps\nschnauzer\nschnauzers\nschnitzel\nschnitzels\nschnook\nschnooks\nschnorrer\nschnorrers\nschnoz\nschnozes\nschnozzle\nschnozzles\nschoenberg\nschoenbergian\nscholar\nscholarliness\nscholarly\nscholars\nscholarship\nscholarships\nscholastic\nscholastically\nscholasticate\nscholasticates\nscholasticism\nscholastics\nscholia\nscholiast\nscholiastic\nscholiasts\nscholium\nscholiums\nschool\nschoolbag\nschoolbags\nschoolbook\nschoolbooks\nschoolboy\nschoolboyish\nschoolboys\nschoolchild\nschoolchildren\nschooldays\nschooled\nschooler\nschoolers\nschoolfellow\nschoolfellows\nschoolgirl\nschoolgirls\nschoolhouse\nschoolhouses\nschooling\nschoolings\nschoolkid\nschoolkids\nschoolma'am\nschoolma'ams\nschoolman\nschoolmarm\nschoolmarmish\nschoolmarms\nschoolmaster\nschoolmasterish\nschoolmasterly\nschoolmasters\nschoolmate\nschoolmates\nschoolmen\nschoolmistress\nschoolmistresses\nschoolroom\nschoolrooms\nschools\nschoolteacher\nschoolteachers\nschooltime\nschooltimes\nschoolwork\nschoolyard\nschoolyards\nschooner\nschooners\nschopenhauer\nschopenhauerian\nschorl\nschorls\nschottische\nschottisches\nschouten\nschrod\nschrodinger\nschtick\nschticks\nschubert\nschumann\nschuss\nschussboomer\nschussboomers\nschussed\nschusses\nschussing\nschuylkill\nschwa\nschwann\nschwarmerei\nschwarzhorn\nschwarzschild\nschwarzwald\nschwas\nsciaenid\nsciaenoid\nsciaenoids\nsciatic\nsciatica\nscience\nsciences\nscienter\nsciential\nscientific\nscientifically\nscientism\nscientist\nscientistic\nscientists\nscientize\nscientized\nscientizes\nscientizing\nscientology\nscilicet\nscilla\nscilly\nscimitar\nscimitars\nscincoid\nscincoids\nscintigram\nscintigrams\nscintigraph\nscintigraphic\nscintigraphically\nscintigraphs\nscintigraphy\nscintilla\nscintillant\nscintillantly\nscintillate\nscintillated\nscintillates\nscintillating\nscintillatingly\nscintillation\nscintillations\nscintillator\nscintillators\nscintillometer\nscintillometers\nscintiscan\nscintiscanner\nscintiscanners\nscintiscans\nsciolism\nsciolist\nsciolistic\nsciolists\nscion\nscions\nscipio\nscirocco\nsciroccos\nscirrhi\nscirrhoid\nscirrhous\nscirrhus\nscirrhuses\nscissile\nscission\nscissions\nscissor\nscissored\nscissoring\nscissors\nscissortail\nscissortails\nscissure\nscissures\nsciurid\nsciurids\nsciuroid\nsclaff\nsclaffed\nsclaffer\nsclaffers\nsclaffing\nsclaffs\nsclera\nscleral\nsclereid\nsclereids\nsclerenchyma\nsclerenchymas\nsclerenchymatous\nsclerite\nsclerites\nscleritic\nscleritis\nscleroderma\nsclerodermatous\nscleroid\nscleroma\nscleromas\nscleromata\nsclerometer\nsclerometers\nscleroprotein\nscleroproteins\nsclerosed\nscleroses\nsclerosing\nsclerosis\nsclerotia\nsclerotial\nsclerotic\nsclerotics\nsclerotin\nsclerotins\nsclerotium\nsclerotization\nsclerotizations\nsclerotized\nsclerotomies\nsclerotomy\nsclerous\nscoff\nscoffed\nscoffer\nscoffers\nscoffing\nscoffingly\nscofflaw\nscofflaws\nscoffs\nscold\nscolded\nscolder\nscolders\nscolding\nscoldingly\nscoldings\nscolds\nscoleces\nscolecite\nscolecites\nscolex\nscolices\nscoliosis\nscoliotic\nscollop\nscolloped\nscolloping\nscollops\nscolopendra\nscolopendrid\nscolopendrids\nscolopendrine\nscombroid\nscombroids\nsconce\nsconces\nscone\nscones\nscoop\nscooped\nscooper\nscoopers\nscoopful\nscoopfuls\nscooping\nscoops\nscoot\nscooted\nscooter\nscooters\nscooting\nscoots\nscop\nscope\nscoped\nscopes\nscoping\nscopolamine\nscops\nscopula\nscopulae\nscopulate\nscorbutic\nscorbutical\nscorbutically\nscorch\nscorched\nscorcher\nscorchers\nscorches\nscorching\nscorchingly\nscore\nscoreboard\nscoreboards\nscorecard\nscorecards\nscored\nscorekeeper\nscorekeepers\nscorekeeping\nscoreless\nscorer\nscorers\nscores\nscoresby\nscoria\nscoriaceous\nscoriae\nscorification\nscorifications\nscorified\nscorifier\nscorifiers\nscorifies\nscorify\nscorifying\nscoring\nscorings\nscorn\nscorned\nscorner\nscorners\nscornful\nscornfully\nscornfulness\nscorning\nscorns\nscorpaenid\nscorpaenids\nscorpaenoid\nscorpaenoids\nscorpio\nscorpioid\nscorpion\nscorpions\nscorpios\nscorpius\nscot\nscotch\nscotched\nscotches\nscotching\nscotchman\nscotchmen\nscotchwoman\nscotchwomen\nscoter\nscoters\nscotia\nscotic\nscotism\nscotist\nscotists\nscotland\nscotoma\nscotomas\nscotomata\nscotomatous\nscotophil\nscotophilic\nscotophily\nscotophobic\nscotophobin\nscotophobins\nscotopia\nscotopias\nscotopic\nscots\nscotsman\nscotsmen\nscotswoman\nscotswomen\nscott\nscotticism\nscotticisms\nscottie\nscotties\nscottish\nscottishness\nscotty\nscotus\nscoundrel\nscoundrelly\nscoundrels\nscour\nscoured\nscourer\nscourers\nscourge\nscourged\nscourger\nscourgers\nscourges\nscourging\nscouring\nscourings\nscours\nscouse\nscouser\nscousers\nscouses\nscout\nscoutcraft\nscoutcrafts\nscouted\nscouter\nscouters\nscouting\nscoutings\nscoutmaster\nscoutmasters\nscouts\nscow\nscowl\nscowled\nscowler\nscowlers\nscowling\nscowlingly\nscowls\nscows\nscrabble\nscrabbled\nscrabbler\nscrabblers\nscrabbles\nscrabbling\nscrabbly\nscrag\nscragged\nscraggier\nscraggiest\nscraggily\nscragginess\nscragging\nscragglier\nscraggliest\nscraggly\nscraggy\nscrags\nscram\nscramble\nscrambled\nscrambler\nscramblers\nscrambles\nscrambling\nscramjet\nscramjets\nscrammed\nscramming\nscrams\nscrannel\nscrap\nscrapbook\nscrapbooks\nscrape\nscraped\nscraper\nscraperboard\nscraperboards\nscrapers\nscrapes\nscrapheap\nscrapheaps\nscrapie\nscraping\nscrapings\nscrappage\nscrapped\nscrapper\nscrappers\nscrappier\nscrappiest\nscrappily\nscrappiness\nscrapping\nscrapple\nscrappy\nscraps\nscratch\nscratchboard\nscratchboards\nscratched\nscratcher\nscratchers\nscratches\nscratchier\nscratchiest\nscratchily\nscratchiness\nscratching\nscratchpad\nscratchpads\nscratchproof\nscratchy\nscrawl\nscrawled\nscrawler\nscrawlers\nscrawling\nscrawls\nscrawly\nscrawnier\nscrawniest\nscrawniness\nscrawny\nscreak\nscreaked\nscreaking\nscreaks\nscreaky\nscream\nscreamed\nscreamer\nscreamers\nscreaming\nscreamingly\nscreams\nscree\nscreech\nscreeched\nscreecher\nscreechers\nscreeches\nscreeching\nscreechy\nscreed\nscreeds\nscreen\nscreenable\nscreened\nscreener\nscreeners\nscreening\nscreenings\nscreenland\nscreenplay\nscreenplays\nscreens\nscreenwriter\nscreenwriters\nscreenwriting\nscrees\nscrew\nscrewable\nscrewball\nscrewballs\nscrewbean\nscrewbeans\nscrewdriver\nscrewdrivers\nscrewed\nscrewer\nscrewers\nscrewier\nscrewiest\nscrewiness\nscrewing\nscrewlike\nscrews\nscrewup\nscrewups\nscrewworm\nscrewworms\nscrewy\nscribal\nscribble\nscribbled\nscribbler\nscribblers\nscribbles\nscribbling\nscribbly\nscribe\nscribed\nscriber\nscribers\nscribes\nscribing\nscried\nscries\nscrim\nscrimmage\nscrimmaged\nscrimmager\nscrimmagers\nscrimmages\nscrimmaging\nscrimp\nscrimped\nscrimper\nscrimpers\nscrimpiness\nscrimping\nscrimps\nscrimption\nscrimpy\nscrims\nscrimshander\nscrimshanders\nscrimshaw\nscrimshawed\nscrimshawing\nscrimshaws\nscrip\nscrips\nscript\nscripted\nscripter\nscripters\nscripting\nscriptoria\nscriptorium\nscriptoriums\nscripts\nscriptural\nscripturally\nscripture\nscriptures\nscriptwriter\nscriptwriters\nscriptwriting\nscrivener\nscriveners\nscrobiculate\nscrod\nscrods\nscrofula\nscrofulous\nscrofulously\nscrofulousness\nscroll\nscrollbar\nscrollbars\nscrolled\nscrolling\nscrolls\nscrollwork\nscrooch\nscrooched\nscrooches\nscrooching\nscrooge\nscrooges\nscroogie\nscroogies\nscrootch\nscrootched\nscrootches\nscrootching\nscrota\nscrotal\nscrotum\nscrotums\nscrouge\nscrouged\nscrouges\nscrouging\nscrounge\nscrounged\nscrounger\nscroungers\nscrounges\nscroungier\nscroungiest\nscrounging\nscroungy\nscrub\nscrubbable\nscrubbed\nscrubber\nscrubbers\nscrubbier\nscrubbiest\nscrubbily\nscrubbiness\nscrubbing\nscrubby\nscrubland\nscrublands\nscrubs\nscrubwoman\nscrubwomen\nscruff\nscruffier\nscruffiest\nscruffily\nscruffiness\nscruffs\nscruffy\nscrum\nscrummage\nscrummaged\nscrummager\nscrummagers\nscrummages\nscrummaging\nscrummed\nscrumming\nscrumptious\nscrumptiously\nscrumptiousness\nscrums\nscrunch\nscrunchable\nscrunched\nscrunches\nscrunching\nscruple\nscrupled\nscruples\nscrupling\nscrupulosity\nscrupulous\nscrupulously\nscrupulousness\nscrutable\nscrutineer\nscrutineers\nscrutinies\nscrutinize\nscrutinized\nscrutinizer\nscrutinizers\nscrutinizes\nscrutinizing\nscrutinizingly\nscrutiny\nscry\nscrying\nscuba\nscubas\nscud\nscudded\nscudding\nscudi\nscudo\nscuds\nscuff\nscuffed\nscuffer\nscuffers\nscuffing\nscuffle\nscuffled\nscuffler\nscufflers\nscuffles\nscuffling\nscuffs\nscull\nsculled\nsculler\nsculleries\nscullers\nscullery\nsculling\nscullion\nscullions\nsculls\nsculpin\nsculpins\nsculpt\nsculpted\nsculpting\nsculptor\nsculptors\nsculptress\nsculptresses\nsculpts\nsculptural\nsculpturally\nsculpture\nsculptured\nsculptures\nsculpturesque\nsculpturesquely\nsculpturing\nscum\nscumbag\nscumbags\nscumble\nscumbled\nscumbles\nscumbling\nscummed\nscummer\nscummers\nscummier\nscummiest\nscummily\nscumminess\nscumming\nscummy\nscums\nscungilli\nscunner\nscunners\nscup\nscupper\nscuppered\nscuppering\nscuppernong\nscuppernongs\nscuppers\nscups\nscurf\nscurfiness\nscurfy\nscurried\nscurries\nscurril\nscurrile\nscurrilities\nscurrility\nscurrilous\nscurrilously\nscurrilousness\nscurry\nscurrying\nscurvier\nscurviest\nscurvily\nscurviness\nscurvy\nscut\nscuta\nscutage\nscutages\nscutate\nscutch\nscutched\nscutcheon\nscutcheons\nscutcher\nscutchers\nscutches\nscutching\nscute\nscutella\nscutellar\nscutellate\nscutellated\nscutellation\nscutellations\nscutellum\nscutes\nscutiform\nscuts\nscutter\nscuttered\nscuttering\nscutters\nscuttle\nscuttlebutt\nscuttled\nscuttles\nscuttling\nscutum\nscutwork\nscuzzier\nscuzziest\nscuzzy\nscylla\nscyphistoma\nscyphistomae\nscyphistomas\nscyphozoan\nscyphozoans\nscyros\nscythe\nscythed\nscythes\nscythia\nscythian\nscythians\nscything\nscène\nscènes\nse\nsea\nseabag\nseabags\nseabed\nseabeds\nseabee\nseabees\nseabird\nseabirds\nseaboard\nseaboards\nseaboot\nseaboots\nseaborgium\nseaborne\nseacoast\nseacoasts\nseacock\nseacocks\nseacraft\nseadog\nseadogs\nseafarer\nseafarers\nseafaring\nseafloor\nseafloors\nseafood\nseafowl\nseafront\nseafronts\nseagirt\nseagoing\nseagull\nseagulls\nseahorse\nseahorses\nseajack\nseajacked\nseajacker\nseajackers\nseajacking\nseajackings\nseajacks\nseal\nsealable\nsealant\nsealants\nsealed\nsealer\nsealers\nsealift\nsealifted\nsealifting\nsealifts\nsealing\nseals\nsealskin\nsealskins\nsealyham\nseam\nseaman\nseamanlike\nseamanly\nseamanship\nseamark\nseamarks\nseamed\nseamen\nseamer\nseamers\nseamier\nseamiest\nseaminess\nseaming\nseamless\nseamlessly\nseamlessness\nseamlike\nseamount\nseamounts\nseams\nseamster\nseamsters\nseamstress\nseamstresses\nseamy\nseance\nseances\nseapiece\nseapieces\nseaplane\nseaplanes\nseaport\nseaports\nseaquake\nseaquakes\nsear\nsearch\nsearchable\nsearched\nsearcher\nsearchers\nsearches\nsearching\nsearchingly\nsearchless\nsearchlight\nsearchlights\nseared\nsearing\nsearingly\nsears\nseas\nseascape\nseascapes\nseashell\nseashells\nseashore\nseashores\nseasick\nseasickness\nseaside\nseason\nseasonable\nseasonableness\nseasonably\nseasonal\nseasonality\nseasonally\nseasoned\nseasoner\nseasoners\nseasoning\nseasonings\nseasonless\nseasons\nseastrand\nseastrands\nseat\nseatback\nseatbacks\nseated\nseater\nseaters\nseating\nseatmate\nseatmates\nseatrain\nseatrains\nseats\nseattle\nseatwork\nseawall\nseawalls\nseaward\nseawards\nseaware\nseawater\nseaway\nseaways\nseaweed\nseaweeds\nseaworthier\nseaworthiest\nseaworthiness\nseaworthy\nsebaceous\nsebacic\nsebastian\nsebastopol\nsebiferous\nsebiparous\nseborrhea\nseborrheic\nseborrhoea\nsebum\nsec\nsecant\nsecants\nsecco\nseccos\nsecede\nseceded\nseceder\nseceders\nsecedes\nseceding\nsecern\nsecerned\nsecerning\nsecernment\nsecernments\nsecerns\nsecession\nsecessional\nsecessionism\nsecessionist\nsecessionists\nsecessions\nsechuana\nseckel\nseclude\nsecluded\nsecludedly\nsecludedness\nsecludes\nsecluding\nseclusion\nseclusive\nseclusively\nseclusiveness\nsecobarbital\nsecobarbitals\nseconal\nsecond\nsecondaries\nsecondarily\nsecondariness\nsecondary\nseconded\nseconder\nseconders\nsecondhand\nsecondi\nseconding\nsecondly\nsecondo\nseconds\nsecondstory\nsecrecies\nsecrecy\nsecret\nsecreta\nsecretagogue\nsecretagogues\nsecretarial\nsecretariat\nsecretariats\nsecretaries\nsecretary\nsecretaryship\nsecrete\nsecreted\nsecreter\nsecreters\nsecretes\nsecretin\nsecreting\nsecretins\nsecretion\nsecretionary\nsecretions\nsecretive\nsecretively\nsecretiveness\nsecretly\nsecretor\nsecretors\nsecretory\nsecrets\nsect\nsectarian\nsectarianism\nsectarianize\nsectarianized\nsectarianizes\nsectarianizing\nsectarians\nsectaries\nsectary\nsectile\nsectility\nsection\nsectional\nsectionalism\nsectionalist\nsectionalists\nsectionalization\nsectionalizations\nsectionalize\nsectionalized\nsectionalizes\nsectionalizing\nsectionally\nsectionals\nsectioned\nsectioning\nsections\nsector\nsectored\nsectorial\nsectoring\nsectors\nsects\nsecular\nsecularism\nsecularist\nsecularistic\nsecularists\nsecularities\nsecularity\nsecularization\nsecularizations\nsecularize\nsecularized\nsecularizer\nsecularizers\nsecularizes\nsecularizing\nsecularly\nseculars\nsecund\nsecundines\nsecurable\nsecure\nsecured\nsecurely\nsecurement\nsecurements\nsecureness\nsecurer\nsecurers\nsecures\nsecurest\nsecuring\nsecurities\nsecuritization\nsecuritize\nsecuritized\nsecuritizes\nsecuritizing\nsecurity\nsedan\nsedans\nsedarim\nsedate\nsedated\nsedately\nsedateness\nsedates\nsedating\nsedation\nsedations\nsedative\nsedatives\nsedentarily\nsedentariness\nsedentary\nseder\nseders\nsederunt\nsederunts\nsedge\nsedges\nsedgwick\nsedile\nsedilia\nsediment\nsedimental\nsedimentary\nsedimentation\nsedimentologic\nsedimentological\nsedimentologist\nsedimentologists\nsedimentology\nsediments\nsedition\nseditionist\nseditionists\nseditious\nseditiously\nseditiousness\nseduce\nseduceable\nseduced\nseducement\nseducements\nseducer\nseducers\nseduces\nseducible\nseducing\nseduction\nseductions\nseductive\nseductively\nseductiveness\nseductress\nseductresses\nsedulity\nsedulous\nsedulously\nsedulousness\nsedum\nsee\nseeable\nseecatch\nseecatchie\nseed\nseedbed\nseedbeds\nseedcake\nseedcakes\nseedcase\nseedcases\nseedeater\nseedeaters\nseeded\nseeder\nseeders\nseedier\nseediest\nseedily\nseediness\nseeding\nseedless\nseedlike\nseedling\nseedlings\nseedpod\nseedpods\nseeds\nseedsman\nseedsmen\nseedtime\nseedtimes\nseedy\nseeing\nseek\nseeker\nseekers\nseeking\nseeks\nseel\nseeled\nseeling\nseels\nseem\nseemed\nseeming\nseemingly\nseemingness\nseemlier\nseemliest\nseemliness\nseemly\nseems\nseen\nseep\nseepage\nseeped\nseeping\nseeps\nseepy\nseer\nseeress\nseeresses\nseers\nseersucker\nsees\nseesaw\nseesawed\nseesawing\nseesaws\nseethe\nseethed\nseethes\nseething\nsegment\nsegmental\nsegmentally\nsegmentary\nsegmentation\nsegmentations\nsegmented\nsegmenting\nsegments\nsegno\nsegnos\nsego\nsegos\nsegovia\nsegregable\nsegregant\nsegregants\nsegregate\nsegregated\nsegregates\nsegregating\nsegregation\nsegregationist\nsegregationists\nsegregations\nsegregative\nsegregator\nsegregators\nsegue\nsegued\nsegueing\nsegues\nseguidilla\nseguidillas\nseguing\nsei\nseicento\nseicentos\nseiche\nseiches\nseidel\nseidels\nseidlitz\nseigneur\nseigneurial\nseigneuries\nseigneurs\nseigneury\nseignior\nseigniorage\nseigniorial\nseigniories\nseigniors\nseigniory\nseignorage\nseignorial\nseignory\nseine\nseined\nseiner\nseiners\nseines\nseining\nseis\nseise\nseised\nseises\nseisin\nseising\nseisins\nseism\nseismic\nseismically\nseismicity\nseismism\nseismogram\nseismograms\nseismograph\nseismographer\nseismographers\nseismographic\nseismographical\nseismographs\nseismography\nseismologic\nseismological\nseismologically\nseismologist\nseismologists\nseismology\nseismometer\nseismometers\nseismometric\nseismometrical\nseismometry\nseismoscope\nseismoscopes\nseismoscopic\nseisms\nseisor\nseisors\nseizable\nseize\nseized\nseizer\nseizers\nseizes\nseizin\nseizing\nseizings\nseizins\nseizor\nseizors\nseizure\nseizures\nsejant\nselachian\nselachians\nseladang\nseladangs\nselaginella\nselaginellas\nselah\nselassie\nselcouth\nseldom\nseldomness\nselect\nselectable\nselected\nselectee\nselectees\nselecting\nselection\nselectional\nselectionism\nselectionist\nselectionists\nselections\nselective\nselectively\nselectiveness\nselectivities\nselectivity\nselectman\nselectmen\nselectness\nselector\nselectors\nselects\nselectwoman\nselectwomen\nselenate\nselenates\nselene\nselenic\nselenide\nselenides\nseleniferous\nselenite\nselenites\nselenium\nselenocentric\nselenographer\nselenographers\nselenographic\nselenographical\nselenographically\nselenographist\nselenographists\nselenography\nselenological\nselenologist\nselenologists\nselenology\nselenosis\nseleucid\nseleucids\nself\nselfdom\nselfhood\nselfish\nselfishly\nselfishness\nselfless\nselflessly\nselflessness\nselfmate\nselfness\nselfridge\nselfsame\nselfsameness\nseljuk\nseljukian\nsell\nsellable\nsellback\nsellbacks\nseller\nsellers\nselling\nselloff\nsellout\nsellouts\nsells\nselsyn\nselsyns\nseltzer\nseltzers\nselva\nselvage\nselvaged\nselvages\nselvas\nselvedge\nselvedged\nselvedges\nselves\nsemanteme\nsemantemes\nsemantic\nsemantical\nsemantically\nsemanticist\nsemanticists\nsemantics\nsemaphore\nsemaphored\nsemaphores\nsemaphoric\nsemaphorically\nsemaphoring\nsemasiological\nsemasiologist\nsemasiologists\nsemasiology\nsematic\nsemblable\nsemblables\nsemblably\nsemblance\nseme\nsemeiology\nsemeiotic\nsemeiotical\nsemeiotics\nsememe\nsememes\nsememic\nsemen\nsemes\nsemester\nsemesters\nsemestral\nsemestrial\nsemi\nsemiabstract\nsemiabstraction\nsemiabstractions\nsemiannual\nsemiannually\nsemiaquatic\nsemiarboreal\nsemiarid\nsemiaridity\nsemiattached\nsemiautobiographical\nsemiautomated\nsemiautomatic\nsemiautomatically\nsemiautomatics\nsemiautonomous\nsemiautonomously\nsemiautonomy\nsemibreve\nsemibreves\nsemicentennial\nsemicentennials\nsemicircle\nsemicircles\nsemicircular\nsemicivilized\nsemiclassic\nsemiclassical\nsemiclassics\nsemicolon\nsemicolonial\nsemicolonialism\nsemicolonies\nsemicolons\nsemicolony\nsemicoma\nsemicomas\nsemicomatose\nsemicommercial\nsemiconducting\nsemiconductor\nsemiconductors\nsemiconscious\nsemiconsciously\nsemiconsciousness\nsemiconservative\nsemiconservatively\nsemicrystalline\nsemidarkness\nsemidarknesses\nsemideified\nsemideifies\nsemideify\nsemideifying\nsemidesert\nsemideserts\nsemidetached\nsemidiameter\nsemidiameters\nsemidiurnal\nsemidivine\nsemidocumentaries\nsemidocumentary\nsemidome\nsemidomed\nsemidomes\nsemidomesticated\nsemidomestication\nsemidominant\nsemidried\nsemidry\nsemidrying\nsemidwarf\nsemidwarfs\nsemielliptical\nsemiempirical\nsemierect\nsemievergreen\nsemifeudal\nsemifinal\nsemifinalist\nsemifinalists\nsemifinals\nsemifinished\nsemifitted\nsemiflexible\nsemiflexion\nsemiflexions\nsemifluid\nsemifluidity\nsemifluids\nsemiformal\nsemigloss\nsemiglosses\nsemiglossy\nsemigovernmental\nsemigroup\nsemigroups\nsemihard\nsemilegendary\nsemilethal\nsemiliquid\nsemiliquidity\nsemiliquids\nsemiliteracy\nsemiliterate\nsemillon\nsemillons\nsemilog\nsemilogarithmic\nsemilunar\nsemilunate\nsemilustrous\nsemimajor\nsemimat\nsemimatt\nsemimatte\nsemimembranous\nsemimetal\nsemimetallic\nsemimetals\nsemimicro\nsemiminor\nsemimoist\nsemimonastic\nsemimonthlies\nsemimonthly\nsemimystical\nseminal\nseminally\nseminar\nseminarian\nseminarians\nseminaries\nseminarist\nseminarists\nseminars\nseminary\nseminatural\nseminiferous\nseminivorous\nseminole\nseminoles\nseminoma\nseminomad\nseminomadic\nseminomads\nseminomas\nseminomata\nseminude\nseminudity\nsemiofficial\nsemiofficially\nsemiological\nsemiologically\nsemiologist\nsemiologists\nsemiology\nsemiopaque\nsemiosis\nsemiotic\nsemiotical\nsemiotician\nsemioticians\nsemioticist\nsemioticists\nsemiotics\nsemioviparous\nsemipalmate\nsemipalmated\nsemiparasite\nsemiparasites\nsemiparasitic\nsemiparasitism\nsemipermanent\nsemipermeability\nsemipermeable\nsemipolitical\nsemipopular\nsemiporcelain\nsemiporcelains\nsemipornographic\nsemipornography\nsemipostal\nsemipostals\nsemiprecious\nsemiprivate\nsemipro\nsemiprofessional\nsemiprofessionally\nsemiprofessionals\nsemipros\nsemipublic\nsemipublicly\nsemiquantitative\nsemiquantitatively\nsemiquaver\nsemiquavers\nsemireligious\nsemiretired\nsemiretirement\nsemiretirements\nsemirigid\nsemiround\nsemirounds\nsemirural\nsemis\nsemisacred\nsemisecret\nsemisedentary\nsemiserious\nsemiseriously\nsemishrubby\nsemiskilled\nsemisoft\nsemisolid\nsemisolids\nsemispherical\nsemistaged\nsemisterile\nsemisubmersible\nsemisubmersibles\nsemisweet\nsemisynthetic\nsemite\nsemiterrestrial\nsemites\nsemitic\nsemiticist\nsemiticists\nsemitics\nsemitism\nsemitist\nsemitists\nsemitization\nsemitize\nsemitized\nsemitizes\nsemitizing\nsemitonal\nsemitonally\nsemitone\nsemitones\nsemitonic\nsemitonically\nsemitrailer\nsemitrailers\nsemitranslucent\nsemitransparent\nsemitropic\nsemitropical\nsemitropics\nsemivowel\nsemivowels\nsemiweeklies\nsemiweekly\nsemiworks\nsemiyearlies\nsemiyearly\nsemolina\nsempervivum\nsempervivums\nsempiternal\nsempiternally\nsempiternity\nsemplice\nsempre\nsempstress\nsempstresses\nsemtex\nsemé\nsen\nsenarii\nsenarius\nsenary\nsenate\nsenates\nsenator\nsenatorial\nsenatorially\nsenatorian\nsenators\nsenatorship\nsenatorships\nsend\nsendal\nsendals\nsender\nsenders\nsending\nsendoff\nsendoffs\nsends\nsene\nseneca\nsenecas\nsenecio\nsenecios\nsenectitude\nsenega\nsenegal\nsenegalese\nsenegambia\nsenegas\nsenesce\nsenesced\nsenescence\nsenescent\nsenesces\nseneschal\nseneschals\nsenescing\nsenhor\nsenhora\nsenhores\nsenhorita\nsenhors\nsenile\nsenilely\nsenility\nsenior\nseniorities\nseniority\nseniors\nseniti\nsenna\nsennas\nsennet\nsennets\nsennight\nsennights\nsennit\nsennits\nsenopia\nsenopias\nsenryu\nsensa\nsensate\nsensated\nsensately\nsensation\nsensational\nsensationalism\nsensationalist\nsensationalistic\nsensationalists\nsensationalization\nsensationalizations\nsensationalize\nsensationalized\nsensationalizes\nsensationalizing\nsensationally\nsensations\nsensatory\nsense\nsensed\nsenseful\nsensei\nsenseis\nsenseless\nsenselessly\nsenselessness\nsenses\nsensibilia\nsensibilities\nsensibility\nsensible\nsensibleness\nsensibly\nsensilla\nsensillum\nsensing\nsensitive\nsensitively\nsensitiveness\nsensitives\nsensitivities\nsensitivity\nsensitization\nsensitizations\nsensitize\nsensitized\nsensitizer\nsensitizers\nsensitizes\nsensitizing\nsensitometer\nsensitometers\nsensitometric\nsensitometry\nsensor\nsensoria\nsensorial\nsensorially\nsensorimotor\nsensorineural\nsensorium\nsensoriums\nsensors\nsensory\nsensual\nsensualism\nsensualist\nsensualistic\nsensualists\nsensuality\nsensualization\nsensualizations\nsensualize\nsensualized\nsensualizes\nsensualizing\nsensually\nsensualness\nsensum\nsensuosity\nsensuous\nsensuously\nsensuousness\nsensurround\nsent\nsentence\nsentenced\nsentencer\nsentencers\nsentences\nsentencing\nsentencings\nsententia\nsententiae\nsentential\nsententially\nsententious\nsententiously\nsententiousness\nsentience\nsentient\nsentiently\nsentiment\nsentimental\nsentimentalism\nsentimentalist\nsentimentalists\nsentimentalities\nsentimentality\nsentimentalization\nsentimentalizations\nsentimentalize\nsentimentalized\nsentimentalizes\nsentimentalizing\nsentimentally\nsentiments\nsentimo\nsentimos\nsentinel\nsentineled\nsentineling\nsentinelled\nsentinelling\nsentinels\nsentries\nsentry\nseoul\nsepal\nsepaled\nsepaline\nsepaloid\nsepalous\nsepals\nseparability\nseparable\nseparableness\nseparably\nseparate\nseparated\nseparately\nseparateness\nseparates\nseparating\nseparation\nseparationist\nseparationists\nseparations\nseparatism\nseparatist\nseparatistic\nseparatists\nseparative\nseparator\nseparators\nsephardi\nsephardic\nsephardim\nsepia\nsepias\nsepiolite\nsepiolites\nsepoy\nsepoys\nseppuku\nseppukus\nsepses\nsepsis\nsept\nsepta\nseptage\nseptages\nseptal\nseptaria\nseptarian\nseptarium\nseptate\nseptavalent\nseptcentenary\nseptectomies\nseptectomy\nseptember\nseptembers\nseptembrist\nseptembrists\nseptenarii\nseptenarius\nseptenary\nseptenate\nseptendecillion\nseptendecillions\nseptennial\nseptennially\nseptennials\nseptentrion\nseptentrional\nseptentrions\nseptet\nseptets\nseptette\nseptettes\nseptic\nsepticemia\nsepticemic\nsepticidal\nsepticidally\nsepticity\nseptifragal\nseptifragally\nseptilateral\nseptillion\nseptillions\nseptillionth\nseptillionths\nseptimal\nseptivalent\nsepts\nseptuagenarian\nseptuagenarians\nseptuagesima\nseptuagesimas\nseptuagint\nseptuagintal\nseptum\nseptuple\nseptupled\nseptuples\nseptuplet\nseptuplets\nseptupling\nsepulcher\nsepulchered\nsepulchering\nsepulchers\nsepulchral\nsepulchrally\nsepulchre\nsepulchred\nsepulchres\nsepulchring\nsepulture\nsepultures\nseq\nsequacious\nsequaciously\nsequacity\nsequel\nsequela\nsequelae\nsequels\nsequenator\nsequenators\nsequence\nsequenced\nsequencer\nsequencers\nsequences\nsequencing\nsequency\nsequent\nsequential\nsequentiality\nsequentially\nsequents\nsequester\nsequestered\nsequestering\nsequesters\nsequestra\nsequestrant\nsequestrants\nsequestrate\nsequestrated\nsequestrates\nsequestrating\nsequestration\nsequestrations\nsequestrator\nsequestrators\nsequestrum\nsequin\nsequined\nsequining\nsequinned\nsequins\nsequitur\nsequiturs\nsequoia\nsequoias\nsera\nseraglio\nseraglios\nserai\nseral\nserape\nserapes\nseraph\nseraphic\nseraphical\nseraphically\nseraphim\nseraphs\nserapis\nserb\nserbia\nserbian\nserbians\nserbo\nserbs\nsere\nserenade\nserenaded\nserenader\nserenaders\nserenades\nserenading\nserenata\nserenatas\nserendipitous\nserendipitously\nserendipity\nserene\nserenely\nsereneness\nserener\nserenest\nserenissima\nserenity\nserer\nserest\nserf\nserfage\nserfdom\nserfs\nserge\nsergeancy\nsergeant\nsergeanties\nsergeants\nsergeantship\nsergeanty\nserges\nserging\nserial\nserialism\nserialist\nserialists\nserialization\nserializations\nserialize\nserialized\nserializes\nserializing\nserially\nserials\nseriate\nseriated\nseriately\nseriates\nseriatim\nseriating\nseriation\nsericeous\nsericin\nsericins\nsericteria\nsericterium\nsericultural\nsericulture\nsericulturist\nsericulturists\nseriema\nseriemas\nseries\nserif\nserifed\nseriffed\nserifs\nserigraph\nserigrapher\nserigraphers\nserigraphs\nserigraphy\nserin\nserine\nserines\nserins\nseriocomic\nseriocomically\nserious\nseriously\nseriousness\nserjeant\nserjeants\nserjeanty\nsermon\nsermonette\nsermonettes\nsermonic\nsermonical\nsermonize\nsermonized\nsermonizer\nsermonizers\nsermonizes\nsermonizing\nsermons\nseroconversion\nseroconversions\nserodiagnoses\nserodiagnosis\nserodiagnostic\nserologic\nserological\nserologically\nserologies\nserologist\nserologists\nserology\nseronegative\nseronegativity\nseropositive\nseropositivity\nseropurulent\nserosa\nserosae\nserosal\nserosas\nserositis\nserositises\nserotherapies\nserotherapist\nserotherapists\nserotherapy\nserotinal\nserotine\nserotines\nserotinous\nserotonergic\nserotonin\nserotoninergic\nserotonins\nserotype\nserotyped\nserotypes\nserotyping\nserous\nserow\nserows\nserpens\nserpent\nserpentaria\nserpentarium\nserpentariums\nserpentine\nserpentinely\nserpentines\nserpents\nserpiginous\nserpiginously\nserpigo\nserpigos\nserranid\nserranids\nserrano\nserranos\nserrate\nserrated\nserrates\nserrating\nserration\nserried\nserriedly\nserriedness\nserries\nserrulate\nserrulated\nserrulation\nserry\nserrying\nsertoli\nsertoman\nsertularian\nsertularians\nserum\nserums\nserval\nservant\nservanthood\nservantless\nservants\nserve\nserved\nserver\nservers\nserves\nservibar\nservibars\nservice\nserviceability\nserviceable\nserviceableness\nserviceably\nserviceberries\nserviceberry\nserviced\nserviceman\nservicemen\nservicepeople\nserviceperson\nservicepersons\nservicer\nservicers\nservices\nservicewoman\nservicewomen\nservicing\nserviette\nserviettes\nservile\nservilely\nservileness\nservility\nserving\nservingly\nservings\nservite\nservites\nservitor\nservitors\nservitorship\nservitorships\nservitude\nservo\nservomechanism\nservomechanisms\nservomotor\nservomotors\nservos\nsesame\nsesames\nsesamoid\nsesamoids\nsesotho\nsesquicarbonate\nsesquicarbonates\nsesquicentenary\nsesquicentennial\nsesquicentennials\nsesquipedal\nsesquipedalian\nsesquipedalians\nsesquiterpene\nsesquiterpenes\nsessile\nsessility\nsession\nsessional\nsessionally\nsessions\nsesterce\nsesterces\nsestertia\nsestertium\nsestet\nsestets\nsestina\nsestinas\nset\nseta\nsetaceous\nsetaceously\nsetae\nsetal\nsetback\nsetbacks\nseth\nsetiferous\nsetiform\nsetigerous\nsetline\nsetlines\nsetoff\nsetoffs\nsetose\nsetout\nsetouts\nsets\nsetscrew\nsetscrews\nsetswana\nsettable\nsettee\nsettees\nsetter\nsetters\nsetting\nsettings\nsettle\nsettleable\nsettled\nsettlement\nsettlements\nsettler\nsettlers\nsettles\nsettling\nsettlings\nsettlor\nsettlors\nsetup\nsetups\nseurat\nsevastopol\nseven\nsevenfold\nsevens\nseventeen\nseventeenfold\nseventeens\nseventeenth\nseventeenths\nseventh\nseventhly\nsevenths\nseventies\nseventieth\nseventieths\nseventy\nseventyfold\nsever\nseverability\nseverable\nseveral\nseveralfold\nseverally\nseveralties\nseveralty\nseverance\nseverances\nsevere\nsevered\nseverely\nsevereness\nseverer\nseverest\nsevering\nseverities\nseverity\nsevers\nseverus\nseviche\nseviches\nseville\nsevres\nsevruga\nsevrugas\nsew\nsewability\nsewable\nsewage\nsewed\nsewellel\nsewellels\nsewer\nsewerage\nsewers\nsewing\nsewn\nsews\nsex\nsexagenarian\nsexagenarians\nsexagenaries\nsexagenary\nsexagesima\nsexagesimal\nsexagesimally\nsexagesimas\nsexcentenaries\nsexcentenary\nsexdecillion\nsexdecillions\nsexduction\nsexductions\nsexed\nsexennial\nsexennially\nsexennials\nsexes\nsexier\nsexiest\nsexily\nsexiness\nsexing\nsexism\nsexist\nsexists\nsexivalent\nsexless\nsexlessly\nsexlessness\nsexologic\nsexological\nsexologist\nsexologists\nsexology\nsexpartite\nsexploitation\nsexpot\nsexpots\nsext\nsextans\nsextant\nsextants\nsextet\nsextets\nsextile\nsextillion\nsextillions\nsextillionth\nsextillionths\nsexto\nsextodecimo\nsextodecimos\nsexton\nsextons\nsextos\nsexts\nsextuple\nsextupled\nsextuples\nsextuplet\nsextuplets\nsextuplicate\nsextuplicated\nsextuplicately\nsextuplicates\nsextuplicating\nsextuplication\nsextuplications\nsextupling\nsextuply\nsexual\nsexuality\nsexualization\nsexualizations\nsexualize\nsexualized\nsexualizes\nsexualizing\nsexually\nsexvalent\nsexy\nseychelles\nseychellois\nseyfert\nseymour\nseymours\nseñor\nseñora\nseñores\nseñorita\nseñors\nsferics\nsforza\nsforzandi\nsforzando\nsforzandos\nsforzas\nsfumato\nsfumatos\nsgraffiti\nsgraffito\nsh\nsha'ban\nshaaban\nshaanxi\nshaba\nshabbat\nshabbier\nshabbiest\nshabbily\nshabbiness\nshabby\nshabu\nshabuoth\nshack\nshacked\nshacking\nshackle\nshacklebone\nshacklebones\nshackled\nshackler\nshacklers\nshackles\nshackling\nshacko\nshacks\nshad\nshadberries\nshadberry\nshadblow\nshadblows\nshadbush\nshadbushes\nshaddock\nshaddocks\nshade\nshaded\nshadeless\nshader\nshaders\nshades\nshadflies\nshadfly\nshadier\nshadiest\nshadily\nshadiness\nshading\nshadings\nshadoof\nshadoofs\nshadow\nshadowbox\nshadowboxed\nshadowboxes\nshadowboxing\nshadowed\nshadower\nshadowers\nshadowgraph\nshadowgraphs\nshadowgraphy\nshadowier\nshadowiest\nshadowily\nshadowiness\nshadowing\nshadowless\nshadowlike\nshadows\nshadowy\nshads\nshaduf\nshadufs\nshady\nshaft\nshafted\nshafting\nshaftings\nshafts\nshag\nshagbark\nshagbarks\nshagged\nshaggier\nshaggiest\nshaggily\nshagginess\nshagging\nshaggy\nshaggymane\nshaggymanes\nshagreen\nshagreens\nshags\nshah\nshahaptian\nshahaptians\nshahaptin\nshahaptins\nshahdom\nshahdoms\nshahs\nshaitan\nshaitans\nshakable\nshake\nshakeable\nshakedown\nshakedowns\nshaken\nshakeout\nshakeouts\nshaker\nshakerism\nshakers\nshakes\nshakespeare\nshakespearean\nshakespeareana\nshakespeareans\nshakespearian\nshakespeariana\nshakespearians\nshakeup\nshakeups\nshakier\nshakiest\nshakily\nshakiness\nshaking\nshako\nshakoes\nshakos\nshaksperean\nshaksperian\nshakta\nshaktas\nshakti\nshaktism\nshaktist\nshaktists\nshaky\nshale\nshaley\nshalimar\nshall\nshallied\nshallies\nshalling\nshalloon\nshalloons\nshallop\nshallops\nshallot\nshallots\nshallow\nshallowed\nshallower\nshallowest\nshallowing\nshallowly\nshallowness\nshallows\nshallu\nshallus\nshally\nshallying\nshallys\nshalom\nshalt\nsham\nshaman\nshamanic\nshamanism\nshamanist\nshamanistic\nshamanists\nshamans\nshamash\nshamble\nshambled\nshambles\nshambling\nshambolic\nshambolically\nshame\nshamed\nshamefaced\nshamefacedly\nshamefacedness\nshamefast\nshameful\nshamefully\nshamefulness\nshameless\nshamelessly\nshamelessness\nshames\nshaming\nshammed\nshammer\nshammers\nshammes\nshammies\nshamming\nshammosim\nshammy\nshampoo\nshampooed\nshampooer\nshampooers\nshampooing\nshampoos\nshamrock\nshamrocks\nshams\nshamus\nshamuses\nshan\nshan't\nshandies\nshandong\nshandy\nshandygaff\nshandygaffs\nshanghai\nshanghaied\nshanghaier\nshanghaiers\nshanghaiing\nshanghais\nshangri\nshank\nshanked\nshanking\nshankpiece\nshankpieces\nshanks\nshans\nshansi\nshanter\nshanters\nshantey\nshanteys\nshanties\nshantung\nshanty\nshantyman\nshantymen\nshantytown\nshantytowns\nshanxi\nshapable\nshape\nshapeable\nshaped\nshapeless\nshapelessly\nshapelessness\nshapelier\nshapeliest\nshapeliness\nshapely\nshapen\nshaper\nshapers\nshapes\nshapeup\nshapeups\nshaping\nsharable\nshard\nshards\nshare\nshareability\nshareable\nsharecrop\nsharecropped\nsharecropper\nsharecroppers\nsharecropping\nsharecrops\nshared\nshareholder\nshareholders\nshareholding\nshareowner\nshareowners\nsharer\nsharers\nshares\nshareware\nshari'a\nshari'ah\nsharia\nsharif\nsharifian\nsharifs\nsharing\nshark\nsharked\nsharking\nsharklike\nsharks\nsharkskin\nsharon\nsharp\nsharped\nsharpen\nsharpened\nsharpener\nsharpeners\nsharpening\nsharpens\nsharper\nsharpers\nsharpest\nsharpie\nsharpies\nsharping\nsharply\nsharpness\nsharps\nsharpshooter\nsharpshooters\nsharpshooting\nsharpshootings\nsharpy\nshashlick\nshashlicks\nshashlik\nshashliks\nshaslik\nshasta\nshastra\nshastras\nshat\nshatter\nshattered\nshattering\nshatteringly\nshatterproof\nshatters\nshave\nshaved\nshaveling\nshavelings\nshaven\nshaver\nshavers\nshaves\nshavetail\nshavetails\nshavian\nshavians\nshaving\nshavings\nshavuot\nshaw\nshawl\nshawled\nshawling\nshawls\nshawm\nshawms\nshawnee\nshawnees\nshawwal\nshay\nshays\nshe\nshe'd\nshe'll\nshe's\nshea\nsheaf\nsheafed\nsheafing\nsheaflike\nsheafs\nshear\nsheared\nshearer\nshearers\nshearing\nshearling\nshearlings\nshears\nshearwater\nshearwaters\nsheatfish\nsheatfishes\nsheath\nsheathbill\nsheathbills\nsheathe\nsheathed\nsheather\nsheathers\nsheathes\nsheathing\nsheathings\nsheaths\nsheave\nsheaved\nsheaves\nsheaving\nshebang\nshebat\nshebats\nshebeen\nshebeens\nshechinah\nshed\nshedder\nshedders\nshedding\nshedlike\nshedrow\nshedrows\nsheds\nsheen\nsheenies\nsheeny\nsheep\nsheepberries\nsheepberry\nsheepcote\nsheepcotes\nsheepdog\nsheepdogs\nsheepfold\nsheepfolds\nsheepherder\nsheepherders\nsheepherding\nsheepish\nsheepishly\nsheepishness\nsheepshank\nsheepshanks\nsheepshead\nsheepsheads\nsheepshearer\nsheepshearers\nsheepshearing\nsheepshearings\nsheepskin\nsheepskins\nsheer\nsheered\nsheerer\nsheerest\nsheering\nsheerlegs\nsheerly\nsheerness\nsheers\nsheet\nsheeted\nsheeter\nsheeters\nsheetfed\nsheeting\nsheetlike\nsheetrock\nsheets\nshegetz\nsheik\nsheika\nsheikas\nsheikdom\nsheikdoms\nsheikh\nsheikha\nsheikhas\nsheikhdom\nsheikhdoms\nsheikhs\nsheiks\nsheila\nshekel\nshekels\nshekinah\nshelby\nsheldonian\nsheldrake\nsheldrakes\nshelduck\nshelducks\nshelf\nshelfful\nshelffuls\nshelflike\nshelikof\nshell\nshellac\nshellack\nshellacked\nshellacking\nshellacks\nshellacs\nshellback\nshellbacks\nshellbark\nshellbarks\nshellcracker\nshellcrackers\nshelled\nsheller\nshellers\nshelley\nshelleys\nshellfire\nshellfish\nshellfisheries\nshellfishery\nshellfishes\nshellfishing\nshellflower\nshellflowers\nshellier\nshelliest\nshelling\nshellproof\nshells\nshellshocked\nshellwork\nshelly\nshelta\nshelter\nshelterbelt\nshelterbelts\nsheltered\nshelterer\nshelterers\nsheltering\nshelterless\nshelters\nsheltie\nshelties\nshelty\nshelve\nshelved\nshelver\nshelvers\nshelves\nshelving\nshema\nshemini\nshenandoah\nshenanigan\nshenanigans\nshensi\nsheol\nshepherd\nshepherded\nshepherdess\nshepherdesses\nshepherding\nshepherds\nsheqalim\nsheqel\nsheraton\nsherbert\nsherberts\nsherbet\nsherbets\nsherd\nsherds\nshergottite\nshergottites\nsheridan\nsherif\nsheriff\nsheriffdom\nsheriffs\nsherifs\nsherlock\nsheroot\nsheroots\nsherpa\nsherpas\nsherries\nsherry\nshetland\nshetlander\nshetlanders\nshetlands\nshevat\nshevats\nshewbread\nshewbreads\nshi\nshi'ism\nshi'ite\nshi'ites\nshia\nshias\nshiatsu\nshiatzu\nshibah\nshibboleth\nshibboleths\nshied\nshield\nshielded\nshielder\nshielders\nshielding\nshields\nshieling\nshielings\nshier\nshies\nshiest\nshift\nshiftable\nshifted\nshifter\nshifters\nshiftier\nshiftiest\nshiftily\nshiftiness\nshifting\nshiftless\nshiftlessly\nshiftlessness\nshifts\nshifty\nshigella\nshigellae\nshigellas\nshigelloses\nshigellosis\nshiism\nshiitake\nshiite\nshiites\nshiitic\nshikar\nshikari\nshikaris\nshikarred\nshikarring\nshikoku\nshiksa\nshiksas\nshikse\nshikses\nshill\nshillalah\nshillalahs\nshilled\nshillelagh\nshillelaghs\nshilling\nshillings\nshills\nshilluk\nshilluks\nshilly\nshim\nshimmed\nshimmer\nshimmered\nshimmering\nshimmeringly\nshimmers\nshimmery\nshimmied\nshimmies\nshimming\nshimmy\nshimmying\nshims\nshin\nshina\nshinbone\nshinbones\nshindies\nshindig\nshindigs\nshindy\nshindys\nshine\nshined\nshiner\nshiners\nshines\nshingle\nshingled\nshingler\nshinglers\nshingles\nshingling\nshingly\nshingon\nshinier\nshiniest\nshininess\nshining\nshiningly\nshinleaf\nshinleafs\nshinleaves\nshinned\nshinneries\nshinnery\nshinney\nshinneys\nshinnied\nshinnies\nshinning\nshinny\nshinnying\nshinplaster\nshinplasters\nshins\nshinsplints\nshinto\nshintoism\nshintoist\nshintoistic\nshintoists\nshiny\nship\nshipboard\nshipborne\nshipbuilder\nshipbuilders\nshipbuilding\nshipfitter\nshipfitters\nshiplap\nshiplapped\nshipload\nshiploads\nshipman\nshipmaster\nshipmasters\nshipmate\nshipmates\nshipmen\nshipment\nshipments\nshipowner\nshipowners\nshippable\nshipped\nshipper\nshippers\nshipping\nships\nshipshape\nshipside\nshipsides\nshipway\nshipways\nshipworm\nshipworms\nshipwreck\nshipwrecked\nshipwrecking\nshipwrecks\nshipwright\nshipwrights\nshipyard\nshipyards\nshire\nshires\nshirk\nshirked\nshirker\nshirkers\nshirking\nshirks\nshirr\nshirred\nshirring\nshirrs\nshirt\nshirtdress\nshirtdresses\nshirted\nshirtfront\nshirtfronts\nshirtier\nshirtiest\nshirting\nshirtless\nshirtmaker\nshirtmakers\nshirts\nshirtsleeve\nshirtsleeved\nshirtsleeves\nshirttail\nshirttails\nshirtwaist\nshirtwaists\nshirty\nshish\nshit\nshitake\nshitfaced\nshithead\nshitheads\nshitless\nshitlist\nshitlists\nshits\nshittah\nshittahs\nshittier\nshittiest\nshittim\nshittimwood\nshittimwoods\nshitting\nshitty\nshiv\nshiva\nshivah\nshivaism\nshivaist\nshivaists\nshivaree\nshivarees\nshiver\nshivered\nshivering\nshivers\nshivery\nshivs\nshkotzim\nshlemiehl\nshlemiehls\nshlemiel\nshlemiels\nshlep\nshlepp\nshlepped\nshlepper\nshleppers\nshlepping\nshlepps\nshleps\nshlock\nshmear\nshmooze\nshmoozed\nshmoozes\nshmoozing\nshmuck\nshmucks\nshoal\nshoaled\nshoaling\nshoals\nshoat\nshoats\nshock\nshockable\nshocked\nshocker\nshockers\nshocking\nshockingly\nshockproof\nshocks\nshod\nshodden\nshoddier\nshoddies\nshoddiest\nshoddily\nshoddiness\nshoddy\nshoe\nshoebill\nshoebills\nshoeblack\nshoeblacks\nshoebox\nshoeboxes\nshoed\nshoehorn\nshoehorned\nshoehorning\nshoehorns\nshoeing\nshoelace\nshoelaces\nshoeless\nshoemaker\nshoemakers\nshoemaking\nshoepac\nshoepack\nshoepacks\nshoepacs\nshoes\nshoeshine\nshoeshines\nshoestring\nshoestrings\nshoetree\nshoetrees\nshofar\nshofars\nshofroth\nshogi\nshogis\nshogun\nshogunal\nshogunate\nshogunates\nshoguns\nshoji\nshojis\nshona\nshonas\nshone\nshoo\nshooed\nshooflies\nshoofly\nshooing\nshook\nshooks\nshoos\nshoot\nshootdown\nshootdowns\nshooter\nshooters\nshooting\nshootings\nshootout\nshootouts\nshoots\nshop\nshopkeeper\nshopkeepers\nshoplift\nshoplifted\nshoplifter\nshoplifters\nshoplifting\nshoplifts\nshoppe\nshopped\nshopper\nshoppers\nshoppes\nshopping\nshops\nshoptalk\nshopwindow\nshopwindows\nshopworn\nshoran\nshorans\nshore\nshorebird\nshorebirds\nshored\nshorefront\nshorefronts\nshoreline\nshorelines\nshores\nshoreside\nshoreward\nshorewards\nshoring\nshorings\nshorn\nshort\nshortage\nshortages\nshortbread\nshortcake\nshortcakes\nshortchange\nshortchanged\nshortchanger\nshortchangers\nshortchanges\nshortchanging\nshortcoming\nshortcomings\nshortcut\nshortcuts\nshortcutting\nshorted\nshorten\nshortened\nshortener\nshorteners\nshortening\nshortenings\nshortens\nshorter\nshortest\nshortfall\nshortfalls\nshorthair\nshorthaired\nshorthairs\nshorthand\nshorthanded\nshorthands\nshorthorn\nshorthorns\nshortia\nshortias\nshortie\nshorties\nshorting\nshortish\nshortleaf\nshortlist\nshortlists\nshortly\nshortness\nshorts\nshortsighted\nshortsightedly\nshortsightedness\nshortstop\nshortstops\nshortwave\nshorty\nshoshone\nshoshonean\nshoshones\nshoshoni\nshoshonis\nshostakovich\nshot\nshote\nshotes\nshotgun\nshotgunner\nshotgunners\nshotguns\nshots\nshott\nshotted\nshotten\nshotting\nshotts\nshould\nshould've\nshoulder\nshouldered\nshouldering\nshoulders\nshouldest\nshouldn\nshouldn't\nshouldst\nshout\nshouted\nshouter\nshouters\nshouting\nshouts\nshove\nshoved\nshovel\nshoveled\nshoveler\nshovelers\nshovelful\nshovelfuls\nshovelhead\nshovelheads\nshoveling\nshovelled\nshoveller\nshovellers\nshovelling\nshovelnose\nshovelnoses\nshovels\nshovelsful\nshover\nshovers\nshoves\nshoving\nshow\nshowable\nshowbiz\nshowbizzy\nshowboat\nshowboated\nshowboating\nshowboats\nshowbread\nshowbreads\nshowcase\nshowcased\nshowcases\nshowcasing\nshowdown\nshowdowns\nshowed\nshower\nshowered\nshowerer\nshowerers\nshowerhead\nshowerheads\nshowering\nshowerless\nshowers\nshowery\nshowgirl\nshowgirls\nshowier\nshowiest\nshowily\nshowiness\nshowing\nshowings\nshowman\nshowmanship\nshowmen\nshown\nshowoff\nshowoffs\nshowpiece\nshowpieces\nshowplace\nshowplaces\nshowring\nshowrings\nshowroom\nshowrooms\nshows\nshowstopper\nshowstoppers\nshowstopping\nshowtime\nshowtimes\nshowy\nshoyu\nshrank\nshrapnel\nshred\nshredded\nshredder\nshredders\nshredding\nshreds\nshrew\nshrewd\nshrewder\nshrewdest\nshrewdly\nshrewdness\nshrewish\nshrewishly\nshrewishness\nshrewlike\nshrewmice\nshrewmouse\nshrews\nshriek\nshrieked\nshrieker\nshriekers\nshrieking\nshrieks\nshrieval\nshrievalty\nshrift\nshrifts\nshrike\nshrikes\nshrill\nshrilled\nshriller\nshrillest\nshrilling\nshrillness\nshrills\nshrilly\nshrimp\nshrimped\nshrimper\nshrimpers\nshrimpfish\nshrimpfishes\nshrimping\nshrimplike\nshrimps\nshrimpy\nshrine\nshrined\nshriner\nshriners\nshrines\nshrining\nshrink\nshrinkable\nshrinkage\nshrinkages\nshrinker\nshrinkers\nshrinking\nshrinks\nshrive\nshrived\nshrivel\nshriveled\nshriveling\nshrivelled\nshrivelling\nshrivels\nshriven\nshriver\nshrivers\nshrives\nshriving\nshroff\nshroffs\nshropshire\nshroud\nshrouded\nshrouding\nshrouds\nshrove\nshrovetide\nshrub\nshrubberies\nshrubbery\nshrubbier\nshrubbiest\nshrubbiness\nshrubby\nshrubs\nshrug\nshrugged\nshrugging\nshrugs\nshrunk\nshrunken\nshtetel\nshtetels\nshtetl\nshtetlach\nshtetls\nshtick\nshticks\nshtik\nshtiks\nshuck\nshucked\nshucker\nshuckers\nshucking\nshucks\nshudder\nshuddered\nshuddering\nshudderingly\nshudders\nshuddery\nshuffle\nshuffleboard\nshuffled\nshuffler\nshufflers\nshuffles\nshuffling\nshui\nshul\nshuls\nshun\nshunned\nshunner\nshunners\nshunning\nshunpike\nshunpiked\nshunpiker\nshunpikers\nshunpikes\nshunpiking\nshuns\nshunt\nshunted\nshunter\nshunters\nshunting\nshunts\nshush\nshushed\nshushes\nshushing\nshut\nshutdown\nshutdowns\nshute\nshuteye\nshutoff\nshutoffs\nshutout\nshutouts\nshuts\nshutter\nshutterbug\nshutterbugs\nshuttered\nshuttering\nshutterless\nshutters\nshutting\nshuttle\nshuttlecock\nshuttlecocked\nshuttlecocking\nshuttlecocks\nshuttlecraft\nshuttlecrafts\nshuttled\nshuttleless\nshuttler\nshuttlers\nshuttles\nshuttling\nshy\nshyer\nshyers\nshyest\nshying\nshylock\nshylocked\nshylocking\nshylocks\nshyly\nshyness\nshyster\nshysterism\nshysters\nsi\nsiabon\nsiabons\nsial\nsialadenitis\nsialadenitises\nsialagogic\nsialagogue\nsialagogues\nsialic\nsialomucin\nsialomucins\nsialorrhea\nsialorrheas\nsialorrhoea\nsialorrhoeas\nsials\nsiam\nsiamang\nsiamangs\nsiamese\nsib\nsibari\nsibelius\nsiberia\nsiberian\nsiberians\nsibilance\nsibilancy\nsibilant\nsibilantly\nsibilants\nsibilate\nsibilated\nsibilates\nsibilating\nsibilation\nsibilations\nsibling\nsiblings\nsibs\nsibuyan\nsibyl\nsibylic\nsibyllic\nsibylline\nsibyls\nsic\nsiccative\nsiccatives\nsicced\nsiccing\nsichuan\nsicilian\nsicilians\nsicily\nsick\nsickbay\nsickbays\nsickbed\nsickbeds\nsicked\nsicken\nsickened\nsickener\nsickeners\nsickening\nsickeningly\nsickens\nsicker\nsickert\nsickest\nsickie\nsickies\nsicking\nsickish\nsickishly\nsickishness\nsickle\nsicklebill\nsicklebills\nsickled\nsicklemia\nsicklemias\nsickles\nsicklied\nsicklier\nsicklies\nsickliest\nsicklily\nsickliness\nsickling\nsickly\nsicklying\nsickness\nsicknesses\nsicko\nsickos\nsickout\nsickouts\nsickroom\nsickrooms\nsicks\nsics\nsiddons\nsiddur\nsiddurim\nside\nsidearm\nsidearms\nsideband\nsidebands\nsidebar\nsidebars\nsideboard\nsideboards\nsideburn\nsideburned\nsideburns\nsidecar\nsidecars\nsided\nsidedly\nsidedness\nsidedress\nsidedresses\nsidehill\nsidehills\nsidekick\nsidekicks\nsidelight\nsidelights\nsideline\nsidelined\nsideliner\nsideliners\nsidelines\nsideling\nsidelining\nsidelong\nsideman\nsidemen\nsidepiece\nsidepieces\nsider\nsidereal\nsiderite\nsiderites\nsideritic\nsiderochrome\nsiderochromes\nsiderocyte\nsiderocytes\nsiderolite\nsiderolites\nsiderosis\nsides\nsidesaddle\nsidesaddles\nsideshow\nsideshows\nsideslip\nsideslipped\nsideslipping\nsideslips\nsidespin\nsidespins\nsidesplitting\nsidesplittingly\nsidestep\nsidestepped\nsidestepper\nsidesteppers\nsidestepping\nsidesteps\nsidestream\nsidestroke\nsidestroked\nsidestroker\nsidestrokers\nsidestrokes\nsidestroking\nsideswipe\nsideswiped\nsideswiper\nsideswipers\nsideswipes\nsideswiping\nsidetrack\nsidetracked\nsidetracking\nsidetracks\nsidewalk\nsidewalks\nsidewall\nsidewalls\nsideward\nsidewards\nsideway\nsideways\nsidewinder\nsidewinders\nsidewise\nsiding\nsidings\nsidle\nsidled\nsidles\nsidling\nsidlingly\nsidney\nsidon\nsiege\nsieged\nsieges\nsiegfried\nsieging\nsiemens\nsiena\nsienese\nsienna\nsierozem\nsierozems\nsierra\nsierran\nsierras\nsiesta\nsiestas\nsieva\nsieve\nsieved\nsievert\nsieverts\nsieves\nsieving\nsifaka\nsifakas\nsift\nsifted\nsifter\nsifters\nsifting\nsiftings\nsifts\nsigh\nsighed\nsigher\nsighers\nsighing\nsighs\nsight\nsighted\nsightedly\nsightedness\nsighting\nsightings\nsightless\nsightlessly\nsightlessness\nsightlier\nsightliest\nsightline\nsightlines\nsightliness\nsightly\nsights\nsightsaw\nsightsee\nsightseeing\nsightseen\nsightseer\nsightseers\nsightsees\nsigil\nsigils\nsigismund\nsigma\nsigmas\nsigmate\nsigmoid\nsigmoidal\nsigmoidally\nsigmoidoscope\nsigmoidoscopes\nsigmoidoscopic\nsigmoidoscopy\nsign\nsignage\nsignal\nsignaled\nsignaler\nsignalers\nsignaling\nsignalization\nsignalizations\nsignalize\nsignalized\nsignalizes\nsignalizing\nsignalled\nsignaller\nsignallers\nsignalling\nsignally\nsignalman\nsignalmen\nsignalment\nsignalments\nsignals\nsignatories\nsignatory\nsignature\nsignatures\nsignboard\nsignboards\nsigned\nsignee\nsignees\nsigner\nsigners\nsignet\nsigneted\nsigneting\nsignets\nsignifiable\nsignificance\nsignificances\nsignificancy\nsignificant\nsignificantly\nsignification\nsignifications\nsignificative\nsignificativeness\nsignifics\nsignified\nsignifier\nsignifiers\nsignifies\nsignify\nsignifying\nsigning\nsignings\nsignior\nsigniories\nsigniors\nsigniory\nsignoff\nsignoffs\nsignor\nsignora\nsignoras\nsignore\nsignori\nsignories\nsignorina\nsignorinas\nsignorine\nsignors\nsignory\nsignpost\nsignposts\nsigns\nsihasapa\nsihasapas\nsika\nsikas\nsikh\nsikhism\nsikhs\nsikkim\nsikkimese\nsilage\nsilane\nsilanes\nsilastic\nsild\nsilds\nsilence\nsilenced\nsilencer\nsilencers\nsilences\nsilencing\nsileni\nsilent\nsilently\nsilentness\nsilents\nsilenus\nsilesia\nsilesian\nsilesians\nsilesias\nsilex\nsilexes\nsilhouette\nsilhouetted\nsilhouettes\nsilhouetting\nsilhouettist\nsilhouettists\nsilica\nsilicate\nsilicates\nsiliceous\nsilicic\nsilicide\nsilicides\nsiliciferous\nsilicification\nsilicifications\nsilicified\nsilicifies\nsilicify\nsilicifying\nsilicious\nsilicle\nsilicles\nsilicon\nsilicone\nsilicones\nsiliconized\nsilicoses\nsilicosis\nsilicotic\nsilique\nsiliques\nsiliquose\nsiliquous\nsilk\nsilkaline\nsilked\nsilken\nsilkier\nsilkiest\nsilkily\nsilkiness\nsilking\nsilklike\nsilkoline\nsilks\nsilkscreen\nsilkscreened\nsilkscreening\nsilkscreens\nsilkweed\nsilkweeds\nsilkworm\nsilkworms\nsilky\nsill\nsillabub\nsillabubs\nsillier\nsillies\nsilliest\nsillily\nsillimanite\nsilliness\nsills\nsilly\nsilo\nsiloed\nsiloing\nsilos\nsiloxane\nsiloxanes\nsilt\nsiltation\nsiltations\nsilted\nsilting\nsilts\nsiltstone\nsiltstones\nsilty\nsilures\nsilurian\nsilurid\nsilurids\nsilva\nsilvae\nsilvan\nsilvanus\nsilvas\nsilver\nsilverback\nsilverbacked\nsilverbacks\nsilverbell\nsilverberries\nsilverberry\nsilvered\nsilverer\nsilverers\nsilvereye\nsilvereyes\nsilverfish\nsilverfishes\nsilveriness\nsilvering\nsilverly\nsilvern\nsilverpoint\nsilverpoints\nsilverrod\nsilverrods\nsilvers\nsilverside\nsilversides\nsilversmith\nsilversmithing\nsilversmiths\nsilvertip\nsilvertips\nsilverware\nsilverweed\nsilverweeds\nsilverwork\nsilvery\nsilvex\nsilvexes\nsilvichemical\nsilvichemicals\nsilvicolous\nsilvicultural\nsilviculturally\nsilviculture\nsilviculturist\nsilviculturists\nsima\nsimas\nsimazine\nsimchas\nsimchat\nsimeon\nsimian\nsimians\nsimilar\nsimilarities\nsimilarity\nsimilarly\nsimile\nsimiles\nsimilitude\nsimla\nsimmental\nsimmentals\nsimmenthal\nsimmenthals\nsimmer\nsimmered\nsimmering\nsimmers\nsimnel\nsimnels\nsimoleon\nsimoleons\nsimon\nsimoniac\nsimoniacal\nsimoniacally\nsimoniacs\nsimonist\nsimonists\nsimonize\nsimonized\nsimonizes\nsimonizing\nsimony\nsimoom\nsimooms\nsimoon\nsimoons\nsimp\nsimpatico\nsimper\nsimpered\nsimperer\nsimperers\nsimpering\nsimperingly\nsimpers\nsimple\nsimpleminded\nsimplemindedly\nsimplemindedness\nsimpleness\nsimpler\nsimples\nsimplest\nsimpleton\nsimpletons\nsimplex\nsimplexes\nsimplices\nsimplicia\nsimplicial\nsimplicially\nsimplicities\nsimplicity\nsimplification\nsimplifications\nsimplified\nsimplifier\nsimplifiers\nsimplifies\nsimplify\nsimplifying\nsimplism\nsimplistic\nsimplistically\nsimplon\nsimply\nsimps\nsimpson\nsimulacra\nsimulacre\nsimulacres\nsimulacrum\nsimulacrums\nsimular\nsimulars\nsimulate\nsimulated\nsimulates\nsimulating\nsimulation\nsimulations\nsimulative\nsimulator\nsimulators\nsimulcast\nsimulcasted\nsimulcasting\nsimulcasts\nsimulium\nsimuliums\nsimultaneity\nsimultaneous\nsimultaneously\nsimultaneousness\nsin\nsinai\nsinanthropus\nsinanthropuses\nsinapism\nsinapisms\nsinbad\nsince\nsincere\nsincerely\nsincereness\nsincerer\nsincerest\nsincerity\nsincipita\nsincipital\nsinciput\nsinciputs\nsind\nsindbad\nsindhi\nsindhis\nsine\nsinecure\nsinecures\nsinecurism\nsinecurist\nsinecurists\nsines\nsinew\nsinewed\nsinewing\nsinews\nsinewy\nsinfonia\nsinfonias\nsinfonietta\nsinfoniettas\nsinful\nsinfully\nsinfulness\nsing\nsingable\nsingapore\nsingaporean\nsingaporeans\nsinge\nsinged\nsingeing\nsinger\nsingers\nsinges\nsingh\nsinghalese\nsinging\nsingings\nsingle\nsingled\nsinglehood\nsingleness\nsingles\nsinglestick\nsinglesticker\nsinglestickers\nsinglesticks\nsinglet\nsingleton\nsingletons\nsingletree\nsingletrees\nsinglets\nsinglewide\nsinglewides\nsingling\nsingly\nsings\nsingsong\nsingsongs\nsingsongy\nsingspiel\nsingspiels\nsingular\nsingularities\nsingularity\nsingularize\nsingularized\nsingularizes\nsingularizing\nsingularly\nsingularness\nsingulars\nsinhala\nsinhalese\nsinicism\nsinicisms\nsinicization\nsinicizations\nsinicize\nsinicized\nsinicizes\nsinicizing\nsinification\nsinifications\nsinified\nsinifies\nsinify\nsinifying\nsinister\nsinisterly\nsinisterness\nsinistral\nsinistrally\nsinistrorse\nsinistrorsely\nsinistrous\nsinistrously\nsinitic\nsink\nsinkable\nsinkage\nsinkages\nsinker\nsinkerball\nsinkerballs\nsinkers\nsinkhole\nsinkholes\nsinkiang\nsinking\nsinks\nsinless\nsinlessly\nsinlessness\nsinn\nsinned\nsinner\nsinners\nsinning\nsino\nsinoatrial\nsinoauricular\nsinolog\nsinological\nsinologist\nsinologists\nsinologs\nsinologue\nsinologues\nsinology\nsinope\nsinophile\nsinophiles\nsinophilia\nsinophobe\nsinophobes\nsinophobia\nsinophobic\nsinopia\nsinopias\nsinopie\nsins\nsinsemilla\nsinsemillas\nsinter\nsinterability\nsintered\nsintering\nsinters\nsinuate\nsinuated\nsinuately\nsinuates\nsinuating\nsinuation\nsinuations\nsinuosities\nsinuosity\nsinuous\nsinuously\nsinuousness\nsinus\nsinuses\nsinusitis\nsinusoid\nsinusoidal\nsinusoidally\nsinusoids\nsiouan\nsiouans\nsioux\nsip\nsiphon\nsiphonal\nsiphoned\nsiphonic\nsiphoning\nsiphonophore\nsiphonophores\nsiphonostele\nsiphonosteles\nsiphonostelic\nsiphons\nsiphuncle\nsiphuncles\nsiphuncular\nsiphunculate\nsipped\nsipper\nsippers\nsippet\nsippets\nsipping\nsips\nsir\nsirach\nsirdar\nsirdars\nsire\nsired\nsiree\nsiren\nsirenian\nsirenians\nsirens\nsires\nsiriases\nsiriasis\nsiring\nsirius\nsirloin\nsirloins\nsirocco\nsiroccos\nsirrah\nsirrahs\nsirree\nsirs\nsirup\nsirups\nsirupy\nsirvente\nsirventes\nsis\nsisal\nsisals\nsiscowet\nsiscowets\nsiskin\nsiskins\nsisseton\nsissetons\nsissies\nsissified\nsissify\nsissifying\nsissiness\nsissy\nsissyish\nsissyness\nsister\nsisterhood\nsisterhoods\nsisterliness\nsisterly\nsisters\nsistine\nsistra\nsistrum\nsistrums\nsisyphean\nsisyphian\nsisyphus\nsit\nsita\nsitar\nsitarist\nsitarists\nsitars\nsitatunga\nsitatungas\nsitcom\nsitcoms\nsite\nsited\nsites\nsith\nsiting\nsitka\nsitkas\nsitology\nsitomania\nsitomanias\nsitophobia\nsitophobias\nsitosterol\nsitosterols\nsits\nsitter\nsitters\nsitting\nsittings\nsitu\nsituate\nsituated\nsituates\nsituating\nsituation\nsituational\nsituationally\nsituations\nsitus\nsitutunga\nsitutungas\nsitz\nsitzkrieg\nsitzkriegs\nsitzmark\nsitzmarks\nsiva\nsivaism\nsivaist\nsivaists\nsivan\nsiwalik\nsiwash\nsix\nsixes\nsixfold\nsixmo\nsixmos\nsixpence\nsixpences\nsixpenny\nsixteen\nsixteenfold\nsixteenmo\nsixteenmos\nsixteenpenny\nsixteens\nsixteenth\nsixteenths\nsixth\nsixthly\nsixths\nsixties\nsixtieth\nsixtieths\nsixtine\nsixty\nsixtyfold\nsixtyish\nsizable\nsizableness\nsizably\nsizar\nsizars\nsize\nsizeable\nsized\nsizer\nsizers\nsizes\nsizing\nsizings\nsizzle\nsizzled\nsizzler\nsizzlers\nsizzles\nsizzling\nsizzlingly\nsiècle\nsjaelland\nsjambok\nsjamboked\nsjamboking\nsjamboks\nsjögren\nska\nskag\nskagerak\nskagerrak\nskags\nskald\nskaldic\nskalds\nskamble\nskanda\nskaneateles\nskat\nskate\nskateboard\nskateboarded\nskateboarder\nskateboarders\nskateboarding\nskateboards\nskated\nskater\nskaters\nskates\nskating\nskatol\nskatole\nskatoles\nskatols\nskean\nskeane\nskeans\nskedaddle\nskedaddled\nskedaddler\nskedaddlers\nskedaddles\nskedaddling\nskeet\nskeeter\nskeeters\nskeg\nskegs\nskein\nskeins\nskeletal\nskeletally\nskeleton\nskeletonic\nskeletonize\nskeletonized\nskeletonizer\nskeletonizers\nskeletonizes\nskeletonizing\nskeletons\nskell\nskells\nskelter\nskeltered\nskeltering\nskelters\nskeltonics\nskene\nskenes\nskep\nskeps\nskepsis\nskeptic\nskeptical\nskeptically\nskepticism\nskeptics\nskerries\nskerry\nsketch\nsketchbook\nsketchbooks\nsketched\nsketcher\nsketchers\nsketches\nsketchier\nsketchiest\nsketchily\nsketchiness\nsketching\nsketchpad\nsketchpads\nsketchy\nskew\nskewback\nskewbacks\nskewbald\nskewbalds\nskewed\nskewer\nskewered\nskewering\nskewers\nskewing\nskewness\nskews\nski\nskiable\nskiagram\nskiagrams\nskiagraph\nskiagraphs\nskiagraphy\nskiascope\nskiascopes\nskiascopies\nskiascopy\nskibob\nskibobber\nskibobbers\nskibobbing\nskibobs\nskid\nskidded\nskidder\nskidders\nskiddier\nskiddiest\nskidding\nskiddoo\nskiddy\nskidoo\nskidoos\nskidproof\nskids\nskied\nskier\nskiers\nskies\nskiey\nskiff\nskiffle\nskiffs\nskiing\nskijoring\nskilful\nskill\nskilled\nskilless\nskillessness\nskillet\nskillets\nskillful\nskillfully\nskillfulness\nskilling\nskillings\nskills\nskim\nskimble\nskimmed\nskimmer\nskimmers\nskimming\nskimobile\nskimobiles\nskimp\nskimped\nskimpier\nskimpiest\nskimpily\nskimpiness\nskimping\nskimps\nskimpy\nskims\nskin\nskinflint\nskinflints\nskinful\nskinfuls\nskinhead\nskinheads\nskink\nskinker\nskinkers\nskinks\nskinless\nskinned\nskinner\nskinnerian\nskinnerians\nskinnerism\nskinners\nskinnier\nskinniest\nskinniness\nskinning\nskinny\nskins\nskintight\nskip\nskipjack\nskipjacks\nskippable\nskipped\nskipper\nskippered\nskippering\nskippers\nskipping\nskips\nskirl\nskirled\nskirling\nskirls\nskirmish\nskirmished\nskirmisher\nskirmishers\nskirmishes\nskirmishing\nskirr\nskirred\nskirret\nskirrets\nskirring\nskirrs\nskirt\nskirted\nskirter\nskirters\nskirting\nskirts\nskis\nskit\nskits\nskitter\nskittered\nskittering\nskitters\nskittery\nskittish\nskittishly\nskittishness\nskittle\nskittles\nskive\nskived\nskiver\nskivers\nskives\nskiving\nskivvies\nskivvy\nskiwear\nskoal\nskoda\nskopje\nskosh\nskua\nskuas\nskulduggeries\nskulduggery\nskulk\nskulked\nskulker\nskulkers\nskulking\nskulks\nskull\nskullcap\nskullcaps\nskullduggeries\nskullduggery\nskulled\nskulls\nskunk\nskunked\nskunking\nskunks\nskunkweed\nskunkweeds\nskunkworks\nsky\nskyborne\nskybox\nskyboxes\nskycap\nskycaps\nskydive\nskydived\nskydiver\nskydivers\nskydives\nskydiving\nskye\nskyey\nskyhook\nskyhooks\nskying\nskyjack\nskyjacked\nskyjacker\nskyjackers\nskyjacking\nskyjacks\nskylark\nskylarked\nskylarker\nskylarkers\nskylarking\nskylarks\nskylight\nskylighted\nskylights\nskyline\nskylines\nskylit\nskyrocket\nskyrocketed\nskyrocketing\nskyrockets\nskyros\nskysail\nskysails\nskyscraper\nskyscrapers\nskyscraping\nskywalk\nskywalks\nskyward\nskywards\nskyway\nskyways\nskywrite\nskywriter\nskywriters\nskywrites\nskywriting\nskywritten\nskywrote\nskíros\nslab\nslabbed\nslabber\nslabbered\nslabbering\nslabbers\nslabbing\nslablike\nslabs\nslack\nslacked\nslacken\nslackened\nslackening\nslackens\nslacker\nslackers\nslackest\nslacking\nslackly\nslackness\nslacks\nslag\nslagged\nslagging\nslaggy\nslags\nslain\nslake\nslaked\nslakes\nslaking\nslalom\nslalomed\nslalomer\nslalomers\nslaloming\nslalomist\nslalomists\nslaloms\nslam\nslammed\nslammer\nslammers\nslamming\nslams\nslander\nslandered\nslanderer\nslanderers\nslandering\nslanderous\nslanderously\nslanderousness\nslanders\nslang\nslanged\nslangily\nslanginess\nslanging\nslangs\nslanguage\nslangy\nslant\nslanted\nslanting\nslantingly\nslants\nslantways\nslantwise\nslanty\nslap\nslapdash\nslaphappier\nslaphappiest\nslaphappy\nslapjack\nslapjacks\nslapped\nslapper\nslappers\nslapping\nslaps\nslapstick\nslapsticks\nslash\nslashed\nslasher\nslashers\nslashes\nslashing\nslashingly\nslat\nslate\nslated\nslatelike\nslater\nslaters\nslates\nslatey\nslather\nslathered\nslathering\nslathers\nslatier\nslatiest\nslating\nslats\nslatted\nslattern\nslatternliness\nslatternly\nslatterns\nslatting\nslaty\nslaughter\nslaughtered\nslaughterer\nslaughterers\nslaughterhouse\nslaughterhouses\nslaughtering\nslaughterous\nslaughterously\nslaughters\nslav\nslave\nslaved\nslaveholder\nslaveholders\nslaveholding\nslaveholdings\nslaver\nslavered\nslaveries\nslavering\nslavers\nslavery\nslaves\nslavey\nslaveys\nslavic\nslavicist\nslavicists\nslaving\nslavish\nslavishly\nslavishness\nslavism\nslavist\nslavists\nslavocracies\nslavocracy\nslavocrat\nslavocratic\nslavocrats\nslavonia\nslavonian\nslavonians\nslavonic\nslavophil\nslavophile\nslavophiles\nslavophilism\nslavophils\nslavs\nslaw\nslaws\nslay\nslayed\nslayer\nslayers\nslaying\nslays\nsle\nsleave\nsleaves\nsleaze\nsleazebag\nsleazebags\nsleazeball\nsleazeballs\nsleazier\nsleaziest\nsleazily\nsleaziness\nsleazo\nsleazy\nsled\nsledded\nsledder\nsledders\nsledding\nsledge\nsledged\nsledgehammer\nsledgehammered\nsledgehammering\nsledgehammers\nsledges\nsledging\nsleds\nsleek\nsleeked\nsleeken\nsleekened\nsleekening\nsleekens\nsleeker\nsleekest\nsleeking\nsleekly\nsleekness\nsleeks\nsleep\nsleeper\nsleepers\nsleepier\nsleepiest\nsleepily\nsleepiness\nsleeping\nsleepless\nsleeplessly\nsleeplessness\nsleeplike\nsleepover\nsleepovers\nsleeps\nsleepwalk\nsleepwalked\nsleepwalker\nsleepwalkers\nsleepwalking\nsleepwalks\nsleepwear\nsleepy\nsleepyhead\nsleepyheads\nsleet\nsleeted\nsleeting\nsleets\nsleety\nsleeve\nsleeved\nsleeveless\nsleevelet\nsleevelets\nsleeves\nsleeving\nsleigh\nsleighed\nsleigher\nsleighers\nsleighing\nsleighs\nsleight\nsleights\nslender\nslenderer\nslenderest\nslenderize\nslenderized\nslenderizes\nslenderizing\nslenderly\nslenderness\nslept\nsles\nsleuth\nsleuthed\nsleuthhound\nsleuthhounds\nsleuthing\nsleuths\nslew\nslewed\nslewing\nslews\nslice\nsliceable\nsliced\nslicer\nslicers\nslices\nslicing\nslick\nslicked\nslicken\nslickened\nslickener\nslickeners\nslickening\nslickens\nslickenside\nslickensides\nslicker\nslickers\nslickest\nslicking\nslickly\nslickness\nslickrock\nslicks\nslid\nslidden\nslide\nslider\nsliders\nslides\nslideway\nslideways\nsliding\nslier\nsliest\nslight\nslighted\nslighter\nslightest\nslighting\nslightingly\nslightly\nslightness\nslights\nslim\nslime\nslimeball\nslimeballs\nslimed\nslimes\nslimier\nslimiest\nslimily\nsliminess\nsliming\nslimly\nslimmed\nslimmer\nslimmers\nslimmest\nslimming\nslimnastics\nslimness\nslimpsy\nslims\nslimsier\nslimsiest\nslimsy\nslimy\nsling\nslinger\nslingers\nslinging\nslings\nslingshot\nslingshots\nslink\nslinked\nslinkier\nslinkiest\nslinkily\nslinkiness\nslinking\nslinkingly\nslinks\nslinky\nslip\nslipcase\nslipcased\nslipcases\nslipcover\nslipcovered\nslipcovering\nslipcovers\nslipform\nslipformed\nslipforming\nslipforms\nslipknot\nslipknots\nslipover\nslipovers\nslippage\nslipped\nslipper\nslippered\nslipperier\nslipperiest\nslipperiness\nslippers\nslipperwort\nslipperworts\nslippery\nslippier\nslippiest\nslipping\nslippy\nslips\nslipshod\nslipshoddiness\nslipshodness\nslipslop\nslipslops\nslipsole\nslipsoles\nslipstitch\nslipstitches\nslipstream\nslipstreamed\nslipstreaming\nslipstreams\nslipup\nslipups\nslipware\nslipway\nslipways\nslit\nslither\nslithered\nslithering\nslithers\nslithery\nslitless\nslits\nslitter\nslitters\nslitting\nslitty\nsliver\nslivered\nslivering\nslivers\nslivery\nslivovitz\nslob\nslobber\nslobbered\nslobberer\nslobberers\nslobbering\nslobbers\nslobbery\nslobbish\nslobby\nslobs\nsloe\nsloes\nslog\nslogan\nsloganeer\nsloganeered\nsloganeering\nsloganeers\nsloganize\nsloganized\nsloganizer\nsloganizers\nsloganizes\nsloganizing\nslogans\nslogged\nslogger\nsloggers\nslogging\nslogs\nsloop\nsloops\nslop\nslope\nsloped\nsloper\nslopers\nslopes\nsloping\nslopingly\nslopped\nsloppier\nsloppiest\nsloppily\nsloppiness\nslopping\nsloppy\nslops\nslopwork\nslosh\nsloshed\nsloshes\nsloshing\nsloshy\nslot\nslotback\nslotbacks\nsloth\nslothful\nslothfully\nslothfulness\nsloths\nslots\nslotted\nslotting\nslouch\nslouched\nsloucher\nslouchers\nslouches\nslouchier\nslouchiest\nslouchily\nslouchiness\nslouching\nslouchy\nslough\nsloughed\nsloughing\nsloughs\nsloughy\nslovak\nslovakia\nslovakian\nslovakians\nslovaks\nsloven\nslovene\nslovenes\nslovenia\nslovenian\nslovenians\nslovenlier\nslovenliest\nslovenliness\nslovenly\nslovens\nslow\nslowdown\nslowdowns\nslowed\nslower\nslowest\nslowing\nslowish\nslowly\nslowness\nslowpoke\nslowpokes\nslows\nslowwitted\nslowworm\nslowworms\nsloyd\nsloyds\nslub\nslubbed\nslubbing\nslubs\nsludge\nsludged\nsludges\nsludgiest\nsludging\nsludgy\nslue\nslued\nslues\nslug\nslugabed\nslugabeds\nslugfest\nslugfests\nsluggard\nsluggardly\nsluggardness\nsluggards\nslugged\nslugger\nsluggers\nslugging\nsluggish\nsluggishly\nsluggishness\nslugs\nsluice\nsluiced\nsluices\nsluiceway\nsluiceways\nsluicing\nsluicy\nsluing\nslum\nslumber\nslumbered\nslumberer\nslumberers\nslumbering\nslumberingly\nslumberous\nslumberously\nslumberousness\nslumbers\nslumbery\nslumbrous\nslumgullion\nslumgullions\nslumlord\nslumlords\nslummed\nslummer\nslummier\nslummiest\nslumming\nslummy\nslump\nslumped\nslumpflation\nslumping\nslumps\nslums\nslung\nslungshot\nslungshots\nslunk\nslur\nslurb\nslurbs\nslurp\nslurped\nslurping\nslurps\nslurred\nslurried\nslurries\nslurring\nslurry\nslurrying\nslurs\nslush\nslushed\nslushes\nslushier\nslushiest\nslushily\nslushiness\nslushing\nslushy\nslut\nsluts\nsluttish\nsluttishly\nsluttishness\nslutty\nsly\nslyboots\nslyer\nslyest\nslyly\nslyness\nslype\nslypes\nsmack\nsmacked\nsmacker\nsmackers\nsmacking\nsmacks\nsmall\nsmallclothes\nsmaller\nsmallest\nsmallholder\nsmallholders\nsmallholding\nsmallholdings\nsmallish\nsmallmouth\nsmallness\nsmallpox\nsmalls\nsmallsword\nsmallswords\nsmalltime\nsmalltimer\nsmalltimers\nsmalt\nsmalti\nsmaltine\nsmaltines\nsmaltite\nsmaltites\nsmalto\nsmalts\nsmaragd\nsmaragdine\nsmaragdite\nsmaragdites\nsmarm\nsmarmier\nsmarmiest\nsmarmily\nsmarminess\nsmarmy\nsmart\nsmarted\nsmarten\nsmartened\nsmartening\nsmartens\nsmarter\nsmartest\nsmartie\nsmarties\nsmarting\nsmartly\nsmartness\nsmarts\nsmartweed\nsmartweeds\nsmarty\nsmash\nsmashed\nsmasher\nsmashers\nsmashes\nsmashing\nsmashingly\nsmashup\nsmashups\nsmatter\nsmattered\nsmatterer\nsmatterers\nsmattering\nsmatterings\nsmatters\nsmaze\nsmazes\nsmear\nsmearcase\nsmearcases\nsmeared\nsmearer\nsmearers\nsmearier\nsmeariest\nsmeariness\nsmearing\nsmears\nsmeary\nsmectic\nsmectite\nsmectites\nsmectitic\nsmegma\nsmell\nsmelled\nsmeller\nsmellers\nsmellier\nsmelliest\nsmelling\nsmells\nsmelly\nsmelt\nsmelted\nsmelter\nsmelteries\nsmelters\nsmeltery\nsmelting\nsmelts\nsmetana\nsmew\nsmews\nsmidge\nsmidgen\nsmidgens\nsmidgeon\nsmidgeons\nsmidgin\nsmidgins\nsmiercase\nsmilax\nsmilaxes\nsmile\nsmiled\nsmileless\nsmiler\nsmilers\nsmiles\nsmiley\nsmiling\nsmilingly\nsmilingness\nsmilodons\nsmilodonss\nsmily\nsmirch\nsmirched\nsmirches\nsmirching\nsmirk\nsmirked\nsmirker\nsmirkers\nsmirkily\nsmirking\nsmirkingly\nsmirks\nsmirky\nsmite\nsmiter\nsmiters\nsmites\nsmith\nsmithereens\nsmitheries\nsmithery\nsmithfield\nsmithies\nsmiths\nsmithsonian\nsmithsonite\nsmithsonites\nsmithy\nsmiting\nsmitten\nsmock\nsmocked\nsmocking\nsmockings\nsmocks\nsmog\nsmoggier\nsmoggiest\nsmoggy\nsmogless\nsmokable\nsmoke\nsmokeable\nsmoked\nsmokehouse\nsmokehouses\nsmokejack\nsmokejacks\nsmokejumper\nsmokejumpers\nsmokeless\nsmokelike\nsmoker\nsmokers\nsmokes\nsmokescreen\nsmokescreens\nsmokestack\nsmokestacks\nsmokey\nsmokier\nsmokiest\nsmokily\nsmokiness\nsmoking\nsmoky\nsmolder\nsmoldered\nsmoldering\nsmolderingly\nsmolders\nsmolensk\nsmollett\nsmolt\nsmolts\nsmooch\nsmooched\nsmooches\nsmooching\nsmoochy\nsmooth\nsmoothbore\nsmoothbores\nsmoothed\nsmoothen\nsmoothened\nsmoothening\nsmoothens\nsmoother\nsmoothers\nsmoothes\nsmoothest\nsmoothie\nsmoothies\nsmoothing\nsmoothly\nsmoothness\nsmooths\nsmoothy\nsmorgasbord\nsmorgasbords\nsmote\nsmother\nsmothered\nsmothering\nsmothers\nsmothery\nsmoulder\nsmouldered\nsmouldering\nsmoulders\nsmudge\nsmudged\nsmudges\nsmudgier\nsmudgiest\nsmudgily\nsmudginess\nsmudging\nsmudgy\nsmug\nsmugger\nsmuggest\nsmuggle\nsmuggled\nsmuggler\nsmugglers\nsmuggles\nsmuggling\nsmugly\nsmugness\nsmut\nsmutch\nsmutched\nsmutches\nsmutching\nsmutchy\nsmuts\nsmutted\nsmuttier\nsmuttiest\nsmuttily\nsmuttiness\nsmutting\nsmutty\nsmyrna\nsnack\nsnacked\nsnacker\nsnackers\nsnacking\nsnacks\nsnaffle\nsnaffled\nsnaffles\nsnaffling\nsnafu\nsnafued\nsnafuing\nsnafus\nsnag\nsnagged\nsnagging\nsnaggleteeth\nsnaggletooth\nsnaggletoothed\nsnaggy\nsnags\nsnail\nsnaillike\nsnails\nsnake\nsnake's\nsnakebird\nsnakebirds\nsnakebit\nsnakebite\nsnakebites\nsnakebitten\nsnaked\nsnakefish\nsnakefishes\nsnakehead\nsnakeheads\nsnakelike\nsnakemouth\nsnakemouths\nsnakeroot\nsnakeroots\nsnakes\nsnakeskin\nsnakeskins\nsnakestone\nsnakestones\nsnakeweed\nsnakeweeds\nsnakey\nsnakier\nsnakiest\nsnakily\nsnakiness\nsnaking\nsnaky\nsnap\nsnapback\nsnapbacks\nsnapdragon\nsnapdragons\nsnapped\nsnapper\nsnappers\nsnappier\nsnappiest\nsnappily\nsnappiness\nsnapping\nsnappish\nsnappishly\nsnappishness\nsnappy\nsnaps\nsnapshoot\nsnapshooter\nsnapshooters\nsnapshooting\nsnapshoots\nsnapshot\nsnapshots\nsnare\nsnared\nsnarer\nsnarers\nsnares\nsnaring\nsnarky\nsnarl\nsnarled\nsnarler\nsnarlers\nsnarling\nsnarlingly\nsnarls\nsnarly\nsnatch\nsnatched\nsnatcher\nsnatchers\nsnatches\nsnatchier\nsnatchiest\nsnatching\nsnatchy\nsnath\nsnathe\nsnathes\nsnaths\nsnazzier\nsnazziest\nsnazziness\nsnazzy\nsneak\nsneaked\nsneaker\nsneakered\nsneakers\nsneakier\nsneakiest\nsneakily\nsneakiness\nsneaking\nsneakingly\nsneaks\nsneaky\nsneer\nsneered\nsneerer\nsneerers\nsneerful\nsneering\nsneeringly\nsneers\nsneery\nsneeze\nsneezed\nsneezer\nsneezers\nsneezes\nsneezeweed\nsneezeweeds\nsneezewort\nsneezeworts\nsneezing\nsneezy\nsnell\nsnellen\nsnells\nsnib\nsnibbed\nsnibbing\nsnibs\nsnick\nsnicked\nsnicker\nsnickered\nsnickerer\nsnickerers\nsnickering\nsnickeringly\nsnickers\nsnickersnee\nsnickersnees\nsnickery\nsnicking\nsnicks\nsnide\nsnidely\nsnideness\nsnider\nsnidest\nsniff\nsniffable\nsniffed\nsniffer\nsniffers\nsniffier\nsniffiest\nsniffily\nsniffiness\nsniffing\nsniffish\nsniffishly\nsniffishness\nsniffle\nsniffled\nsniffler\nsnifflers\nsniffles\nsniffling\nsniffly\nsniffs\nsniffy\nsnifter\nsnifters\nsnigger\nsniggered\nsniggerer\nsniggerers\nsniggering\nsniggers\nsniggle\nsniggled\nsniggles\nsniggling\nsnip\nsnipe\nsniped\nsnipefish\nsnipefishes\nsniper\nsnipers\nsniperscope\nsniperscopes\nsnipes\nsniping\nsnipped\nsnipper\nsnippers\nsnippersnapper\nsnippersnappers\nsnippet\nsnippetier\nsnippetiest\nsnippets\nsnippety\nsnippier\nsnippiest\nsnippily\nsnippiness\nsnipping\nsnippy\nsnips\nsnit\nsnitch\nsnitched\nsnitcher\nsnitchers\nsnitches\nsnitching\nsnits\nsnivel\nsniveled\nsniveler\nsnivelers\nsniveling\nsnivelled\nsnivelling\nsnivels\nsnob\nsnobberies\nsnobbery\nsnobbier\nsnobbiest\nsnobbish\nsnobbishly\nsnobbishness\nsnobbism\nsnobby\nsnobs\nsnoek\nsnoeks\nsnollygoster\nsnollygosters\nsnood\nsnooded\nsnooding\nsnoods\nsnook\nsnooker\nsnookered\nsnookering\nsnookers\nsnooks\nsnoop\nsnooped\nsnooper\nsnoopers\nsnoopier\nsnoopiest\nsnoopily\nsnoopiness\nsnooping\nsnoops\nsnoopy\nsnoot\nsnooted\nsnootier\nsnootiest\nsnootily\nsnootiness\nsnooting\nsnoots\nsnooty\nsnooze\nsnoozed\nsnoozer\nsnoozers\nsnoozes\nsnoozing\nsnoozle\nsnoozled\nsnoozles\nsnoozling\nsnore\nsnored\nsnorer\nsnorers\nsnores\nsnoring\nsnorkel\nsnorkeled\nsnorkeler\nsnorkelers\nsnorkeling\nsnorkels\nsnort\nsnorted\nsnorter\nsnorters\nsnorting\nsnorts\nsnot\nsnots\nsnottier\nsnottiest\nsnottily\nsnottiness\nsnotty\nsnout\nsnouted\nsnoutish\nsnouts\nsnouty\nsnow\nsnowball\nsnowballed\nsnowballing\nsnowballs\nsnowbank\nsnowbanks\nsnowbell\nsnowbells\nsnowbelt\nsnowbelts\nsnowberries\nsnowberry\nsnowbird\nsnowbirds\nsnowblink\nsnowblinks\nsnowblower\nsnowblowers\nsnowboard\nsnowboarded\nsnowboarder\nsnowboarders\nsnowboarding\nsnowboards\nsnowbound\nsnowbrush\nsnowbrushes\nsnowbush\nsnowbushes\nsnowcap\nsnowcapped\nsnowcaps\nsnowdrift\nsnowdrifts\nsnowdrop\nsnowdrops\nsnowed\nsnowfall\nsnowfalls\nsnowfield\nsnowfields\nsnowflake\nsnowflakes\nsnowier\nsnowiest\nsnowily\nsnowiness\nsnowing\nsnowless\nsnowmaker\nsnowmakers\nsnowmaking\nsnowmakings\nsnowman\nsnowmelt\nsnowmelts\nsnowmen\nsnowmobile\nsnowmobiler\nsnowmobilers\nsnowmobiles\nsnowmobiling\nsnowmobilist\nsnowmobilists\nsnowpack\nsnowpacks\nsnowplough\nsnowploughs\nsnowplow\nsnowplowed\nsnowplowing\nsnowplows\nsnows\nsnowscape\nsnowscapes\nsnowshed\nsnowsheds\nsnowshoe\nsnowshoed\nsnowshoeing\nsnowshoer\nsnowshoers\nsnowshoes\nsnowslide\nsnowslides\nsnowstorm\nsnowstorms\nsnowsuit\nsnowsuits\nsnowy\nsnub\nsnubbed\nsnubber\nsnubbers\nsnubbiness\nsnubbing\nsnubby\nsnubness\nsnubs\nsnuck\nsnuff\nsnuffbox\nsnuffboxes\nsnuffed\nsnuffer\nsnuffers\nsnuffing\nsnuffle\nsnuffled\nsnuffler\nsnufflers\nsnuffles\nsnuffling\nsnuffly\nsnuffs\nsnuffy\nsnug\nsnugged\nsnugger\nsnuggeries\nsnuggery\nsnuggest\nsnugging\nsnuggle\nsnuggled\nsnuggles\nsnuggling\nsnuggly\nsnugly\nsnugness\nsnugs\nso\nsoak\nsoakage\nsoaked\nsoaker\nsoakers\nsoaking\nsoaks\nsoap\nsoapbark\nsoapbarks\nsoapberries\nsoapberry\nsoapbox\nsoapboxed\nsoapboxes\nsoapboxing\nsoaped\nsoaper\nsoapers\nsoapier\nsoapiest\nsoapily\nsoapiness\nsoaping\nsoaps\nsoapstone\nsoapsuds\nsoapwort\nsoapworts\nsoapy\nsoar\nsoared\nsoarer\nsoarers\nsoaring\nsoaringly\nsoarings\nsoars\nsoave\nsoaves\nsob\nsobbed\nsobbing\nsobbingly\nsober\nsobered\nsoberer\nsoberest\nsobering\nsoberize\nsoberized\nsoberizes\nsoberizing\nsoberly\nsoberness\nsobers\nsobersided\nsobersidedness\nsobersides\nsobriety\nsobriquet\nsobriquets\nsobs\nsoca\nsocage\nsocager\nsocagers\nsocages\nsocas\nsoccage\nsoccages\nsoccer\nsociabilities\nsociability\nsociable\nsociableness\nsociables\nsociably\nsocial\nsocialism\nsocialist\nsocialistic\nsocialistically\nsocialists\nsocialite\nsocialites\nsocialities\nsociality\nsocialization\nsocializations\nsocialize\nsocialized\nsocializer\nsocializers\nsocializes\nsocializing\nsocially\nsocials\nsocietal\nsocietally\nsocieties\nsociety\nsocinian\nsocinianism\nsocinians\nsociobiological\nsociobiologist\nsociobiologists\nsociobiology\nsociocultural\nsocioculturally\nsocioeconomic\nsocioeconomically\nsociogram\nsociograms\nsociohistorical\nsociolinguist\nsociolinguistic\nsociolinguistics\nsociolinguists\nsociologese\nsociologic\nsociological\nsociologically\nsociologist\nsociologists\nsociology\nsociometric\nsociometry\nsociopath\nsociopathic\nsociopaths\nsociopolitical\nsociopsychological\nsocioreligious\nsociosexual\nsock\nsockdolager\nsockdolagers\nsockdologer\nsockdologers\nsocked\nsocket\nsocketed\nsocketing\nsockets\nsockeye\nsockeyes\nsocking\nsockless\nsocko\nsocks\nsocle\nsocles\nsocotra\nsocrates\nsocratic\nsocratically\nsod\nsoda\nsodalist\nsodalists\nsodalite\nsodalites\nsodalities\nsodality\nsodas\nsodbuster\nsodbusters\nsodded\nsodden\nsoddened\nsoddening\nsoddenly\nsoddenness\nsoddens\nsodding\nsodic\nsodium\nsodom\nsodomist\nsodomists\nsodomite\nsodomites\nsodomitic\nsodomitical\nsodomize\nsodomized\nsodomizes\nsodomizing\nsodomy\nsods\nsoever\nsofa\nsofar\nsofars\nsofas\nsoffit\nsoffits\nsofia\nsoft\nsoftback\nsoftbacks\nsoftball\nsoftballer\nsoftballers\nsoftballs\nsoftbound\nsoftcover\nsoften\nsoftened\nsoftener\nsofteners\nsoftening\nsoftens\nsofter\nsoftest\nsofthead\nsoftheaded\nsoftheadedly\nsoftheadedness\nsoftheads\nsofthearted\nsoftheartedly\nsoftheartedness\nsoftie\nsofties\nsoftish\nsoftly\nsoftness\nsoftnesses\nsoftshell\nsoftshells\nsoftware\nsoftwood\nsoftwoods\nsofty\nsogdian\nsogdians\nsoggier\nsoggiest\nsoggily\nsogginess\nsoggy\nsognafjord\nsoho\nsoigné\nsoignée\nsoil\nsoilage\nsoilborne\nsoiled\nsoiler\nsoiling\nsoilism\nsoilless\nsoils\nsoilure\nsoiree\nsoirees\nsoirée\nsoirées\nsoixante\nsojourn\nsojourned\nsojourner\nsojourners\nsojourning\nsojourns\nsoke\nsokeman\nsokemen\nsokes\nsol\nsola\nsolace\nsolaced\nsolacement\nsolacer\nsolacers\nsolaces\nsolacing\nsolan\nsolanaceous\nsolanin\nsolanine\nsolanines\nsolanins\nsolans\nsolanum\nsolanums\nsolar\nsolaria\nsolarimeter\nsolarimeters\nsolarium\nsolariums\nsolarization\nsolarizations\nsolarize\nsolarized\nsolarizes\nsolarizing\nsolatia\nsolation\nsolatium\nsold\nsoldan\nsoldans\nsolder\nsolderability\nsoldered\nsolderer\nsolderers\nsoldering\nsolders\nsoldi\nsoldier\nsoldiered\nsoldieries\nsoldiering\nsoldierly\nsoldiers\nsoldiership\nsoldiery\nsoldo\nsole\nsolecism\nsolecisms\nsolecist\nsolecistic\nsolecists\nsoled\nsolei\nsolely\nsolemn\nsolemner\nsolemnest\nsolemnified\nsolemnifies\nsolemnify\nsolemnifying\nsolemnities\nsolemnity\nsolemnization\nsolemnizations\nsolemnize\nsolemnized\nsolemnizes\nsolemnizing\nsolemnly\nsolemnness\nsoleness\nsolenodon\nsolenodons\nsolenoid\nsolenoidal\nsolenoidally\nsolenoids\nsoleplate\nsoleplates\nsoleprint\nsoleprints\nsoles\nsoleus\nsolfatara\nsolfataras\nsolfataric\nsolfeggi\nsolfeggio\nsolfeggios\nsolferino\nsolferinos\nsolfège\nsolgel\nsolicit\nsolicitant\nsolicitants\nsolicitation\nsolicitations\nsolicited\nsoliciting\nsolicitor\nsolicitors\nsolicitorship\nsolicitous\nsolicitously\nsolicitousness\nsolicits\nsolicitude\nsolicitudes\nsolid\nsolidago\nsolidagos\nsolidarism\nsolidarist\nsolidaristic\nsolidarists\nsolidarity\nsolider\nsolidest\nsolidi\nsolidification\nsolidifications\nsolidified\nsolidifier\nsolidifiers\nsolidifies\nsolidify\nsolidifying\nsolidity\nsolidly\nsolidness\nsolids\nsolidus\nsolifluction\nsoliloquies\nsoliloquist\nsoliloquists\nsoliloquize\nsoliloquized\nsoliloquizer\nsoliloquizers\nsoliloquizes\nsoliloquizing\nsoliloquy\nsoliman\nsoling\nsolipsism\nsolipsist\nsolipsistic\nsolipsistically\nsolipsists\nsolitaire\nsolitaires\nsolitarian\nsolitarians\nsolitaries\nsolitarily\nsolitariness\nsolitary\nsoliton\nsolitons\nsolitude\nsolitudinarian\nsolitudinarians\nsolleret\nsollerets\nsolmization\nsolmizations\nsolo\nsoloed\nsoloing\nsoloist\nsoloistic\nsoloists\nsolomon\nsolomonic\nsolomons\nsolon\nsolonchak\nsolonchaks\nsolonetz\nsolonetzic\nsolons\nsolos\nsols\nsolstice\nsolstices\nsolstitial\nsolubilities\nsolubility\nsolubilization\nsolubilizations\nsolubilize\nsolubilized\nsolubilizes\nsolubilizing\nsoluble\nsolubleness\nsolubly\nsolum\nsolums\nsolus\nsolute\nsolutes\nsolution\nsolutions\nsolutrean\nsolutrian\nsolvability\nsolvable\nsolvableness\nsolvate\nsolvated\nsolvates\nsolvating\nsolvation\nsolvations\nsolvay\nsolve\nsolved\nsolvency\nsolvent\nsolventless\nsolvently\nsolvents\nsolver\nsolvers\nsolves\nsolving\nsolvolysis\nsolvolytic\nsoma\nsomali\nsomalia\nsomalian\nsomalians\nsomaliland\nsomalis\nsomas\nsomata\nsomatic\nsomatically\nsomatogenetic\nsomatogenic\nsomatologic\nsomatological\nsomatologist\nsomatologists\nsomatology\nsomatomedin\nsomatomedins\nsomatoplasm\nsomatoplasms\nsomatoplastic\nsomatopleural\nsomatopleure\nsomatopleures\nsomatopleuric\nsomatosensory\nsomatostatin\nsomatostatins\nsomatotherapies\nsomatotherapy\nsomatotrophin\nsomatotrophins\nsomatotropic\nsomatotropin\nsomatotropins\nsomatotype\nsomatotypes\nsomatotypic\nsomber\nsomberly\nsomberness\nsombre\nsombrero\nsombreros\nsombrous\nsome\nsomebodies\nsomebody\nsomebody's\nsomeday\nsomehow\nsomeone\nsomeone's\nsomeplace\nsomersault\nsomersaulted\nsomersaulting\nsomersaults\nsomerset\nsomersets\nsomersetted\nsomersetting\nsomesthetic\nsomething\nsometime\nsometimes\nsomeway\nsomeways\nsomewhat\nsomewhen\nsomewhere\nsomewheres\nsomewhither\nsomite\nsomites\nsomitic\nsomme\nsommelier\nsommeliers\nsomnambulant\nsomnambular\nsomnambulate\nsomnambulated\nsomnambulates\nsomnambulating\nsomnambulation\nsomnambulations\nsomnambulism\nsomnambulist\nsomnambulistic\nsomnambulistically\nsomnambulists\nsomnifacient\nsomnifacients\nsomniferous\nsomniferously\nsomnific\nsomniloquies\nsomniloquist\nsomniloquists\nsomniloquy\nsomnolence\nsomnolent\nsomnolently\nson\nsonance\nsonances\nsonant\nsonants\nsonar\nsonata\nsonatas\nsonatina\nsonatinas\nsonde\nsondes\nsone\nsones\nsong\nsongbird\nsongbirds\nsongbook\nsongbooks\nsongfest\nsongfests\nsongful\nsongfully\nsongfulness\nsongless\nsonglessly\nsonglike\nsongs\nsongsmith\nsongsmiths\nsongster\nsongsters\nsongstress\nsongstresses\nsongwriter\nsongwriters\nsongwriting\nsonhood\nsonic\nsonically\nsonicate\nsonicated\nsonicates\nsonicating\nsonication\nsonications\nsonless\nsonly\nsonnet\nsonneteer\nsonneteering\nsonneteers\nsonnets\nsonnies\nsonny\nsonobuoy\nsonobuoys\nsonogram\nsonograms\nsonograph\nsonographer\nsonographers\nsonographic\nsonographs\nsonography\nsonometer\nsonometers\nsonorant\nsonorants\nsonorities\nsonority\nsonorous\nsonorously\nsonorousness\nsons\nsonship\nsoochong\nsoochongs\nsoon\nsooner\nsooners\nsoonest\nsoot\nsooted\nsooth\nsoothe\nsoothed\nsoother\nsoothers\nsoothes\nsoothfast\nsoothing\nsoothingly\nsoothingness\nsoothly\nsooths\nsoothsaid\nsoothsay\nsoothsayer\nsoothsayers\nsoothsaying\nsoothsayings\nsoothsays\nsootier\nsootiest\nsootily\nsootiness\nsooting\nsoots\nsooty\nsop\nsopaipilla\nsopapilla\nsophism\nsophisms\nsophist\nsophistic\nsophistical\nsophistically\nsophisticate\nsophisticated\nsophisticatedly\nsophisticates\nsophisticating\nsophistication\nsophistications\nsophisticator\nsophisticators\nsophistries\nsophistry\nsophists\nsophoclean\nsophocles\nsophomore\nsophomores\nsophomoric\nsophomorically\nsophonias\nsopor\nsoporiferous\nsoporiferously\nsoporiferousness\nsoporific\nsoporifically\nsoporifics\nsopors\nsopped\nsoppier\nsoppiest\nsoppiness\nsopping\nsoppy\nsopranino\nsopraninos\nsoprano\nsopranos\nsops\nsora\nsoras\nsorb\nsorbability\nsorbable\nsorbate\nsorbates\nsorbed\nsorbefacient\nsorbefacients\nsorbent\nsorbents\nsorbet\nsorbets\nsorbian\nsorbians\nsorbic\nsorbing\nsorbitol\nsorbonne\nsorbose\nsorboses\nsorbs\nsorcerer\nsorcerers\nsorceress\nsorceresses\nsorcerous\nsorcerously\nsorcery\nsordid\nsordidly\nsordidness\nsordini\nsordino\nsords\nsore\nsored\nsoredia\nsoredial\nsoredium\nsorehead\nsoreheaded\nsoreheads\nsorely\nsoreness\nsorer\nsores\nsorest\nsorgho\nsorghos\nsorghum\nsorghums\nsorgo\nsorgos\nsori\nsoricine\nsoring\nsorites\nsoroptimist\nsoroptimists\nsororal\nsororate\nsororates\nsororicidal\nsororicide\nsororicides\nsororities\nsorority\nsorption\nsorptive\nsorrel\nsorrels\nsorrento\nsorrier\nsorriest\nsorrily\nsorriness\nsorrow\nsorrowed\nsorrower\nsorrowers\nsorrowful\nsorrowfully\nsorrowfulness\nsorrowing\nsorrows\nsorry\nsort\nsortable\nsortation\nsortations\nsorted\nsorter\nsorters\nsortie\nsortied\nsortieing\nsorties\nsortilege\nsortileges\nsorting\nsortition\nsortitions\nsorts\nsorus\nsos\nsostenuti\nsostenuto\nsostenutos\nsot\nsoteriologic\nsoteriological\nsoteriology\nsothic\nsotho\nsotol\nsotols\nsots\nsotted\nsottedly\nsottedness\nsottish\nsottishly\nsottishness\nsotto\nsou\nsou'wester\nsou'westers\nsouari\nsoubise\nsoubises\nsoubrette\nsoubrettes\nsoubriquet\nsoubriquets\nsouchong\nsouchongs\nsouci\nsoudan\nsoudans\nsoufflé\nsouffléd\nsoufflés\nsoufrière\nsough\nsoughed\nsoughing\nsoughs\nsought\nsouk\nsouks\nsoul\nsouled\nsoulful\nsoulfully\nsoulfulness\nsoulless\nsoullessly\nsoullessness\nsoulmate\nsoulmates\nsouls\nsound\nsoundable\nsoundalike\nsoundboard\nsoundboards\nsounded\nsounder\nsounders\nsoundest\nsounding\nsoundingly\nsoundings\nsoundless\nsoundlessly\nsoundlessness\nsoundly\nsoundman\nsoundmen\nsoundness\nsoundproof\nsoundproofed\nsoundproofing\nsoundproofs\nsounds\nsoundstage\nsoundstages\nsoundtrack\nsoundtracks\nsoup\nsouped\nsoupier\nsoupiest\nsoups\nsoupspoon\nsoupspoons\nsoupy\nsoupçon\nsoupçons\nsour\nsourball\nsourballs\nsource\nsourcebook\nsourcebooks\nsourced\nsourceless\nsources\nsourcing\nsourdine\nsourdines\nsourdough\nsourdoughs\nsoured\nsourer\nsourest\nsouring\nsourish\nsourly\nsourness\nsourpuss\nsourpusses\nsours\nsoursop\nsoursops\nsourwood\nsourwoods\nsous\nsousa\nsousaphone\nsousaphones\nsouse\nsoused\nsouses\nsousing\nsouslik\nsousliks\nsoutache\nsoutaches\nsoutane\nsoutanes\nsouth\nsouthampton\nsouthbound\nsouthdown\nsoutheast\nsoutheaster\nsoutheasterly\nsoutheastern\nsoutheasterner\nsoutheasterners\nsoutheasternmost\nsoutheasters\nsoutheastward\nsoutheastwardly\nsoutheastwards\nsouther\nsoutherlies\nsoutherly\nsouthern\nsoutherner\nsoutherners\nsouthernism\nsouthernisms\nsouthernmost\nsouthernness\nsouthernwood\nsouthernwoods\nsouthers\nsouthey\nsouthing\nsouthings\nsouthland\nsouthlander\nsouthlanders\nsouthlands\nsouthpaw\nsouthpaws\nsouthron\nsouthrons\nsouthward\nsouthwardly\nsouthwards\nsouthwest\nsouthwester\nsouthwesterly\nsouthwestern\nsouthwesterner\nsouthwesterners\nsouthwesternmost\nsouthwesters\nsouthwestward\nsouthwestwardly\nsouthwestwards\nsouvenir\nsouvenirs\nsouvlaki\nsouvlakia\nsovereign\nsovereignly\nsovereigns\nsovereignties\nsovereignty\nsoviet\nsovietism\nsovietization\nsovietizations\nsovietize\nsovietized\nsovietizes\nsovietizing\nsovietologist\nsovietologists\nsovietology\nsoviets\nsovkhoz\nsovkhozes\nsovkhozy\nsovran\nsovrans\nsovranties\nsovranty\nsow\nsowbellies\nsowbelly\nsowbread\nsowbreads\nsowed\nsowens\nsower\nsowers\nsowetan\nsowetans\nsoweto\nsowing\nsowings\nsown\nsows\nsox\nsoxer\nsoxers\nsoy\nsoya\nsoybean\nsoybeans\nsoymilk\nsozzled\nspa\nspace\nspaceband\nspacebands\nspacebar\nspacebars\nspaceborne\nspacebridge\nspacebridges\nspacecraft\nspaced\nspacefarer\nspacefarers\nspacefaring\nspacefarings\nspaceflight\nspaceflights\nspaceless\nspaceman\nspacemen\nspaceport\nspaceports\nspacer\nspacers\nspaces\nspaceship\nspaceships\nspacesick\nspacesuit\nspacesuits\nspacewalk\nspacewalked\nspacewalker\nspacewalkers\nspacewalking\nspacewalks\nspaceward\nspacey\nspacial\nspacier\nspaciest\nspacing\nspacings\nspacious\nspaciously\nspaciousness\nspackle\nspackled\nspackles\nspackling\nspacy\nspade\nspaded\nspadefish\nspadefishes\nspadefoot\nspadeful\nspadefuls\nspader\nspaders\nspades\nspadework\nspadices\nspadille\nspading\nspadix\nspaetzle\nspaetzles\nspaghetti\nspaghettilike\nspaghettini\nspaghettis\nspagyric\nspagyrical\nspahi\nspahis\nspain\nspall\nspallable\nspallation\nspallations\nspalled\nspalling\nspalls\nspalpeen\nspalpeens\nspam\nspammed\nspamming\nspams\nspan\nspanakopita\nspanakopitas\nspandau\nspandex\nspandrel\nspandrels\nspandril\nspandrils\nspang\nspangle\nspangled\nspangles\nspangling\nspanglish\nspangly\nspaniard\nspaniards\nspaniel\nspaniels\nspanish\nspanishness\nspank\nspanked\nspanker\nspankers\nspanking\nspankingly\nspankings\nspanks\nspanned\nspanner\nspanners\nspanning\nspanokopita\nspans\nspanworm\nspanworms\nspar\nspare\nspareable\nspared\nsparely\nspareness\nsparer\nsparerib\nspareribs\nsparers\nspares\nsparest\nsparge\nsparged\nsparger\nspargers\nsparges\nsparging\nsparid\nsparids\nsparing\nsparingly\nsparingness\nspark\nsparked\nsparker\nsparkers\nsparkier\nsparkiest\nsparkily\nsparking\nsparkish\nsparkle\nsparkleberries\nsparkleberry\nsparkled\nsparkler\nsparklers\nsparkles\nsparklier\nsparkliest\nsparkling\nsparklingly\nsparkly\nsparkplug\nsparkplugged\nsparkplugging\nsparkplugs\nsparks\nsparky\nsparling\nsparlings\nsparred\nsparring\nsparrow\nsparrowgrass\nsparrowlike\nsparrows\nspars\nsparse\nsparsely\nsparseness\nsparser\nsparsest\nsparsity\nsparta\nspartacist\nspartacists\nspartacus\nspartan\nspartanism\nspartanly\nspartans\nsparteine\nsparteines\nspas\nspasm\nspasmodic\nspasmodically\nspasmolytic\nspasmolytics\nspasms\nspastic\nspastically\nspasticity\nspastics\nspat\nspatchcock\nspatchcocked\nspatchcocking\nspatchcocks\nspate\nspates\nspathe\nspathes\nspathic\nspathulate\nspatial\nspatiality\nspatially\nspatiotemporal\nspatiotemporally\nspats\nspatted\nspatter\nspatterdock\nspatterdocks\nspattered\nspattering\nspatters\nspatting\nspatula\nspatular\nspatulas\nspatulate\nspatzle\nspatzles\nspavin\nspavined\nspawn\nspawned\nspawner\nspawners\nspawning\nspawns\nspay\nspayed\nspaying\nspays\nspaz\nspazzes\nspeak\nspeakable\nspeakeasies\nspeakeasy\nspeaker\nspeakerphone\nspeakerphones\nspeakers\nspeakership\nspeakerships\nspeaking\nspeaks\nspear\nspeared\nspearer\nspearers\nspearfish\nspearfished\nspearfisher\nspearfishers\nspearfishes\nspearfishing\nspeargun\nspearguns\nspearhead\nspearheaded\nspearheading\nspearheads\nspearing\nspearlike\nspearman\nspearmen\nspearmint\nspearmints\nspears\nspearwort\nspearworts\nspec\nspec'd\nspec'er\nspec'ers\nspec'ing\nspecced\nspeccing\nspecial\nspecialism\nspecialisms\nspecialist\nspecialistic\nspecialists\nspecialities\nspeciality\nspecialization\nspecializations\nspecialize\nspecialized\nspecializes\nspecializing\nspecially\nspecialness\nspecials\nspecialties\nspecialty\nspeciate\nspeciated\nspeciates\nspeciating\nspeciation\nspeciational\nspeciations\nspecie\nspecies\nspeciesism\nspeciesist\nspeciesists\nspecifiable\nspecific\nspecifically\nspecification\nspecifications\nspecificity\nspecificness\nspecifics\nspecified\nspecifier\nspecifiers\nspecifies\nspecify\nspecifying\nspecimen\nspecimens\nspeciosity\nspecious\nspeciously\nspeciousness\nspeck\nspecked\nspecking\nspeckle\nspeckled\nspeckles\nspeckling\nspecks\nspecs\nspectacle\nspectacled\nspectacles\nspectacular\nspectacularity\nspectacularly\nspectaculars\nspectate\nspectated\nspectates\nspectating\nspectator\nspectatorial\nspectators\nspectatorship\nspectatorships\nspecter\nspecters\nspectinomycin\nspectinomycins\nspectra\nspectral\nspectrality\nspectrally\nspectralness\nspectre\nspectres\nspectrin\nspectrins\nspectrofluorimeter\nspectrofluorimeters\nspectrofluorometer\nspectrofluorometers\nspectrofluorometric\nspectrofluorometry\nspectrogram\nspectrograms\nspectrograph\nspectrographic\nspectrographically\nspectrographs\nspectrography\nspectroheliogram\nspectroheliograms\nspectroheliograph\nspectroheliographic\nspectroheliographs\nspectroheliography\nspectrohelioscope\nspectrohelioscopes\nspectrohelioscopic\nspectrometer\nspectrometers\nspectrometric\nspectrometry\nspectrophotometer\nspectrophotometers\nspectrophotometric\nspectrophotometrical\nspectrophotometrically\nspectrophotometry\nspectroscope\nspectroscopes\nspectroscopic\nspectroscopical\nspectroscopically\nspectroscopies\nspectroscopist\nspectroscopists\nspectroscopy\nspectrum\nspectrums\nspecula\nspecular\nspecularity\nspecularly\nspeculate\nspeculated\nspeculates\nspeculating\nspeculation\nspeculations\nspeculative\nspeculatively\nspeculativeness\nspeculator\nspeculators\nspeculum\nspeculums\nsped\nspeech\nspeeches\nspeechified\nspeechifier\nspeechifiers\nspeechifies\nspeechify\nspeechifying\nspeechless\nspeechlessly\nspeechlessness\nspeechmaker\nspeechmakers\nspeechmaking\nspeechwriter\nspeechwriters\nspeechwriting\nspeed\nspeedball\nspeedballs\nspeedboat\nspeedboater\nspeedboaters\nspeedboating\nspeedboatings\nspeedboats\nspeeded\nspeeder\nspeeders\nspeedier\nspeediest\nspeedily\nspeediness\nspeeding\nspeedings\nspeedo\nspeedometer\nspeedometers\nspeedos\nspeeds\nspeedster\nspeedsters\nspeedup\nspeedups\nspeedway\nspeedways\nspeedwell\nspeedwells\nspeedwriter\nspeedwriters\nspeedwriting\nspeedwritings\nspeedy\nspeiss\nspeisses\nspeleological\nspeleologist\nspeleologists\nspeleology\nspell\nspellbind\nspellbinder\nspellbinders\nspellbinding\nspellbindingly\nspellbinds\nspellbound\nspellchecker\nspellcheckers\nspelldown\nspelldowns\nspelled\nspeller\nspellers\nspelling\nspellings\nspells\nspelt\nspelter\nspelters\nspelunker\nspelunkers\nspelunking\nspencer\nspencerian\nspencerianism\nspencerians\nspencerism\nspencers\nspend\nspendable\nspender\nspenders\nspending\nspends\nspendthrift\nspendthrifts\nspenglerian\nspenglerians\nspenser\nspenserian\nspent\nsperm\nspermaceti\nspermacetis\nspermagonia\nspermagonium\nspermaries\nspermary\nspermatheca\nspermathecas\nspermatia\nspermatial\nspermatic\nspermatid\nspermatids\nspermatium\nspermatocyte\nspermatocytes\nspermatogenesis\nspermatogenetic\nspermatogenic\nspermatogonia\nspermatogonial\nspermatogonium\nspermatophore\nspermatophores\nspermatophyte\nspermatophytes\nspermatophytic\nspermatozoa\nspermatozoal\nspermatozoan\nspermatozoid\nspermatozoids\nspermatozoon\nspermicidal\nspermicide\nspermicides\nspermiogenesis\nspermogonia\nspermogonium\nspermophile\nspermophiles\nspermous\nsperms\nsperrylite\nsperrylites\nspessartine\nspessartines\nspessartite\nspessartites\nspew\nspewed\nspewer\nspewers\nspewing\nspews\nsphagnous\nsphagnum\nsphalerite\nsphalerites\nsphene\nsphenes\nsphenic\nsphenodon\nsphenodons\nsphenodont\nsphenogram\nsphenograms\nsphenoid\nsphenoidal\nsphenoids\nsphenopsid\nsphenopsids\nspheral\nsphere\nsphered\nspheres\nspheric\nspherical\nspherically\nsphericalness\nsphericity\nspherics\nspherier\nspheriest\nsphering\nspheroid\nspheroidal\nspheroidally\nspheroidic\nspheroidicity\nspheroids\nspherometer\nspherometers\nspheroplast\nspheroplasts\nspherular\nspherule\nspherules\nspherulite\nspherulites\nspherulitic\nsphery\nsphincter\nsphincteral\nsphincteric\nsphincters\nsphinges\nsphingid\nsphingids\nsphingosine\nsphingosines\nsphinx\nsphinxes\nsphinxlike\nsphragistics\nsphygmic\nsphygmogram\nsphygmograms\nsphygmograph\nsphygmographic\nsphygmographs\nsphygmography\nsphygmoid\nsphygmomanometer\nsphygmomanometers\nsphygmomanometric\nsphygmomanometrically\nsphygmomanometry\nsphygmometer\nsphygmometers\nspic\nspica\nspicae\nspicas\nspicate\nspiccato\nspiccatos\nspice\nspiceberries\nspiceberry\nspicebush\nspicebushes\nspiced\nspiceless\nspiceries\nspicery\nspices\nspicier\nspiciest\nspicily\nspiciness\nspicing\nspick\nspicks\nspics\nspicula\nspiculae\nspicular\nspiculate\nspiculation\nspiculations\nspicule\nspicules\nspiculum\nspicy\nspider\nspiderish\nspiderlike\nspiders\nspiderweb\nspiderwebs\nspiderwort\nspiderworts\nspidery\nspied\nspiegel\nspiegeleisen\nspiegeleisens\nspiegels\nspiel\nspieled\nspieler\nspielers\nspieling\nspiels\nspier\nspiers\nspies\nspiff\nspiffed\nspiffied\nspiffier\nspiffies\nspiffiest\nspiffily\nspiffiness\nspiffing\nspiffs\nspiffy\nspiffying\nspigot\nspigots\nspik\nspike\nspiked\nspikelet\nspikelets\nspikelike\nspikenard\nspikenards\nspiker\nspikers\nspikes\nspikey\nspikier\nspikiest\nspikily\nspikiness\nspiking\nspiks\nspiky\nspile\nspiled\nspiles\nspiling\nspill\nspillable\nspillage\nspillback\nspillbacks\nspilled\nspiller\nspillers\nspillikin\nspillikins\nspilling\nspillover\nspillovers\nspills\nspillway\nspillways\nspilt\nspilth\nspilths\nspin\nspina\nspinach\nspinachlike\nspinachy\nspinal\nspinally\nspinals\nspindle\nspindled\nspindler\nspindlers\nspindles\nspindlier\nspindliest\nspindling\nspindly\nspindrift\nspine\nspined\nspinel\nspineless\nspinelessly\nspinelessness\nspinelike\nspinelle\nspinelles\nspinels\nspines\nspinescence\nspinescent\nspinet\nspinets\nspinier\nspiniest\nspiniferous\nspinifex\nspinifexes\nspininess\nspinless\nspinnaker\nspinnakers\nspinner\nspinneret\nspinnerets\nspinnerette\nspinnerettes\nspinners\nspinney\nspinneys\nspinning\nspinnings\nspinocerebellar\nspinoff\nspinoffs\nspinor\nspinors\nspinose\nspinosely\nspinosity\nspinous\nspinout\nspinouts\nspinoza\nspinozism\nspinozist\nspinozistic\nspinozists\nspins\nspinster\nspinsterhood\nspinsterish\nspinsterly\nspinsters\nspinthariscope\nspinthariscopes\nspinthariscopic\nspinto\nspintos\nspinule\nspinules\nspinulose\nspinulous\nspiny\nspiracle\nspiracles\nspiracular\nspiraea\nspiraeas\nspiral\nspiraled\nspiraling\nspirality\nspiralled\nspiralling\nspirally\nspirals\nspirant\nspirants\nspire\nspirea\nspireas\nspired\nspirem\nspireme\nspiremes\nspirems\nspires\nspiriferous\nspirilla\nspirillum\nspiring\nspirit\nspirited\nspiritedly\nspiritedness\nspiriting\nspiritism\nspiritist\nspiritistic\nspiritists\nspiritless\nspiritlessly\nspiritlessness\nspiritoso\nspiritous\nspirits\nspiritual\nspiritualism\nspiritualist\nspiritualistic\nspiritualists\nspiritualities\nspirituality\nspiritualization\nspiritualizations\nspiritualize\nspiritualized\nspiritualizer\nspiritualizers\nspiritualizes\nspiritualizing\nspiritually\nspiritualness\nspirituals\nspiritualties\nspiritualty\nspirituel\nspirituelle\nspirituosity\nspirituous\nspirituousness\nspirochaete\nspirochaetes\nspirochetal\nspirochete\nspirochetes\nspirochetoses\nspirochetosis\nspirograph\nspirographic\nspirographically\nspirographs\nspirography\nspirogyra\nspirogyras\nspiroid\nspirometer\nspirometers\nspirometric\nspirometry\nspironolactone\nspironolactones\nspiroplasma\nspiroplasmas\nspirt\nspirted\nspirting\nspirts\nspirula\nspirulae\nspiry\nspit\nspital\nspitals\nspitball\nspitballs\nspite\nspited\nspiteful\nspitefully\nspitefulness\nspites\nspitfire\nspitfires\nspithead\nspiting\nspits\nspitsbergen\nspitted\nspitter\nspitters\nspitting\nspittle\nspittlebug\nspittlebugs\nspittoon\nspittoons\nspitz\nspitzes\nspiv\nspivs\nsplanchnic\nsplanchnology\nsplanchnopleure\nsplanchnopleures\nsplanchnopleuric\nsplash\nsplashboard\nsplashboards\nsplashdown\nsplashdowns\nsplashed\nsplasher\nsplashers\nsplashes\nsplashguard\nsplashguards\nsplashier\nsplashiest\nsplashily\nsplashiness\nsplashing\nsplashy\nsplat\nsplats\nsplatter\nsplattered\nsplattering\nsplatters\nsplay\nsplayed\nsplayfeet\nsplayfoot\nsplayfooted\nsplaying\nsplays\nspleen\nspleenful\nspleens\nspleenwort\nspleenworts\nspleeny\nsplendent\nsplendid\nsplendidly\nsplendidness\nsplendiferous\nsplendiferously\nsplendiferousness\nsplendor\nsplendorous\nsplendors\nsplendrous\nsplenectomies\nsplenectomize\nsplenectomized\nsplenectomizes\nsplenectomizing\nsplenectomy\nsplenetic\nsplenetical\nsplenetically\nspleneticals\nsplenetics\nsplenial\nsplenic\nsplenii\nsplenius\nsplenomegalies\nsplenomegaly\nsplice\nspliced\nsplicer\nsplicers\nsplices\nsplicing\nspliff\nspline\nsplines\nsplint\nsplinted\nsplinter\nsplintered\nsplintering\nsplinters\nsplintery\nsplinting\nsplints\nsplit\nsplits\nsplitter\nsplitters\nsplitting\nsplotch\nsplotched\nsplotches\nsplotchiness\nsplotching\nsplotchy\nsplurge\nsplurged\nsplurges\nsplurging\nsplurgy\nsplutter\nspluttered\nsplutterer\nspluttering\nsplutters\nspluttery\nspock\nspode\nspodumene\nspodumenes\nspoil\nspoilable\nspoilage\nspoiled\nspoiler\nspoilers\nspoiling\nspoils\nspoilsman\nspoilsmen\nspoilsport\nspoilsports\nspoilt\nspokane\nspoke\nspoked\nspoken\nspokes\nspokeshave\nspokeshaves\nspokesman\nspokesmanship\nspokesmen\nspokespeople\nspokesperson\nspokespersons\nspokeswoman\nspokeswomen\nspoking\nspoleto\nspoliate\nspoliated\nspoliates\nspoliating\nspoliation\nspoliator\nspoliators\nspondaic\nspondee\nspondees\nspondylitis\nspondylitises\nspondyloses\nspondylosis\nsponge\nsponged\nsponger\nspongers\nsponges\nspongeware\nspongier\nspongiest\nspongiform\nspongin\nsponginess\nsponging\nspongins\nspongioblast\nspongioblasts\nspongiocyte\nspongiocytes\nspongocoel\nspongocoels\nspongy\nsponson\nsponsons\nsponsor\nsponsored\nsponsorial\nsponsoring\nsponsors\nsponsorship\nsponsorships\nspontaneities\nspontaneity\nspontaneous\nspontaneously\nspontaneousness\nspontoon\nspontoons\nspoof\nspoofed\nspoofery\nspoofing\nspoofs\nspoofy\nspook\nspooked\nspookeries\nspookery\nspookier\nspookiest\nspookily\nspookiness\nspooking\nspookish\nspooks\nspooky\nspool\nspooled\nspooling\nspoolings\nspools\nspoon\nspoonable\nspoonbill\nspoonbills\nspoondrift\nspoondrifts\nspooned\nspoonerism\nspoonerisms\nspooney\nspoonful\nspoonfuls\nspoonier\nspooniest\nspooning\nspoons\nspoonsful\nspoony\nspoor\nspoored\nspooring\nspoors\nsporaceous\nsporades\nsporadic\nsporadical\nsporadically\nsporadicalness\nsporangia\nsporangial\nsporangiophore\nsporangiophores\nsporangium\nspore\nspored\nsporeling\nsporelings\nspores\nsporicidal\nsporicide\nsporicides\nsporiferous\nsporing\nsporocarp\nsporocarps\nsporocyst\nsporocysts\nsporocyte\nsporocytes\nsporogenesis\nsporogenic\nsporogenous\nsporogonia\nsporogonic\nsporogonium\nsporogonous\nsporogony\nsporont\nsporonts\nsporophore\nsporophores\nsporophyll\nsporophylls\nsporophyte\nsporophytes\nsporophytic\nsporoplasm\nsporoplasms\nsporopollenin\nsporopollenins\nsporotrichoses\nsporotrichosis\nsporozoan\nsporozoans\nsporozoite\nsporozoites\nsporran\nsporrans\nsport\nsported\nsportfisherman\nsportfishermen\nsportfishing\nsportful\nsportfully\nsportfulness\nsportier\nsportiest\nsportif\nsportily\nsportiness\nsporting\nsportingly\nsportive\nsportively\nsportiveness\nsports\nsportscast\nsportscaster\nsportscasters\nsportscasts\nsportsman\nsportsmanlike\nsportsmanly\nsportsmanship\nsportsmen\nsportswear\nsportswoman\nsportswomen\nsportswriter\nsportswriters\nsportswriting\nsporty\nsporular\nsporulate\nsporulated\nsporulates\nsporulating\nsporulation\nsporulations\nsporulative\nspot\nspotless\nspotlessly\nspotlessness\nspotlight\nspotlighted\nspotlighting\nspotlights\nspotlit\nspots\nspottable\nspotted\nspotter\nspotters\nspottier\nspottiest\nspottily\nspottiness\nspotting\nspotty\nspousal\nspousals\nspouse\nspoused\nspouseless\nspouses\nspousing\nspout\nspouted\nspouter\nspouters\nspouting\nspoutings\nspouts\nsprachgefühl\nspraddle\nspraddled\nspraddles\nspraddling\nsprag\nsprags\nsprain\nsprained\nspraining\nsprains\nsprang\nsprat\nsprats\nsprawl\nsprawled\nsprawler\nsprawlers\nsprawling\nsprawls\nspray\nsprayed\nsprayer\nsprayers\nspraying\nsprays\nspread\nspreadability\nspreadable\nspreadably\nspreader\nspreaders\nspreading\nspreads\nspreadsheet\nspreadsheets\nsprechstimme\nsprechstimmes\nspree\nsprees\nsprier\nspriest\nsprig\nsprigged\nsprigger\nspriggers\nsprigging\nspright\nsprightful\nsprightfully\nsprightfulness\nsprightlier\nsprightliest\nsprightliness\nsprightly\nsprights\nsprigs\nsprigtail\nsprigtails\nspring\nspringal\nspringald\nspringalds\nspringals\nspringboard\nspringboards\nspringbok\nspringboks\nspringbuck\nspringbucks\nspringe\nspringer\nspringers\nspringes\nspringfield\nspringform\nspringhalt\nspringhalts\nspringhare\nspringhares\nspringhead\nspringheads\nspringhouse\nspringhouses\nspringier\nspringiest\nspringily\nspringiness\nspringing\nspringlet\nspringlets\nspringlike\nsprings\nspringtail\nspringtails\nspringtide\nspringtides\nspringtime\nspringwater\nspringwood\nspringwoods\nspringy\nsprinkle\nsprinkled\nsprinkler\nsprinklered\nsprinklering\nsprinklers\nsprinkles\nsprinkling\nsprinklings\nsprint\nsprinted\nsprinter\nsprinters\nsprinting\nsprints\nsprit\nsprite\nsprites\nsprits\nspritsail\nspritsails\nspritz\nspritzed\nspritzer\nspritzers\nspritzes\nspritzing\nsprocket\nsprockets\nsprout\nsprouted\nsprouting\nsprouts\nspruce\nspruced\nsprucely\nspruceness\nsprucer\nspruces\nsprucest\nsprucier\nspruciest\nsprucing\nsprucy\nsprue\nsprues\nsprung\nspry\nspryer\nspryest\nspryly\nspryness\nspud\nspudded\nspudding\nspuds\nspumante\nspume\nspumed\nspumes\nspuming\nspumone\nspumones\nspumoni\nspumonis\nspumous\nspumy\nspun\nspunbonded\nspunk\nspunkier\nspunkiest\nspunkily\nspunkiness\nspunky\nspur\nspurge\nspurges\nspurious\nspuriously\nspuriousness\nspurn\nspurned\nspurner\nspurners\nspurning\nspurns\nspurred\nspurrey\nspurreys\nspurries\nspurring\nspurry\nspurs\nspurt\nspurted\nspurting\nspurts\nsputa\nsputnik\nsputniks\nsputter\nsputtered\nsputterer\nsputterers\nsputtering\nsputters\nsputtery\nsputum\nspy\nspyglass\nspyglasses\nspying\nspymaster\nspymasters\nsquab\nsquabble\nsquabbled\nsquabbler\nsquabblers\nsquabbles\nsquabbling\nsquabs\nsquad\nsquadded\nsquadding\nsquadron\nsquadrons\nsquads\nsqualamine\nsqualene\nsqualenes\nsqualid\nsqualidity\nsqualidly\nsqualidness\nsquall\nsqualled\nsqualler\nsquallers\nsquallier\nsqualliest\nsqualling\nsqualls\nsqually\nsqualor\nsqualors\nsquama\nsquamae\nsquamate\nsquamation\nsquamations\nsquamiform\nsquamosal\nsquamosals\nsquamose\nsquamous\nsquamously\nsquamousness\nsquamule\nsquamules\nsquamulose\nsquander\nsquandered\nsquanderer\nsquanderers\nsquandering\nsquanderingly\nsquanders\nsquare\nsquared\nsquarely\nsquareness\nsquarer\nsquarers\nsquares\nsquarest\nsquaretail\nsquaretails\nsquaring\nsquarish\nsquarishly\nsquarishness\nsquarrose\nsquash\nsquashed\nsquasher\nsquashers\nsquashes\nsquashier\nsquashiest\nsquashily\nsquashiness\nsquashing\nsquashy\nsquat\nsquatly\nsquatness\nsquats\nsquatted\nsquatter\nsquatters\nsquattest\nsquattier\nsquattiest\nsquatting\nsquatty\nsquaw\nsquawfish\nsquawfishes\nsquawk\nsquawked\nsquawker\nsquawkers\nsquawkier\nsquawkiest\nsquawkily\nsquawking\nsquawks\nsquawky\nsquawroot\nsquawroots\nsquaws\nsqueak\nsqueaked\nsqueaker\nsqueakers\nsqueakier\nsqueakiest\nsqueakily\nsqueakiness\nsqueaking\nsqueaks\nsqueaky\nsqueal\nsquealed\nsquealer\nsquealers\nsquealing\nsqueals\nsqueamish\nsqueamishly\nsqueamishness\nsqueegee\nsqueegeed\nsqueegeeing\nsqueegees\nsqueezability\nsqueezable\nsqueeze\nsqueezebox\nsqueezeboxes\nsqueezed\nsqueezer\nsqueezers\nsqueezes\nsqueezing\nsquelch\nsquelched\nsquelcher\nsquelchers\nsquelches\nsquelching\nsquelchy\nsqueteague\nsquib\nsquibbed\nsquibbing\nsquibs\nsquid\nsquidded\nsquidding\nsquids\nsquiffed\nsquiffier\nsquiffiest\nsquiffy\nsquiggle\nsquiggled\nsquiggles\nsquiggling\nsquiggly\nsquill\nsquilla\nsquillae\nsquillas\nsquills\nsquinch\nsquinched\nsquinches\nsquinching\nsquinnied\nsquinnies\nsquinny\nsquinnying\nsquint\nsquinted\nsquinter\nsquinting\nsquintingly\nsquints\nsquinty\nsquirarchies\nsquirarchy\nsquire\nsquirearchies\nsquirearchy\nsquired\nsquires\nsquiring\nsquirish\nsquirm\nsquirmed\nsquirmer\nsquirmers\nsquirmier\nsquirmiest\nsquirminess\nsquirming\nsquirms\nsquirmy\nsquirrel\nsquirreled\nsquirrelfish\nsquirrelfishes\nsquirreling\nsquirrelled\nsquirrelling\nsquirrelly\nsquirrels\nsquirt\nsquirted\nsquirter\nsquirters\nsquirting\nsquirts\nsquish\nsquished\nsquishes\nsquishier\nsquishiest\nsquishiness\nsquishing\nsquishy\nsquoosh\nsquooshed\nsquooshes\nsquooshing\nsquush\nsquushed\nsquushes\nsquushing\nsranan\nsranantongo\nsrebrenica\nsri\nsrinagar\nst\nstab\nstabat\nstabbed\nstabber\nstabbers\nstabbing\nstabile\nstabiles\nstabilities\nstability\nstabilization\nstabilizations\nstabilize\nstabilized\nstabilizer\nstabilizers\nstabilizes\nstabilizing\nstable\nstabled\nstableman\nstablemate\nstablemates\nstablemen\nstableness\nstabler\nstables\nstablest\nstabling\nstablish\nstablished\nstablishes\nstablishing\nstably\nstabs\nstaccati\nstaccato\nstaccatos\nstack\nstackable\nstacked\nstacker\nstackers\nstacking\nstacks\nstackup\nstackups\nstacte\nstactes\nstaddle\nstaddles\nstade\nstades\nstadholder\nstadholders\nstadia\nstadium\nstadiums\nstadtholder\nstadtholderate\nstadtholders\nstadtholdership\nstaff\nstaffed\nstaffer\nstaffers\nstaffing\nstaffordshire\nstaffs\nstag\nstage\nstageable\nstagecoach\nstagecoaches\nstagecraft\nstagecrafts\nstaged\nstageful\nstagefuls\nstagehand\nstagehands\nstagelike\nstager\nstagers\nstages\nstagestruck\nstagey\nstagflation\nstagflationary\nstaggard\nstaggards\nstagged\nstagger\nstaggerbush\nstaggerbushes\nstaggered\nstaggerer\nstaggerers\nstaggering\nstaggeringly\nstaggers\nstaggery\nstagging\nstaggy\nstaghorn\nstaghound\nstaghounds\nstagier\nstagiest\nstagily\nstaginess\nstaging\nstagings\nstagirite\nstagirites\nstagnancy\nstagnant\nstagnantly\nstagnate\nstagnated\nstagnates\nstagnating\nstagnation\nstagnations\nstags\nstagy\nstaid\nstaidly\nstaidness\nstain\nstainability\nstainable\nstained\nstainer\nstainers\nstaining\nstainless\nstainlessly\nstainproof\nstains\nstair\nstaircase\nstaircases\nstairs\nstairway\nstairways\nstairwell\nstairwells\nstake\nstaked\nstakeholder\nstakeholders\nstakeout\nstakeouts\nstakes\nstakhanovism\nstakhanovite\nstakhanovites\nstaking\nstalactiform\nstalactite\nstalactites\nstalactitic\nstalag\nstalagmite\nstalagmites\nstalagmitic\nstalags\nstale\nstaled\nstalely\nstalemate\nstalemated\nstalemates\nstalemating\nstaleness\nstaler\nstales\nstalest\nstalin\nstaling\nstalingrad\nstalinism\nstalinist\nstalinists\nstalinization\nstalinize\nstalinized\nstalinizes\nstalinizing\nstalinoid\nstalk\nstalked\nstalker\nstalkers\nstalking\nstalkless\nstalks\nstalky\nstall\nstalled\nstallholder\nstallholders\nstalling\nstallion\nstallions\nstalls\nstalwart\nstalwartly\nstalwartness\nstalwarts\nstamen\nstamens\nstamina\nstaminal\nstaminate\nstaminode\nstaminodes\nstaminodia\nstaminodies\nstaminodium\nstaminody\nstammel\nstammels\nstammer\nstammered\nstammerer\nstammerers\nstammering\nstammeringly\nstammers\nstamp\nstamped\nstampede\nstampeded\nstampeder\nstampeders\nstampedes\nstampeding\nstamper\nstampers\nstamping\nstampless\nstamps\nstance\nstances\nstanch\nstanched\nstancher\nstanchers\nstanches\nstanching\nstanchion\nstanchioned\nstanchioning\nstanchions\nstanchly\nstanchness\nstand\nstandalone\nstandard\nstandardbred\nstandardbreds\nstandardizable\nstandardization\nstandardizations\nstandardize\nstandardized\nstandardizer\nstandardizers\nstandardizes\nstandardizing\nstandardless\nstandardly\nstandards\nstandaway\nstandby\nstandbys\nstanddown\nstanddowns\nstandee\nstandees\nstander\nstanders\nstanding\nstandings\nstandish\nstandishes\nstandoff\nstandoffish\nstandoffishly\nstandoffishness\nstandoffs\nstandout\nstandouts\nstandpat\nstandpatter\nstandpatters\nstandpattism\nstandpipe\nstandpipes\nstandpoint\nstandpoints\nstands\nstandstill\nstandstills\nstandup\nstanford\nstanhope\nstanhopes\nstanine\nstanines\nstanislavski\nstanislavskian\nstanislavsky\nstank\nstanley\nstannaries\nstannary\nstannic\nstannite\nstannites\nstannous\nstanovoi\nstanovoy\nstanza\nstanzaic\nstanzas\nstapedectomies\nstapedectomy\nstapedes\nstapedial\nstapelia\nstapelias\nstapes\nstaph\nstaphs\nstaphylinid\nstaphylinids\nstaphylococcal\nstaphylococci\nstaphylococcic\nstaphylococcus\nstaphyloplastic\nstaphyloplasties\nstaphyloplasty\nstaphyloraphies\nstaphyloraphy\nstaphylorrhaphies\nstaphylorrhaphy\nstaple\nstapled\nstapler\nstaplers\nstaples\nstapling\nstar\nstarboard\nstarboards\nstarburst\nstarbursts\nstarch\nstarched\nstarches\nstarchier\nstarchiest\nstarchily\nstarchiness\nstarching\nstarchy\nstardom\nstardoms\nstardust\nstare\nstared\nstarer\nstarers\nstares\nstarets\nstarfish\nstarfishes\nstarflower\nstarflowers\nstargaze\nstargazed\nstargazer\nstargazers\nstargazes\nstargazing\nstaring\nstark\nstarker\nstarkers\nstarkest\nstarkly\nstarkness\nstarless\nstarlet\nstarlets\nstarlight\nstarlike\nstarling\nstarlings\nstarlit\nstarred\nstarrier\nstarriest\nstarriness\nstarring\nstarry\nstars\nstarship\nstarships\nstarstruck\nstart\nstarted\nstarter\nstarters\nstarting\nstartle\nstartled\nstartlement\nstartles\nstartling\nstartlingly\nstartlingness\nstarts\nstartsy\nstartup\nstartups\nstarvation\nstarve\nstarved\nstarveling\nstarvelings\nstarves\nstarving\nstarwort\nstarworts\nstases\nstash\nstashed\nstashes\nstashing\nstasis\nstat\nstatable\nstatant\nstate\nstatecraft\nstated\nstatedly\nstatehood\nstatehooder\nstatehooders\nstatehouse\nstatehouses\nstateless\nstatelessness\nstatelet\nstatelets\nstatelier\nstateliest\nstateliness\nstately\nstatement\nstatements\nstaten\nstater\nstateroom\nstaterooms\nstaters\nstates\nstateside\nstatesman\nstatesmanlike\nstatesmanly\nstatesmanship\nstatesmen\nstateswoman\nstateswomen\nstatewide\nstatic\nstatical\nstatically\nstatice\nstatices\nstaticky\nstatics\nstating\nstation\nstational\nstationaries\nstationary\nstationed\nstationer\nstationers\nstationery\nstationhouse\nstationhouses\nstationing\nstationmaster\nstationmasters\nstations\nstatism\nstatist\nstatistic\nstatistical\nstatistically\nstatistician\nstatisticians\nstatistics\nstatists\nstative\nstatives\nstatoblast\nstatoblasts\nstatocyst\nstatocysts\nstatolith\nstatoliths\nstator\nstators\nstatoscope\nstatoscopes\nstats\nstatuaries\nstatuary\nstatue\nstatues\nstatuesque\nstatuesquely\nstatuette\nstatuettes\nstature\nstatures\nstatus\nstatuses\nstatusy\nstatutable\nstatute\nstatutes\nstatutorily\nstatutory\nstaunch\nstaunched\nstauncher\nstaunchers\nstaunches\nstaunching\nstaunchly\nstaunchness\nstaurolite\nstaurolites\nstaurolitic\nstavanger\nstave\nstaved\nstaves\nstavesacre\nstavesacres\nstaving\nstay\nstayed\nstayer\nstayers\nstaying\nstays\nstaysail\nstaysails\nstaël\nstead\nsteaded\nsteadfast\nsteadfastly\nsteadfastness\nsteadied\nsteadier\nsteadiers\nsteadies\nsteadiest\nsteadily\nsteadiness\nsteading\nsteadings\nsteads\nsteady\nsteadying\nsteak\nsteakhouse\nsteakhouses\nsteaks\nsteal\nstealable\nstealer\nstealers\nstealing\nsteals\nstealth\nstealthier\nstealthiest\nstealthily\nstealthiness\nstealthy\nsteam\nsteamboat\nsteamboats\nsteamed\nsteamer\nsteamers\nsteamfitter\nsteamfitters\nsteamfitting\nsteamier\nsteamiest\nsteamily\nsteaminess\nsteaming\nsteamroll\nsteamrolled\nsteamroller\nsteamrollered\nsteamrollering\nsteamrollers\nsteamrolling\nsteamrolls\nsteams\nsteamship\nsteamships\nsteamy\nsteapsin\nsteapsins\nstearate\nstearates\nstearic\nstearin\nstearine\nstearines\nstearins\nstearoptene\nstearoptenes\nsteatite\nsteatites\nsteatitic\nsteatolysis\nsteatopygia\nsteatopygias\nsteatopygic\nsteatopygous\nsteatorrhea\nsteatorrheas\nsteatorrhoea\nsteatorrhoeas\nsteatoses\nsteatosis\nstedfast\nsteed\nsteeds\nsteel\nsteele\nsteeled\nsteelhead\nsteelheads\nsteelie\nsteelier\nsteelies\nsteeliest\nsteeliness\nsteeling\nsteelmaker\nsteelmakers\nsteelmaking\nsteels\nsteelwork\nsteelworker\nsteelworkers\nsteelworks\nsteely\nsteelyard\nsteelyards\nsteenbok\nsteenboks\nsteep\nsteeped\nsteepen\nsteepened\nsteepening\nsteepens\nsteeper\nsteepers\nsteepest\nsteeping\nsteepish\nsteeple\nsteeplebush\nsteeplebushes\nsteeplechase\nsteeplechaser\nsteeplechasers\nsteeplechases\nsteeplechasing\nsteepled\nsteeplejack\nsteeplejacks\nsteeples\nsteeply\nsteepness\nsteeps\nsteer\nsteerable\nsteerage\nsteerageway\nsteerageways\nsteered\nsteerer\nsteerers\nsteering\nsteers\nsteersman\nsteersmen\nsteeve\nsteeved\nsteeves\nsteeving\nsteganographic\nsteganography\nstegodon\nstegodons\nstegosaur\nstegosaurs\nstegosaurus\nstegosauruses\nstein\nsteinbeck\nsteinbok\nsteinboks\nsteins\nsteinway\nstela\nstelae\nstelar\nstele\nsteles\nstella\nstellar\nstellas\nstellate\nstellated\nstellately\nstellenbosch\nsteller\nstelliform\nstellular\nstem\nstemless\nstemma\nstemmas\nstemmata\nstemmatic\nstemmed\nstemmer\nstemmers\nstemmier\nstemmiest\nstemming\nstemmy\nstems\nstemson\nstemsons\nstemware\nsten\nstench\nstenches\nstenchful\nstenchy\nstencil\nstenciled\nstenciler\nstencilers\nstenciling\nstencilled\nstenciller\nstencillers\nstencilling\nstencils\nstendhal\nsteno\nstenobath\nstenobathic\nstenobaths\nstenograph\nstenographer\nstenographers\nstenographic\nstenographical\nstenographically\nstenographs\nstenography\nstenohaline\nstenophagous\nstenos\nstenosed\nstenoses\nstenosis\nstenotherm\nstenothermal\nstenothermic\nstenothermous\nstenotherms\nstenotic\nstenotopic\nstenotype\nstenotyped\nstenotypes\nstenotypies\nstenotyping\nstenotypist\nstenotypists\nstenotypy\nstentor\nstentorian\nstentors\nstep\nstepbrother\nstepbrothers\nstepchild\nstepchildren\nstepdaughter\nstepdaughters\nstepfamilies\nstepfamily\nstepfather\nstepfathers\nstephanotis\nstephanotises\nstephen\nstephenson\nstepladder\nstepladders\nsteplike\nstepmother\nstepmothers\nstepparent\nstepparenting\nstepparents\nsteppe\nstepped\nstepper\nsteppers\nsteppes\nstepping\nsteppingstone\nsteppingstones\nsteps\nstepsibling\nstepsiblings\nstepsister\nstepsisters\nstepson\nstepsons\nstepwise\nsteradian\nsteradians\nstercoraceous\nstercorous\nsterculia\nstere\nstereo\nstereobate\nstereobates\nstereochemical\nstereochemistry\nstereochrome\nstereochromes\nstereochromic\nstereochromically\nstereochromies\nstereochromy\nstereogram\nstereograms\nstereograph\nstereographed\nstereographic\nstereographical\nstereographically\nstereographing\nstereographs\nstereography\nstereoisomer\nstereoisomeric\nstereoisomerism\nstereoisomerisms\nstereoisomers\nstereologic\nstereological\nstereologically\nstereologist\nstereologists\nstereology\nstereomicroscope\nstereomicroscopes\nstereomicroscopic\nstereomicroscopically\nstereomicroscopy\nstereophonic\nstereophonically\nstereophony\nstereophotographic\nstereophotography\nstereopsis\nstereopticon\nstereopticons\nstereoregular\nstereoregularity\nstereos\nstereoscope\nstereoscopes\nstereoscopic\nstereoscopically\nstereoscopist\nstereoscopists\nstereoscopy\nstereospecific\nstereospecifically\nstereospecificity\nstereotactic\nstereotactical\nstereotactically\nstereotaxic\nstereotaxical\nstereotaxically\nstereotaxies\nstereotaxis\nstereotaxises\nstereotaxy\nstereotropic\nstereotropism\nstereotropisms\nstereotype\nstereotyped\nstereotyper\nstereotypers\nstereotypes\nstereotypic\nstereotypical\nstereotypically\nstereotypies\nstereotyping\nstereotypy\nstereovision\nstereovisions\nsteres\nsteric\nsterical\nsterically\nsterigma\nsterigmata\nsterigmatic\nsterilant\nsterilants\nsterile\nsterilely\nsterileness\nsterility\nsterilization\nsterilizations\nsterilize\nsterilized\nsterilizer\nsterilizers\nsterilizes\nsterilizing\nsterlet\nsterlets\nsterling\nsterlingly\nsterlingness\nstern\nsterna\nsternal\nsterner\nsternest\nsternforemost\nsternite\nsternites\nsternly\nsternmost\nsternness\nsternoclavicular\nsternocleidomastoid\nsternocleidomastoids\nsternocostal\nsternpost\nsternposts\nsterns\nsternson\nsternsons\nsternum\nsternums\nsternutation\nsternutations\nsternutator\nsternutatories\nsternutators\nsternutatory\nsternward\nsternwards\nsternway\nsternways\nsternwheeler\nsternwheelers\nsteroid\nsteroidal\nsteroidogenesis\nsteroidogenic\nsteroids\nsterol\nsterols\nsterope\nsteropes\nstertor\nstertorous\nstertorously\nstertors\nstet\nstethoscope\nstethoscopes\nstethoscopic\nstethoscopical\nstethoscopically\nstethoscopy\nstets\nstetson\nstetsons\nstetted\nstetting\nstevedore\nstevedored\nstevedores\nstevedoring\nstevengraph\nstevengraphs\nstevensgraph\nstevensgraphs\nstew\nsteward\nstewarded\nstewardess\nstewardesses\nstewarding\nstewards\nstewardship\nstewardships\nstewartia\nstewartias\nstewed\nstewing\nstewpan\nstewpans\nstewpot\nstewpots\nstews\nstewy\nsthenia\nsthenias\nsthenic\nstibine\nstibines\nstibnite\nstibnites\nstich\nstiches\nstichic\nstichometric\nstichometry\nstichomythia\nstichomythias\nstichomythic\nstichomythies\nstichomythy\nstick\nstickball\nstickballer\nstickballers\nsticked\nsticker\nstickers\nstickful\nstickfuls\nstickhandle\nstickhandled\nstickhandler\nstickhandlers\nstickhandles\nstickhandling\nstickier\nstickiest\nstickily\nstickiness\nsticking\nstickle\nstickleback\nsticklebacks\nstickled\nstickler\nsticklers\nstickles\nsticklike\nstickling\nstickman\nstickmen\nstickpin\nstickpins\nsticks\nstickseed\nstickseeds\nsticktail\nsticktails\nsticktight\nsticktights\nstickum\nstickums\nstickup\nstickups\nstickweed\nstickweeds\nstickwork\nsticky\nstiction\nstied\nsties\nstiff\nstiffed\nstiffen\nstiffened\nstiffener\nstiffeners\nstiffening\nstiffens\nstiffer\nstiffest\nstiffing\nstiffish\nstiffly\nstiffness\nstiffs\nstifle\nstifled\nstifler\nstiflers\nstifles\nstifling\nstiflingly\nstigma\nstigmal\nstigmas\nstigmasterol\nstigmasterols\nstigmata\nstigmatic\nstigmatically\nstigmatics\nstigmatism\nstigmatist\nstigmatists\nstigmatization\nstigmatizations\nstigmatize\nstigmatized\nstigmatizer\nstigmatizers\nstigmatizes\nstigmatizing\nstilbene\nstilbenes\nstilbestrol\nstilbestrols\nstilbite\nstilbites\nstile\nstiles\nstiletto\nstilettoes\nstilettos\nstill\nstillbirth\nstillbirths\nstillborn\nstilled\nstiller\nstillest\nstillier\nstilliest\nstilliform\nstilling\nstillman\nstillmen\nstillness\nstillroom\nstillrooms\nstills\nstillson\nstillsons\nstilly\nstilt\nstilted\nstiltedly\nstiltedness\nstilting\nstilton\nstilts\nstimulant\nstimulants\nstimulate\nstimulated\nstimulater\nstimulaters\nstimulates\nstimulating\nstimulatingly\nstimulation\nstimulations\nstimulative\nstimulator\nstimulators\nstimulatory\nstimuli\nstimulus\nsting\nstingaree\nstingarees\nstinger\nstingers\nstingier\nstingiest\nstingily\nstinginess\nstinging\nstingingly\nstingless\nstingray\nstingrays\nstings\nstingy\nstink\nstinkard\nstinkards\nstinkaroo\nstinkaroos\nstinkball\nstinkballs\nstinkbug\nstinkbugs\nstinker\nstinkeroo\nstinkeroos\nstinkers\nstinkhorn\nstinkhorns\nstinking\nstinkingly\nstinkingness\nstinko\nstinkpot\nstinkpots\nstinks\nstinkstone\nstinkstones\nstinkweed\nstinkweeds\nstinkwood\nstinkwoods\nstinky\nstint\nstinted\nstinter\nstinters\nstinting\nstintingly\nstints\nstipe\nstiped\nstipel\nstipellate\nstipels\nstipend\nstipendiaries\nstipendiary\nstipends\nstipes\nstipiform\nstipitate\nstipites\nstipitiform\nstipple\nstippled\nstippler\nstipplers\nstipples\nstippling\nstipular\nstipulate\nstipulated\nstipulates\nstipulating\nstipulation\nstipulations\nstipulator\nstipulators\nstipulatory\nstipule\nstipuled\nstipules\nstir\nstirabout\nstirabouts\nstirk\nstirks\nstirling\nstirp\nstirpes\nstirps\nstirred\nstirrer\nstirrers\nstirring\nstirringly\nstirrings\nstirrup\nstirrups\nstirs\nstishovite\nstishovites\nstitch\nstitched\nstitcher\nstitchers\nstitchery\nstitches\nstitching\nstitchwort\nstitchworts\nstithies\nstithy\nstiver\nstivers\nstoa\nstoae\nstoas\nstoat\nstoats\nstoccado\nstoccados\nstochastic\nstochastically\nstock\nstockade\nstockaded\nstockades\nstockading\nstockage\nstockbreeder\nstockbreeders\nstockbreeding\nstockbreedings\nstockbroker\nstockbrokerage\nstockbrokers\nstockbroking\nstockcar\nstockcars\nstocked\nstocker\nstockers\nstockfish\nstockfishes\nstockholder\nstockholders\nstockholding\nstockholdings\nstockholm\nstockier\nstockiest\nstockily\nstockiness\nstockinet\nstockinets\nstockinette\nstockinettes\nstocking\nstockinged\nstockings\nstockish\nstockist\nstockists\nstockjobber\nstockjobbers\nstockjobbery\nstockjobbing\nstockkeeper\nstockkeepers\nstockless\nstockman\nstockmar\nstockmen\nstockowner\nstockowners\nstockownership\nstockpile\nstockpiled\nstockpiler\nstockpilers\nstockpiles\nstockpiling\nstockpot\nstockpots\nstockroom\nstockrooms\nstocks\nstocktaking\nstocktakings\nstocky\nstockyard\nstockyards\nstodgier\nstodgiest\nstodgily\nstodginess\nstodgy\nstogie\nstogies\nstogy\nstoic\nstoical\nstoically\nstoicalness\nstoichiometric\nstoichiometrically\nstoichiometry\nstoicism\nstoics\nstoke\nstoked\nstokehold\nstokeholds\nstokehole\nstokeholes\nstoker\nstokers\nstokes\nstoking\nstole\nstolen\nstoles\nstolid\nstolider\nstolidest\nstolidity\nstolidly\nstolidness\nstollen\nstollens\nstolon\nstolonate\nstoloniferous\nstoloniferously\nstoma\nstomach\nstomachache\nstomachaches\nstomached\nstomacher\nstomachers\nstomachic\nstomachically\nstomachics\nstomaching\nstomachs\nstomachy\nstomal\nstomas\nstomata\nstomatal\nstomate\nstomates\nstomatic\nstomatitis\nstomatitises\nstomatologic\nstomatological\nstomatologist\nstomatologists\nstomatology\nstomatopod\nstomatopods\nstomatous\nstomodaea\nstomodaeal\nstomodaeum\nstomodea\nstomodeal\nstomodeum\nstomp\nstomped\nstomper\nstompers\nstomping\nstompingly\nstomps\nstone\nstoneboat\nstoneboats\nstonecat\nstonecats\nstonechat\nstonechats\nstonecrop\nstonecrops\nstonecutter\nstonecutters\nstonecutting\nstoned\nstonefish\nstonefishes\nstoneflies\nstonefly\nstonehearted\nstonehenge\nstonemason\nstonemasonry\nstonemasons\nstoner\nstoneroller\nstonerollers\nstoners\nstones\nstonewall\nstonewalled\nstonewaller\nstonewallers\nstonewalling\nstonewalls\nstoneware\nstonewash\nstonewashed\nstonewashes\nstonewashing\nstonework\nstoneworker\nstoneworkers\nstonewort\nstoneworts\nstoney\nstonier\nstoniest\nstonily\nstoniness\nstoning\nstony\nstonyhearted\nstonyheartedly\nstonyheartedness\nstood\nstooge\nstooged\nstooges\nstooging\nstool\nstooled\nstoolie\nstoolies\nstooling\nstools\nstoop\nstoopball\nstoopballs\nstooped\nstooper\nstoopers\nstooping\nstoops\nstop\nstopcock\nstopcocks\nstope\nstoped\nstoper\nstopers\nstopes\nstopgap\nstopgaps\nstoping\nstoplight\nstoplights\nstopover\nstopovers\nstoppable\nstoppage\nstoppages\nstopped\nstopper\nstoppered\nstoppering\nstoppers\nstopping\nstopple\nstoppled\nstopples\nstoppling\nstops\nstopwatch\nstopwatches\nstorable\nstorage\nstorax\nstoraxes\nstore\nstored\nstorefront\nstorefronts\nstorehouse\nstorehouses\nstorekeeper\nstorekeepers\nstorekeeping\nstoreowner\nstoreowners\nstorer\nstoreroom\nstorerooms\nstorers\nstores\nstoreship\nstoreships\nstorewide\nstorey\nstoreyed\nstoreys\nstoried\nstories\nstoring\nstork\nstorks\nstorksbill\nstorksbills\nstorm\nstormbound\nstormed\nstormier\nstormiest\nstormily\nstorminess\nstorming\nstorms\nstormy\nstory\nstoryboard\nstoryboarded\nstoryboarding\nstoryboards\nstorybook\nstorybooks\nstorying\nstoryteller\nstorytellers\nstorytelling\nstorywriter\nstorywriters\nstoss\nstotinka\nstotinki\nstound\nstounds\nstoup\nstoups\nstout\nstouten\nstoutened\nstoutening\nstoutens\nstouter\nstoutest\nstouthearted\nstoutheartedly\nstoutheartedness\nstoutish\nstoutly\nstoutness\nstouts\nstove\nstovepipe\nstovepipes\nstover\nstovers\nstoves\nstovetop\nstovetops\nstow\nstowage\nstowaway\nstowaways\nstowed\nstowing\nstows\nstrabismal\nstrabismic\nstrabismus\nstrabo\nstrabotomies\nstrabotomy\nstrachey\nstrad\nstraddle\nstraddled\nstraddler\nstraddlers\nstraddles\nstraddling\nstradivari\nstradivarius\nstrads\nstrafe\nstrafed\nstrafer\nstrafers\nstrafes\nstrafing\nstraggle\nstraggled\nstraggler\nstragglers\nstraggles\nstragglier\nstraggliest\nstraggling\nstraggly\nstraight\nstraightarrow\nstraightaway\nstraightaways\nstraightbred\nstraightedge\nstraightedged\nstraightedges\nstraighten\nstraightened\nstraightener\nstraighteners\nstraightening\nstraightens\nstraighter\nstraightest\nstraightforward\nstraightforwardly\nstraightforwardness\nstraightforwards\nstraightish\nstraightjacket\nstraightjacketed\nstraightjacketing\nstraightjackets\nstraightlaced\nstraightly\nstraightness\nstraights\nstraightway\nstrain\nstrained\nstrainer\nstrainers\nstraining\nstrainometer\nstrainometers\nstrains\nstrait\nstraiten\nstraitened\nstraitening\nstraitens\nstraitjacket\nstraitjacketed\nstraitjacketing\nstraitjackets\nstraitlaced\nstraitlacedly\nstraitlacedness\nstraitly\nstraitness\nstraits\nstrake\nstrakes\nstramonium\nstramoniums\nstrand\nstranded\nstrandedness\nstranding\nstrandline\nstrandlines\nstrands\nstrange\nstrangely\nstrangeness\nstranger\nstrangers\nstrangest\nstrangle\nstrangled\nstranglehold\nstrangleholds\nstrangler\nstranglers\nstrangles\nstrangling\nstrangulate\nstrangulated\nstrangulates\nstrangulating\nstrangulation\nstrangulations\nstranguries\nstrangury\nstrap\nstraphang\nstraphanger\nstraphangers\nstraphanging\nstraphangs\nstraphung\nstrapless\nstraplesses\nstrappado\nstrappadoes\nstrapped\nstrapper\nstrappers\nstrapping\nstraps\nstrasbourg\nstrass\nstrasses\nstrata\nstratagem\nstratagems\nstratal\nstrategic\nstrategical\nstrategically\nstrategics\nstrategies\nstrategist\nstrategists\nstrategize\nstrategized\nstrategizes\nstrategizing\nstrategy\nstratford\nstrath\nstrathclyde\nstraths\nstrathspey\nstrathspeys\nstrati\nstraticulate\nstraticulation\nstraticulations\nstratification\nstratificational\nstratified\nstratifies\nstratiform\nstratify\nstratifying\nstratigraphic\nstratigraphical\nstratigraphically\nstratigraphy\nstratocracies\nstratocracy\nstratocratic\nstratocumuli\nstratocumulus\nstratopause\nstratopauses\nstratosphere\nstratospheres\nstratospheric\nstratospherically\nstratovolcano\nstratovolcanos\nstratum\nstratums\nstratus\nstrauss\nstravinsky\nstraw\nstrawberries\nstrawberry\nstrawboard\nstrawboards\nstrawflower\nstrawflowers\nstrawhat\nstraws\nstrawworm\nstrawworms\nstrawy\nstray\nstrayed\nstrayer\nstrayers\nstraying\nstrays\nstreak\nstreaked\nstreaker\nstreakers\nstreakier\nstreakiest\nstreakily\nstreakiness\nstreaking\nstreaks\nstreaky\nstream\nstreambed\nstreambeds\nstreamed\nstreamer\nstreamers\nstreaming\nstreamlet\nstreamlets\nstreamline\nstreamlined\nstreamliner\nstreamliners\nstreamlines\nstreamlining\nstreams\nstreamside\nstreamsides\nstreamy\nstreet\nstreetcar\nstreetcars\nstreeter\nstreeters\nstreetlight\nstreetlights\nstreets\nstreetscape\nstreetscapes\nstreetwalker\nstreetwalkers\nstreetwalking\nstreetwise\nstrength\nstrengthen\nstrengthened\nstrengthener\nstrengtheners\nstrengthening\nstrengthens\nstrengths\nstrenuosity\nstrenuous\nstrenuously\nstrenuousness\nstrep\nstreps\nstreptobacilli\nstreptobacillus\nstreptocarpus\nstreptocarpuses\nstreptococcal\nstreptococci\nstreptococcic\nstreptococcus\nstreptodornase\nstreptodornases\nstreptokinase\nstreptokinases\nstreptolysin\nstreptolysins\nstreptomyces\nstreptomycete\nstreptomycetes\nstreptomycin\nstreptomycins\nstreptonigrin\nstreptonigrins\nstreptothricin\nstreptothricins\nstreptovaricin\nstreptovaricins\nstreptozotocin\nstreptozotocins\nstresa\nstress\nstressed\nstresses\nstressful\nstressfully\nstressfulness\nstressing\nstressless\nstresslessness\nstressor\nstressors\nstretch\nstretchability\nstretchable\nstretched\nstretcher\nstretchers\nstretches\nstretchier\nstretchiest\nstretchiness\nstretching\nstretchy\nstretta\nstrettas\nstrette\nstretti\nstretto\nstrettos\nstreusel\nstreusels\nstrew\nstrewed\nstrewing\nstrewn\nstrews\nstria\nstriae\nstriata\nstriate\nstriated\nstriates\nstriating\nstriation\nstriations\nstriatum\nstrick\nstricken\nstrickle\nstrickled\nstrickles\nstrickling\nstricks\nstrict\nstricter\nstrictest\nstrictly\nstrictness\nstricture\nstrictures\nstridden\nstride\nstridence\nstridency\nstrident\nstridently\nstrider\nstriders\nstrides\nstriding\nstridor\nstridors\nstridulate\nstridulated\nstridulates\nstridulating\nstridulation\nstridulations\nstridulatory\nstridulous\nstridulously\nstrife\nstrifeless\nstrigil\nstrigils\nstrigose\nstrike\nstrikebound\nstrikebreaker\nstrikebreakers\nstrikebreaking\nstrikeout\nstrikeouts\nstrikeover\nstrikeovers\nstriker\nstrikers\nstrikes\nstriking\nstrikingly\nstrikingness\nstrindberg\nstring\nstringboard\nstringboards\nstringcourse\nstringcourses\nstringed\nstringencies\nstringency\nstringendo\nstringent\nstringently\nstringer\nstringers\nstringhalt\nstringhalted\nstringhalts\nstringier\nstringiest\nstringily\nstringiness\nstringing\nstringless\nstringpiece\nstringpieces\nstrings\nstringy\nstringybark\nstringybarks\nstrip\nstripe\nstriped\nstripeless\nstriper\nstripers\nstripes\nstripfilm\nstripfilms\nstripier\nstripiest\nstriping\nstripings\nstripling\nstriplings\nstrippable\nstripped\nstripper\nstrippers\nstripping\nstrips\nstript\nstriptease\nstripteaser\nstripteasers\nstripteases\nstripy\nstrive\nstrived\nstriven\nstriver\nstrivers\nstrives\nstriving\nstrivingly\nstrivings\nstrobe\nstrobes\nstrobila\nstrobilaceous\nstrobilae\nstrobilar\nstrobilation\nstrobilations\nstrobile\nstrobiles\nstrobili\nstrobilus\nstroboscope\nstroboscopes\nstroboscopic\nstroboscopically\nstrobotron\nstrobotrons\nstrode\nstroganoff\nstroke\nstroked\nstroker\nstrokers\nstrokes\nstroking\nstroll\nstrolled\nstroller\nstrollers\nstrolling\nstrolls\nstroma\nstromal\nstromata\nstromatic\nstromatolite\nstromatolites\nstromatolitic\nstromboli\nstrong\nstrongbox\nstrongboxes\nstronger\nstrongest\nstronghold\nstrongholds\nstrongish\nstrongly\nstrongman\nstrongmen\nstrongpoint\nstrongpoints\nstrongyl\nstrongyle\nstrongyles\nstrongyloidiasis\nstrongyloidosis\nstrongylosis\nstrongyls\nstrontianite\nstrontianites\nstrontium\nstrop\nstrophanthin\nstrophanthins\nstrophe\nstrophes\nstrophic\nstrophoid\nstrophoids\nstrophuli\nstrophulus\nstropped\nstroppier\nstroppiest\nstropping\nstroppy\nstrops\nstroud\nstrouding\nstrouds\nstrove\nstruck\nstructural\nstructuralism\nstructuralist\nstructuralists\nstructuralization\nstructuralizations\nstructuralize\nstructuralized\nstructuralizes\nstructuralizing\nstructurally\nstructurals\nstructuration\nstructure\nstructured\nstructureless\nstructurelessness\nstructures\nstructuring\nstrudel\nstrudels\nstruggle\nstruggled\nstruggler\nstrugglers\nstruggles\nstruggling\nstrugglingly\nstrum\nstruma\nstrumae\nstrumas\nstrumatic\nstrummed\nstrummer\nstrummers\nstrumming\nstrumose\nstrumous\nstrumpet\nstrumpets\nstrums\nstrung\nstrut\nstruthious\nstruts\nstrutted\nstrutter\nstrutters\nstrutting\nstruttingly\nstrychnine\nstrychninism\nstrychninisms\nstuart\nstuarts\nstub\nstubbed\nstubbier\nstubbiest\nstubbily\nstubbiness\nstubbing\nstubble\nstubbled\nstubbly\nstubborn\nstubborner\nstubbornest\nstubbornly\nstubbornness\nstubbs\nstubby\nstubs\nstucco\nstuccoed\nstuccoes\nstuccoing\nstuccos\nstuccowork\nstuccoworker\nstuccoworkers\nstuck\nstud\nstudbook\nstudbooks\nstudded\nstudding\nstuddingsail\nstuddingsails\nstudent\nstudents\nstudentship\nstudentships\nstudfish\nstudfishes\nstudhorse\nstudhorses\nstudied\nstudiedly\nstudiedness\nstudier\nstudiers\nstudies\nstudio\nstudios\nstudious\nstudiously\nstudiousness\nstudly\nstuds\nstudwork\nstudy\nstudying\nstuff\nstuffed\nstuffer\nstuffers\nstuffier\nstuffiest\nstuffily\nstuffiness\nstuffing\nstuffless\nstuffs\nstuffy\nstukeley\nstull\nstulls\nstultification\nstultifications\nstultified\nstultifier\nstultifiers\nstultifies\nstultify\nstultifying\nstum\nstumble\nstumblebum\nstumblebums\nstumbled\nstumbler\nstumblers\nstumbles\nstumbling\nstumblingly\nstummed\nstumming\nstump\nstumpage\nstumped\nstumper\nstumpers\nstumpiness\nstumping\nstumps\nstumpy\nstums\nstun\nstung\nstunk\nstunned\nstunner\nstunners\nstunning\nstunningly\nstuns\nstunt\nstunted\nstuntedness\nstunting\nstuntman\nstuntmen\nstunts\nstuntwoman\nstuntwomen\nstupa\nstupas\nstupe\nstupefacient\nstupefacients\nstupefaction\nstupefactions\nstupefactive\nstupefactives\nstupefied\nstupefier\nstupefiers\nstupefies\nstupefy\nstupefying\nstupefyingly\nstupendous\nstupendously\nstupendousness\nstupes\nstupid\nstupider\nstupidest\nstupidities\nstupidity\nstupidly\nstupidness\nstupids\nstupor\nstuporous\nstupors\nsturdier\nsturdiest\nsturdily\nsturdiness\nsturdy\nsturgeon\nsturgeons\nsturm\nstutter\nstuttered\nstutterer\nstutterers\nstuttering\nstutteringly\nstutters\nstuttgart\nsty\nstye\nstyes\nstygian\nstying\nstylar\nstylate\nstyle\nstylebook\nstylebooks\nstyled\nstyler\nstylers\nstyles\nstylet\nstylets\nstyli\nstyliform\nstyling\nstylings\nstylish\nstylishly\nstylishness\nstylist\nstylistic\nstylistically\nstylistics\nstylists\nstylite\nstylites\nstylitic\nstylitism\nstylization\nstylizations\nstylize\nstylized\nstylizer\nstylizers\nstylizes\nstylizing\nstylobate\nstylobates\nstylography\nstyloid\nstylolite\nstylolites\nstylopodia\nstylopodium\nstylus\nstyluses\nstymie\nstymied\nstymieing\nstymies\nstymy\nstymying\nstypsis\nstyptic\nstypticity\nstyptics\nstyrax\nstyraxes\nstyrene\nstyria\nstyrofoam\nstyx\nsuability\nsuable\nsuably\nsuasion\nsuasions\nsuasive\nsuasively\nsuasiveness\nsuave\nsuavely\nsuaveness\nsuaver\nsuavest\nsuavity\nsub\nsubabdominal\nsubacid\nsubacidly\nsubacidness\nsubacute\nsubacutely\nsubadar\nsubadars\nsubaddress\nsubaddresses\nsubadolescent\nsubadult\nsubadults\nsubaerial\nsubaerially\nsubagencies\nsubagency\nsubagent\nsubagents\nsubahdar\nsubahdars\nsuballocation\nsuballocations\nsubalpine\nsubaltern\nsubalternate\nsubalternation\nsubalternations\nsubalterns\nsubantarctic\nsubapical\nsubapically\nsubaquatic\nsubaqueous\nsubarachnoid\nsubarachnoidal\nsubarctic\nsubarea\nsubareas\nsubarid\nsubassemblies\nsubassembly\nsubatmospheric\nsubatomic\nsubaudible\nsubaudition\nsubauditions\nsubaverage\nsubaxillary\nsubbase\nsubbasement\nsubbasements\nsubbases\nsubbasin\nsubbasins\nsubbass\nsubbasses\nsubbed\nsubbing\nsubbituminous\nsubblock\nsubblocks\nsubbranch\nsubbranches\nsubcabinet\nsubcaliber\nsubcapsular\nsubcarrier\nsubcarriers\nsubcartilaginous\nsubcaste\nsubcastes\nsubcategories\nsubcategorization\nsubcategorizations\nsubcategorize\nsubcategorized\nsubcategorizes\nsubcategorizing\nsubcategory\nsubceiling\nsubceilings\nsubcelestial\nsubcellar\nsubcellars\nsubcellular\nsubcenter\nsubcenters\nsubcentral\nsubcentrally\nsubchannel\nsubchannels\nsubchapter\nsubchapters\nsubchaser\nsubchasers\nsubchief\nsubchiefs\nsubclan\nsubclans\nsubclass\nsubclasses\nsubclassification\nsubclassifications\nsubclassified\nsubclassifies\nsubclassify\nsubclassifying\nsubclavian\nsubclavians\nsubclimactic\nsubclimax\nsubclimaxes\nsubclinical\nsubclinically\nsubcluster\nsubclusters\nsubcode\nsubcodes\nsubcollection\nsubcollections\nsubcollege\nsubcolleges\nsubcollegiate\nsubcolonies\nsubcolony\nsubcommand\nsubcommands\nsubcommission\nsubcommissions\nsubcommittee\nsubcommittees\nsubcommunities\nsubcommunity\nsubcompact\nsubcompacts\nsubcomponent\nsubcomponents\nsubconference\nsubconferences\nsubconscious\nsubconsciously\nsubconsciousness\nsubcontinent\nsubcontinental\nsubcontinents\nsubcontract\nsubcontracted\nsubcontracting\nsubcontractor\nsubcontractors\nsubcontracts\nsubcontraoctave\nsubcontraoctaves\nsubcontraries\nsubcontrary\nsubcool\nsubcooled\nsubcooling\nsubcools\nsubcordate\nsubcoriaceous\nsubcortex\nsubcortical\nsubcortically\nsubcortices\nsubcounties\nsubcounty\nsubcritical\nsubcrustal\nsubcult\nsubcults\nsubcultural\nsubculturally\nsubculture\nsubcultures\nsubcurative\nsubcutaneous\nsubcutaneously\nsubcutis\nsubcutises\nsubdeacon\nsubdeacons\nsubdean\nsubdeans\nsubdeb\nsubdebs\nsubdebutante\nsubdebutantes\nsubdecision\nsubdecisions\nsubdepartment\nsubdepartments\nsubdermal\nsubdermally\nsubdevelopment\nsubdevelopments\nsubdiaconal\nsubdiaconate\nsubdiaconates\nsubdialect\nsubdialects\nsubdirector\nsubdirectories\nsubdirectors\nsubdirectory\nsubdiscipline\nsubdisciplines\nsubdistrict\nsubdistricts\nsubdividable\nsubdivide\nsubdivided\nsubdivider\nsubdividers\nsubdivides\nsubdividing\nsubdivision\nsubdivisional\nsubdivisions\nsubdominant\nsubdominants\nsubduable\nsubduct\nsubducted\nsubducting\nsubduction\nsubductions\nsubducts\nsubdue\nsubdued\nsubduedly\nsubduer\nsubduers\nsubdues\nsubduing\nsubdural\nsubeconomies\nsubeconomy\nsubedit\nsubedited\nsubediting\nsubeditor\nsubeditorial\nsubeditors\nsubedits\nsubemployed\nsubemployment\nsubentries\nsubentry\nsubepidermal\nsubequatorial\nsuberect\nsuberin\nsuberins\nsuberization\nsuberizations\nsuberize\nsuberized\nsuberizes\nsuberizing\nsuberose\nsuberous\nsubexpression\nsubexpressions\nsubfamilies\nsubfamily\nsubfield\nsubfields\nsubfigure\nsubfigures\nsubfile\nsubfiles\nsubfloor\nsubflooring\nsubfloorings\nsubfloors\nsubfolder\nsubfolders\nsubfossil\nsubfossils\nsubframe\nsubframes\nsubfreezing\nsubfusc\nsubfuscs\nsubgenera\nsubgeneration\nsubgenerations\nsubgeneric\nsubgenre\nsubgenres\nsubgenus\nsubglacial\nsubglacially\nsubgoal\nsubgoals\nsubgovernment\nsubgovernments\nsubgrade\nsubgrades\nsubgraph\nsubgraphs\nsubgroup\nsubgroups\nsubgum\nsubgums\nsubharmonic\nsubhead\nsubheading\nsubheadings\nsubheads\nsubhuman\nsubhumans\nsubhumid\nsubindex\nsubindexes\nsubindices\nsubindustries\nsubindustry\nsubinfeud\nsubinfeudate\nsubinfeudated\nsubinfeudates\nsubinfeudating\nsubinfeudation\nsubinfeudations\nsubinfeudatory\nsubinfeuded\nsubinfeuding\nsubinfeuds\nsubinhibitory\nsubinterval\nsubintervals\nsubirrigate\nsubirrigated\nsubirrigates\nsubirrigating\nsubirrigation\nsubirrigations\nsubito\nsubjacency\nsubjacent\nsubjacently\nsubject\nsubjected\nsubjecting\nsubjection\nsubjections\nsubjective\nsubjectively\nsubjectiveness\nsubjectivism\nsubjectivist\nsubjectivistic\nsubjectivists\nsubjectivity\nsubjectivization\nsubjectivizations\nsubjectivize\nsubjectivized\nsubjectivizes\nsubjectivizing\nsubjectless\nsubjects\nsubjoin\nsubjoinder\nsubjoinders\nsubjoined\nsubjoining\nsubjoins\nsubjugate\nsubjugated\nsubjugates\nsubjugating\nsubjugation\nsubjugations\nsubjugator\nsubjugators\nsubjunction\nsubjunctions\nsubjunctive\nsubjunctives\nsubkingdom\nsubkingdoms\nsublanguage\nsublanguages\nsublate\nsublated\nsublates\nsublating\nsublation\nsublations\nsublease\nsubleased\nsubleases\nsubleasing\nsublet\nsublethal\nsublethally\nsublets\nsubletting\nsublevel\nsublevels\nsublibrarian\nsublibrarians\nsublicense\nsublicensed\nsublicensee\nsublicensees\nsublicenses\nsublicensing\nsublieutenant\nsublieutenants\nsublimable\nsublimate\nsublimated\nsublimates\nsublimating\nsublimation\nsublimations\nsublime\nsublimed\nsublimely\nsublimeness\nsublimer\nsublimers\nsublimes\nsubliminal\nsubliminally\nsubliming\nsublimit\nsublimities\nsublimits\nsublimity\nsubline\nsublines\nsublingual\nsublingually\nsublinguals\nsubliteracy\nsubliterary\nsubliterate\nsubliterature\nsublittoral\nsublot\nsublots\nsublunar\nsublunary\nsubluxation\nsubluxations\nsubmachine\nsubmanager\nsubmanagers\nsubmandibular\nsubmarginal\nsubmarine\nsubmarined\nsubmariner\nsubmariners\nsubmarines\nsubmarining\nsubmarket\nsubmarkets\nsubmaxilla\nsubmaxillae\nsubmaxillaries\nsubmaxillary\nsubmaximal\nsubmediant\nsubmediants\nsubmenu\nsubmenus\nsubmerge\nsubmerged\nsubmergence\nsubmerges\nsubmergibility\nsubmergible\nsubmerging\nsubmerse\nsubmersed\nsubmerses\nsubmersible\nsubmersibles\nsubmersing\nsubmersion\nsubmersions\nsubmetacentric\nsubmetacentrics\nsubmicrogram\nsubmicron\nsubmicroscopic\nsubmicroscopically\nsubmillimeter\nsubminiature\nsubminiaturization\nsubminiaturizations\nsubminiaturize\nsubminiaturized\nsubminiaturizes\nsubminiaturizing\nsubminimal\nsubminimum\nsubminister\nsubministered\nsubministering\nsubministers\nsubmiss\nsubmission\nsubmissions\nsubmissive\nsubmissively\nsubmissiveness\nsubmit\nsubmitochondrial\nsubmits\nsubmittal\nsubmittals\nsubmitted\nsubmitter\nsubmitters\nsubmitting\nsubmontane\nsubmucosa\nsubmucosal\nsubmucosally\nsubmucosas\nsubmultiple\nsubmultiples\nsubmunition\nsubmunitions\nsubnational\nsubnet\nsubnets\nsubnetwork\nsubnetworks\nsubniche\nsubniches\nsubnormal\nsubnormality\nsubnormally\nsubnormals\nsubnuclear\nsuboceanic\nsuboptimal\nsuboptimization\nsuboptimizations\nsuboptimize\nsuboptimized\nsuboptimizes\nsuboptimizing\nsuboptimum\nsuboptimums\nsuborbicular\nsuborbital\nsuborbitals\nsuborder\nsuborders\nsubordinate\nsubordinated\nsubordinately\nsubordinateness\nsubordinates\nsubordinating\nsubordination\nsubordinations\nsubordinative\nsubordinator\nsubordinators\nsuborganization\nsuborganizations\nsuborn\nsubornation\nsubornations\nsuborned\nsuborner\nsuborners\nsuborning\nsuborns\nsuboxide\nsuboxides\nsubpanel\nsubpanels\nsubpar\nsubparagraph\nsubparagraphs\nsubparallel\nsubpart\nsubparts\nsubperiod\nsubperiods\nsubperiosteal\nsubphase\nsubphases\nsubphyla\nsubphylum\nsubplot\nsubplots\nsubpoena\nsubpoenaed\nsubpoenaing\nsubpoenas\nsubpolar\nsubpopulation\nsubpopulations\nsubpotency\nsubpotent\nsubprimate\nsubprimates\nsubprincipal\nsubprincipals\nsubproblem\nsubproblems\nsubprocess\nsubprocesses\nsubproduct\nsubproducts\nsubprofessional\nsubprofessionals\nsubprogram\nsubprograms\nsubproject\nsubprojects\nsubproletariat\nsubproletariats\nsubrational\nsubregion\nsubregional\nsubregions\nsubreption\nsubreptions\nsubreptitious\nsubreptitiously\nsubring\nsubrings\nsubrogate\nsubrogated\nsubrogates\nsubrogating\nsubrogation\nsubrogations\nsubroutine\nsubroutines\nsubs\nsubsample\nsubsampled\nsubsamples\nsubsampling\nsubsatellite\nsubsatellites\nsubsaturated\nsubsaturation\nsubscale\nsubscales\nsubscapular\nsubscapulars\nsubscience\nsubsciences\nsubscribe\nsubscribed\nsubscriber\nsubscribers\nsubscribes\nsubscribing\nsubscript\nsubscripted\nsubscripting\nsubscription\nsubscriptions\nsubscriptive\nsubscriptively\nsubscripts\nsubsea\nsubsecretaries\nsubsecretary\nsubsection\nsubsections\nsubsector\nsubsectors\nsubsegment\nsubsegments\nsubseizure\nsubsense\nsubsenses\nsubsentence\nsubsentences\nsubsequence\nsubsequences\nsubsequent\nsubsequently\nsubsequentness\nsubsere\nsubseres\nsubseries\nsubserve\nsubserved\nsubserves\nsubservience\nsubserviency\nsubservient\nsubserviently\nsubserving\nsubset\nsubsets\nsubshell\nsubshells\nsubshrub\nsubshrubs\nsubside\nsubsided\nsubsidence\nsubsides\nsubsidiaries\nsubsidiarily\nsubsidiarity\nsubsidiary\nsubsidies\nsubsiding\nsubsidization\nsubsidizations\nsubsidize\nsubsidized\nsubsidizer\nsubsidizers\nsubsidizes\nsubsidizing\nsubsidy\nsubsist\nsubsisted\nsubsistence\nsubsistent\nsubsister\nsubsisters\nsubsisting\nsubsists\nsubsite\nsubsites\nsubskill\nsubskills\nsubsocial\nsubsocieties\nsubsociety\nsubsoil\nsubsoiled\nsubsoiler\nsubsoilers\nsubsoiling\nsubsoils\nsubsolar\nsubsonic\nsubsonically\nsubspace\nsubspaces\nsubspecialist\nsubspecialists\nsubspecialization\nsubspecializations\nsubspecialize\nsubspecialized\nsubspecializes\nsubspecializing\nsubspecialties\nsubspecialty\nsubspecies\nsubspecific\nsubstage\nsubstages\nsubstance\nsubstanceless\nsubstances\nsubstandard\nsubstantia\nsubstantiae\nsubstantial\nsubstantiality\nsubstantially\nsubstantialness\nsubstantials\nsubstantiate\nsubstantiated\nsubstantiates\nsubstantiating\nsubstantiation\nsubstantiations\nsubstantiative\nsubstantival\nsubstantivally\nsubstantive\nsubstantively\nsubstantiveness\nsubstantives\nsubstantivize\nsubstantivized\nsubstantivizes\nsubstantivizing\nsubstate\nsubstates\nsubstation\nsubstations\nsubstituent\nsubstituents\nsubstitutability\nsubstitutable\nsubstitute\nsubstituted\nsubstitutes\nsubstituting\nsubstitution\nsubstitutional\nsubstitutionally\nsubstitutionary\nsubstitutions\nsubstitutive\nsubstitutively\nsubstrata\nsubstrate\nsubstrates\nsubstrative\nsubstratosphere\nsubstratospheres\nsubstratospheric\nsubstratum\nsubstratums\nsubstructural\nsubstructure\nsubstructures\nsubsumable\nsubsume\nsubsumed\nsubsumes\nsubsuming\nsubsumption\nsubsumptions\nsubsumptive\nsubsurface\nsubsystem\nsubsystems\nsubtask\nsubtasks\nsubtaxa\nsubtaxon\nsubtaxons\nsubteen\nsubteens\nsubtemperate\nsubtenancy\nsubtenant\nsubtenants\nsubtend\nsubtended\nsubtending\nsubtends\nsubterfuge\nsubterfuges\nsubterminal\nsubterranean\nsubterraneanly\nsubterraneous\nsubterraneously\nsubterrestrial\nsubtest\nsubtests\nsubtext\nsubtexts\nsubtextual\nsubtheme\nsubthemes\nsubtherapeutic\nsubtherapeutically\nsubthreshold\nsubtile\nsubtilely\nsubtileness\nsubtiler\nsubtilest\nsubtilin\nsubtilins\nsubtilisin\nsubtilisins\nsubtility\nsubtilization\nsubtilizations\nsubtilize\nsubtilized\nsubtilizes\nsubtilizing\nsubtilty\nsubtitle\nsubtitled\nsubtitles\nsubtitling\nsubtle\nsubtleness\nsubtler\nsubtlest\nsubtleties\nsubtlety\nsubtly\nsubtonic\nsubtonics\nsubtopic\nsubtopics\nsubtorrid\nsubtotal\nsubtotaled\nsubtotaling\nsubtotalled\nsubtotalling\nsubtotally\nsubtotals\nsubtract\nsubtracted\nsubtracter\nsubtracters\nsubtracting\nsubtraction\nsubtractions\nsubtractive\nsubtracts\nsubtrahend\nsubtrahends\nsubtreasuries\nsubtreasury\nsubtrend\nsubtrends\nsubtribe\nsubtribes\nsubtropic\nsubtropical\nsubtropics\nsubtype\nsubtypes\nsubulate\nsubumbrella\nsubumbrellas\nsubunit\nsubunits\nsuburb\nsuburban\nsuburbanite\nsuburbanites\nsuburbanization\nsuburbanizations\nsuburbanize\nsuburbanized\nsuburbanizes\nsuburbanizing\nsuburbans\nsuburbia\nsuburbs\nsubvarieties\nsubvariety\nsubvassal\nsubvassals\nsubvention\nsubventionary\nsubventions\nsubversion\nsubversionary\nsubversions\nsubversive\nsubversively\nsubversiveness\nsubversives\nsubvert\nsubverted\nsubverter\nsubverters\nsubverting\nsubverts\nsubviral\nsubvirus\nsubviruses\nsubvisible\nsubvisual\nsubvocal\nsubvocalization\nsubvocalizations\nsubvocalize\nsubvocalized\nsubvocalizer\nsubvocalizers\nsubvocalizes\nsubvocalizing\nsubvocally\nsubway\nsubways\nsubworld\nsubworlds\nsubwriter\nsubwriters\nsubzero\nsubzone\nsubzones\nsuccedanea\nsuccedaneous\nsuccedaneum\nsuccedaneums\nsuccedent\nsucceed\nsucceeded\nsucceeder\nsucceeders\nsucceeding\nsucceeds\nsuccess\nsuccesses\nsuccessful\nsuccessfully\nsuccessfulness\nsuccession\nsuccessional\nsuccessionally\nsuccessions\nsuccessive\nsuccessively\nsuccessiveness\nsuccessor\nsuccessors\nsucci\nsuccinate\nsuccinates\nsuccinct\nsuccincter\nsuccinctest\nsuccinctly\nsuccinctness\nsuccinic\nsuccinyl\nsuccinylcholine\nsuccinylcholines\nsuccinyls\nsuccinylsulfathiazole\nsuccinylsulfathiazoles\nsuccor\nsuccorable\nsuccored\nsuccorer\nsuccorers\nsuccories\nsuccoring\nsuccors\nsuccory\nsuccotash\nsuccoth\nsuccuba\nsuccubae\nsuccubi\nsuccubus\nsuccubuses\nsucculence\nsucculency\nsucculent\nsucculently\nsucculents\nsuccumb\nsuccumbed\nsuccumbing\nsuccumbs\nsuccus\nsuccussatory\nsuccussion\nsuccussions\nsuccès\nsuch\nsuchlike\nsuck\nsucked\nsucker\nsuckered\nsuckerfish\nsuckerfishes\nsuckering\nsuckers\nsuckfish\nsuckfishes\nsucking\nsuckle\nsuckled\nsuckler\nsucklers\nsuckles\nsuckling\nsucklings\nsucks\nsucrase\nsucrases\nsucre\nsucres\nsucrose\nsuction\nsuctional\nsuctioned\nsuctioning\nsuctions\nsuctorial\nsuctorian\nsuctorians\nsudan\nsudanese\nsudanic\nsudatoria\nsudatories\nsudatorium\nsudatory\nsudd\nsudden\nsuddenly\nsuddenness\nsudds\nsudeten\nsudetenland\nsudetes\nsudoriferous\nsudorific\nsudorifics\nsudra\nsudras\nsuds\nsudser\nsudsers\nsudsier\nsudsiest\nsudsless\nsudsy\nsue\nsued\nsuede\nsueded\nsuedes\nsueding\nsuer\nsuers\nsues\nsuet\nsuety\nsuey\nsueys\nsuez\nsuffer\nsufferable\nsufferableness\nsufferably\nsufferance\nsuffered\nsufferer\nsufferers\nsuffering\nsufferingly\nsufferings\nsuffers\nsuffice\nsufficed\nsufficer\nsufficers\nsuffices\nsufficiencies\nsufficiency\nsufficient\nsufficiently\nsufficing\nsufficingly\nsufficingness\nsuffix\nsuffixal\nsuffixation\nsuffixations\nsuffixed\nsuffixes\nsuffixing\nsuffixion\nsuffixions\nsuffocate\nsuffocated\nsuffocates\nsuffocating\nsuffocatingly\nsuffocation\nsuffocations\nsuffocative\nsuffolk\nsuffragan\nsuffragans\nsuffraganship\nsuffraganships\nsuffrage\nsuffrages\nsuffragette\nsuffragettes\nsuffragettism\nsuffragism\nsuffragist\nsuffragists\nsuffrutescent\nsuffruticose\nsuffuse\nsuffused\nsuffuses\nsuffusing\nsuffusion\nsuffusions\nsuffusive\nsufi\nsufic\nsufis\nsufism\nsufistic\nsugar\nsugarberries\nsugarberry\nsugarbird\nsugarbirds\nsugarcane\nsugarcanes\nsugarcoat\nsugarcoated\nsugarcoating\nsugarcoats\nsugared\nsugarer\nsugarers\nsugarhouse\nsugarhouses\nsugarier\nsugariest\nsugariness\nsugaring\nsugarless\nsugarloaf\nsugarloaves\nsugarplum\nsugarplums\nsugars\nsugary\nsuggest\nsuggested\nsuggester\nsuggesters\nsuggestibility\nsuggestible\nsuggesting\nsuggestion\nsuggestions\nsuggestive\nsuggestively\nsuggestiveness\nsuggests\nsui\nsuicidal\nsuicidally\nsuicide\nsuicided\nsuicides\nsuiciding\nsuicidologist\nsuicidologists\nsuicidology\nsuing\nsuint\nsuints\nsuit\nsuitability\nsuitable\nsuitableness\nsuitably\nsuitcase\nsuitcases\nsuite\nsuited\nsuiter\nsuiters\nsuites\nsuiting\nsuitings\nsuitor\nsuitors\nsuits\nsukiyaki\nsukiyakis\nsukkah\nsukkot\nsukkoth\nsulawesi\nsulcal\nsulcate\nsulci\nsulcus\nsuleiman\nsulfa\nsulfadiazine\nsulfadiazines\nsulfanilamide\nsulfanilamides\nsulfanilic\nsulfatase\nsulfatases\nsulfate\nsulfated\nsulfates\nsulfathiazole\nsulfathiazoles\nsulfating\nsulfhydryl\nsulfhydryls\nsulfide\nsulfides\nsulfinpyrazone\nsulfinpyrazones\nsulfinyl\nsulfinyls\nsulfite\nsulfites\nsulfitic\nsulfonamide\nsulfonamides\nsulfonate\nsulfonated\nsulfonates\nsulfonating\nsulfonation\nsulfonations\nsulfone\nsulfones\nsulfonic\nsulfonium\nsulfoniums\nsulfonmethane\nsulfonmethanes\nsulfonyl\nsulfonyls\nsulfonylurea\nsulfonylureas\nsulfoxide\nsulfoxides\nsulfur\nsulfurate\nsulfurated\nsulfurates\nsulfurating\nsulfuration\nsulfurations\nsulfured\nsulfureous\nsulfuret\nsulfureted\nsulfureting\nsulfurets\nsulfuretted\nsulfuretting\nsulfuric\nsulfuring\nsulfurization\nsulfurizations\nsulfurize\nsulfurized\nsulfurizes\nsulfurizing\nsulfurous\nsulfurously\nsulfurousness\nsulfurs\nsulfury\nsulfuryl\nsulfuryls\nsulk\nsulked\nsulkers\nsulkier\nsulkies\nsulkiest\nsulkily\nsulkiness\nsulking\nsulks\nsulky\nsulla\nsullage\nsullen\nsullener\nsullenest\nsullenly\nsullenness\nsullied\nsullies\nsullivan\nsully\nsullying\nsulphur\nsulphured\nsulphureous\nsulphuric\nsulphuring\nsulphurous\nsulphurs\nsulphury\nsulpician\nsulpicians\nsultan\nsultana\nsultanas\nsultanate\nsultanates\nsultaness\nsultanesses\nsultanic\nsultans\nsultrier\nsultriest\nsultrily\nsultriness\nsultry\nsulu\nsulus\nsum\nsumac\nsumach\nsumacs\nsumatra\nsumatran\nsumatrans\nsumba\nsumbawa\nsumer\nsumerian\nsumerians\nsumerologist\nsumerologists\nsumerology\nsumma\nsummability\nsummable\nsummae\nsummand\nsummands\nsummaries\nsummarily\nsummariness\nsummarizable\nsummarization\nsummarizations\nsummarize\nsummarized\nsummarizer\nsummarizers\nsummarizes\nsummarizing\nsummary\nsummate\nsummated\nsummates\nsummating\nsummation\nsummational\nsummations\nsummative\nsummed\nsummer\nsummercater\nsummercaters\nsummered\nsummerhouse\nsummerhouses\nsummering\nsummerlike\nsummerlong\nsummerly\nsummers\nsummersault\nsummersaulted\nsummersaulting\nsummersaults\nsummerset\nsummersets\nsummersetted\nsummersetting\nsummertime\nsummerwood\nsummery\nsumming\nsummings\nsummit\nsummiteer\nsummiteers\nsummitries\nsummitry\nsummits\nsummon\nsummonable\nsummoned\nsummoner\nsummoners\nsummoning\nsummons\nsummonsed\nsummonses\nsummonsing\nsummum\nsumo\nsump\nsumps\nsumpter\nsumpters\nsumptuary\nsumptuous\nsumptuously\nsumptuousness\nsums\nsun\nsunbaked\nsunbath\nsunbathe\nsunbathed\nsunbather\nsunbathers\nsunbathes\nsunbathing\nsunbaths\nsunbeam\nsunbeams\nsunbelt\nsunbelts\nsunbird\nsunbirds\nsunblind\nsunblock\nsunbonnet\nsunbonnets\nsunbow\nsunbows\nsunburn\nsunburned\nsunburning\nsunburns\nsunburnt\nsunburst\nsunbursts\nsunchoke\nsunchokes\nsundae\nsundaes\nsunday\nsundays\nsundeck\nsundecks\nsunder\nsunderance\nsundered\nsundering\nsunders\nsundew\nsundews\nsundial\nsundials\nsundog\nsundogs\nsundown\nsundowner\nsundowners\nsundress\nsundresses\nsundries\nsundrops\nsundry\nsunfish\nsunfishes\nsunflower\nsunflowers\nsung\nsunglass\nsunglasses\nsunglow\nsunglows\nsunk\nsunken\nsunlamp\nsunlamps\nsunless\nsunlessness\nsunlight\nsunlike\nsunlit\nsunn\nsunna\nsunnah\nsunned\nsunni\nsunnier\nsunniest\nsunnily\nsunniness\nsunning\nsunnis\nsunnism\nsunnite\nsunnites\nsunns\nsunny\nsunporch\nsunporches\nsunray\nsunrays\nsunrise\nsunrises\nsunroof\nsunroofs\nsunroom\nsunrooms\nsuns\nsunscald\nsunscalds\nsunscreen\nsunscreening\nsunscreens\nsunseeker\nsunseekers\nsunset\nsunsets\nsunshade\nsunshades\nsunshine\nsunshiny\nsunspace\nsunspaces\nsunspot\nsunspots\nsunstone\nsunstones\nsunstroke\nsunstrokes\nsunstruck\nsunsuit\nsunsuits\nsuntan\nsuntanned\nsuntans\nsunup\nsunward\nsunwards\nsunwise\nsup\nsuper\nsuperable\nsuperableness\nsuperably\nsuperabound\nsuperabounded\nsuperabounding\nsuperabounds\nsuperabsorbent\nsuperabsorbents\nsuperabundance\nsuperabundant\nsuperabundantly\nsuperachiever\nsuperachievers\nsuperactivities\nsuperactivity\nsuperadd\nsuperadded\nsuperadding\nsuperaddition\nsuperadditions\nsuperadds\nsuperadministrator\nsuperadministrators\nsuperagencies\nsuperagency\nsuperagent\nsuperagents\nsuperalloy\nsuperalloys\nsuperaltern\nsuperalterns\nsuperambitious\nsuperannuate\nsuperannuated\nsuperannuates\nsuperannuating\nsuperannuation\nsuperannuations\nsuperathlete\nsuperb\nsuperbad\nsuperball\nsuperbank\nsuperbillionaire\nsuperbitch\nsuperblock\nsuperblocks\nsuperbly\nsuperbness\nsuperboard\nsuperbomb\nsuperbomber\nsuperbright\nsuperbureaucrat\nsupercabinet\nsupercalender\nsupercalendered\nsupercalendering\nsupercalenders\nsupercar\nsupercargo\nsupercargoes\nsupercargos\nsupercarrier\nsupercautious\nsupercenter\nsupercharge\nsupercharged\nsupercharger\nsuperchargers\nsupercharges\nsupercharging\nsuperchic\nsuperchurch\nsuperciliary\nsupercilious\nsuperciliously\nsuperciliousness\nsupercities\nsupercity\nsupercivilization\nsupercivilized\nsuperclass\nsuperclasses\nsuperclean\nsuperclub\nsupercluster\nsuperclusters\nsupercoil\nsupercoiled\nsupercoiling\nsupercoils\nsupercollider\nsupercolliders\nsupercolossal\nsupercolumnar\nsupercomfortable\nsupercompetitive\nsupercomputer\nsupercomputers\nsupercomputing\nsuperconduct\nsuperconducted\nsuperconducting\nsuperconductive\nsuperconductivity\nsuperconductor\nsuperconductors\nsuperconducts\nsuperconfident\nsuperconglomerate\nsuperconservative\nsupercontinent\nsupercontinents\nsuperconvenient\nsupercool\nsupercooled\nsupercooling\nsupercools\nsupercop\nsupercorporation\nsupercriminal\nsupercritical\nsupercurrent\nsupercurrents\nsupercute\nsuperdelegate\nsuperdelegates\nsuperdeluxe\nsuperdiplomat\nsuperdominant\nsuperdominants\nsuperduper\nsupered\nsupereffective\nsuperefficiency\nsuperefficient\nsuperego\nsuperegoist\nsuperegoists\nsuperegos\nsuperelevate\nsuperelevated\nsuperelevates\nsuperelevating\nsuperelevation\nsuperelevations\nsuperelite\nsupereminence\nsupereminent\nsupereminently\nsupererogate\nsupererogated\nsupererogates\nsupererogating\nsupererogation\nsupererogations\nsupererogative\nsupererogatory\nsuperexcellent\nsuperexpensive\nsuperexpress\nsuperfamilies\nsuperfamily\nsuperfan\nsuperfarm\nsuperfast\nsuperfatted\nsuperfecta\nsuperfectas\nsuperfecundation\nsuperfecundations\nsuperfetate\nsuperfetated\nsuperfetates\nsuperfetating\nsuperfetation\nsuperfetations\nsuperficial\nsuperficialities\nsuperficiality\nsuperficially\nsuperficialness\nsuperficies\nsuperfine\nsuperfineness\nsuperfirm\nsuperfix\nsuperfixes\nsuperflack\nsuperfluid\nsuperfluidity\nsuperfluids\nsuperfluities\nsuperfluity\nsuperfluous\nsuperfluously\nsuperfluousness\nsuperfund\nsupergalactic\nsupergalaxies\nsupergalaxy\nsupergene\nsupergenes\nsupergiant\nsupergiants\nsuperglue\nsuperglues\nsupergood\nsupergovernment\nsupergraphics\nsupergravity\nsupergroup\nsupergroups\nsupergrowth\nsuperharden\nsuperheat\nsuperheated\nsuperheater\nsuperheaters\nsuperheating\nsuperheats\nsuperheavy\nsuperheavyweight\nsuperheavyweights\nsuperhelical\nsuperhelically\nsuperhelices\nsuperhelix\nsuperhelixes\nsuperhero\nsuperheroes\nsuperheroine\nsuperheterodyne\nsuperheterodynes\nsuperhigh\nsuperhighway\nsuperhighways\nsuperhit\nsuperhot\nsuperhuman\nsuperhumanity\nsuperhumanly\nsuperhumanness\nsuperhype\nsuperimposable\nsuperimpose\nsuperimposed\nsuperimposes\nsuperimposing\nsuperimposition\nsuperimpositions\nsuperincumbence\nsuperincumbency\nsuperincumbent\nsuperincumbently\nsuperindividual\nsuperinduce\nsuperinduced\nsuperinduces\nsuperinducing\nsuperinduction\nsuperinductions\nsuperinfect\nsuperinfected\nsuperinfecting\nsuperinfection\nsuperinfections\nsuperinfects\nsupering\nsuperinsulated\nsuperintellectual\nsuperintelligence\nsuperintelligent\nsuperintend\nsuperintended\nsuperintendence\nsuperintendences\nsuperintendencies\nsuperintendency\nsuperintendent\nsuperintendents\nsuperintending\nsuperintends\nsuperintensity\nsuperior\nsuperiority\nsuperiorly\nsuperiors\nsuperjacent\nsuperjet\nsuperjets\nsuperjock\nsuperjumbo\nsuperlarge\nsuperlative\nsuperlatively\nsuperlativeness\nsuperlatives\nsuperlawyer\nsuperlight\nsuperlinear\nsuperliner\nsuperliners\nsuperlobbyist\nsuperlobbyists\nsuperloyalist\nsuperloyalists\nsuperlunar\nsuperlunary\nsuperluxurious\nsuperluxury\nsupermacho\nsupermagnetic\nsupermajorities\nsupermajority\nsupermale\nsuperman\nsupermarket\nsupermarketer\nsupermarketers\nsupermarkets\nsupermasculine\nsupermassive\nsupermen\nsupermicro\nsupermicros\nsupermilitant\nsupermillionaire\nsupermind\nsuperminicomputer\nsuperminicomputers\nsuperminister\nsupermodel\nsupermodels\nsupermodern\nsupermolecule\nsupermolecules\nsupermom\nsupermoms\nsupernal\nsupernally\nsupernatant\nsupernatants\nsupernation\nsupernational\nsupernatural\nsupernaturalism\nsupernaturalist\nsupernaturalistic\nsupernaturalists\nsupernaturally\nsupernaturalness\nsupernaturals\nsupernature\nsupernormal\nsupernormality\nsupernormally\nsupernova\nsupernovae\nsupernovas\nsupernumeraries\nsupernumerary\nsupernutrition\nsuperorder\nsuperorders\nsuperordinate\nsuperordinated\nsuperordinates\nsuperordinating\nsuperordination\nsuperordinations\nsuperorganic\nsuperorganism\nsuperorganisms\nsuperorgasm\nsuperovulate\nsuperovulated\nsuperovulates\nsuperovulating\nsuperovulation\nsuperovulations\nsuperoxide\nsuperoxides\nsuperparasitic\nsuperparasitism\nsuperparasitisms\nsuperpatriot\nsuperpatriotic\nsuperpatriotism\nsuperperson\nsuperpersonal\nsuperphenomenon\nsuperphosphate\nsuperphosphates\nsuperphysical\nsuperpimp\nsuperplane\nsuperplastic\nsuperplasticity\nsuperplayer\nsuperpolite\nsuperport\nsuperposable\nsuperpose\nsuperposed\nsuperposes\nsuperposing\nsuperposition\nsuperpower\nsuperpowered\nsuperpowerful\nsuperpowers\nsuperpremium\nsuperpro\nsuperprofit\nsuperquality\nsuperrace\nsuperreal\nsuperrealism\nsuperrealist\nsuperrealistic\nsuperrealists\nsuperregional\nsuperrich\nsuperroad\nsuperromantic\nsuperromanticism\nsupers\nsupersafe\nsupersale\nsupersalesman\nsupersaturate\nsupersaturated\nsupersaturates\nsupersaturating\nsupersaturation\nsupersaturations\nsupersaver\nsupersavers\nsuperscale\nsuperschool\nsuperscout\nsuperscribe\nsuperscribed\nsuperscribes\nsuperscribing\nsuperscript\nsuperscripted\nsuperscripting\nsuperscription\nsuperscripts\nsupersecrecy\nsupersecret\nsupersede\nsupersedeas\nsupersedeases\nsuperseded\nsuperseder\nsuperseders\nsupersedes\nsuperseding\nsupersedure\nsupersedures\nsupersell\nsuperseller\nsupersensible\nsupersensibly\nsupersensitive\nsupersensitively\nsupersensitivity\nsupersensory\nsuperserviceable\nsupersession\nsupersessions\nsuperset\nsupersets\nsupersexuality\nsupersharp\nsupershow\nsupersinger\nsupersize\nsupersized\nsupersleuth\nsuperslick\nsupersmart\nsupersmooth\nsupersoft\nsupersonic\nsupersonically\nsupersonics\nsupersophisticated\nsuperspecial\nsuperspecialist\nsuperspecialists\nsuperspecialization\nsuperspecialized\nsuperspectacle\nsuperspectacular\nsuperspeculation\nsuperspy\nsuperstar\nsuperstardom\nsuperstars\nsuperstate\nsuperstates\nsuperstation\nsuperstations\nsuperstimulate\nsuperstition\nsuperstitions\nsuperstitious\nsuperstitiously\nsuperstitiousness\nsuperstock\nsuperstore\nsuperstores\nsuperstrata\nsuperstratum\nsuperstrength\nsuperstrike\nsuperstring\nsuperstrings\nsuperstrong\nsuperstructural\nsuperstructure\nsuperstructures\nsuperstud\nsupersubstantial\nsupersubtle\nsupersubtlety\nsupersurgeon\nsupersweet\nsupersymmetric\nsupersymmetry\nsupersystem\nsupersystems\nsupertanker\nsupertankers\nsupertax\nsupertaxes\nsuperterrific\nsuperthick\nsuperthin\nsuperthriller\nsupertight\nsupertitle\nsupertitled\nsupertitles\nsupertonic\nsupertonics\nsupervene\nsupervened\nsupervenes\nsupervenient\nsupervening\nsupervention\nsuperventions\nsupervirile\nsupervirtuoso\nsupervise\nsupervised\nsupervises\nsupervising\nsupervision\nsupervisions\nsupervisor\nsupervisors\nsupervisory\nsuperwave\nsuperweapon\nsuperwide\nsuperwife\nsuperwoman\nsuperwomen\nsupinate\nsupinated\nsupinates\nsupinating\nsupination\nsupinations\nsupinator\nsupinators\nsupine\nsupinely\nsupineness\nsupped\nsupper\nsuppers\nsuppertime\nsuppertimes\nsupping\nsupplant\nsupplantation\nsupplantations\nsupplanted\nsupplanter\nsupplanters\nsupplanting\nsupplants\nsupple\nsuppled\nsupplejack\nsupplejacks\nsupplely\nsupplement\nsupplemental\nsupplementarity\nsupplementary\nsupplementation\nsupplementations\nsupplemented\nsupplementer\nsupplementers\nsupplementing\nsupplements\nsuppleness\nsuppler\nsupples\nsupplest\nsuppletion\nsuppletions\nsuppletive\nsuppletory\nsuppliance\nsuppliant\nsuppliantly\nsuppliants\nsupplicant\nsupplicants\nsupplicate\nsupplicated\nsupplicates\nsupplicating\nsupplication\nsupplications\nsupplicatory\nsupplied\nsupplier\nsuppliers\nsupplies\nsuppling\nsupply\nsupplying\nsupport\nsupportability\nsupportable\nsupportably\nsupported\nsupporter\nsupporters\nsupporting\nsupportive\nsupportively\nsupportiveness\nsupports\nsupposable\nsupposably\nsupposal\nsupposals\nsuppose\nsupposed\nsupposedly\nsupposes\nsupposing\nsupposition\nsuppositional\nsuppositionally\nsuppositions\nsuppositious\nsupposititious\nsupposititiously\nsupposititiousness\nsuppositive\nsuppositively\nsuppositives\nsuppositories\nsuppository\nsuppress\nsuppressant\nsuppressants\nsuppressed\nsuppresser\nsuppressers\nsuppresses\nsuppressibility\nsuppressible\nsuppressing\nsuppression\nsuppressions\nsuppressive\nsuppressiveness\nsuppressor\nsuppressors\nsuppurate\nsuppurated\nsuppurates\nsuppurating\nsuppuration\nsuppurations\nsuppurative\nsupra\nsupracellular\nsupragenic\nsupraglottal\nsupraliminal\nsupramaxilla\nsupramaxillae\nsupramaxillary\nsupramolecular\nsupranational\nsupranationalism\nsupranationalist\nsupranationalists\nsupranationality\nsupraoptic\nsupraorbital\nsuprarational\nsuprarenal\nsuprarenals\nsuprascapular\nsuprasegmental\nsupraventricular\nsupravital\nsupravitally\nsupremacies\nsupremacist\nsupremacists\nsupremacy\nsuprematism\nsuprematist\nsuprematists\nsupreme\nsupremely\nsupremeness\nsupremer\nsupremest\nsupremo\nsupremos\nsuprême\nsups\nsuquamish\nsuquamishes\nsura\nsurah\nsurahs\nsural\nsuras\nsurat\nsurbase\nsurbased\nsurbases\nsurcease\nsurceased\nsurceases\nsurceasing\nsurcharge\nsurcharged\nsurcharges\nsurcharging\nsurcingle\nsurcingled\nsurcingles\nsurcingling\nsurcoat\nsurcoats\nsurculose\nsurd\nsurds\nsure\nsurefire\nsurefooted\nsurefootedly\nsurefootedness\nsurely\nsureness\nsurer\nsurest\nsureties\nsurety\nsuretyship\nsurf\nsurface\nsurfaced\nsurfacer\nsurfacers\nsurfaces\nsurfacing\nsurfactant\nsurfactants\nsurfbird\nsurfbirds\nsurfboard\nsurfboarder\nsurfboarders\nsurfboarding\nsurfboardings\nsurfboards\nsurfboat\nsurfboats\nsurfcaster\nsurfcasters\nsurfcasting\nsurfcastings\nsurfed\nsurfeit\nsurfeited\nsurfeiter\nsurfeiters\nsurfeiting\nsurfeits\nsurfer\nsurfers\nsurficial\nsurfing\nsurfperch\nsurfperches\nsurfs\nsurfside\nsurfy\nsurge\nsurged\nsurgeon\nsurgeonfish\nsurgeonfishes\nsurgeons\nsurgeries\nsurgery\nsurges\nsurgical\nsurgically\nsurgicenter\nsurgicenters\nsurging\nsuribachi\nsuricate\nsuricates\nsurimi\nsurimis\nsurinam\nsuriname\nsurinamer\nsurinamers\nsurinamese\nsurjection\nsurjections\nsurjective\nsurlier\nsurliest\nsurlily\nsurliness\nsurly\nsurmise\nsurmised\nsurmises\nsurmising\nsurmount\nsurmountable\nsurmounted\nsurmounter\nsurmounters\nsurmounting\nsurmounts\nsurmullet\nsurmullets\nsurname\nsurnamed\nsurnames\nsurnaming\nsurpass\nsurpassable\nsurpassed\nsurpasses\nsurpassing\nsurpassingly\nsurplice\nsurplices\nsurplus\nsurplusage\nsurplusages\nsurpluses\nsurprint\nsurprinted\nsurprinting\nsurprints\nsurprisal\nsurprisals\nsurprise\nsurprised\nsurpriser\nsurprisers\nsurprises\nsurprising\nsurprisingly\nsurprize\nsurprized\nsurprizes\nsurprizing\nsurra\nsurreal\nsurrealism\nsurrealist\nsurrealistic\nsurrealistically\nsurrealists\nsurreally\nsurrebuttal\nsurrebuttals\nsurrebutter\nsurrebutters\nsurrejoinder\nsurrejoinders\nsurrender\nsurrendered\nsurrendering\nsurrenders\nsurreptitious\nsurreptitiously\nsurreptitiousness\nsurrey\nsurreys\nsurrogacies\nsurrogacy\nsurrogate\nsurrogated\nsurrogates\nsurrogating\nsurround\nsurrounded\nsurrounding\nsurroundings\nsurrounds\nsurroyal\nsurroyals\nsurtax\nsurtaxed\nsurtaxes\nsurtaxing\nsurtitle\nsurtitles\nsurtout\nsurtouts\nsurveil\nsurveillance\nsurveillant\nsurveillants\nsurveilled\nsurveilling\nsurveils\nsurvey\nsurveyed\nsurveying\nsurveyor\nsurveyors\nsurveys\nsurvivability\nsurvivable\nsurvival\nsurvivalist\nsurvivalists\nsurvivals\nsurvivance\nsurvive\nsurvived\nsurvives\nsurviving\nsurvivor\nsurvivors\nsurvivorship\nsusan\nsusanna\nsusceptance\nsusceptances\nsusceptibilities\nsusceptibility\nsusceptible\nsusceptibleness\nsusceptibly\nsusceptive\nsusceptiveness\nsusceptivity\nsushi\nsusiana\nsuslik\nsusliks\nsuspect\nsuspected\nsuspecting\nsuspects\nsuspend\nsuspended\nsuspender\nsuspendered\nsuspenders\nsuspending\nsuspends\nsuspense\nsuspenseful\nsuspensefully\nsuspensefulness\nsuspenseless\nsuspenser\nsuspensers\nsuspension\nsuspensions\nsuspensive\nsuspensively\nsuspensiveness\nsuspensor\nsuspensories\nsuspensors\nsuspensory\nsuspicion\nsuspicional\nsuspicioned\nsuspicioning\nsuspicions\nsuspicious\nsuspiciously\nsuspiciousness\nsuspiration\nsuspirations\nsuspire\nsuspired\nsuspires\nsuspiring\nsusquehanna\nsusquehannas\nsusquehannock\nsusquehannocks\nsuss\nsussed\nsusses\nsussex\nsussing\nsustain\nsustainability\nsustainable\nsustainably\nsustained\nsustainedly\nsustainer\nsustainers\nsustaining\nsustainment\nsustainments\nsustains\nsustenance\nsustentacular\nsustentation\nsustentations\nsustentative\nsusu\nsusurrant\nsusurration\nsusurrations\nsusurrous\nsusurrus\nsusurruses\nsusus\nsutler\nsutlers\nsutra\nsutras\nsuttee\nsuttees\nsutural\nsuturally\nsuture\nsutured\nsutures\nsuturing\nsuzerain\nsuzerains\nsuzerainties\nsuzerainty\nsuzette\nsuzettes\nsuède\nsvalbard\nsvedberg\nsvedbergs\nsvelte\nsveltely\nsvelteness\nsvelter\nsveltest\nsvengali\nsvengalis\nsverdlovsk\nsverdrup\nsw\nswab\nswabbed\nswabber\nswabbers\nswabbie\nswabbies\nswabbing\nswabby\nswabia\nswabian\nswabians\nswabs\nswaddle\nswaddled\nswaddles\nswaddling\nswag\nswage\nswaged\nswages\nswagged\nswagger\nswaggered\nswaggerer\nswaggerers\nswaggering\nswaggeringly\nswaggers\nswagging\nswaging\nswagman\nswagmen\nswags\nswahili\nswahilian\nswahilis\nswain\nswainish\nswainishness\nswains\nswainson\nswale\nswales\nswallow\nswallowable\nswallowed\nswallower\nswallowers\nswallowing\nswallows\nswallowtail\nswallowtails\nswallowwort\nswallowworts\nswam\nswami\nswamis\nswamp\nswamped\nswamper\nswampers\nswampier\nswampiest\nswampiness\nswamping\nswampland\nswamplands\nswamps\nswampy\nswan\nswank\nswanked\nswanker\nswankest\nswankier\nswankiest\nswankily\nswankiness\nswanking\nswanks\nswanky\nswanlike\nswanned\nswanneries\nswannery\nswanning\nswans\nswansdown\nswanskin\nswanskins\nswap\nswappable\nswapped\nswapper\nswappers\nswapping\nswaps\nswaraj\nswarajist\nswarajists\nsward\nswarded\nswards\nswarf\nswarfs\nswarm\nswarmed\nswarmer\nswarmers\nswarming\nswarms\nswart\nswarth\nswarthier\nswarthiest\nswarthily\nswarthiness\nswarths\nswarthy\nswartness\nswash\nswashbuckle\nswashbuckled\nswashbuckler\nswashbucklers\nswashbuckles\nswashbuckling\nswashed\nswasher\nswashers\nswashes\nswashing\nswastika\nswastikas\nswat\nswatch\nswatches\nswath\nswathe\nswathed\nswather\nswathers\nswathes\nswathing\nswaths\nswats\nswatted\nswatter\nswatters\nswatting\nsway\nswayback\nswaybacked\nswaybacks\nswayed\nswayer\nswayers\nswaying\nswayingly\nsways\nswazi\nswaziland\nswazis\nswear\nswearer\nswearers\nswearing\nswears\nswearword\nswearwords\nsweat\nsweatband\nsweatbands\nsweatbox\nsweatboxes\nsweated\nsweater\nsweaterdress\nsweaterdresses\nsweaters\nsweathouse\nsweathouses\nsweatier\nsweatiest\nsweatily\nsweatiness\nsweating\nsweatpants\nsweats\nsweatshirt\nsweatshirts\nsweatshop\nsweatshops\nsweaty\nswede\nsweden\nswedenborg\nswedenborgian\nswedenborgianism\nswedenborgians\nswedes\nswedish\nsweep\nsweepback\nsweepbacks\nsweeper\nsweepers\nsweepier\nsweepiest\nsweeping\nsweepingly\nsweepingness\nsweepings\nsweeps\nsweepstake\nsweepstakes\nsweepy\nsweet\nsweetbread\nsweetbreads\nsweetbriar\nsweetbriars\nsweetbrier\nsweetbriers\nsweeten\nsweetened\nsweetener\nsweeteners\nsweetening\nsweetenings\nsweetens\nsweeter\nsweetest\nsweetheart\nsweethearts\nsweetie\nsweeties\nsweeting\nsweetings\nsweetish\nsweetishly\nsweetly\nsweetmeat\nsweetmeats\nsweetness\nsweets\nsweetshop\nsweetshops\nsweetsop\nsweetsops\nswell\nswelled\nsweller\nswellest\nswellfish\nswellfishes\nswellhead\nswellheaded\nswellheadedness\nswellheads\nswelling\nswellings\nswells\nswelter\nsweltered\nsweltering\nswelteringly\nswelters\nsweltrier\nsweltriest\nsweltry\nswept\nsweptback\nsweptwing\nsweptwings\nswerve\nswerved\nswerves\nswerving\nswidden\nswiddens\nswift\nswifter\nswiftest\nswiftlet\nswiftlets\nswiftly\nswiftness\nswifts\nswig\nswigged\nswigger\nswiggers\nswigging\nswigs\nswill\nswilled\nswiller\nswillers\nswilling\nswills\nswim\nswimmable\nswimmer\nswimmeret\nswimmerets\nswimmers\nswimmier\nswimmiest\nswimmily\nswimming\nswimmingly\nswimmy\nswims\nswimsuit\nswimsuits\nswimwear\nswindle\nswindled\nswindler\nswindlers\nswindles\nswindling\nswine\nswineherd\nswineherds\nswinepox\nswinepoxes\nswing\nswinge\nswinged\nswingeing\nswinger\nswingers\nswinges\nswingier\nswingiest\nswinging\nswingingly\nswingletree\nswingletrees\nswingman\nswingmen\nswings\nswingy\nswinish\nswinishly\nswinishness\nswipe\nswiped\nswipes\nswiping\nswirl\nswirled\nswirlier\nswirliest\nswirling\nswirlingly\nswirls\nswirly\nswish\nswished\nswisher\nswishers\nswishes\nswishier\nswishiest\nswishing\nswishingly\nswishy\nswiss\nswissair\nswitch\nswitchable\nswitchback\nswitchbacks\nswitchblade\nswitchblades\nswitchboard\nswitchboards\nswitched\nswitcher\nswitcheroo\nswitcheroos\nswitchers\nswitches\nswitchgrass\nswitching\nswitchman\nswitchmen\nswitchover\nswitchovers\nswitchyard\nswitchyards\nswitzer\nswitzerland\nswitzers\nswivel\nswiveled\nswiveling\nswivelled\nswivelling\nswivels\nswivet\nswivets\nswizzle\nswizzled\nswizzler\nswizzlers\nswizzles\nswizzling\nswob\nswobbed\nswobbing\nswobs\nswollen\nswoon\nswooned\nswooner\nswooners\nswooning\nswooningly\nswoons\nswoop\nswooped\nswooper\nswoopers\nswooping\nswoops\nswoosh\nswooshed\nswooshes\nswooshing\nswop\nswopped\nswopping\nswops\nsword\nswordbill\nswordbills\nswordfish\nswordfishes\nswordlike\nswordplay\nswordplayer\nswordplayers\nswords\nswordsman\nswordsmanship\nswordsmen\nswordtail\nswordtails\nswore\nsworn\nswum\nswung\nsybarite\nsybarites\nsybaritic\nsybaritically\nsybaritism\nsycamine\nsycamines\nsycamore\nsycamores\nsyce\nsycee\nsycees\nsyces\nsycomore\nsycomores\nsyconia\nsyconium\nsycophancies\nsycophancy\nsycophant\nsycophantic\nsycophantical\nsycophantically\nsycophantish\nsycophantishly\nsycophantism\nsycophantly\nsycophants\nsycosis\nsydenham\nsydney\nsyenite\nsyenites\nsyenitic\nsyli\nsylis\nsyllabaries\nsyllabary\nsyllabi\nsyllabic\nsyllabically\nsyllabicate\nsyllabicated\nsyllabicates\nsyllabicating\nsyllabication\nsyllabications\nsyllabicity\nsyllabics\nsyllabification\nsyllabifications\nsyllabified\nsyllabifies\nsyllabify\nsyllabifying\nsyllabism\nsyllabisms\nsyllabize\nsyllabized\nsyllabizes\nsyllabizing\nsyllable\nsyllabled\nsyllables\nsyllabling\nsyllabub\nsyllabubs\nsyllabus\nsyllabuses\nsyllepses\nsyllepsis\nsylleptic\nsyllogism\nsyllogisms\nsyllogist\nsyllogistic\nsyllogistical\nsyllogistically\nsyllogistics\nsyllogists\nsyllogization\nsyllogizations\nsyllogize\nsyllogized\nsyllogizer\nsyllogizers\nsyllogizes\nsyllogizing\nsylph\nsylphid\nsylphids\nsylphlike\nsylphs\nsylva\nsylvan\nsylvanite\nsylvanites\nsylvanus\nsylvatic\nsylviculture\nsylvine\nsylvines\nsylvinite\nsylvinites\nsylvite\nsylvites\nsymbiont\nsymbiontic\nsymbionts\nsymbioses\nsymbiosis\nsymbiote\nsymbiotes\nsymbiotic\nsymbiotical\nsymbiotically\nsymbol\nsymboled\nsymbolic\nsymbolical\nsymbolically\nsymbolicalness\nsymboling\nsymbolism\nsymbolist\nsymbolistic\nsymbolistically\nsymbolists\nsymbolization\nsymbolizations\nsymbolize\nsymbolized\nsymbolizer\nsymbolizers\nsymbolizes\nsymbolizing\nsymbology\nsymbols\nsymmetallism\nsymmetric\nsymmetrical\nsymmetrically\nsymmetricalness\nsymmetries\nsymmetrization\nsymmetrizations\nsymmetrize\nsymmetrized\nsymmetrizes\nsymmetrizing\nsymmetry\nsympathectomies\nsympathectomized\nsympathectomy\nsympathetic\nsympathetically\nsympathies\nsympathin\nsympathins\nsympathize\nsympathized\nsympathizer\nsympathizers\nsympathizes\nsympathizing\nsympathizingly\nsympatholytic\nsympathomimetic\nsympathomimetics\nsympathy\nsympatric\nsympatrically\nsympatries\nsympatry\nsympetalous\nsympetaly\nsymphonic\nsymphonically\nsymphonies\nsymphonious\nsymphoniously\nsymphonist\nsymphonists\nsymphony\nsymphyseal\nsymphyses\nsymphysial\nsymphysis\nsympodia\nsympodial\nsympodially\nsympodium\nsymposia\nsymposiac\nsymposiacs\nsymposiarch\nsymposiarchs\nsymposiast\nsymposiasts\nsymposium\nsymposiums\nsymptom\nsymptomatic\nsymptomatically\nsymptomatize\nsymptomatized\nsymptomatizes\nsymptomatizing\nsymptomatologic\nsymptomatological\nsymptomatologically\nsymptomatology\nsymptomize\nsymptomized\nsymptomizes\nsymptomizing\nsymptomless\nsymptoms\nsynaeresis\nsynaesthesia\nsynaesthesias\nsynaesthesis\nsynagog\nsynagogal\nsynagogical\nsynagogs\nsynagogue\nsynagogues\nsynalepha\nsynalephas\nsynaloepha\nsynaloephas\nsynapse\nsynapsed\nsynapses\nsynapsid\nsynapsing\nsynapsis\nsynaptic\nsynaptically\nsynaptinemal\nsynaptonemal\nsynaptosomal\nsynaptosome\nsynaptosomes\nsynarthrodia\nsynarthrodiae\nsynarthrodial\nsynarthrodially\nsynarthroses\nsynarthrosis\nsync\nsyncarp\nsyncarpous\nsyncarps\nsyncarpy\nsyncategorematic\nsyncategorematically\nsynced\nsynch\nsynched\nsynching\nsynchondroses\nsynchondrosis\nsynchro\nsynchrocyclotron\nsynchrocyclotrons\nsynchroflash\nsynchroflashes\nsynchromesh\nsynchromeshes\nsynchronal\nsynchroneity\nsynchronic\nsynchronical\nsynchronically\nsynchronicities\nsynchronicity\nsynchronies\nsynchronism\nsynchronistic\nsynchronistical\nsynchronistically\nsynchronization\nsynchronizations\nsynchronize\nsynchronized\nsynchronizer\nsynchronizers\nsynchronizes\nsynchronizing\nsynchronous\nsynchronously\nsynchronousness\nsynchrony\nsynchros\nsynchroscope\nsynchroscopes\nsynchrotron\nsynchrotrons\nsynchs\nsyncing\nsynclinal\nsyncline\nsynclines\nsyncopal\nsyncopate\nsyncopated\nsyncopates\nsyncopating\nsyncopation\nsyncopations\nsyncopative\nsyncopator\nsyncopators\nsyncope\nsyncopes\nsyncopic\nsyncretic\nsyncretism\nsyncretist\nsyncretistic\nsyncretists\nsyncretize\nsyncretized\nsyncretizes\nsyncretizing\nsyncs\nsyncytia\nsyncytial\nsyncytium\nsyndactyl\nsyndactylism\nsyndactylous\nsyndactyls\nsyndactyly\nsyndesmoses\nsyndesmosis\nsyndesmotic\nsyndetic\nsyndetically\nsyndic\nsyndical\nsyndicalism\nsyndicalist\nsyndicalistic\nsyndicalists\nsyndicate\nsyndicated\nsyndicates\nsyndicating\nsyndication\nsyndications\nsyndicator\nsyndicators\nsyndics\nsyndrome\nsyndromes\nsyndromic\nsyne\nsynecdoche\nsynecdoches\nsynecdochic\nsynecdochical\nsynecdochically\nsynecologic\nsynecological\nsynecology\nsynereses\nsyneresis\nsynergetic\nsynergic\nsynergically\nsynergid\nsynergids\nsynergies\nsynergism\nsynergist\nsynergistic\nsynergistically\nsynergists\nsynergy\nsynesis\nsynesthesia\nsynesthesias\nsynesthete\nsynesthetes\nsynesthetic\nsynfuel\nsynfuels\nsyngamic\nsyngamies\nsyngamous\nsyngamy\nsyngas\nsyngases\nsyngeneic\nsyngeneically\nsyngenesis\nsyngenetic\nsynizeses\nsynizesis\nsynkaryon\nsynkaryonic\nsynkaryons\nsynkineses\nsynkinesis\nsynkinetic\nsynod\nsynodal\nsynodic\nsynodical\nsynodically\nsynods\nsynonym\nsynonymic\nsynonymical\nsynonymies\nsynonymist\nsynonymists\nsynonymity\nsynonymize\nsynonymized\nsynonymizes\nsynonymizing\nsynonymous\nsynonymously\nsynonyms\nsynonymy\nsynopses\nsynopsis\nsynopsize\nsynopsized\nsynopsizes\nsynopsizing\nsynoptic\nsynoptical\nsynoptically\nsynostoses\nsynostosis\nsynostotic\nsynovia\nsynovial\nsynovias\nsynovitis\nsynovitises\nsynsepalous\nsyntactic\nsyntactical\nsyntactically\nsyntactics\nsyntagma\nsyntagmas\nsyntagmata\nsyntagmatic\nsyntax\nsyntaxes\nsyntenic\nsyntenies\nsynteny\nsynth\nsyntheses\nsynthesis\nsynthesist\nsynthesists\nsynthesize\nsynthesized\nsynthesizer\nsynthesizers\nsynthesizes\nsynthesizing\nsynthetase\nsynthetases\nsynthetic\nsynthetically\nsynthetics\nsynths\nsyntonic\nsyntrophies\nsyntrophism\nsyntrophisms\nsyntrophy\nsypher\nsyphered\nsyphering\nsyphers\nsyphilis\nsyphilitic\nsyphilitics\nsyphiloid\nsyphon\nsyphoned\nsyphoning\nsyphons\nsyracusan\nsyracuse\nsyrette\nsyria\nsyriac\nsyrian\nsyrians\nsyringa\nsyringas\nsyringe\nsyringeal\nsyringed\nsyringes\nsyringing\nsyringomyelia\nsyringomyelias\nsyringomyelic\nsyrinx\nsyrinxes\nsyros\nsyrphid\nsyrphids\nsyrphus\nsyrup\nsyrups\nsyrupy\nsysop\nsysops\nsyssarcoses\nsyssarcosis\nsystaltic\nsystem\nsystematic\nsystematical\nsystematically\nsystematicness\nsystematics\nsystematism\nsystematist\nsystematists\nsystematization\nsystematizations\nsystematize\nsystematized\nsystematizer\nsystematizers\nsystematizes\nsystematizing\nsystemic\nsystemically\nsystemization\nsystemizations\nsystemize\nsystemized\nsystemizer\nsystemizers\nsystemizes\nsystemizing\nsystemless\nsystems\nsystole\nsystoles\nsystolic\nsyzygial\nsyzygies\nsyzygy\nszechuan\nszechwan\nsào\nsão\nséance\nséances\nsémillon\nsémillons\nsérac\nsèvres\nsíros\nsûreté\nsüleyman\nt\nt'other\ntaal\ntab\ntabanid\ntabanids\ntabard\ntabards\ntabaret\ntabarets\ntabasco\ntabbed\ntabbies\ntabbing\ntabbouleh\ntabby\ntabernacle\ntabernacled\ntabernacles\ntabernacling\ntabernacular\ntabes\ntabescence\ntabescent\ntabetic\ntabi\ntabis\ntabla\ntablas\ntablature\ntablatures\ntable\ntableau\ntableaus\ntableaux\ntablecloth\ntablecloths\ntabled\ntableful\ntablefuls\ntableland\ntablelands\ntablemat\ntablemate\ntablemates\ntablemats\ntables\ntableside\ntablesides\ntablespoon\ntablespoonful\ntablespoonfuls\ntablespoons\ntablespoonsful\ntablet\ntableted\ntableting\ntabletop\ntabletops\ntablets\ntableware\ntabling\ntabloid\ntabloids\ntaboo\ntabooed\ntabooing\ntabooli\ntaboos\ntabor\ntaborer\ntaborers\ntaboret\ntaborets\ntabors\ntabouli\ntabour\ntabourer\ntabourers\ntabouret\ntabourets\ntabours\ntabriz\ntabs\ntabu\ntabued\ntabuing\ntabula\ntabulae\ntabular\ntabularization\ntabularizations\ntabularize\ntabularized\ntabularizes\ntabularizing\ntabularly\ntabulate\ntabulated\ntabulates\ntabulating\ntabulation\ntabulations\ntabulator\ntabulators\ntabun\ntabuns\ntabus\ntac\ntacamahac\ntacamahacs\ntacan\ntacet\ntach\ntachina\ntachinid\ntachinids\ntachism\ntachisme\ntachist\ntachiste\ntachistes\ntachistoscope\ntachistoscopes\ntachistoscopic\ntachistoscopically\ntachists\ntachograph\ntachographs\ntachometer\ntachometers\ntachometric\ntachometry\ntachyarrhythmia\ntachyarrhythmias\ntachycardia\ntachycardiac\ntachycardiacs\ntachycardias\ntachygraphy\ntachylite\ntachylites\ntachylyte\ntachylytes\ntachylytic\ntachymeter\ntachymeters\ntachymetry\ntachyon\ntachyonic\ntachyons\ntachyphylaxes\ntachyphylaxis\ntachypnea\ntachypneas\ntachysterol\ntachysterols\ntacit\ntacitly\ntacitness\ntaciturn\ntaciturnity\ntaciturnly\ntacitus\ntack\ntackboard\ntackboards\ntacked\ntacker\ntackers\ntackier\ntackies\ntackiest\ntackified\ntackifier\ntackifiers\ntackifies\ntackify\ntackifying\ntackily\ntackiness\ntacking\ntackle\ntackled\ntackler\ntacklers\ntackles\ntackless\ntackling\ntacks\ntacky\ntaco\ntacoma\ntaconite\ntaconites\ntacos\ntact\ntactful\ntactfully\ntactfulness\ntactic\ntactical\ntactically\ntactician\ntacticians\ntactics\ntactile\ntactilely\ntactility\ntaction\ntactions\ntactless\ntactlessly\ntactlessness\ntactoreceptor\ntactoreceptors\ntactual\ntactually\ntad\ntadema\ntadjik\ntadjiks\ntadpole\ntadpoles\ntads\ntadzhik\ntadzhiki\ntadzhikistan\ntadzhiks\ntael\ntaels\ntaenia\ntaeniacide\ntaeniacides\ntaeniae\ntaeniafuge\ntaeniafuges\ntaenias\ntaeniasis\ntaeniasises\ntaffeta\ntaffetas\ntaffetized\ntaffia\ntaffias\ntaffies\ntaffrail\ntaffrails\ntaffy\ntafia\ntafias\ntag\ntagalog\ntagalogs\ntagalong\ntagalongs\ntagboard\ntagboards\ntagged\ntagger\ntaggers\ntagging\ntaggle\ntagliatelle\ntagline\ntaglines\ntagma\ntagmata\ntagore\ntagrag\ntags\ntagus\ntahini\ntahiti\ntahitian\ntahitians\ntahoe\ntahr\ntahrs\ntahseeldar\ntahseeldars\ntahsil\ntahsildar\ntahsildars\ntai\ntaiga\ntaigas\ntail\ntailback\ntailbacks\ntailboard\ntailboards\ntailbone\ntailbones\ntailcoat\ntailcoated\ntailcoats\ntailed\ntailender\ntailenders\ntailer\ntailers\ntailfin\ntailfins\ntailgate\ntailgated\ntailgater\ntailgaters\ntailgates\ntailgating\ntailing\ntailings\ntaille\ntailles\ntailless\ntaillight\ntaillights\ntaillike\ntailor\ntailorbird\ntailorbirds\ntailored\ntailoring\ntailors\ntailpiece\ntailpieces\ntailpipe\ntailpipes\ntailplane\ntailplanes\ntailrace\ntailraces\ntails\ntailskid\ntailskids\ntailslide\ntailslides\ntailspin\ntailspins\ntailstock\ntailstocks\ntailwater\ntailwind\ntailwinds\ntain\ntaino\ntainos\ntains\ntaint\ntainted\ntainting\ntaintless\ntaintlessly\ntaintlessness\ntaints\ntaipan\ntaipans\ntaipeh\ntaipei\ntais\ntaiwan\ntaiwanese\ntaj\ntajik\ntajiki\ntajikistan\ntajiks\ntajs\ntaka\ntakable\ntakahe\ntakahes\ntakas\ntake\ntakeaway\ntakeaways\ntakedown\ntakedowns\ntaken\ntakeoff\ntakeoffs\ntakeout\ntakeouts\ntakeover\ntakeovers\ntaker\ntakers\ntakes\ntakin\ntaking\ntakings\ntakins\ntakkakaw\ntaklamakan\ntaklimakan\ntala\ntalapoin\ntalapoins\ntalaria\ntalas\ntalaud\ntalaur\ntalbot\ntalc\ntalced\ntalcing\ntalcked\ntalcking\ntalcky\ntalcose\ntalcous\ntalcs\ntalcum\ntale\ntalebearer\ntalebearers\ntalebearing\ntalent\ntalented\ntalentless\ntalentlessness\ntalents\ntaler\ntalers\ntales\ntalesman\ntalesmen\ntaleteller\ntaletellers\ntaletelling\ntali\ntalion\ntalions\ntaliped\ntalipeds\ntalipes\ntalipot\ntalipots\ntalisman\ntalismanic\ntalismanical\ntalismanically\ntalismans\ntalk\ntalkathon\ntalkathons\ntalkative\ntalkatively\ntalkativeness\ntalkback\ntalkbacks\ntalked\ntalker\ntalkers\ntalkfest\ntalkfests\ntalkie\ntalkier\ntalkies\ntalkiest\ntalkiness\ntalking\ntalks\ntalky\ntall\ntallage\ntallaged\ntallages\ntallaging\ntallahassee\ntallboy\ntallboys\ntaller\ntallest\ntalleyrand\ntallgrass\ntallied\ntallies\ntallis\ntallish\ntallisim\ntallith\ntallithim\ntalliths\ntallness\ntallow\ntallowed\ntallowing\ntallows\ntallowy\ntally\ntallyho\ntallyhoed\ntallyhoing\ntallyhos\ntallying\ntallyman\ntallymen\ntalmi\ntalmud\ntalmudic\ntalmudical\ntalmudism\ntalmudist\ntalmudists\ntalon\ntaloned\ntalons\ntalus\ntaluses\ntam\ntamable\ntamale\ntamales\ntamandua\ntamanduas\ntamarack\ntamaracks\ntamarao\ntamaraos\ntamarau\ntamaraus\ntamari\ntamarillo\ntamarillos\ntamarin\ntamarind\ntamarinds\ntamarins\ntamarisk\ntamarisks\ntambac\ntambacs\ntambak\ntambaks\ntambala\ntambalas\ntambour\ntamboura\ntambouras\ntamboured\ntambourer\ntambourers\ntambourin\ntambourine\ntambourines\ntambouring\ntambourins\ntambours\ntambura\ntamburas\ntamburitza\ntamburitzas\ntamburlaine\ntame\ntameable\ntamed\ntameless\ntamely\ntameness\ntamer\ntamerlane\ntamers\ntames\ntamest\ntamil\ntamils\ntaming\ntammany\ntammanyism\ntammuz\ntammy\ntamora\ntamoxifen\ntamp\ntampa\ntamped\ntamper\ntampered\ntamperer\ntamperers\ntampering\ntamperproof\ntampers\ntamping\ntampion\ntampions\ntampon\ntamponed\ntamponing\ntampons\ntamps\ntams\ntamworth\ntan\ntanager\ntanagers\ntanagrine\ntanbark\ntanbarks\ntanbur\ntanburs\ntancred\ntandem\ntandems\ntandoor\ntandoori\ntandoors\ntang\ntanganyika\ntanganyikan\ntanganyikans\ntanged\ntangelo\ntangelos\ntangence\ntangency\ntangent\ntangental\ntangential\ntangentiality\ntangentially\ntangents\ntangerine\ntangerines\ntangibility\ntangible\ntangibleness\ntangibles\ntangibly\ntangier\ntangiest\ntanginess\ntanging\ntangle\ntangled\ntanglement\ntangles\ntangling\ntangly\ntango\ntangoed\ntangoing\ntangolike\ntangoreceptor\ntangoreceptors\ntangos\ntangram\ntangrams\ntangs\ntangy\ntanimbar\ntanist\ntanistry\ntanists\ntank\ntanka\ntankage\ntankages\ntankard\ntankards\ntankas\ntanked\ntanker\ntankers\ntankful\ntankfuls\ntanking\ntankless\ntanklike\ntanks\ntannage\ntannate\ntannates\ntanned\ntanner\ntanneries\ntanners\ntannery\ntannest\ntannhäuser\ntannic\ntanniferous\ntannin\ntanning\ntannings\ntannins\ntannish\ntanoak\ntanoaks\ntanoan\ntanrec\ntanrecs\ntans\ntansies\ntansy\ntantalate\ntantalic\ntantalite\ntantalites\ntantalization\ntantalizations\ntantalize\ntantalized\ntantalizer\ntantalizers\ntantalizes\ntantalizing\ntantalizingly\ntantalum\ntantalums\ntantalus\ntantaluses\ntantamount\ntantara\ntantaras\ntantivies\ntantivy\ntantra\ntantras\ntantric\ntantrism\ntantrist\ntantrists\ntantrum\ntantrums\ntanuki\ntanyard\ntanyards\ntanzania\ntanzanian\ntanzanians\ntanzanite\ntanzanites\ntao\ntaoiseach\ntaoism\ntaoist\ntaoistic\ntaoists\ntaormina\ntaos\ntap\ntapa\ntapas\ntape\ntapeable\ntaped\ntapeless\ntapeline\ntapelines\ntaper\ntapered\ntaperer\ntaperers\ntapering\ntaperingly\ntapers\ntaperstick\ntapersticks\ntapes\ntapestried\ntapestries\ntapestry\ntapestrying\ntapeta\ntapetal\ntapetum\ntapeworm\ntapeworms\ntaphole\ntapholes\ntaphonomic\ntaphonomist\ntaphonomists\ntaphonomy\ntaping\ntapings\ntapioca\ntapiocas\ntapir\ntapirs\ntapis\ntapped\ntapper\ntappers\ntappet\ntappets\ntapping\ntappings\ntaproom\ntaprooms\ntaproot\ntaproots\ntaps\ntapster\ntapsters\ntapénade\ntar\ntaradiddle\ntaradiddles\ntarahumara\ntarahumaras\ntaramasalata\ntaramasalatas\ntaramosalata\ntaramosalatas\ntarantella\ntarantellas\ntarantism\ntarantisms\ntaranto\ntarantula\ntarantulae\ntarantulas\ntarascan\ntarascans\ntarawa\ntarboosh\ntarbooshes\ntarbush\ntarbushes\ntardenois\ntardenoisean\ntardier\ntardiest\ntardigrade\ntardigrades\ntardily\ntardiness\ntardive\ntardo\ntardy\ntare\ntared\ntarentum\ntares\ntarge\ntarges\ntarget\ntargetable\ntargeted\ntargeting\ntargets\ntargum\ntargums\ntarheel\ntarheels\ntariff\ntariffed\ntariffing\ntariffs\ntaring\ntarlatan\ntarlatans\ntarletan\ntarletans\ntarmac\ntarmacadam\ntarmacadams\ntarmacked\ntarmacking\ntarmacs\ntarn\ntarnal\ntarnally\ntarnation\ntarnations\ntarnish\ntarnishable\ntarnished\ntarnishes\ntarnishing\ntarns\ntaro\ntaroc\ntarocs\ntarok\ntaroks\ntaros\ntarot\ntarots\ntarp\ntarpaper\ntarpapered\ntarpapers\ntarpaulin\ntarpaulins\ntarpon\ntarpons\ntarps\ntarquin\ntarquins\ntarradiddle\ntarradiddles\ntarragon\ntarragona\ntarre\ntarred\ntarres\ntarriance\ntarriances\ntarried\ntarrier\ntarriers\ntarries\ntarriest\ntarring\ntarry\ntarrying\ntars\ntarsal\ntarsi\ntarsier\ntarsiers\ntarsometatarsal\ntarsometatarsi\ntarsometatarsus\ntarsus\ntart\ntartan\ntartans\ntartar\ntartare\ntartarean\ntartareous\ntartarian\ntartaric\ntartarization\ntartarizations\ntartarize\ntartarized\ntartarizes\ntartarizing\ntartarous\ntartars\ntartarus\ntartary\ntarter\ntartest\ntartier\ntartiest\ntartily\ntartine\ntartines\ntartiness\ntartish\ntartlet\ntartlets\ntartly\ntartness\ntartrate\ntartrated\ntartrates\ntarts\ntartufe\ntartufes\ntartuffe\ntartuffery\ntartuffes\ntarty\ntarvia\ntarweed\ntarweeds\ntarzan\ntarzans\ntashkent\ntask\ntasked\ntasking\ntaskmaster\ntaskmasters\ntaskmistress\ntaskmistresses\ntasks\ntasman\ntasmania\ntasmanian\ntasmanians\ntass\ntasse\ntassel\ntasseled\ntasseling\ntasselled\ntasselling\ntassels\ntasses\ntasset\ntassets\ntasso\ntastable\ntaste\ntasted\ntasteful\ntastefully\ntastefulness\ntasteless\ntastelessly\ntastelessness\ntastemaker\ntastemakers\ntaster\ntasters\ntastes\ntastier\ntastiest\ntastily\ntastiness\ntasting\ntastings\ntasty\ntat\ntatami\ntatamis\ntatar\ntatars\ntatary\ntater\ntaters\ntats\ntatted\ntatter\ntatterdemalion\ntatterdemalions\ntattered\ntattering\ntatters\ntattersall\ntattersalls\ntattier\ntattiest\ntattiness\ntatting\ntattle\ntattled\ntattler\ntattlers\ntattles\ntattletale\ntattletales\ntattling\ntattlingly\ntattoo\ntattooed\ntattooer\ntattooers\ntattooing\ntattooist\ntattooists\ntattoos\ntatty\ntau\ntaught\ntaunt\ntaunted\ntaunter\ntaunters\ntaunting\ntauntingly\ntaunts\ntaupe\ntaurean\ntaureans\ntaurine\ntaurines\ntaurocholic\ntaurus\ntausug\ntaut\ntautaug\ntautaugs\ntauten\ntautened\ntautening\ntautens\ntauter\ntautest\ntautly\ntautness\ntautog\ntautogs\ntautologic\ntautological\ntautologically\ntautologies\ntautologist\ntautologists\ntautologize\ntautologized\ntautologizes\ntautologizing\ntautologous\ntautologously\ntautology\ntautomer\ntautomeric\ntautomerism\ntautomerisms\ntautomers\ntautonym\ntautonymic\ntautonymous\ntautonyms\ntautonymy\ntav\ntavern\ntaverna\ntavernas\ntaverner\ntaverners\ntaverns\ntaw\ntawdrier\ntawdriest\ntawdrily\ntawdriness\ntawdry\ntawed\ntawer\ntawers\ntawing\ntawnier\ntawnies\ntawniest\ntawniness\ntawny\ntaws\ntawse\ntax\ntaxa\ntaxability\ntaxable\ntaxableness\ntaxables\ntaxably\ntaxation\ntaxed\ntaxeme\ntaxemes\ntaxemic\ntaxer\ntaxers\ntaxes\ntaxi\ntaxicab\ntaxicabs\ntaxidermal\ntaxidermic\ntaxidermist\ntaxidermists\ntaxidermy\ntaxied\ntaxies\ntaxiing\ntaximan\ntaximen\ntaximeter\ntaximeters\ntaximetrics\ntaxing\ntaxingly\ntaxis\ntaxiway\ntaxiways\ntaxman\ntaxmen\ntaxon\ntaxonomic\ntaxonomical\ntaxonomically\ntaxonomies\ntaxonomist\ntaxonomists\ntaxonomy\ntaxons\ntaxpayer\ntaxpayers\ntaxpaying\ntaxus\ntaxying\ntaygeta\ntaylor\ntayra\ntayras\ntayside\ntazza\ntazzas\ntbilisi\ntchaikovskian\ntchaikovsky\ntchaikovskyan\ntchotchke\ntchotchkes\nte\ntea\nteabag\nteabags\nteaberry\nteacake\nteacakes\nteacart\nteacarts\nteach\nteachability\nteachable\nteachableness\nteachably\nteacher\nteacherly\nteachers\nteaches\nteaching\nteachings\nteacup\nteacupful\nteacupfuls\nteacups\nteahouse\nteahouses\nteak\nteakettle\nteakettles\nteaks\nteakwood\nteal\ntealike\nteals\nteam\nteamed\nteaming\nteammate\nteammates\nteams\nteamster\nteamsters\nteamwork\nteapot\nteapots\nteapoy\nteapoys\ntear\ntearable\ntearaway\ntearaways\nteardown\nteardowns\nteardrop\nteardrops\nteared\ntearer\ntearers\ntearful\ntearfully\ntearfulness\nteargas\nteargases\nteargassed\nteargasses\nteargassing\ntearier\nteariest\ntearily\nteariness\ntearing\ntearjerker\ntearjerkers\ntearless\ntearlessly\ntearoom\ntearooms\ntears\ntearstain\ntearstained\ntearstains\nteary\nteas\ntease\nteased\nteasel\nteaseled\nteaseling\nteaselled\nteaselling\nteasels\nteaser\nteasers\nteases\nteashop\nteashops\nteasing\nteasingly\nteaspoon\nteaspoonful\nteaspoonfuls\nteaspoons\nteaspoonsful\nteat\nteated\nteatime\nteatimes\nteats\ntebet\ntebeth\ntech\nteched\ntechie\ntechies\ntechnetium\ntechnetronic\ntechnic\ntechnical\ntechnicalities\ntechnicality\ntechnicalization\ntechnicalizations\ntechnicalize\ntechnicalized\ntechnicalizes\ntechnicalizing\ntechnically\ntechnicalness\ntechnicals\ntechnician\ntechnicians\ntechnicolor\ntechnics\ntechnique\ntechniques\ntechnobabble\ntechnocracies\ntechnocracy\ntechnocrat\ntechnocratic\ntechnocrats\ntechnologic\ntechnological\ntechnologically\ntechnologies\ntechnologist\ntechnologists\ntechnologize\ntechnologized\ntechnologizes\ntechnologizing\ntechnology\ntechnophile\ntechnophiles\ntechnophobe\ntechnophobes\ntechnophobia\ntechnophobic\ntechnostructure\ntechnostructures\ntechy\ntecta\ntectal\ntectonic\ntectonically\ntectonics\ntectonism\ntectonisms\ntectrices\ntectrix\ntectum\nted\ntedded\ntedder\ntedders\nteddies\ntedding\nteddy\ntedious\ntediously\ntediousness\ntedium\nteds\ntee\nteed\nteeing\nteem\nteemed\nteemer\nteemers\nteeming\nteemingly\nteemingness\nteems\nteen\nteenage\nteenaged\nteenager\nteenagers\nteener\nteeners\nteenier\nteeniest\nteens\nteensier\nteensiest\nteensy\nteeny\nteenybop\nteenybopper\nteenyboppers\nteeoff\nteeoffs\nteepee\nteepees\ntees\nteeter\nteeterboard\nteeterboards\nteetered\nteetering\nteeters\nteeth\nteethe\nteethed\nteether\nteethers\nteethes\nteething\nteethridge\nteethridges\nteetotal\nteetotaler\nteetotalers\nteetotalism\nteetotalist\nteetotalists\nteetotaller\nteetotallers\nteetotally\nteetotum\nteetotums\nteff\ntefillin\nteflon\nteg\ntegg\nteggs\ntegmen\ntegmental\ntegmentum\ntegmentums\ntegmina\ntegs\ntegu\ntegua\nteguas\ntegucigalpa\ntegular\ntegularly\ntegulated\ntegument\ntegumental\ntegumentary\nteguments\ntegus\ntehachapi\nteheran\ntehran\ntehuantepec\ntehuelche\ntehuelchean\ntehuelches\nteiglach\nteiid\nteiids\ntekkie\ntekkies\ntektite\ntektites\ntektitic\ntektronix\ntel\ntelaesthesia\ntelaesthesias\ntelamon\ntelamones\ntelangiectases\ntelangiectasia\ntelangiectasias\ntelangiectasis\ntelangiectatic\ntelecamera\ntelecameras\ntelecast\ntelecasted\ntelecaster\ntelecasters\ntelecasting\ntelecasts\ntelecom\ntelecommunicate\ntelecommunicated\ntelecommunicates\ntelecommunicating\ntelecommunication\ntelecommunications\ntelecommunicator\ntelecommunicators\ntelecommute\ntelecommuted\ntelecommuter\ntelecommuters\ntelecommutes\ntelecommuting\ntelecoms\nteleconference\nteleconferenced\nteleconferences\nteleconferencing\ntelecopier\ntelecourse\ntelecourses\nteledrama\nteledramas\nteledu\nteledus\ntelefacsimile\ntelefacsimiles\ntelefilm\ntelefilms\ntelegenic\ntelegenically\ntelegonic\ntelegonous\ntelegony\ntelegram\ntelegrammed\ntelegramming\ntelegrams\ntelegraph\ntelegraphed\ntelegrapher\ntelegraphers\ntelegraphese\ntelegraphic\ntelegraphical\ntelegraphically\ntelegraphing\ntelegraphist\ntelegraphists\ntelegraphs\ntelegraphy\ntelegu\ntelegus\ntelekinesis\ntelekinetic\ntelekinetically\ntelemachus\ntelemark\ntelemarked\ntelemarker\ntelemarkers\ntelemarketer\ntelemarketers\ntelemarketing\ntelemarking\ntelemarks\ntelemedicine\ntelemeter\ntelemetered\ntelemetering\ntelemeters\ntelemetric\ntelemetrical\ntelemetrically\ntelemetry\ntelencephalic\ntelencephalon\ntelencephalons\nteleologic\nteleological\nteleologically\nteleologies\nteleologist\nteleologists\nteleology\nteleonomic\nteleonomy\nteleost\nteleostean\nteleosteans\nteleosts\ntelepath\ntelepathic\ntelepathically\ntelepathist\ntelepathists\ntelepaths\ntelepathy\ntelephone\ntelephoned\ntelephoner\ntelephoners\ntelephones\ntelephonic\ntelephonically\ntelephoning\ntelephonist\ntelephonists\ntelephony\ntelephoto\ntelephotograph\ntelephotographed\ntelephotographic\ntelephotographing\ntelephotographs\ntelephotography\ntelephotos\nteleplay\nteleplays\nteleport\nteleportation\nteleported\nteleporting\nteleports\nteleprinter\nteleprinters\nteleprocessing\nteleprompter\nteleprompters\nteleran\ntelerans\ntelescope\ntelescoped\ntelescopes\ntelescopic\ntelescopically\ntelescoping\ntelescopist\ntelescopists\ntelescopium\ntelescopy\nteleses\nteleshopping\nteleshoppings\ntelesis\ntelestereoscope\ntelestereoscopes\ntelesthesia\ntelesthesias\ntelesthetic\ntelesto\nteletext\nteletexts\nteletheater\nteletheaters\ntelethermoscope\ntelethermoscopes\ntelethon\ntelethons\nteletranscription\nteletranscriptions\nteletype\nteletyped\nteletypes\nteletypesetter\nteletypewriter\nteletypewriters\nteletyping\nteleutospore\nteleutospores\nteleutosporic\ntelevangelism\ntelevangelist\ntelevangelists\nteleview\nteleviewed\nteleviewer\nteleviewers\nteleviewing\nteleviews\ntelevise\ntelevised\ntelevises\ntelevising\ntelevision\ntelevisions\ntelevisor\ntelevisors\ntelevisual\ntelex\ntelexed\ntelexes\ntelexing\ntelford\ntelia\ntelial\ntelic\ntelically\nteliospore\nteliospores\nteliosporic\ntelium\ntell\ntellable\nteller\ntellers\ntellership\ntellies\ntelling\ntellingly\ntells\ntelltale\ntelltales\ntellurian\ntellurians\ntelluric\ntelluride\ntellurion\ntellurions\ntellurium\ntellurometer\ntellurometers\ntellurous\ntelly\ntellys\ntelnet\ntelocentric\ntelolecithal\ntelome\ntelomere\ntelomeres\ntelophase\ntelophases\ntelophasic\ntelos\ntelotaxis\ntelotaxises\ntelpher\ntelphered\ntelphering\ntelphers\ntelson\ntelsons\ntelugu\ntelugus\ntem\ntemblor\ntemblors\ntemerarious\ntemerariously\ntemerariousness\ntemerity\ntemne\ntemnes\ntemp\ntempeh\ntempehs\ntemper\ntempera\ntemperability\ntemperable\ntemperament\ntemperamental\ntemperamentally\ntemperaments\ntemperance\ntemperas\ntemperate\ntemperately\ntemperateness\ntemperature\ntemperatures\ntempered\ntemperedly\ntemperedness\ntemperer\ntemperers\ntempering\ntempers\ntempest\ntempested\ntempesting\ntempests\ntempestuous\ntempestuously\ntempestuousness\ntempi\ntemplar\ntemplars\ntemplate\ntemplates\ntemple\ntempled\ntemples\ntemplet\ntemplets\ntempo\ntemporal\ntemporalities\ntemporality\ntemporalize\ntemporalized\ntemporalizes\ntemporalizing\ntemporally\ntemporaries\ntemporarily\ntemporariness\ntemporary\ntempore\ntemporization\ntemporizations\ntemporize\ntemporized\ntemporizer\ntemporizers\ntemporizes\ntemporizing\ntemporomandibular\ntempos\ntemps\ntempt\ntemptable\ntemptation\ntemptations\ntempted\ntempter\ntempters\ntempting\ntemptingly\ntemptingness\ntemptress\ntemptresses\ntempts\ntempura\ntempuras\nten\ntenability\ntenable\ntenableness\ntenably\ntenace\ntenaces\ntenacious\ntenaciously\ntenaciousness\ntenacity\ntenacula\ntenaculum\ntenancies\ntenancy\ntenant\ntenantable\ntenanted\ntenanting\ntenantless\ntenantry\ntenants\ntench\ntenches\ntend\ntendance\ntended\ntendencies\ntendencious\ntendency\ntendentious\ntendentiously\ntendentiousness\ntender\ntendered\ntenderer\ntenderers\ntenderest\ntenderfeet\ntenderfoot\ntenderfoots\ntenderhearted\ntenderheartedly\ntenderheartedness\ntendering\ntenderization\ntenderizations\ntenderize\ntenderized\ntenderizer\ntenderizers\ntenderizes\ntenderizing\ntenderloin\ntenderloins\ntenderly\ntenderness\ntendernesses\ntenderometer\ntenderometers\ntenders\ntending\ntendinitis\ntendinous\ntendon\ntendonitis\ntendons\ntendresse\ntendril\ntendriled\ntendrilled\ntendrilous\ntendrils\ntends\ntenebrae\ntenebrific\ntenebrionid\ntenebrionids\ntenebrious\ntenebrism\ntenebrist\ntenebrists\ntenebrosity\ntenebrous\ntenebrously\ntenement\ntenemental\ntenementary\ntenements\ntenens\ntenerife\ntenesmus\ntenesmuses\ntenet\ntenets\ntenfold\ntenia\nteniacide\nteniacides\nteniae\nteniafuge\nteniafuges\ntenias\nteniasis\nteniasises\ntenner\ntenners\ntennessean\ntennesseans\ntennessee\ntenniel\ntennies\ntennis\ntennist\ntennists\ntennyson\ntennysonian\ntenochtitlán\ntenon\ntenoned\ntenoning\ntenonitis\ntenons\ntenor\ntenorist\ntenorists\ntenorrhaphies\ntenorrhaphy\ntenors\ntenos\ntenosynovitis\ntenosynovitises\ntenotomies\ntenotomy\ntenpenny\ntenpin\ntenpins\ntenpounder\ntenpounders\ntenrec\ntenrecs\ntens\ntense\ntensed\ntensely\ntenseness\ntenser\ntenses\ntensest\ntensile\ntensility\ntensimeter\ntensimeters\ntensing\ntensiometer\ntensiometers\ntensiometric\ntensiometry\ntension\ntensional\ntensioned\ntensioner\ntensioners\ntensioning\ntensionless\ntensions\ntensities\ntensity\ntensive\ntensor\ntensorial\ntensors\ntent\ntentacle\ntentacled\ntentacles\ntentacular\ntentage\ntentages\ntentative\ntentatively\ntentativeness\ntented\ntenter\ntentered\ntenterhook\ntenterhooks\ntentering\ntenters\ntenth\ntenthly\ntenths\ntenting\ntentless\ntentlike\ntentmaker\ntentmakers\ntents\ntenues\ntenuis\ntenuity\ntenuous\ntenuously\ntenuousness\ntenurable\ntenure\ntenured\ntenures\ntenurial\ntenurially\ntenuto\nteocalli\nteocallis\nteosinte\nteosintes\nteotihuacán\ntepa\ntepal\ntepals\ntepary\ntepas\ntepee\ntepees\ntephra\ntephras\ntepid\ntepidity\ntepidly\ntepidness\ntequila\ntequilas\nteraampere\nteraamperes\nterabecquerel\nterabecquerels\nterabit\nterabits\nterabyte\nterabytes\nteracandela\nteracandelas\nteracoulomb\nteracoulombs\nterafarad\nterafarads\nteraflop\nteraflops\nteragram\nteragrams\nterahenries\nterahenry\nterahenrys\nterahertz\nterai\nterais\nterajoule\nterajoules\nterakelvin\nterakelvins\nteralumen\nteralumens\nteralux\nterameter\nterameters\nteramole\nteramoles\nteranewton\nteranewtons\nteraohm\nteraohms\nterapascal\nterapascals\nteraph\nteraphim\nteraradian\nteraradians\nterasecond\nteraseconds\nterasiemens\nterasievert\nterasieverts\nterasteradian\nterasteradians\nteratesla\nterateslas\nteratism\nteratisms\nteratocarcinoma\nteratocarcinomas\nteratocarcinomata\nteratogen\nteratogenesis\nteratogenic\nteratogenicity\nteratogens\nteratoid\nteratologic\nteratological\nteratologist\nteratologists\nteratology\nteratoma\nteratomas\nteratomata\nteratomatous\nteravolt\nteravolts\nterawatt\nterawatts\nteraweber\nterawebers\nterbium\nterce\nterceira\ntercel\ntercels\ntercentenaries\ntercentenary\ntercentennial\ntercentennials\ntercet\ntercets\nterebene\nterebenes\nterebic\nterebinth\nterebinthic\nterebinthine\nterebinths\nteredines\nteredo\nteredos\nterence\nterephthalate\nterephthalates\nterephthalic\nteresa\nterete\ntereus\nterga\ntergal\ntergite\ntergites\ntergiversate\ntergiversated\ntergiversates\ntergiversating\ntergiversation\ntergiversations\ntergiversator\ntergiversators\ntergum\nteriyaki\nteriyakis\nterm\ntermagant\ntermagants\ntermed\ntermer\ntermers\nterminability\nterminable\nterminableness\nterminably\nterminal\nterminally\nterminals\nterminate\nterminated\nterminates\nterminating\ntermination\nterminational\nterminations\nterminative\nterminatively\nterminator\nterminators\nterminer\nterming\ntermini\nterminological\nterminologically\nterminologies\nterminologist\nterminologists\nterminology\nterminus\nterminuses\ntermitaria\ntermitaries\ntermitarium\ntermitary\ntermite\ntermites\ntermitic\ntermless\nterms\ntern\nternaries\nternary\nternate\nternately\nterne\nterneplate\nterneplates\nternes\nterns\nterpene\nterpeneless\nterpenes\nterpenic\nterpenoid\nterpenoids\nterpin\nterpineol\nterpineols\nterpolymer\nterpolymers\nterpsichore\nterpsichorean\nterpsichoreans\nterpsichores\nterr\nterra\nterrace\nterraced\nterraces\nterracing\nterracotta\nterrae\nterrain\nterrains\nterramycin\nterran\nterrane\nterranes\nterrapin\nterrapins\nterraqueous\nterraria\nterrarium\nterrariums\nterrazzo\nterrene\nterrenes\nterreplein\nterrepleins\nterrestrial\nterrestrially\nterrestrialness\nterrestrials\nterret\nterrets\nterrible\nterribleness\nterribles\nterribly\nterricolous\nterrier\nterriers\nterries\nterrific\nterrifically\nterrified\nterrifier\nterrifiers\nterrifies\nterrify\nterrifying\nterrifyingly\nterrigenous\nterrine\nterrines\nterritorial\nterritorialism\nterritorialist\nterritorialists\nterritorialities\nterritoriality\nterritorialization\nterritorializations\nterritorialize\nterritorialized\nterritorializes\nterritorializing\nterritorially\nterritorials\nterritories\nterritory\nterror\nterrorism\nterrorist\nterroristic\nterrorists\nterrorization\nterrorizations\nterrorize\nterrorized\nterrorizer\nterrorizers\nterrorizes\nterrorizing\nterrorless\nterrors\nterrs\nterry\nterse\ntersely\nterseness\nterser\ntersest\ntertial\ntertials\ntertian\ntertians\ntertiaries\ntertiary\ntertium\ntertullian\ntervalent\ntervuren\nterza\nterze\ntesla\nteslas\ntessellate\ntessellated\ntessellates\ntessellating\ntessellation\ntessellations\ntessera\ntesseract\ntesseracts\ntesserae\ntessitura\ntessituras\ntest\ntesta\ntestability\ntestable\ntestacean\ntestaceans\ntestaceous\ntestacy\ntestae\ntestament\ntestamentary\ntestaments\ntestate\ntestator\ntestators\ntestatrices\ntestatrix\ntestatrixes\ntestcross\ntestcrossed\ntestcrosses\ntestcrossing\ntested\ntestee\ntestees\ntester\ntesters\ntestes\ntesticle\ntesticles\ntesticular\ntesticulate\ntestier\ntestiest\ntestificandum\ntestification\ntestifications\ntestified\ntestifier\ntestifiers\ntestifies\ntestify\ntestifying\ntestily\ntestimonial\ntestimonials\ntestimonies\ntestimony\ntestiness\ntesting\ntestis\nteston\ntestons\ntestoon\ntestoons\ntestosterone\ntests\ntestudinal\ntestudinate\ntestudinates\ntestudo\ntestudos\ntesty\ntetanal\ntetanic\ntetanically\ntetanies\ntetanization\ntetanizations\ntetanize\ntetanized\ntetanizes\ntetanizing\ntetanus\ntetany\ntetartohedral\ntetched\ntetchier\ntetchiest\ntetchily\ntetchiness\ntetchy\nteth\ntether\ntetherball\ntetherballs\ntethered\ntethering\ntethers\ntethys\nteton\ntetons\ntetra\ntetrabasic\ntetrabasicity\ntetrabranchiate\ntetrabranchiates\ntetracaine\ntetracaines\ntetrachloride\ntetrachlorides\ntetrachloroethylene\ntetrachord\ntetrachordal\ntetrachords\ntetracid\ntetracids\ntetracyclic\ntetracycline\ntetracyclines\ntetrad\ntetradactylous\ntetradic\ntetradrachm\ntetradrachms\ntetrads\ntetradymite\ntetradymites\ntetradynamous\ntetraethyl\ntetraethyllead\ntetraethylleads\ntetrafluoride\ntetrafluorides\ntetragon\ntetragonal\ntetragonally\ntetragons\ntetragrammaton\ntetragynous\ntetrahedra\ntetrahedral\ntetrahedrally\ntetrahedrite\ntetrahedrites\ntetrahedron\ntetrahedrons\ntetrahydrocannabinol\ntetrahydrocannabinols\ntetrahydrofuran\ntetrahydrofurans\ntetrahydroxy\ntetrahymena\ntetrahymenas\ntetralogies\ntetralogy\ntetramer\ntetrameric\ntetramerism\ntetramerous\ntetramers\ntetrameter\ntetrameters\ntetramethyllead\ntetramethylleads\ntetrandrous\ntetraplegic\ntetraploid\ntetraploids\ntetraploidy\ntetrapod\ntetrapodous\ntetrapods\ntetrapterous\ntetrapyrrole\ntetrapyrroles\ntetrarch\ntetrarchate\ntetrarchates\ntetrarchic\ntetrarchical\ntetrarchies\ntetrarchs\ntetrarchy\ntetras\ntetrasporangia\ntetrasporangium\ntetraspore\ntetraspores\ntetrasporic\ntetrastyle\ntetrasyllabic\ntetratomic\ntetravalent\ntetrazolium\ntetrazoliums\ntetrazzini\ntetrode\ntetrodes\ntetrodotoxin\ntetrodotoxins\ntetroxide\ntetroxides\ntetryl\ntetryls\ntetter\ntetterbush\ntetterbushes\ntetters\nteuton\nteutonic\nteutonically\nteutonicism\nteutonicisms\nteutonism\nteutonisms\nteutonist\nteutonists\nteutonization\nteutonizations\nteutonize\nteutonized\nteutonizes\nteutonizing\nteutons\ntevet\ntewa\ntewas\ntex\ntexaco\ntexan\ntexans\ntexas\ntexel\ntext\ntextbook\ntextbookish\ntextbooks\ntextile\ntextiles\ntexts\ntextual\ntextualism\ntextualisms\ntextualist\ntextualists\ntextually\ntextuaries\ntextuary\ntextural\ntexturally\ntexture\ntextured\ntextureless\ntextures\ntexturing\ntexturize\ntexturized\ntexturizer\ntexturizers\ntexturizes\ntexturizing\nthackeray\nthai\nthailand\nthais\nthalamencephalic\nthalamencephalon\nthalamencephalons\nthalami\nthalamic\nthalamically\nthalamus\nthalassemia\nthalassemias\nthalassemic\nthalassic\nthalassocracies\nthalassocracy\nthalassocrat\nthalassocrats\nthaler\nthalers\nthales\nthalesian\nthalia\nthalidomide\nthalli\nthallic\nthallium\nthalloid\nthalloidal\nthallophyte\nthallophytes\nthallophytic\nthallous\nthallus\nthalluses\nthammuz\nthan\nthanage\nthanages\nthanatological\nthanatologist\nthanatologists\nthanatology\nthanatopsis\nthanatos\nthanatotic\nthane\nthanes\nthaneship\nthanet\nthank\nthanked\nthanker\nthankers\nthankful\nthankfully\nthankfulness\nthanking\nthankless\nthanklessly\nthanklessness\nthanks\nthanksgiving\nthanksgivings\nthankworthier\nthankworthiest\nthankworthy\nthat\nthat'd\nthat'll\nthat's\nthataway\nthatch\nthatched\nthatcher\nthatchers\nthatches\nthatching\nthatchy\nthaumatologies\nthaumatology\nthaumaturge\nthaumaturges\nthaumaturgic\nthaumaturgical\nthaumaturgist\nthaumaturgists\nthaumaturgy\nthaw\nthawed\nthawing\nthaws\nthe\ntheanthropic\ntheanthropical\ntheanthropism\ntheanthropisms\ntheanthropist\ntheanthropists\nthearchies\nthearchy\ntheater\ntheatergoer\ntheatergoers\ntheatergoing\ntheaters\ntheatine\ntheatines\ntheatre\ntheatres\ntheatric\ntheatrical\ntheatricalism\ntheatricalisms\ntheatricality\ntheatricalization\ntheatricalizations\ntheatricalize\ntheatricalized\ntheatricalizer\ntheatricalizers\ntheatricalizes\ntheatricalizing\ntheatrically\ntheatricalness\ntheatricals\ntheatrics\nthebaine\nthebaines\ntheban\nthebans\nthebe\nthebes\ntheca\nthecae\nthecal\nthecate\nthecodont\nthecodonts\nthee\ntheelin\ntheelins\ntheelol\ntheelols\ntheft\nthefts\nthegn\nthegnly\ntheir\ntheirs\ntheirselves\ntheism\ntheist\ntheistic\ntheistical\ntheistically\ntheists\nthem\nthematic\nthematically\ntheme\nthemed\nthemeless\nthemes\nthemistocles\nthemselves\nthen\nthenar\nthenars\nthence\nthenceforth\nthenceforward\nthenceforwards\ntheobald\ntheobromine\ntheobromines\ntheocentric\ntheocentricity\ntheocentrism\ntheocracies\ntheocracy\ntheocrat\ntheocratic\ntheocratical\ntheocratically\ntheocrats\ntheocritus\ntheodicies\ntheodicy\ntheodolite\ntheodolites\ntheodolitic\ntheodora\ntheodore\ntheodoric\ntheodosius\ntheogonic\ntheogonies\ntheogony\ntheolog\ntheologian\ntheologians\ntheologic\ntheological\ntheologically\ntheologies\ntheologize\ntheologized\ntheologizer\ntheologizers\ntheologizes\ntheologizing\ntheologs\ntheologue\ntheologues\ntheology\ntheomachies\ntheomachy\ntheomorphic\ntheomorphism\ntheomorphisms\ntheonomous\ntheonomy\ntheophanic\ntheophanies\ntheophany\ntheophrastus\ntheophylline\ntheophyllines\ntheorbo\ntheorbos\ntheorem\ntheorematic\ntheorems\ntheoretic\ntheoretical\ntheoretically\ntheoretician\ntheoreticians\ntheoretics\ntheories\ntheorist\ntheorists\ntheorization\ntheorizations\ntheorize\ntheorized\ntheorizer\ntheorizers\ntheorizes\ntheorizing\ntheory\ntheosophic\ntheosophical\ntheosophically\ntheosophies\ntheosophist\ntheosophists\ntheosophy\ntheotokos\ntherapeusis\ntherapeutic\ntherapeutical\ntherapeutically\ntherapeutics\ntherapeutist\ntherapeutists\ntherapies\ntherapist\ntherapists\ntherapsid\ntherapsids\ntherapy\ntheravada\nthere\nthere'd\nthere'll\nthere's\nthereabout\nthereabouts\nthereafter\nthereagainst\nthereat\nthereby\ntherefor\ntherefore\ntherefrom\ntherein\nthereinafter\nthereinto\ntheremin\ntheremins\nthereof\nthereon\ntheresa\nthereto\ntheretofore\nthereunder\nthereunto\nthereupon\ntherewith\ntherewithal\ntheriac\ntheriaca\ntheriacal\ntheriacs\ntheriomorphic\ntheriomorphous\ntherm\nthermal\nthermalization\nthermalizations\nthermalize\nthermalized\nthermalizes\nthermalizing\nthermally\nthermals\nthermanesthesia\nthermanesthesias\nthermesthesia\nthermesthesias\nthermic\nthermically\nthermidor\nthermion\nthermionic\nthermionics\nthermions\nthermistor\nthermistors\nthermit\nthermite\nthermocauteries\nthermocautery\nthermochemical\nthermochemist\nthermochemistry\nthermochemists\nthermocline\nthermoclines\nthermocoagulation\nthermocoagulations\nthermocouple\nthermocouples\nthermoduric\nthermodynamic\nthermodynamical\nthermodynamically\nthermodynamicist\nthermodynamicists\nthermodynamics\nthermoelectric\nthermoelectrical\nthermoelectrically\nthermoelectricity\nthermoelectron\nthermoelectrons\nthermoelement\nthermoelements\nthermoform\nthermoformable\nthermoformed\nthermoforming\nthermoforms\nthermogenesis\nthermogenetic\nthermogenic\nthermogram\nthermograms\nthermograph\nthermographic\nthermographically\nthermographies\nthermographs\nthermography\nthermohaline\nthermojunction\nthermojunctions\nthermolabile\nthermolability\nthermoluminescence\nthermoluminescences\nthermoluminescent\nthermolyses\nthermolysis\nthermolytic\nthermomagnetic\nthermometer\nthermometers\nthermometric\nthermometrically\nthermometry\nthermomotor\nthermomotors\nthermonuclear\nthermoperiodicities\nthermoperiodicity\nthermoperiodism\nthermoperiodisms\nthermophile\nthermophiles\nthermophilic\nthermophilous\nthermopile\nthermopiles\nthermoplastic\nthermoplasticity\nthermoplastics\nthermoreceptor\nthermoreceptors\nthermoregulate\nthermoregulated\nthermoregulates\nthermoregulating\nthermoregulation\nthermoregulations\nthermoregulator\nthermoregulators\nthermoregulatory\nthermoremanence\nthermoremanent\nthermos\nthermoscope\nthermoscopes\nthermoses\nthermoset\nthermosets\nthermosetting\nthermosphere\nthermospheric\nthermostabile\nthermostability\nthermostable\nthermostat\nthermostatic\nthermostatically\nthermostats\nthermotactic\nthermotaxes\nthermotaxic\nthermotaxis\nthermotherapies\nthermotherapy\nthermotropic\nthermotropism\ntherms\ntheropod\ntheropodan\ntheropodans\ntheropods\nthersites\nthesaural\nthesauri\nthesaurus\nthesauruses\nthese\nthese'd\nthese'll\ntheses\ntheseus\nthesis\nthespian\nthespians\nthespis\nthessalian\nthessalians\nthessalonian\nthessalonians\nthessalonica\nthessaloniki\nthessaloníki\nthessaly\ntheta\nthetas\nthetic\nthetical\nthetically\nthetis\ntheurgic\ntheurgical\ntheurgically\ntheurgies\ntheurgist\ntheurgists\ntheurgy\nthew\nthews\nthewy\nthey\nthey'd\nthey'll\nthey're\nthey've\nthiabendazole\nthiabendazoles\nthiamin\nthiaminase\nthiaminases\nthiamine\nthiamines\nthiamins\nthiazide\nthiazides\nthiazine\nthiazines\nthiazole\nthiazoles\nthick\nthicken\nthickened\nthickener\nthickeners\nthickening\nthickenings\nthickens\nthicker\nthickest\nthicket\nthicketed\nthickets\nthickety\nthickhead\nthickheaded\nthickheads\nthickish\nthickly\nthickness\nthicknesses\nthickset\nthickskulled\nthief\nthieve\nthieved\nthieveries\nthievery\nthieves\nthieving\nthievish\nthievishly\nthievishness\nthigh\nthighbone\nthighbones\nthighed\nthighs\nthigmotactic\nthigmotactically\nthigmotaxis\nthigmotaxises\nthigmotropic\nthigmotropism\nthigmotropisms\nthill\nthills\nthimble\nthimbleberries\nthimbleberry\nthimbleful\nthimblefuls\nthimblerig\nthimblerigged\nthimblerigger\nthimbleriggers\nthimblerigging\nthimblerigs\nthimbles\nthimbleweed\nthimbleweeds\nthimbu\nthimerosal\nthimerosals\nthimphu\nthin\nthine\nthing\nthingamabob\nthingamabobs\nthingamajig\nthingamajigs\nthingness\nthings\nthingumabob\nthingumabobs\nthingumajig\nthingumajigs\nthingumbob\nthingumbobs\nthingummies\nthingummy\nthink\nthinkable\nthinkableness\nthinkably\nthinker\nthinkers\nthinking\nthinkingly\nthinkingness\nthinkings\nthinks\nthinly\nthinned\nthinner\nthinners\nthinness\nthinnest\nthinning\nthinnish\nthins\nthio\nthiocarbamide\nthiocarbamides\nthiocyanate\nthiocyanates\nthiocyanic\nthiokol\nthiol\nthiolic\nthiols\nthionic\nthionyl\nthionyls\nthiopental\nthiophene\nthiophenes\nthioridazine\nthioridazines\nthiosulfate\nthiosulfates\nthiosulfuric\nthiotepa\nthiotepas\nthiouracil\nthiouracils\nthiourea\nthioureas\nthiram\nthirams\nthird\nthirdhand\nthirdly\nthirds\nthirst\nthirsted\nthirster\nthirsters\nthirstier\nthirstiest\nthirstily\nthirstiness\nthirsting\nthirsts\nthirsty\nthirteen\nthirteenfold\nthirteens\nthirteenth\nthirteenths\nthirties\nthirtieth\nthirtieths\nthirty\nthirtyfold\nthirtyish\nthis\nthis'd\nthis'll\nthisaway\nthisbe\nthistle\nthistledown\nthistles\nthistly\nthither\nthitherto\nthitherward\nthitherwards\nthixotropic\nthixotropy\ntho\nthohoyandou\nthole\ntholeiite\ntholeiitic\ntholepin\ntholepins\ntholes\nthomas\nthomism\nthomist\nthomistic\nthomists\nthompson\nthomson\nthong\nthonged\nthongs\nthor\nthoraces\nthoracic\nthoracically\nthoracolumbar\nthoracoplasties\nthoracoplasty\nthoracotomies\nthoracotomy\nthorax\nthoraxes\nthorazine\nthoreau\nthoreauvian\nthoria\nthorianite\nthorias\nthoric\nthorite\nthorites\nthorium\nthorn\nthornback\nthornbacks\nthornbush\nthornbushes\nthorndike\nthorned\nthornier\nthorniest\nthornily\nthorniness\nthornless\nthornlike\nthorns\nthorny\nthoron\nthorons\nthorough\nthoroughbass\nthoroughbasses\nthoroughbrace\nthoroughbraces\nthoroughbred\nthoroughbreds\nthoroughfare\nthoroughfares\nthoroughgoing\nthoroughly\nthoroughness\nthoroughpaced\nthoroughpin\nthoroughpins\nthoroughwort\nthoroughworts\nthorp\nthorps\nthose\nthose'd\nthose'll\nthou\nthough\nthought\nthoughtful\nthoughtfully\nthoughtfulness\nthoughtless\nthoughtlessly\nthoughtlessness\nthoughts\nthoughtway\nthoughtways\nthousand\nthousandfold\nthousands\nthousandth\nthousandths\nthrace\nthracian\nthracians\nthraldom\nthrall\nthralldom\nthralled\nthralling\nthralls\nthrash\nthrashed\nthrasher\nthrashers\nthrashes\nthrashing\nthrashings\nthrasonical\nthrasonically\nthread\nthreadbare\nthreadbareness\nthreaded\nthreader\nthreaders\nthreadfin\nthreadfins\nthreadier\nthreadiest\nthreadiness\nthreading\nthreadless\nthreadlike\nthreads\nthreadworm\nthreadworms\nthready\nthreat\nthreated\nthreaten\nthreatened\nthreatener\nthreateners\nthreatening\nthreateningly\nthreatens\nthreating\nthreats\nthree\nthreefold\nthreepence\nthreepences\nthreepenny\nthrees\nthreescore\nthreesome\nthreesomes\nthremmatology\nthrenode\nthrenodes\nthrenodial\nthrenodic\nthrenodies\nthrenodist\nthrenodists\nthrenody\nthreonine\nthreonines\nthresh\nthreshed\nthresher\nthreshers\nthreshes\nthreshing\nthreshold\nthresholds\nthrew\nthrice\nthrift\nthriftier\nthriftiest\nthriftily\nthriftiness\nthriftless\nthriftlessly\nthriftlessness\nthrifts\nthrifty\nthrill\nthrilled\nthriller\nthrillers\nthrilling\nthrillingly\nthrills\nthrips\nthrive\nthrived\nthriven\nthriver\nthrivers\nthrives\nthriving\nthrivingly\nthroat\nthroated\nthroatier\nthroatiest\nthroatily\nthroatiness\nthroating\nthroatlatch\nthroatlatches\nthroats\nthroaty\nthrob\nthrobbed\nthrobber\nthrobbers\nthrobbing\nthrobbingly\nthrobs\nthroe\nthroes\nthrombi\nthrombin\nthrombocyte\nthrombocytes\nthrombocytic\nthrombocytopenia\nthrombocytopenias\nthrombocytopenic\nthromboembolic\nthromboembolism\nthromboembolisms\nthrombokinase\nthrombokinases\nthrombolyses\nthrombolysis\nthrombolytic\nthrombophlebitis\nthrombophlebitises\nthromboplastic\nthromboplastically\nthromboplastin\nthromboplastins\nthromboses\nthrombosis\nthrombosthenin\nthrombosthenins\nthrombotic\nthromboxane\nthromboxanes\nthrombus\nthrone\nthroned\nthrones\nthrong\nthronged\nthronging\nthrongs\nthroning\nthrostle\nthrostles\nthrottle\nthrottleable\nthrottled\nthrottlehold\nthrottleholds\nthrottler\nthrottlers\nthrottles\nthrottling\nthrough\nthroughly\nthroughout\nthroughput\nthroughway\nthroughways\nthrove\nthrow\nthrowaway\nthrowaways\nthrowback\nthrowbacks\nthrower\nthrowers\nthrowing\nthrown\nthrows\nthrowster\nthrowsters\nthru\nthrum\nthrummed\nthrumming\nthrums\nthrush\nthrushes\nthrust\nthruster\nthrusters\nthrustful\nthrusting\nthrustor\nthrustors\nthrusts\nthruway\nthruways\nthucydides\nthud\nthudded\nthudding\nthuds\nthug\nthuggery\nthuggish\nthugs\nthuja\nthujas\nthule\nthulium\nthumb\nthumbed\nthumbhole\nthumbholes\nthumbing\nthumbnail\nthumbnails\nthumbnut\nthumbnuts\nthumbprint\nthumbprints\nthumbs\nthumbscrew\nthumbscrews\nthumbtack\nthumbtacked\nthumbtacking\nthumbtacks\nthumbwheel\nthumbwheels\nthummim\nthump\nthumped\nthumper\nthumpers\nthumping\nthumpingly\nthumps\nthunder\nthunderbird\nthunderbirds\nthunderbolt\nthunderbolts\nthunderclap\nthunderclaps\nthundercloud\nthunderclouds\nthundered\nthunderer\nthunderers\nthunderhead\nthunderheads\nthundering\nthunderingly\nthunderous\nthunderously\nthunders\nthundershower\nthundershowers\nthunderstone\nthunderstones\nthunderstorm\nthunderstorms\nthunderstricken\nthunderstrike\nthunderstrikes\nthunderstriking\nthunderstroke\nthunderstrokes\nthunderstruck\nthunk\nthunked\nthunking\nthunks\nthurber\nthurible\nthuribles\nthurifer\nthurifers\nthuringer\nthuringia\nthuringian\nthuringians\nthurl\nthurls\nthursday\nthursdays\nthus\nthusly\nthwack\nthwacked\nthwacking\nthwacks\nthwart\nthwarted\nthwarter\nthwarters\nthwarting\nthwartly\nthwarts\nthwartwise\nthy\nthyestean\nthyestes\nthylacine\nthylacines\nthylakoid\nthylakoids\nthyme\nthymectomies\nthymectomize\nthymectomized\nthymectomizes\nthymectomizing\nthymectomy\nthymey\nthymic\nthymidine\nthymidines\nthymine\nthymines\nthymocyte\nthymocytes\nthymol\nthymols\nthymoma\nthymomas\nthymosin\nthymosins\nthymus\nthymuses\nthymy\nthyratron\nthyratrons\nthyristor\nthyristors\nthyroactive\nthyrocalcitonin\nthyrocalcitonins\nthyroglobulin\nthyroglobulins\nthyroid\nthyroidal\nthyroidectomies\nthyroidectomize\nthyroidectomized\nthyroidectomizes\nthyroidectomizing\nthyroidectomy\nthyroiditis\nthyroiditises\nthyroids\nthyrotoxicosis\nthyrotrophic\nthyrotrophin\nthyrotrophins\nthyrotropic\nthyrotropin\nthyrotropins\nthyroxin\nthyroxine\nthyroxines\nthyroxins\nthyrse\nthyrses\nthyrsi\nthyrsoid\nthyrsoidal\nthyrsus\nthysanuran\nthysanurans\nthyself\nthásos\nthéatre\nthíra\nti\ntiahuanaco\ntiara\ntiaras\ntiber\ntiberian\ntiberius\ntibet\ntibetan\ntibetans\ntibeto\ntibia\ntibiae\ntibial\ntibias\ntibiofibula\ntibiofibular\ntibiofibulas\ntibiotarsus\ntibiotarsuses\ntic\ntical\nticals\nticced\nticcing\ntick\ntickbird\ntickbirds\nticked\nticker\ntickers\nticket\nticketed\nticketing\nticketless\ntickets\nticking\ntickle\ntickled\ntickler\nticklers\ntickles\ntickling\nticklish\nticklishly\nticklishness\nticks\ntickseed\ntickseeds\nticktack\nticktacks\nticktacktoe\nticktacktoes\nticktock\nticktocks\nticky\nticqueur\nticqueurs\ntics\ntictac\ntidal\ntidally\ntidbit\ntidbits\ntiddledywinks\ntiddler\ntiddlers\ntiddly\ntiddlywinks\ntide\ntided\ntideland\ntidelands\ntideless\ntidemark\ntidemarks\ntiderip\ntiderips\ntides\ntidewaiter\ntidewaiters\ntidewater\ntidewaters\ntideway\ntideways\ntidied\ntidier\ntidies\ntidiest\ntidily\ntidiness\ntiding\ntidings\ntidy\ntidying\ntidytips\ntie\ntieback\ntiebacks\ntiebreaker\ntiebreakers\ntiebreaking\ntied\ntieing\ntieless\ntiemannite\ntiemannites\ntientsin\ntiepin\ntiepins\ntiepolo\ntier\ntierce\ntiercel\ntiercels\ntierces\ntiered\ntiering\ntierra\ntiers\nties\ntietze\ntiff\ntiffanies\ntiffany\ntiffed\ntiffin\ntiffing\ntiffins\ntiffs\ntiger\ntigereye\ntigereyes\ntigerish\ntigerishly\ntigerishness\ntigerlike\ntigers\ntight\ntighten\ntightened\ntightener\ntighteners\ntightening\ntightens\ntighter\ntightest\ntightfisted\ntightfistedness\ntightlipped\ntightlippedness\ntightly\ntightness\ntightrope\ntightropes\ntights\ntightwad\ntightwads\ntightwire\ntightwires\ntiglic\ntiglon\ntiglons\ntigon\ntigons\ntigre\ntigress\ntigresses\ntigrinya\ntigris\ntigré\ntike\ntikes\ntiki\ntikis\ntil\ntilapia\ntilapias\ntilburies\ntilbury\ntilde\ntildes\ntile\ntiled\ntilefish\ntilefishes\ntiler\ntilers\ntiles\ntiling\ntill\ntillable\ntillage\ntillamook\ntillandsia\ntillandsias\ntilled\ntiller\ntillered\ntillering\ntillerman\ntillermen\ntillers\ntilling\ntills\ntils\ntilsit\ntilsiter\ntilt\ntiltable\ntilted\ntilter\ntilters\ntilth\ntilting\ntiltmeter\ntiltmeters\ntilts\ntiltyard\ntiltyards\ntim\ntimbal\ntimbale\ntimbales\ntimbals\ntimber\ntimberdoodle\ntimberdoodles\ntimbered\ntimberhead\ntimberheads\ntimbering\ntimberings\ntimberland\ntimberlands\ntimberline\ntimberlines\ntimberman\ntimbermen\ntimbers\ntimberwork\ntimberworks\ntimbral\ntimbre\ntimbrel\ntimbrelled\ntimbrels\ntimbres\ntimbuktu\ntime\ntimecard\ntimecards\ntimed\ntimekeeper\ntimekeepers\ntimekeeping\ntimeless\ntimelessly\ntimelessness\ntimelier\ntimeliest\ntimeline\ntimelines\ntimeliness\ntimely\ntimeous\ntimeously\ntimeout\ntimeouts\ntimepiece\ntimepieces\ntimepleaser\ntimepleasers\ntimer\ntimers\ntimes\ntimesaver\ntimesavers\ntimesaving\ntimescale\ntimescales\ntimeserver\ntimeservers\ntimeserving\ntimeshare\ntimeshared\ntimeshares\ntimesharing\ntimetable\ntimetables\ntimework\ntimeworker\ntimeworkers\ntimeworn\ntimid\ntimider\ntimidest\ntimidity\ntimidly\ntimidness\ntiming\ntimings\ntimocracies\ntimocracy\ntimocratic\ntimocratical\ntimolol\ntimolols\ntimon\ntimor\ntimorese\ntimorous\ntimorously\ntimorousness\ntimothies\ntimothy\ntimpani\ntimpanist\ntimpanists\ntimpanogos\ntimpanum\ntimucua\ntimucuas\ntin\ntinamou\ntinamous\ntinbergen\ntincal\ntincals\ntinct\ntinctorial\ntinctorially\ntincts\ntincture\ntinctured\ntinctures\ntincturing\ntinder\ntinderbox\ntinderboxes\ntine\ntinea\ntineal\ntineas\ntined\ntines\ntinfoil\ntinful\ntinfuls\nting\ntinge\ntinged\ntingeing\ntinges\ntinging\ntingle\ntingled\ntingler\ntinglers\ntingles\ntingling\ntinglingly\ntingly\ntings\ntinhorn\ntinhorns\ntinian\ntinier\ntiniest\ntinily\ntininess\ntinker\ntinkered\ntinkerer\ntinkerers\ntinkering\ntinkers\ntinkertoy\ntinkle\ntinkled\ntinkles\ntinkling\ntinkly\ntinned\ntinner\ntinners\ntinnier\ntinniest\ntinnily\ntinniness\ntinning\ntinnitus\ntinnituses\ntinny\ntinplate\ntinplates\ntins\ntinsel\ntinseled\ntinseling\ntinselled\ntinselling\ntinselly\ntinsels\ntinsmith\ntinsmithing\ntinsmiths\ntinstone\ntinstones\ntint\ntinted\ntinter\ntinters\ntinting\ntintinnabula\ntintinnabular\ntintinnabulary\ntintinnabulation\ntintinnabulations\ntintinnabulous\ntintinnabulum\ntintless\ntintoretto\ntints\ntintype\ntintypes\ntinware\ntinwork\ntinworks\ntiny\ntip\ntipcart\ntipcarts\ntipcat\ntipi\ntipis\ntippecanoe\ntipped\ntipper\ntippers\ntippet\ntippets\ntippier\ntippiest\ntipping\ntipple\ntippled\ntippler\ntipplers\ntipples\ntippling\ntippy\ntips\ntipsier\ntipsiest\ntipsily\ntipsiness\ntipstaff\ntipstaffs\ntipstaves\ntipster\ntipsters\ntipsy\ntiptoe\ntiptoed\ntiptoeing\ntiptoes\ntiptop\ntiptops\ntirade\ntirades\ntiramisu\ntirana\ntiranë\ntire\ntired\ntiredly\ntiredness\ntireless\ntirelessly\ntirelessness\ntires\ntiresias\ntiresome\ntiresomely\ntiresomeness\ntiring\ntiro\ntirol\ntiros\ntirpitz\ntiryns\ntis\ntisane\ntisanes\ntishri\ntisiphone\ntissot\ntissue\ntissues\ntissuey\ntissular\ntit\ntitan\ntitanate\ntitanates\ntitaness\ntitanesses\ntitania\ntitanic\ntitanically\ntitaniferous\ntitanism\ntitanisms\ntitanite\ntitanites\ntitanium\ntitanosaur\ntitanosaurs\ntitanothere\ntitanotheres\ntitanous\ntitans\ntitbit\ntitbits\ntiter\ntiters\ntitfer\ntitfers\ntithable\ntithe\ntithed\ntither\ntithers\ntithes\ntithing\ntithings\ntithonia\ntithonias\ntiti\ntitian\ntitianesque\ntiticaca\ntitillate\ntitillated\ntitillater\ntitillaters\ntitillates\ntitillating\ntitillatingly\ntitillation\ntitillations\ntitillative\ntitis\ntitivate\ntitivated\ntitivates\ntitivating\ntitivation\ntitivations\ntitlark\ntitlarks\ntitle\ntitled\ntitleholder\ntitleholders\ntitles\ntitling\ntitlist\ntitlists\ntitmice\ntitmouse\ntito\ntitoism\ntitoist\ntitoists\ntitrant\ntitrants\ntitratable\ntitrate\ntitrated\ntitrates\ntitrating\ntitration\ntitrations\ntitrator\ntitrators\ntitre\ntitres\ntitrimetric\ntitrimetrically\ntits\ntitter\ntittered\ntitterer\ntitterers\ntittering\ntitteringly\ntitters\ntittivate\ntittivated\ntittivates\ntittivating\ntittle\ntittles\ntittup\ntittuped\ntittuping\ntittupped\ntittupping\ntittups\ntitubation\ntitubations\ntitular\ntitularies\ntitularly\ntitulars\ntitulary\ntitus\ntivoli\ntiwa\ntiwas\ntizzies\ntizzy\ntko\ntlingit\ntlingits\ntmeses\ntmesis\ntnt\nto\ntoad\ntoadeater\ntoadeaters\ntoadfish\ntoadfishes\ntoadflax\ntoadflaxes\ntoadied\ntoadies\ntoads\ntoadstone\ntoadstones\ntoadstool\ntoadstools\ntoady\ntoadying\ntoadyish\ntoadyism\ntoast\ntoasted\ntoaster\ntoasters\ntoastier\ntoastiest\ntoasting\ntoastmaster\ntoastmasters\ntoastmistress\ntoastmistresses\ntoasts\ntoasty\ntobacco\ntobaccoes\ntobacconist\ntobacconists\ntobaccos\ntobagan\ntobagans\ntobago\ntobagonian\ntobagonians\ntobias\ntobies\ntobit\ntoboggan\ntobogganed\ntobogganer\ntobogganers\ntobogganing\ntobogganist\ntobogganists\ntoboggans\ntobruk\ntoby\ntoccata\ntoccatas\ntocharian\ntocharians\ntocology\ntocopherol\ntocopherols\ntocqueville\ntocsin\ntocsins\ntoday\ntodays\ntoddies\ntoddle\ntoddled\ntoddler\ntoddlerhood\ntoddlers\ntoddles\ntoddling\ntoddy\ntodies\ntody\ntoe\ntoea\ntoecap\ntoecaps\ntoed\ntoehold\ntoeholds\ntoeing\ntoeless\ntoenail\ntoenailed\ntoenailing\ntoenails\ntoepiece\ntoepieces\ntoeplate\ntoeplates\ntoes\ntoffee\ntoffees\ntoffies\ntoffy\ntofu\ntog\ntoga\ntogaed\ntogas\ntogether\ntogetherness\ntogged\ntoggenburg\ntoggeries\ntoggery\ntogging\ntoggle\ntoggled\ntoggles\ntoggling\ntogo\ntogolese\ntogs\ntogue\ntogues\ntoheroa\ntoheroas\ntoil\ntoile\ntoiled\ntoiler\ntoilers\ntoilet\ntoiletries\ntoiletry\ntoilets\ntoilette\ntoilettes\ntoilful\ntoilfully\ntoiling\ntoils\ntoilsome\ntoilsomely\ntoilsomeness\ntoilworn\ntoity\ntokamak\ntokamaks\ntokara\ntokay\ntokays\ntoke\ntoked\ntokelau\ntoken\ntokened\ntokening\ntokenism\ntokenize\ntokenized\ntokenizes\ntokenizing\ntokens\ntokes\ntokharian\ntokharians\ntoking\ntokology\ntokomak\ntokomaks\ntokonoma\ntokonomas\ntokyo\ntola\ntolas\ntolbutamide\ntolbutamides\ntold\ntole\ntoled\ntoledo\ntoledos\ntolerability\ntolerable\ntolerableness\ntolerably\ntolerance\ntolerances\ntolerant\ntolerantly\ntolerate\ntolerated\ntolerates\ntolerating\ntoleration\ntolerative\ntolerator\ntolerators\ntoles\ntolidine\ntolidines\ntoling\ntoll\ntollbooth\ntollbooths\ntolled\ntollgate\ntollgates\ntollhouse\ntollhouses\ntolling\ntolls\ntollway\ntollways\ntolstoian\ntolstoy\ntolstoyan\ntoltec\ntoltecan\ntoltecs\ntolu\ntoluate\ntoluates\ntoluene\ntoluenes\ntoluic\ntoluidine\ntoluidines\ntoluol\ntoluols\ntolus\ntolyl\ntolyls\ntom\ntomahawk\ntomahawked\ntomahawking\ntomahawks\ntomalley\ntomalleys\ntomatillo\ntomatillos\ntomato\ntomatoes\ntomatoey\ntomb\ntombac\ntombacs\ntombless\ntomblike\ntombolo\ntombolos\ntomboy\ntomboyish\ntomboyishness\ntomboys\ntombs\ntombstone\ntombstones\ntomcat\ntomcats\ntomcatted\ntomcatting\ntomcod\ntomcods\ntome\ntomenta\ntomentose\ntomentum\ntomes\ntomfool\ntomfooleries\ntomfoolery\ntomfools\ntomism\ntommed\ntommies\ntomming\ntommy\ntommyrot\ntomogram\ntomograms\ntomograph\ntomographic\ntomographs\ntomography\ntomorrow\ntomorrows\ntompion\ntompions\ntoms\ntomsk\ntomtit\ntomtits\ntomé\nton\ntonal\ntonalities\ntonality\ntonally\ntondi\ntondo\ntondos\ntone\ntonearm\ntonearms\ntoned\ntoneless\ntonelessly\ntonelessness\ntoneme\ntonemes\ntonemic\ntoner\ntoners\ntones\ntonetic\ntonetically\ntonetics\ntonette\ntonettes\ntoney\ntong\ntonga\ntongan\ntongans\ntonged\ntonger\ntongers\ntonging\ntongs\ntongue\ntongued\ntonguefish\ntonguefishes\ntongueless\ntonguelike\ntongues\ntonguing\ntonguings\ntonic\ntonically\ntonicities\ntonicity\ntonics\ntonier\ntoniest\ntonight\ntonights\ntoning\ntonk\ntonka\ntonkin\ntonkinese\ntonks\ntonnage\ntonnages\ntonne\ntonneau\ntonneaus\ntonner\ntonners\ntonnes\ntonometer\ntonometers\ntonometric\ntonometry\ntonoplast\ntonoplasts\ntons\ntonsil\ntonsillar\ntonsillectomies\ntonsillectomy\ntonsillitic\ntonsillitis\ntonsillotomies\ntonsillotomy\ntonsils\ntonsorial\ntonsure\ntonsured\ntonsures\ntonsuring\ntontine\ntontines\ntonus\ntonuses\ntony\ntonys\ntoo\ntooer\ntooers\ntooism\ntook\ntool\ntoolbox\ntoolboxes\ntooled\ntoolholder\ntoolholders\ntoolhouse\ntoolhouses\ntooling\ntoolings\ntoolkit\ntoolkits\ntoolmaker\ntoolmakers\ntoolmaking\ntoolroom\ntoolrooms\ntools\ntoolshed\ntoolsheds\ntoon\ntoons\ntoot\ntooted\ntooter\ntooters\ntooth\ntoothache\ntoothaches\ntoothbrush\ntoothbrushes\ntoothbrushing\ntoothed\ntoothier\ntoothiest\ntoothily\ntoothing\ntoothless\ntoothlessly\ntoothlessness\ntoothlike\ntoothpaste\ntoothpick\ntoothpicks\ntoothpowder\ntoothpowders\ntooths\ntoothsome\ntoothsomely\ntoothsomeness\ntoothwort\ntoothworts\ntoothy\ntooting\ntootle\ntootled\ntootler\ntootlers\ntootles\ntootling\ntoots\ntootsie\ntootsies\ntootsy\ntop\ntopaz\ntopazes\ntopcoat\ntopcoats\ntopcross\ntopcrosses\ntopdressing\ntopdressings\ntope\ntopectomies\ntopectomy\ntoped\ntopee\ntopees\ntopeka\ntoper\ntopers\ntopes\ntopflight\ntopful\ntopfull\ntopgallant\ntopgallants\ntophet\ntophets\ntophi\ntophus\ntopi\ntopiaries\ntopiary\ntopic\ntopical\ntopicality\ntopically\ntopics\ntoping\ntopis\ntopkick\ntopkicks\ntopknot\ntopknots\ntopless\ntoplessness\ntopline\ntoplines\ntoploftical\ntoploftier\ntoploftiest\ntoploftily\ntoploftiness\ntoplofty\ntopmast\ntopmasts\ntopminnow\ntopminnows\ntopmost\ntopnotch\ntopnotcher\ntopnotchers\ntopocentric\ntopograph\ntopographer\ntopographers\ntopographic\ntopographical\ntopographically\ntopographies\ntopographs\ntopography\ntopoi\ntopologic\ntopological\ntopologically\ntopologies\ntopologist\ntopologists\ntopology\ntoponym\ntoponymic\ntoponymical\ntoponymies\ntoponymist\ntoponymists\ntoponyms\ntoponymy\ntopos\ntopotype\ntopotypes\ntopped\ntopper\ntoppers\ntopping\ntoppings\ntopple\ntoppled\ntopples\ntoppling\ntops\ntopsail\ntopsails\ntopside\ntopsider\ntopsiders\ntopsides\ntopsoil\ntopsoiled\ntopsoiling\ntopsoils\ntopspin\ntopstitch\ntopstitched\ntopstitches\ntopstitching\ntopsy\ntopwork\ntopworked\ntopworking\ntopworks\ntoque\ntoques\ntor\ntorah\ntorahs\ntorbernite\ntorbernites\ntorch\ntorchbearer\ntorchbearers\ntorched\ntorches\ntorchier\ntorchiere\ntorchieres\ntorchiers\ntorchiest\ntorching\ntorchlight\ntorchlights\ntorchon\ntorchwood\ntorchwoods\ntorchy\ntorchère\ntorchères\ntore\ntoreador\ntoreadors\ntorero\ntoreros\ntoreutic\ntoreutics\ntori\ntoric\ntories\ntorii\ntorino\ntorment\ntormented\ntormenter\ntormenters\ntormentil\ntormentils\ntormenting\ntormentingly\ntormentor\ntormentors\ntorments\ntorn\ntornadic\ntornado\ntornadoes\ntornados\ntornillo\ntornillos\ntoroid\ntoroidal\ntoroidally\ntoroids\ntoronto\ntorose\ntorpedo\ntorpedoed\ntorpedoes\ntorpedoing\ntorpid\ntorpidity\ntorpidly\ntorpor\ntorporific\ntorquate\ntorque\ntorqued\ntorquemada\ntorquer\ntorquers\ntorques\ntorqueses\ntorquey\ntorquing\ntorr\ntorrefaction\ntorrefied\ntorrefies\ntorrefy\ntorrefying\ntorremolinos\ntorrens\ntorrent\ntorrential\ntorrentially\ntorrents\ntorres\ntorrid\ntorrider\ntorridest\ntorridity\ntorridly\ntorridness\ntors\ntorsade\ntorsades\ntorsi\ntorsion\ntorsional\ntorsionally\ntorso\ntorsos\ntort\ntorte\ntortellini\ntorten\ntortes\ntorticollar\ntorticollis\ntorticollises\ntortilla\ntortillas\ntortious\ntortiously\ntortoise\ntortoises\ntortoiseshell\ntortoiseshells\ntortola\ntortoni\ntortricid\ntortricids\ntortrix\ntorts\ntortuga\ntortuosities\ntortuosity\ntortuous\ntortuously\ntortuousness\ntorture\ntortured\ntorturer\ntorturers\ntortures\ntorturing\ntorturous\ntorturously\ntorula\ntorulae\ntorulas\ntorus\ntory\ntoryism\ntosca\ntoscanini\ntosh\ntoss\ntossed\ntosser\ntossers\ntosses\ntossing\ntosspot\ntosspots\ntossup\ntossups\ntostada\ntostadas\ntostado\ntostados\ntot\ntotable\ntotal\ntotaled\ntotaling\ntotalism\ntotalistic\ntotalitarian\ntotalitarianism\ntotalitarianize\ntotalitarianized\ntotalitarianizes\ntotalitarianizing\ntotalitarians\ntotalities\ntotality\ntotalization\ntotalizations\ntotalizator\ntotalizators\ntotalize\ntotalized\ntotalizer\ntotalizers\ntotalizes\ntotalizing\ntotalled\ntotalling\ntotally\ntotals\ntote\ntoted\ntotem\ntotemic\ntotemism\ntotemisms\ntotemist\ntotemistic\ntotemists\ntotems\ntoter\ntoters\ntotes\ntother\ntoting\ntotipalmate\ntotipalmation\ntotipalmations\ntotipotence\ntotipotences\ntotipotencies\ntotipotency\ntotipotent\ntoto\ntots\ntotted\ntotter\ntottered\ntotterer\ntotterers\ntottering\ntotteringly\ntotters\ntottery\ntotting\ntouareg\ntoucan\ntoucanet\ntoucanets\ntoucans\ntouch\ntouchable\ntouchableness\ntouchback\ntouchbacks\ntouchdown\ntouchdowns\ntouched\ntoucher\ntouchers\ntouches\ntouchhole\ntouchholes\ntouchier\ntouchiest\ntouchily\ntouchiness\ntouching\ntouchingly\ntouchingness\ntouchline\ntouchlines\ntouchmark\ntouchmarks\ntouchstone\ntouchstones\ntouchtone\ntouchup\ntouchups\ntouchwood\ntouchwoods\ntouchy\ntouché\ntough\ntoughen\ntoughened\ntoughener\ntougheners\ntoughening\ntoughens\ntougher\ntoughest\ntoughie\ntoughies\ntoughly\ntoughness\ntoughs\ntoughy\ntoulon\ntoulouse\ntoupee\ntoupees\ntouquet\ntour\ntouraco\ntouracos\ntouraine\ntourbillion\ntourbillions\ntourbillon\ntourbillons\ntoured\ntourer\ntourers\ntourette\ntourette's\ntouring\ntourings\ntourism\ntourist\ntouristic\ntouristically\ntourists\ntouristy\ntourmaline\ntourmalines\ntournament\ntournaments\ntournedos\ntourney\ntourneyed\ntourneying\ntourneys\ntourniquet\ntourniquets\ntours\ntouse\ntoused\ntouses\ntousing\ntousle\ntousled\ntousles\ntousling\ntoussaint\ntout\ntouted\ntouter\ntouters\ntouting\ntouts\ntovarich\ntovariches\ntovarish\ntovarishes\ntow\ntowable\ntowage\ntoward\ntowardliness\ntowardly\ntowards\ntowboat\ntowboats\ntowed\ntowel\ntoweled\ntowelette\ntowelettes\ntoweling\ntowelings\ntowelled\ntowelling\ntowellings\ntowels\ntower\ntowered\ntowering\ntoweringly\ntowerish\ntowerlike\ntowers\ntowhead\ntowheaded\ntowheads\ntowhee\ntowhees\ntowing\ntowline\ntowlines\ntown\ntownhouse\ntownhouses\ntownie\ntownies\ntownlet\ntownlets\ntowns\ntownscape\ntownscapes\ntownsend\ntownsfolk\ntownshend\ntownship\ntownships\ntownsman\ntownsmen\ntownspeople\ntownswoman\ntownswomen\ntowny\ntowpath\ntowpaths\ntowrope\ntowropes\ntows\ntoxalbumin\ntoxalbumins\ntoxaphene\ntoxaphenes\ntoxemia\ntoxemic\ntoxic\ntoxically\ntoxicant\ntoxicants\ntoxicities\ntoxicity\ntoxicogenic\ntoxicologic\ntoxicological\ntoxicologically\ntoxicologist\ntoxicologists\ntoxicology\ntoxicoses\ntoxicosis\ntoxics\ntoxigenic\ntoxigenicity\ntoxin\ntoxins\ntoxoid\ntoxoids\ntoxophilite\ntoxophilites\ntoxophily\ntoxoplasma\ntoxoplasmas\ntoxoplasmic\ntoxoplasmoses\ntoxoplasmosis\ntoy\ntoyed\ntoyer\ntoyers\ntoying\ntoylike\ntoynbee\ntoyon\ntoyons\ntoyota\ntoyotas\ntoys\ntoyshop\ntoyshops\ntrabeate\ntrabeated\ntrabeation\ntrabeations\ntrabecula\ntrabeculae\ntrabecular\ntrabeculas\ntrabeculate\ntrace\ntraceability\ntraceable\ntraceableness\ntraceably\ntraced\ntraceless\ntracer\ntraceried\ntraceries\ntracers\ntracery\ntraces\ntrachea\ntracheae\ntracheal\ntracheary\ntracheas\ntracheate\ntracheated\ntracheates\ntracheid\ntracheidal\ntracheids\ntracheitis\ntracheitises\ntracheobronchial\ntracheoesophageal\ntracheolar\ntracheole\ntracheoles\ntracheophyte\ntracheophytes\ntracheoscopic\ntracheoscopies\ntracheoscopy\ntracheostomies\ntracheostomy\ntracheotomies\ntracheotomy\ntrachoma\ntrachomatous\ntrachyte\ntrachytic\ntracing\ntracings\ntrack\ntrackable\ntrackage\ntrackages\ntrackball\ntrackballs\ntracked\ntracker\ntrackers\ntracking\ntracklayer\ntracklayers\ntracklaying\ntrackless\ntrackman\ntrackmen\ntracks\ntrackside\ntracksides\ntracksuit\ntracksuits\ntrackwalker\ntrackwalkers\ntrackway\ntrackways\ntract\ntractability\ntractable\ntractableness\ntractably\ntractarian\ntractarianism\ntractarians\ntractate\ntractates\ntractile\ntractility\ntraction\ntractional\ntractive\ntractor\ntractors\ntracts\ntracy\ntradable\ntrade\ntradeable\ntradecraft\ntradecrafts\ntraded\ntrademark\ntrademarked\ntrademarking\ntrademarks\ntradeoff\ntradeoffs\ntrader\ntraders\ntrades\ntradescantia\ntradescantias\ntradesman\ntradesmen\ntradespeople\ntrading\ntradition\ntraditional\ntraditionalism\ntraditionalist\ntraditionalistic\ntraditionalists\ntraditionalize\ntraditionalized\ntraditionalizes\ntraditionalizing\ntraditionally\ntraditionary\ntraditionless\ntraditions\ntraditor\ntraditores\ntraduce\ntraduced\ntraducement\ntraducements\ntraducer\ntraducers\ntraduces\ntraducianism\ntraducianist\ntraducianistic\ntraducianists\ntraducing\ntraducingly\ntrafalgar\ntraffic\ntrafficability\ntrafficable\ntrafficked\ntrafficker\ntraffickers\ntrafficking\ntraffics\ntragacanth\ntragacanths\ntragedian\ntragedians\ntragedienne\ntragediennes\ntragedies\ntragedy\ntragi\ntragic\ntragical\ntragically\ntragicalness\ntragicomedies\ntragicomedy\ntragicomic\ntragicomical\ntragicomically\ntragopan\ntragopans\ntragus\ntrail\ntrailblazer\ntrailblazers\ntrailblazing\ntrailbreaker\ntrailbreakers\ntrailed\ntrailer\ntrailerable\ntrailered\ntrailering\ntrailerist\ntrailerists\ntrailerite\ntrailerites\ntrailers\ntrailhead\ntrailheads\ntrailing\ntrailless\ntrails\ntrailside\ntrailsides\ntrain\ntrainability\ntrainable\ntrainband\ntrainbands\ntrainbearer\ntrainbearers\ntrained\ntrainee\ntrainees\ntraineeship\ntrainer\ntrainers\ntrainful\ntrainfuls\ntraining\ntrainload\ntrainloads\ntrainman\ntrainmaster\ntrainmasters\ntrainmen\ntrains\ntraipse\ntraipsed\ntraipses\ntraipsing\ntrait\ntraitor\ntraitoress\ntraitoresses\ntraitorous\ntraitorously\ntraitorousness\ntraitors\ntraitress\ntraitresses\ntraits\ntrajan\ntraject\ntrajected\ntrajecting\ntrajection\ntrajections\ntrajectories\ntrajectory\ntrajects\ntrakehner\ntrakehners\ntram\ntramcar\ntramcars\ntramline\ntramlines\ntrammed\ntrammel\ntrammeled\ntrammeler\ntrammelers\ntrammeling\ntrammelled\ntrammelling\ntrammels\ntramming\ntramontane\ntramontanes\ntramp\ntramped\ntramper\ntrampers\ntramping\ntrampish\ntrample\ntrampled\ntrampler\ntramplers\ntramples\ntrampling\ntrampoline\ntrampoliner\ntrampoliners\ntrampolines\ntrampolining\ntrampolinist\ntrampolinists\ntramps\ntrampy\ntrams\ntramway\ntramways\ntrance\ntranced\ntrancelike\ntrances\ntranche\ntrancing\ntranquil\ntranquility\ntranquilization\ntranquilizations\ntranquilize\ntranquilized\ntranquilizer\ntranquilizers\ntranquilizes\ntranquilizing\ntranquillity\ntranquillize\ntranquillized\ntranquillizer\ntranquillizers\ntranquillizes\ntranquillizing\ntranquilly\ntranquilness\ntrans\ntransact\ntransacted\ntransacting\ntransactinide\ntransaction\ntransactional\ntransactions\ntransactivate\ntransactivated\ntransactivates\ntransactivating\ntransactivation\ntransactivations\ntransactivator\ntransactivators\ntransactor\ntransactors\ntransacts\ntransalpine\ntransaminase\ntransaminases\ntransamination\ntransaminations\ntransatlantic\ntransaxle\ntransaxles\ntranscaucasia\ntranscaucasian\ntranscaucasians\ntransceiver\ntransceivers\ntranscend\ntranscended\ntranscendence\ntranscendency\ntranscendent\ntranscendental\ntranscendentalism\ntranscendentalist\ntranscendentalists\ntranscendentally\ntranscendently\ntranscending\ntranscends\ntransconductance\ntranscontinental\ntranscribable\ntranscribe\ntranscribed\ntranscriber\ntranscribers\ntranscribes\ntranscribing\ntranscript\ntranscriptase\ntranscriptases\ntranscription\ntranscriptional\ntranscriptionally\ntranscriptionist\ntranscriptionists\ntranscriptions\ntranscripts\ntranscultural\ntransculturation\ntransculturations\ntranscurrent\ntranscutaneous\ntransdermal\ntransdermals\ntransdisciplinary\ntransduce\ntransduced\ntransducer\ntransducers\ntransduces\ntransducing\ntransductant\ntransductants\ntransduction\ntransductional\ntransductions\ntransect\ntransected\ntransecting\ntransection\ntransections\ntransects\ntransept\ntranseptal\ntransepts\ntranseunt\ntransfect\ntransfected\ntransfecting\ntransfection\ntransfections\ntransfects\ntransfer\ntransferability\ntransferable\ntransferal\ntransferals\ntransferase\ntransferases\ntransferee\ntransferees\ntransference\ntransferential\ntransferor\ntransferors\ntransferrable\ntransferred\ntransferrer\ntransferrers\ntransferrin\ntransferring\ntransferrins\ntransfers\ntransfiguration\ntransfigurations\ntransfigure\ntransfigured\ntransfigurement\ntransfigures\ntransfiguring\ntransfinite\ntransfix\ntransfixed\ntransfixes\ntransfixing\ntransfixion\ntransfixions\ntransform\ntransformable\ntransformation\ntransformational\ntransformationalist\ntransformationalists\ntransformationally\ntransformations\ntransformative\ntransformed\ntransformer\ntransformers\ntransforming\ntransforms\ntransfusable\ntransfuse\ntransfused\ntransfuser\ntransfusers\ntransfuses\ntransfusible\ntransfusing\ntransfusion\ntransfusional\ntransfusions\ntransfusive\ntransgenic\ntransgress\ntransgressed\ntransgresses\ntransgressible\ntransgressing\ntransgression\ntransgressions\ntransgressive\ntransgressively\ntransgressor\ntransgressors\ntranship\ntranshipped\ntranshipping\ntranships\ntranshistorical\ntranshumance\ntranshumant\ntranshumants\ntransience\ntransiency\ntransient\ntransiently\ntransients\ntransilluminate\ntransilluminated\ntransilluminates\ntransilluminating\ntransillumination\ntransilluminations\ntransilluminator\ntransilluminators\ntransistor\ntransistorization\ntransistorizations\ntransistorize\ntransistorized\ntransistorizes\ntransistorizing\ntransistors\ntransit\ntransited\ntransiting\ntransition\ntransitional\ntransitionally\ntransitionary\ntransitions\ntransitive\ntransitively\ntransitiveness\ntransitives\ntransitivity\ntransitorily\ntransitoriness\ntransitory\ntransits\ntransjordan\ntransjordanian\ntransjordanians\ntranskei\ntranskeian\ntranskeians\ntranslatability\ntranslatable\ntranslatableness\ntranslate\ntranslated\ntranslates\ntranslating\ntranslation\ntranslational\ntranslations\ntranslative\ntranslator\ntranslatorial\ntranslators\ntranslatory\ntransliterate\ntransliterated\ntransliterates\ntransliterating\ntransliteration\ntransliterations\ntranslocate\ntranslocated\ntranslocates\ntranslocating\ntranslocation\ntranslocations\ntranslucence\ntranslucency\ntranslucent\ntranslucently\ntranslunar\ntransmarine\ntransmembrane\ntransmigrant\ntransmigrants\ntransmigrate\ntransmigrated\ntransmigrates\ntransmigrating\ntransmigration\ntransmigrationism\ntransmigrations\ntransmigrator\ntransmigrators\ntransmigratory\ntransmissibility\ntransmissible\ntransmission\ntransmissions\ntransmissive\ntransmissivity\ntransmissometer\ntransmissometers\ntransmissometry\ntransmit\ntransmits\ntransmittable\ntransmittal\ntransmittals\ntransmittance\ntransmittances\ntransmitted\ntransmitter\ntransmitters\ntransmitting\ntransmogrification\ntransmogrifications\ntransmogrified\ntransmogrifies\ntransmogrify\ntransmogrifying\ntransmontane\ntransmountain\ntransmundane\ntransmutability\ntransmutable\ntransmutableness\ntransmutably\ntransmutation\ntransmutational\ntransmutations\ntransmutative\ntransmute\ntransmuted\ntransmuter\ntransmuters\ntransmutes\ntransmuting\ntransnational\ntransnationalism\ntransnatural\ntransoceanic\ntransom\ntransoms\ntransonic\ntranspacific\ntransparence\ntransparencies\ntransparency\ntransparent\ntransparentize\ntransparentized\ntransparentizes\ntransparentizing\ntransparently\ntransparentness\ntranspersonal\ntranspicuous\ntranspierce\ntranspierced\ntranspierces\ntranspiercing\ntranspiration\ntranspirational\ntranspire\ntranspired\ntranspires\ntranspiring\ntransplacental\ntransplacentally\ntransplant\ntransplantability\ntransplantable\ntransplantation\ntransplantations\ntransplanted\ntransplanter\ntransplanters\ntransplanting\ntransplants\ntranspolar\ntransponder\ntransponders\ntranspontine\ntransport\ntransportability\ntransportable\ntransportation\ntransportational\ntransported\ntransporter\ntransporters\ntransporting\ntransportive\ntransports\ntransposable\ntranspose\ntransposed\ntransposes\ntransposing\ntransposition\ntranspositional\ntranspositions\ntransposon\ntransposons\ntranssexual\ntranssexualism\ntranssexuality\ntranssexuals\ntransshape\ntransshaped\ntransshapes\ntransshaping\ntransship\ntransshipment\ntransshipments\ntransshipped\ntransshipping\ntransships\ntranssonic\ntransthoracic\ntransthoracically\ntransubstantial\ntransubstantiate\ntransubstantiated\ntransubstantiates\ntransubstantiating\ntransubstantiation\ntransubstantiationalist\ntransubstantiationalists\ntransubstantiations\ntransudate\ntransudates\ntransudation\ntransudations\ntransudatory\ntransude\ntransuded\ntransudes\ntransuding\ntransuranic\ntransuranium\ntransurethral\ntransvaal\ntransvaluate\ntransvaluated\ntransvaluates\ntransvaluating\ntransvaluation\ntransvaluations\ntransvalue\ntransvalued\ntransvalues\ntransvaluing\ntransversal\ntransversally\ntransversals\ntransverse\ntransversely\ntransverseness\ntransverses\ntransvestism\ntransvestite\ntransvestites\ntransvestitism\ntransylvania\ntransylvanian\ntransylvanians\ntrap\ntrapdoor\ntrapdoors\ntrapeze\ntrapezes\ntrapezia\ntrapeziform\ntrapezist\ntrapezists\ntrapezium\ntrapeziums\ntrapezius\ntrapeziuses\ntrapezohedra\ntrapezohedron\ntrapezohedrons\ntrapezoid\ntrapezoidal\ntrapezoids\ntraplight\ntraplights\ntrapline\ntraplines\ntrapped\ntrapper\ntrappers\ntrapping\ntrappings\ntrappist\ntrappists\ntraprock\ntraprocks\ntraps\ntrapshooter\ntrapshooters\ntrapshooting\ntrapunto\ntrapuntos\ntrash\ntrashed\ntrashes\ntrashier\ntrashiest\ntrashily\ntrashiness\ntrashing\ntrashman\ntrashmen\ntrashy\ntrass\ntrasses\ntrattoria\ntrattorias\ntrattorie\ntrauma\ntraumas\ntraumata\ntraumatic\ntraumatically\ntraumatism\ntraumatisms\ntraumatization\ntraumatizations\ntraumatize\ntraumatized\ntraumatizes\ntraumatizing\ntraumatological\ntraumatologist\ntraumatologists\ntraumatology\ntravail\ntravailed\ntravailing\ntravails\ntrave\ntravel\ntraveled\ntraveler\ntraveler's\ntravelers\ntraveling\ntravelled\ntraveller\ntravellers\ntravelling\ntravelog\ntravelogs\ntravelogue\ntravelogues\ntravels\ntraversable\ntraversal\ntraversals\ntraverse\ntraversed\ntraverser\ntraversers\ntraverses\ntraversing\ntravertine\ntravertines\ntraves\ntravestied\ntravesties\ntravesty\ntravestying\ntraviata\ntravois\ntravoise\ntravoises\ntrawl\ntrawled\ntrawler\ntrawlerman\ntrawlermen\ntrawlers\ntrawling\ntrawls\ntray\ntrayful\ntrayfuls\ntrays\ntrazodone\ntrazodones\ntreacheries\ntreacherous\ntreacherously\ntreacherousness\ntreachery\ntreacle\ntreacly\ntread\ntreaded\ntreader\ntreaders\ntreading\ntreadle\ntreadled\ntreadler\ntreadlers\ntreadles\ntreadless\ntreadling\ntreadmill\ntreadmills\ntreads\ntreason\ntreasonable\ntreasonableness\ntreasonably\ntreasonous\ntreasonously\ntreasurable\ntreasure\ntreasured\ntreasurer\ntreasurers\ntreasurership\ntreasures\ntreasuries\ntreasuring\ntreasury\ntreat\ntreatability\ntreatable\ntreated\ntreater\ntreaters\ntreaties\ntreating\ntreatise\ntreatises\ntreatment\ntreatments\ntreats\ntreaty\ntrebizond\ntreble\ntrebled\ntrebleness\ntrebles\ntrebling\ntrebly\ntrebuchet\ntrebuchets\ntrebucket\ntrebuckets\ntrecento\ntredecillion\ntredecillions\ntree\ntreed\ntreehopper\ntreehoppers\ntreeing\ntreeless\ntreelike\ntreen\ntreenail\ntreenails\ntreens\ntrees\ntreetop\ntreetops\ntref\ntrefoil\ntrefoils\ntrehala\ntrehalas\ntrehalase\ntrehalases\ntrehalose\ntrehaloses\ntreillage\ntreillages\ntrek\ntrekked\ntrekker\ntrekkers\ntrekking\ntreks\ntrellis\ntrellised\ntrellises\ntrellising\ntrelliswork\ntrematode\ntrematodes\ntrematodiasis\ntremble\ntrembled\ntrembler\ntremblers\ntrembles\ntrembling\ntremblingly\ntrembly\ntremendous\ntremendously\ntremendousness\ntremens\ntremolite\ntremolites\ntremolitic\ntremolo\ntremolos\ntremor\ntremors\ntremulant\ntremulous\ntremulously\ntremulousness\ntrenail\ntrenails\ntrench\ntrenchancy\ntrenchant\ntrenchantly\ntrenched\ntrencher\ntrencherman\ntrenchermen\ntrenchers\ntrenches\ntrenching\ntrend\ntrended\ntrendier\ntrendies\ntrendiest\ntrendily\ntrendiness\ntrending\ntrends\ntrendsetter\ntrendsetters\ntrendsetting\ntrendy\ntrentino\ntrenton\ntrepan\ntrepanation\ntrepanations\ntrepang\ntrepangs\ntrepanned\ntrepanning\ntrepans\ntrephination\ntrephinations\ntrephine\ntrephined\ntrephines\ntrephining\ntrepid\ntrepidant\ntrepidation\ntreponema\ntreponemal\ntreponemas\ntreponemata\ntreponematoses\ntreponematosis\ntreponematous\ntreponeme\ntreponemes\ntrespass\ntrespassed\ntrespasser\ntrespassers\ntrespasses\ntrespassing\ntress\ntressed\ntressel\ntressels\ntresses\ntrestle\ntrestles\ntrestletree\ntrestletrees\ntrestlework\ntretinoin\ntretinoins\ntrevallies\ntrevally\ntrevelyan\ntrevithick\ntrews\ntrey\ntreys\ntriable\ntriableness\ntriacetate\ntriacetates\ntriacid\ntriacids\ntriad\ntriadelphous\ntriadic\ntriadically\ntriads\ntriage\ntriages\ntrial\ntrialogue\ntrialogues\ntrials\ntriamcinolone\ntriamcinolones\ntriandrous\ntriangle\ntriangles\ntriangular\ntriangularity\ntriangularly\ntriangulate\ntriangulated\ntriangulates\ntriangulating\ntriangulation\ntriangulations\ntriangulum\ntriarchies\ntriarchy\ntriassic\ntriathlete\ntriathletes\ntriathlon\ntriathlons\ntriatomic\ntriaxial\ntriaxiality\ntriazine\ntriazines\ntriazole\ntriazoles\ntribade\ntribades\ntribadism\ntribal\ntribalism\ntribalisms\ntribalist\ntribalistic\ntribalists\ntribally\ntribasic\ntribe\ntribes\ntribesman\ntribesmen\ntribespeople\ntribeswoman\ntribeswomen\ntriboelectric\ntriboelectricities\ntriboelectricity\ntribological\ntribologist\ntribologists\ntribology\ntriboluminescence\ntriboluminescent\ntribrach\ntribrachic\ntribrachs\ntribromoethanol\ntribromoethanols\ntribulate\ntribulated\ntribulates\ntribulating\ntribulation\ntribulations\ntribunal\ntribunals\ntribunary\ntribunate\ntribunates\ntribune\ntribunes\ntribuneship\ntributaries\ntributary\ntribute\ntributes\ntricameral\ntricarboxylic\ntrice\ntriced\ntricentennial\ntricentennials\ntriceps\ntricepses\ntriceratops\ntriceratopses\ntrices\ntrichiasis\ntrichina\ntrichinae\ntrichinal\ntrichinas\ntrichinization\ntrichinizations\ntrichinize\ntrichinized\ntrichinizes\ntrichinizing\ntrichinoses\ntrichinosis\ntrichinous\ntrichite\ntrichites\ntrichitic\ntrichlorethylene\ntrichlorethylenes\ntrichlorfon\ntrichlorfons\ntrichlorid\ntrichloride\ntrichlorides\ntrichlorids\ntrichloroacetic\ntrichloroethane\ntrichloroethylene\ntrichloroethylenes\ntrichlorphon\ntrichlorphons\ntrichocyst\ntrichocystic\ntrichocysts\ntrichogyne\ntrichogynes\ntrichoid\ntrichologist\ntrichologists\ntrichology\ntrichome\ntrichomes\ntrichomic\ntrichomonacidal\ntrichomonacide\ntrichomonacides\ntrichomonad\ntrichomonadal\ntrichomonads\ntrichomonal\ntrichomoniases\ntrichomoniasis\ntrichopteran\ntrichopterans\ntrichoses\ntrichosis\ntrichothecene\ntrichothecenes\ntrichotomic\ntrichotomies\ntrichotomous\ntrichotomously\ntrichotomy\ntrichroic\ntrichroism\ntrichroisms\ntrichromat\ntrichromatic\ntrichromatism\ntrichromats\ntrichrome\ntrichromic\ntrichuriases\ntrichuriasis\ntricing\ntrick\ntricked\ntricker\ntrickeries\ntrickers\ntrickery\ntrickier\ntrickiest\ntrickily\ntrickiness\ntricking\ntrickish\ntrickishly\ntrickishness\ntrickle\ntrickled\ntrickles\ntrickling\ntricks\ntricksier\ntricksiest\ntricksiness\ntrickster\ntricksters\ntricksy\ntricky\ntriclad\ntriclads\ntriclinia\ntriclinic\ntriclinium\ntricolette\ntricolettes\ntricolor\ntricolored\ntricolors\ntricorn\ntricorne\ntricornered\ntricornes\ntricorns\ntricostate\ntricot\ntricotine\ntricotines\ntricots\ntricrotic\ntricrotism\ntrictrac\ntricuspid\ntricuspidal\ntricuspidate\ntricuspids\ntricycle\ntricycles\ntricyclic\ntricyclics\ntridactyl\ntridactylous\ntrident\ntridentate\ntridentine\ntridentines\ntridents\ntridimensional\ntridimensionality\ntriduum\ntried\ntriene\ntrienes\ntriennia\ntriennial\ntriennially\ntriennials\ntriennium\ntrienniums\ntrier\ntrierarch\ntrierarchies\ntrierarchs\ntrierarchy\ntriers\ntries\ntrieste\ntriethiodide\ntriethyl\ntrifacial\ntrifecta\ntrifectas\ntrifid\ntrifle\ntrifled\ntrifler\ntriflers\ntrifles\ntrifling\ntriflingly\ntrifluoperazine\ntrifluoperazines\ntrifluralin\ntrifluralins\ntrifocal\ntrifocals\ntrifoliate\ntrifoliated\ntrifoliolate\ntrifolium\ntriforia\ntriforium\ntriform\ntriformed\ntrifurcate\ntrifurcated\ntrifurcates\ntrifurcating\ntrifurcation\ntrifurcations\ntrig\ntrigamous\ntrigeminal\ntrigemini\ntrigeminus\ntrigged\ntrigger\ntriggered\ntriggerfish\ntriggerfishes\ntriggering\ntriggerman\ntriggermen\ntriggers\ntrigging\ntrigly\ntriglyceride\ntriglycerides\ntriglyph\ntriglyphic\ntriglyphical\ntriglyphs\ntrigness\ntrigon\ntrigonal\ntrigonally\ntrigonometric\ntrigonometrical\ntrigonometrically\ntrigonometry\ntrigons\ntrigram\ntrigrammatic\ntrigrammatically\ntrigrams\ntrigraph\ntrigraphic\ntrigraphically\ntrigraphs\ntrigs\ntrigynous\ntrihalomethane\ntrihalomethanes\ntrihedra\ntrihedral\ntrihedrals\ntrihedron\ntrihedrons\ntrihybrid\ntrihybrids\ntrihydric\ntrihydroxy\ntriiodothyronine\ntriiodothyronines\ntrijet\ntrijets\ntrike\ntrikes\ntrilabiate\ntrilateral\ntrilateralism\ntrilateralisms\ntrilateralist\ntrilateralists\ntrilaterally\ntrilbies\ntrilby\ntrilinear\ntrilingual\ntrilingualism\ntrilingually\ntrilinguals\ntriliteral\ntriliteralism\ntriliterals\ntrilith\ntrilithic\ntrilithon\ntrilithons\ntriliths\ntrill\ntrilled\ntriller\ntrillers\ntrilling\ntrillion\ntrillions\ntrillionth\ntrillionths\ntrillium\ntrilliums\ntrills\ntrilobate\ntrilobated\ntrilobed\ntrilobite\ntrilobites\ntrilobitic\ntrilocular\ntrilogies\ntrilogy\ntrim\ntrimaran\ntrimarans\ntrimer\ntrimeric\ntrimerism\ntrimerous\ntrimers\ntrimester\ntrimesters\ntrimestral\ntrimestrial\ntrimeter\ntrimeters\ntrimethadione\ntrimethadiones\ntrimethoprim\ntrimethoprims\ntrimetric\ntrimetrical\ntrimetrogon\ntrimetrogons\ntrimly\ntrimmed\ntrimmer\ntrimmers\ntrimmest\ntrimming\ntrimmings\ntrimness\ntrimolecular\ntrimonthly\ntrimorph\ntrimorphic\ntrimorphically\ntrimorphism\ntrimorphous\ntrimorphs\ntrimotor\ntrimotors\ntrims\ntrimurti\ntrinal\ntrinary\ntrincomalee\ntrine\ntrines\ntrinidad\ntrinidadian\ntrinidadians\ntrinitarian\ntrinitarianism\ntrinitarians\ntrinities\ntrinitrobenzene\ntrinitrobenzenes\ntrinitrocresol\ntrinitrocresols\ntrinitrophenol\ntrinitrophenols\ntrinitrotoluene\ntrinitrotoluenes\ntrinitrotoluol\ntrinitrotoluols\ntrinity\ntrinitytide\ntrinket\ntrinketer\ntrinketers\ntrinketry\ntrinkets\ntrinocular\ntrinomial\ntrinomialism\ntrinomials\ntrinucleotide\ntrinucleotides\ntrio\ntriode\ntriodes\ntriol\ntriolet\ntriolets\ntriols\ntrios\ntriose\ntrioses\ntrioxid\ntrioxide\ntrioxides\ntrioxids\ntrip\ntripack\ntripacks\ntripalmitin\ntripalmitins\ntripartite\ntripartitely\ntripartition\ntripartitions\ntripe\ntripedal\ntripeptide\ntripeptides\ntripetalous\ntriphammer\ntriphammers\ntriphenylmethane\ntriphenylmethanes\ntriphibian\ntriphibians\ntriphibious\ntriphosphatase\ntriphosphate\ntriphosphates\ntriphosphopyridine\ntriphthong\ntriphthongal\ntriphthongs\ntripinnate\ntripinnately\ntriplane\ntriplanes\ntriple\ntripled\ntripleheader\ntripleheaders\ntriples\ntriplet\ntripletail\ntripletails\ntriplets\ntriplex\ntriplexes\ntriplicate\ntriplicated\ntriplicately\ntriplicates\ntriplicating\ntriplication\ntriplications\ntriplicities\ntriplicity\ntripling\ntriploblastic\ntriploid\ntriploids\ntriploidy\ntriply\ntripod\ntripodal\ntripods\ntripoli\ntripolis\ntripolitan\ntripolitania\ntripolitanian\ntripolitanians\ntripolitans\ntripolyphosphate\ntripos\ntriposes\ntripped\ntripper\ntrippers\ntrippet\ntrippets\ntripping\ntrippingly\ntrippy\ntrips\ntriptane\ntriptanes\ntriptych\ntriptychs\ntripura\ntripwire\ntripwires\ntriquetra\ntriquetral\ntriquetrous\ntriquetrum\ntriradiate\ntrireme\ntriremes\ntrisaccharide\ntrisaccharides\ntrisagion\ntrisect\ntrisected\ntrisecting\ntrisection\ntrisections\ntrisector\ntrisectors\ntrisects\ntrisepalous\ntrishaw\ntrishaws\ntriskaidekaphobia\ntriskaidekaphobias\ntriskele\ntriskeles\ntriskelia\ntriskelion\ntrismic\ntrismus\ntrisoctahedra\ntrisoctahedral\ntrisoctahedron\ntrisoctahedrons\ntrisodium\ntrisome\ntrisomes\ntrisomic\ntrisomies\ntrisomy\ntristan\ntristate\ntriste\ntristearin\ntristearins\ntristeza\ntristful\ntristfully\ntristfulness\ntristich\ntristichs\ntristimulus\ntristram\ntrisubstituted\ntrisulfide\ntrisulfides\ntrisyllabic\ntrisyllabical\ntrisyllabically\ntrisyllable\ntrisyllables\ntritanopia\ntritanopias\ntrite\ntritely\ntriteness\ntriter\ntritest\ntritheism\ntritheist\ntritheistic\ntritheistical\ntritheists\ntritiate\ntritiated\ntritiates\ntritiating\ntritiation\ntriticale\ntriticales\ntritium\ntritoma\ntritomas\ntriton\ntritone\ntritones\ntritons\ntriturable\ntriturate\ntriturated\ntriturates\ntriturating\ntrituration\ntriturations\ntriturator\ntriturators\ntriumph\ntriumphal\ntriumphalism\ntriumphalisms\ntriumphalist\ntriumphalists\ntriumphant\ntriumphantly\ntriumphed\ntriumphing\ntriumphs\ntriumvir\ntriumviral\ntriumvirate\ntriumvirates\ntriumviri\ntriumvirs\ntriune\ntriunes\ntriunities\ntriunity\ntrivalence\ntrivalency\ntrivalent\ntrivalve\ntrivet\ntrivets\ntrivia\ntrivial\ntrivialist\ntrivialists\ntrivialities\ntriviality\ntrivialization\ntrivializations\ntrivialize\ntrivialized\ntrivializes\ntrivializing\ntrivially\ntrivialness\ntrivium\ntriweeklies\ntriweekly\ntrobriand\ntrocar\ntrocars\ntrochaic\ntrochaics\ntrochal\ntrochanter\ntrochanteral\ntrochanteric\ntrochanters\ntrochar\ntrochars\ntroche\ntrochee\ntrochees\ntroches\ntrochlea\ntrochleae\ntrochlear\ntrochoid\ntrochoidal\ntrochoidally\ntrochoids\ntrochophore\ntrochophores\ntrod\ntrodden\ntroffer\ntroffers\ntroglodyte\ntroglodytes\ntroglodytic\ntroglodytical\ntrogon\ntrogons\ntroika\ntroikas\ntroilite\ntroilites\ntroilus\ntrois\ntrojan\ntrojans\ntroll\ntrolled\ntroller\ntrollers\ntrolley\ntrolleybus\ntrolleybuses\ntrolleyed\ntrolleying\ntrolleys\ntrollied\ntrollies\ntrolling\ntrollop\ntrollope\ntrollops\ntrolls\ntrolly\ntrollying\ntrombe\ntrombiculiasis\ntrombiculoses\ntrombiculosis\ntrombone\ntrombones\ntrombonist\ntrombonists\ntrommel\ntrommels\ntromp\ntrompe\ntromped\ntrompes\ntromping\ntromps\ntromsö\ntrona\ntronas\ntrondheim\ntroop\ntrooped\ntrooper\ntroopers\ntrooping\ntroops\ntroopship\ntroopships\ntroostite\ntroostites\ntrop\ntrope\ntropes\ntropez\ntrophallaxes\ntrophallaxis\ntrophic\ntrophically\ntrophies\ntrophoblast\ntrophoblastic\ntrophoblasts\ntrophoderm\ntrophoderms\ntrophozoite\ntrophozoites\ntrophy\ntropic\ntropical\ntropicalize\ntropicalized\ntropicalizes\ntropicalizing\ntropically\ntropicals\ntropicbird\ntropicbirds\ntropics\ntropin\ntropine\ntropines\ntropins\ntropism\ntropistic\ntropistically\ntropocollagen\ntropocollagens\ntropologic\ntropological\ntropologically\ntropologies\ntropology\ntropomyosin\ntropomyosins\ntroponin\ntroponins\ntropopause\ntropopauses\ntropophyte\ntropophytes\ntropophytic\ntroposphere\ntropospheric\ntropotactic\ntropotactically\ntropotaxis\ntropotaxises\ntroppo\ntrot\ntroth\ntrothed\ntrothing\ntrothplight\ntrothplighted\ntrothplighting\ntrothplights\ntroths\ntrotline\ntrotlines\ntrots\ntrotsky\ntrotskyism\ntrotskyist\ntrotskyists\ntrotskyite\ntrotskyites\ntrotted\ntrotter\ntrotters\ntrotting\ntroubadour\ntroubadours\ntrouble\ntroubled\ntroublemaker\ntroublemakers\ntroublemaking\ntroubler\ntroublers\ntroubles\ntroubleshoot\ntroubleshooter\ntroubleshooters\ntroubleshooting\ntroubleshoots\ntroubleshot\ntroublesome\ntroublesomely\ntroublesomeness\ntroubling\ntroublingly\ntroublous\ntroublously\ntroublousness\ntrough\ntroughs\ntrounce\ntrounced\ntrounces\ntrouncing\ntroupe\ntrouped\ntrouper\ntroupers\ntroupes\ntroupial\ntroupials\ntrouping\ntrouser\ntrousers\ntrousseau\ntrousseaus\ntrousseaux\ntrout\ntroutier\ntroutiest\ntroutperch\ntroutperches\ntrouts\ntrouty\ntrouvere\ntrouveres\ntrouveur\ntrouveurs\ntrouville\ntrouvère\ntrouvères\ntrove\ntrover\ntrovers\ntroves\ntrow\ntrowed\ntrowel\ntroweled\ntroweler\ntrowelers\ntroweling\ntrowelled\ntroweller\ntrowellers\ntrowelling\ntrowels\ntrowing\ntrows\ntrowser\ntrowsers\ntroy\ntroôdos\ntruancies\ntruancy\ntruant\ntruanted\ntruanting\ntruantries\ntruantry\ntruants\ntruce\ntrucebreaker\ntrucebreakers\ntruced\ntruces\ntrucing\ntruck\ntruckage\ntrucked\ntrucker\ntruckers\ntruckful\ntruckfuls\ntrucking\ntruckle\ntruckled\ntruckler\ntrucklers\ntruckles\ntruckline\ntrucklines\ntruckling\ntruckload\ntruckloads\ntruckman\ntruckmaster\ntruckmasters\ntruckmen\ntrucks\ntruculence\ntruculences\ntruculencies\ntruculency\ntruculent\ntruculently\ntrudge\ntrudged\ntrudgen\ntrudgens\ntrudgeon\ntrudgeons\ntrudger\ntrudgers\ntrudges\ntrudging\ntrue\ntrueborn\ntrued\ntruehearted\ntrueheartedness\ntrueing\ntruelove\ntrueloves\ntrueness\ntruepennies\ntruepenny\ntruer\ntrues\ntruest\ntruffle\ntruffled\ntruffles\ntruing\ntruism\ntruisms\ntruistic\ntruk\ntrull\ntrulls\ntruly\ntrump\ntrumped\ntrumperies\ntrumpery\ntrumpet\ntrumpeted\ntrumpeter\ntrumpeters\ntrumpeting\ntrumpetlike\ntrumpets\ntrumping\ntrumps\ntruncate\ntruncated\ntruncately\ntruncates\ntruncating\ntruncation\ntruncations\ntruncheon\ntruncheoned\ntruncheoning\ntruncheons\ntrundle\ntrundled\ntrundler\ntrundlers\ntrundles\ntrundling\ntrunk\ntrunked\ntrunkfish\ntrunkfishes\ntrunkful\ntrunkfuls\ntrunks\ntrunnel\ntrunnels\ntrunnion\ntrunnions\ntruss\ntrussed\ntrusser\ntrussers\ntrusses\ntrussing\ntrust\ntrustability\ntrustable\ntrustbuster\ntrustbusters\ntrustbusting\ntrustbustings\ntrusted\ntrustee\ntrusteed\ntrusteeing\ntrustees\ntrusteeship\ntrusteeships\ntruster\ntrusters\ntrustful\ntrustfully\ntrustfulness\ntrustier\ntrusties\ntrustiest\ntrustily\ntrustiness\ntrusting\ntrustingly\ntrustingness\ntrustless\ntrusts\ntrustworthier\ntrustworthiest\ntrustworthily\ntrustworthiness\ntrustworthy\ntrusty\ntruth\ntruthful\ntruthfully\ntruthfulness\ntruths\ntry\ntrying\ntryingly\ntryout\ntryouts\ntrypanosomal\ntrypanosome\ntrypanosomes\ntrypanosomiases\ntrypanosomiasis\ntrypanosomic\ntryparsamide\ntryparsamides\ntrypsin\ntrypsinogen\ntrypsinogens\ntrypsins\ntryptamine\ntryptamines\ntryptic\ntryptophan\ntryptophane\ntryptophanes\ntryptophans\ntrysail\ntrysails\ntryst\ntrysted\ntryster\ntrysters\ntrysting\ntrysts\ntryworks\ntsade\ntsades\ntsar\ntsars\ntsarskoye\ntsatske\ntsatskes\ntsetse\ntshiluba\ntsimmes\ntsimmeses\ntsimshian\ntsimshians\ntsinghai\ntsk\ntsked\ntsking\ntsks\ntsunami\ntsunamic\ntsunamis\ntsuris\ntsurises\ntsushima\ntsutsugamushi\ntswana\ntswanas\ntu\ntuamotu\ntuan\ntuareg\ntuaregs\ntuatara\ntuataras\ntub\ntuba\ntubaist\ntubaists\ntubal\ntubas\ntubate\ntubbable\ntubbed\ntubber\ntubbers\ntubbier\ntubbiest\ntubbiness\ntubbing\ntubby\ntube\ntubectomies\ntubectomy\ntubed\ntubeless\ntubelike\ntubenose\ntubenoses\ntuber\ntubercle\ntubercles\ntubercular\ntuberculars\ntuberculate\ntuberculated\ntuberculately\ntuberculation\ntuberculations\ntuberculin\ntuberculins\ntuberculoid\ntuberculoses\ntuberculosis\ntuberculous\ntuberculously\ntuberose\ntuberoses\ntuberosities\ntuberosity\ntuberous\ntubers\ntuberworm\ntuberworms\ntubes\ntubeworm\ntubeworms\ntubful\ntubfuls\ntubicolous\ntubifex\ntubifexes\ntubificid\ntubificids\ntubing\ntubist\ntubists\ntublike\ntubocurarine\ntubocurarines\ntuboplasties\ntuboplasty\ntubs\ntubuai\ntubular\ntubularity\ntubularly\ntubulate\ntubulated\ntubulation\ntubulations\ntubulator\ntubulators\ntubule\ntubules\ntubuliferous\ntubuliflorous\ntubulin\ntubulins\ntubulous\ntubulously\ntucana\ntuchun\ntuchuns\ntuck\ntuckahoe\ntuckahoes\ntucked\ntucker\ntuckered\ntuckering\ntuckers\ntucket\ntuckets\ntucking\ntucks\ntuckshop\ntuckshops\ntucson\ntudor\ntudors\ntuesday\ntuesdays\ntufa\ntufaceous\ntufas\ntuff\ntuffaceous\ntuffet\ntuffets\ntuffs\ntuft\ntufted\ntufter\ntufters\ntufting\ntufts\ntufty\ntug\ntugboat\ntugboats\ntugged\ntugger\ntuggers\ntugging\ntughrik\ntughriks\ntugrik\ntugriks\ntugs\ntui\ntuille\ntuilles\ntuis\ntuition\ntuitional\ntuitionary\ntularemia\ntularemic\ntule\ntules\ntulip\ntulips\ntulipwood\ntulipwoods\ntulle\ntulles\ntullibee\ntullibees\ntulsa\ntumble\ntumblebug\ntumblebugs\ntumbled\ntumbledown\ntumblehome\ntumblehomes\ntumbler\ntumblerful\ntumblerfuls\ntumblers\ntumbles\ntumbleset\ntumblesets\ntumbleweed\ntumbleweeds\ntumbling\ntumblings\ntumbrel\ntumbrels\ntumbril\ntumbrils\ntumefacient\ntumefaction\ntumefactions\ntumefactive\ntumefied\ntumefies\ntumefy\ntumefying\ntumescence\ntumescences\ntumescent\ntumid\ntumidity\ntumidly\ntumidness\ntummies\ntummler\ntummlers\ntummy\ntumor\ntumoral\ntumorigeneses\ntumorigenesis\ntumorigenic\ntumorigenicity\ntumorlike\ntumorous\ntumors\ntump\ntumpline\ntumplines\ntumps\ntumular\ntumuli\ntumulose\ntumulosity\ntumulous\ntumult\ntumults\ntumultuary\ntumultuous\ntumultuously\ntumultuousness\ntumulus\ntun\ntuna\ntunability\ntunable\ntunableness\ntunably\ntunas\ntundish\ntundishes\ntundra\ntundras\ntune\ntuneable\ntuned\ntuneful\ntunefully\ntunefulness\ntuneless\ntunelessly\ntunelessness\ntuner\ntuners\ntunes\ntunesmith\ntunesmiths\ntung\ntungstate\ntungstates\ntungsten\ntungstenic\ntungstic\ntungstite\ntungstites\ntungus\ntunguses\ntungusic\ntunic\ntunica\ntunicae\ntunicate\ntunicated\ntunicates\ntunicle\ntunicles\ntunics\ntuning\ntunings\ntunis\ntunisia\ntunisian\ntunisians\ntunnel\ntunneled\ntunneler\ntunnelers\ntunneling\ntunnelled\ntunneller\ntunnellers\ntunnellike\ntunnelling\ntunnels\ntunnies\ntunny\ntuns\ntup\ntupelo\ntupelos\ntupi\ntupian\ntupians\ntupis\ntupped\ntuppence\ntupperware\ntupping\ntups\ntuque\ntuques\nturaco\nturacos\nturanian\nturanians\nturban\nturbaned\nturbanned\nturbans\nturbaries\nturbary\nturbellarian\nturbellarians\nturbid\nturbidimeter\nturbidimeters\nturbidimetric\nturbidimetrically\nturbidimetry\nturbidite\nturbidites\nturbidities\nturbidity\nturbidly\nturbidness\nturbinal\nturbinals\nturbinate\nturbinated\nturbination\nturbinations\nturbine\nturbines\nturbit\nturbits\nturbo\nturbocar\nturbocars\nturbocharged\nturbocharger\nturbochargers\nturboelectric\nturbofan\nturbofans\nturbogenerator\nturbogenerators\nturbojet\nturbojets\nturbomachinery\nturboprop\nturboprops\nturboramjet\nturboramjets\nturbos\nturboshaft\nturboshafts\nturbosupercharger\nturbosuperchargers\nturbot\nturbots\nturbulence\nturbulencies\nturbulency\nturbulent\nturbulently\nturcoman\nturcomans\nturd\nturds\ntureen\ntureens\nturf\nturfed\nturfing\nturfman\nturfmen\nturfs\nturfski\nturfskiing\nturfskis\nturfy\nturgenev\nturgescence\nturgescent\nturgid\nturgidity\nturgidly\nturgidness\nturgor\nturin\nturing\nturion\nturions\nturista\nturk\nturkana\nturkestan\nturkey\nturkeys\nturki\nturkic\nturkics\nturkis\nturkish\nturkism\nturkistan\nturkmen\nturkmenistan\nturkmens\nturkoman\nturkomans\nturks\nturmaline\nturmalines\nturmeric\nturmoil\nturn\nturnable\nturnabout\nturnabouts\nturnaround\nturnarounds\nturnbuckle\nturnbuckles\nturncoat\nturncoats\nturndown\nturndowns\nturned\nturner\nturneries\nturners\nturnery\nturning\nturnings\nturnip\nturnips\nturnkey\nturnkeys\nturnoff\nturnoffs\nturnout\nturnouts\nturnover\nturnovers\nturnpike\nturnpikes\nturns\nturnsole\nturnsoles\nturnspit\nturnspits\nturnstile\nturnstiles\nturnstone\nturnstones\nturntable\nturntables\nturnup\nturnups\nturnverein\nturnvereins\nturophile\nturophiles\nturpentine\nturpentined\nturpentines\nturpentinic\nturpentining\nturpentinous\nturpin\nturpitude\nturps\nturquois\nturquoise\nturquoises\nturret\nturreted\nturrets\nturtle\nturtleback\nturtlebacked\nturtlebacks\nturtled\nturtledove\nturtledoves\nturtlehead\nturtleheads\nturtleneck\nturtlenecked\nturtlenecks\nturtler\nturtlers\nturtles\nturtling\nturves\nturvier\nturvies\nturviest\nturvily\nturviness\nturvy\nturvydom\ntuscan\ntuscans\ntuscany\ntuscarora\ntuscaroras\ntusche\ntusches\ntush\ntushes\ntushie\ntushies\ntushy\ntusk\ntusked\ntusker\ntuskers\ntusking\ntusklike\ntusks\ntussah\ntussahs\ntussal\ntussaud\ntusser\ntusses\ntussie\ntussis\ntussive\ntussle\ntussled\ntussles\ntussling\ntussock\ntussocks\ntussocky\ntussore\ntussores\ntut\ntutankhamen\ntutankhaten\ntutee\ntutees\ntutelage\ntutelar\ntutelaries\ntutelars\ntutelary\ntutor\ntutorage\ntutorages\ntutored\ntutoress\ntutoresses\ntutorial\ntutorials\ntutoring\ntutors\ntutorship\ntutorships\ntutoyer\ntutoyered\ntutoyering\ntutoyers\ntuts\ntutsi\ntutsis\ntutted\ntutti\ntutting\ntuttis\ntutty\ntutu\ntutuila\ntutus\ntuvalu\ntuvaluan\ntuvaluans\ntux\ntuxedo\ntuxedoed\ntuxedoes\ntuxedos\ntuxes\ntuyere\ntuyeres\ntuyère\ntuyères\ntuzzy\ntwaddle\ntwaddled\ntwaddler\ntwaddlers\ntwaddles\ntwaddling\ntwain\ntwains\ntwang\ntwanged\ntwanger\ntwangers\ntwanging\ntwangs\ntwangy\ntwas\ntwat\ntwats\ntwayblade\ntwayblades\ntweak\ntweaked\ntweaking\ntweaks\ntweaky\ntwee\ntweed\ntweeddale\ntweedier\ntweediest\ntweediness\ntweedledee\ntweedledum\ntweeds\ntweedy\ntween\ntweet\ntweeted\ntweeter\ntweeters\ntweeting\ntweets\ntweeze\ntweezed\ntweezer\ntweezers\ntweezes\ntweezing\ntwelfth\ntwelfths\ntwelve\ntwelvefold\ntwelvemo\ntwelvemonth\ntwelvemonths\ntwelvemos\ntwelvepenny\ntwelves\ntwenties\ntwentieth\ntwentieths\ntwenty\ntwentyfold\ntwere\ntwerp\ntwerps\ntwi\ntwibill\ntwibills\ntwice\ntwiddle\ntwiddled\ntwiddler\ntwiddlers\ntwiddles\ntwiddling\ntwig\ntwigged\ntwiggier\ntwiggiest\ntwigging\ntwiggy\ntwigs\ntwilight\ntwilit\ntwill\ntwilled\ntwilling\ntwills\ntwin\ntwinberries\ntwinberry\ntwinborn\ntwine\ntwined\ntwiner\ntwiners\ntwines\ntwinflower\ntwinflowers\ntwinge\ntwinged\ntwingeing\ntwinges\ntwinging\ntwinight\ntwining\ntwinjet\ntwinjets\ntwinkle\ntwinkled\ntwinkler\ntwinklers\ntwinkles\ntwinkling\ntwinkly\ntwinleaf\ntwinleaves\ntwinned\ntwinning\ntwinnings\ntwins\ntwinset\ntwinsets\ntwinship\ntwiny\ntwirl\ntwirled\ntwirler\ntwirlers\ntwirling\ntwirls\ntwirly\ntwirp\ntwirps\ntwist\ntwistability\ntwistable\ntwisted\ntwister\ntwisters\ntwisting\ntwistingly\ntwists\ntwisty\ntwit\ntwitch\ntwitched\ntwitcher\ntwitchers\ntwitches\ntwitchier\ntwitchiest\ntwitchily\ntwitchiness\ntwitching\ntwitchingly\ntwitchy\ntwite\ntwites\ntwits\ntwitted\ntwitter\ntwittered\ntwitterer\ntwitterers\ntwittering\ntwitters\ntwittery\ntwitting\ntwixt\ntwo\ntwofaced\ntwofer\ntwofers\ntwofold\ntwomo\ntwomos\ntwopence\ntwopences\ntwopenny\ntwos\ntwosome\ntwosomes\ntyburn\ntycho\ntycoon\ntycoons\ntyer\ntyers\ntying\ntyke\ntykes\ntylectomies\ntylectomy\ntylenol\ntylose\ntyloses\ntylosin\ntylosins\ntylosis\ntymbal\ntymbals\ntympan\ntympana\ntympanal\ntympani\ntympanic\ntympanies\ntympanist\ntympanists\ntympanites\ntympanitic\ntympanitis\ntympanitises\ntympanoplasties\ntympanoplasty\ntympans\ntympanum\ntympanums\ntympany\ntyndale\ntyndareus\ntyne\ntynes\ntypal\ntype\ntypeable\ntypecast\ntypecasting\ntypecasts\ntyped\ntypeface\ntypefaces\ntypefounder\ntypefounders\ntypefounding\ntypes\ntypescript\ntypescripts\ntypeset\ntypesets\ntypesetter\ntypesetters\ntypesetting\ntypestyle\ntypestyles\ntypewrite\ntypewriter\ntypewriters\ntypewrites\ntypewriting\ntypewritings\ntypewritten\ntypewrote\ntypey\ntyphlitic\ntyphlitis\ntyphlology\ntyphlosole\ntyphlosoles\ntyphoean\ntyphoeus\ntyphogenic\ntyphoid\ntyphoidal\ntyphoidin\ntyphoidins\ntyphon\ntyphoon\ntyphoons\ntyphous\ntyphus\ntypic\ntypical\ntypicality\ntypically\ntypicalness\ntypier\ntypiest\ntypification\ntypifications\ntypified\ntypifier\ntypifiers\ntypifies\ntypify\ntypifying\ntyping\ntypist\ntypists\ntypo\ntypograph\ntypographed\ntypographer\ntypographers\ntypographic\ntypographical\ntypographically\ntypographies\ntypographing\ntypographs\ntypography\ntypologic\ntypological\ntypologically\ntypologies\ntypologist\ntypologists\ntypology\ntypos\ntypy\ntyramine\ntyramines\ntyrannic\ntyrannical\ntyrannically\ntyrannicalness\ntyrannicide\ntyrannicides\ntyrannies\ntyrannize\ntyrannized\ntyrannizer\ntyrannizers\ntyrannizes\ntyrannizing\ntyrannizingly\ntyrannosaur\ntyrannosaurs\ntyrannosaurus\ntyrannosauruses\ntyrannous\ntyrannously\ntyranny\ntyrant\ntyrants\ntyrian\ntyrians\ntyro\ntyrocidin\ntyrocidine\ntyrocidines\ntyrocidins\ntyrol\ntyrolean\ntyroleans\ntyrolese\ntyrolian\ntyrollean\ntyrone\ntyros\ntyrosinase\ntyrosinases\ntyrosine\ntyrosines\ntyrothricin\ntyrothricins\ntyrrhenian\ntzaddik\ntzaddikim\ntzar\ntzars\ntzetze\ntzigane\ntziganes\ntzimmes\ntzimmeses\ntzitzis\ntzitzit\ntzuris\ntzurises\ntène\ntête\ntêtes\ntínos\ntórshavn\ntôle\ntôles\nu\nubangi\nubiety\nubiquinone\nubiquinones\nubiquitous\nubiquitously\nubiquitousness\nubiquity\nuccello\nudall\nudder\nudders\nudine\nudo\nudometer\nudometers\nudos\nudzungwa\nuffizi\nufo\nufological\nufologist\nufologists\nufology\nufos\nuganda\nugandan\nugandans\nugaritic\nugh\nugli\nuglier\nuglies\nugliest\nuglification\nuglifications\nuglified\nuglifier\nuglifiers\nuglifies\nuglify\nuglifying\nuglily\nugliness\nugly\nugrian\nugrians\nugric\nugsome\nugsomeness\nuh\nuhf\nuhlan\nuhlans\nuighur\nuighurs\nuigur\nuigurian\nuiguric\nuigurs\nuilleann\nuintahite\nuintahites\nuintaite\nuintaites\nuitlander\nuitlanders\nuk\nukase\nukases\nuke\nukelele\nukeleles\nukes\nukraine\nukrainian\nukrainians\nukulele\nukuleles\nulama\nulamas\nulan\nulans\nulcer\nulcerate\nulcerated\nulcerates\nulcerating\nulceration\nulcerations\nulcerative\nulcerogenic\nulcerous\nulcerously\nulcerousness\nulcers\nulema\nulexite\nulexites\nullage\nullages\nulna\nulnae\nulnar\nulnas\nulster\nulsters\nulterior\nulteriorly\nultima\nultimacies\nultimacy\nultimas\nultimata\nultimate\nultimately\nultimateness\nultimatum\nultimatums\nultimo\nultimogeniture\nultra\nultrabasic\nultracareful\nultracasual\nultracautious\nultracentrifugal\nultracentrifugally\nultracentrifugation\nultracentrifugations\nultracentrifuge\nultracentrifuges\nultrachic\nultracivilized\nultraclean\nultracold\nultracommercial\nultracompact\nultracompetent\nultraconservatism\nultraconservative\nultraconservatives\nultracontemporary\nultraconvenient\nultracool\nultracritical\nultrademocratic\nultradense\nultradian\nultradistance\nultradistant\nultradry\nultraefficient\nultraenergetic\nultraexclusive\nultrafamiliar\nultrafashionable\nultrafast\nultrafastidious\nultrafeminine\nultrafiche\nultrafiches\nultrafiltrate\nultrafiltrating\nultrafiltration\nultrafiltrations\nultrafine\nultraglamorous\nultrahazardous\nultraheat\nultraheavy\nultrahigh\nultrahip\nultrahot\nultrahuman\nultraism\nultraist\nultraistic\nultraists\nultraleft\nultraleftism\nultraleftist\nultraleftists\nultraliberal\nultraliberalism\nultraliberals\nultralight\nultralights\nultralightweight\nultralow\nultramafic\nultramarathon\nultramarathoner\nultramarathoners\nultramarathons\nultramarine\nultramarines\nultramasculine\nultramicro\nultramicrofiche\nultramicrofiches\nultramicrometer\nultramicrometers\nultramicroscope\nultramicroscopes\nultramicroscopic\nultramicroscopical\nultramicroscopically\nultramicroscopy\nultramicrotome\nultramicrotomes\nultramicrotomy\nultramilitant\nultramilitants\nultraminiature\nultraminiaturization\nultraminiaturizations\nultraminiaturize\nultraminiaturized\nultraminiaturizes\nultraminiaturizing\nultramodern\nultramodernism\nultramodernist\nultramodernistic\nultramodernists\nultramontane\nultramontanes\nultramontanism\nultramontanist\nultramontanists\nultramundane\nultranational\nultranationalism\nultranationalist\nultranationalistic\nultranationalists\nultraorthodox\nultraparadoxical\nultrapatriotic\nultraphysical\nultrapowerful\nultrapractical\nultraprecise\nultraprecision\nultraprofessional\nultraprogressive\nultrapure\nultraquiet\nultraradical\nultrarapid\nultrarare\nultrararefied\nultrarational\nultrarealism\nultrarealist\nultrarealistic\nultrarealists\nultrarefined\nultrareliable\nultrarespectable\nultrarevolutionary\nultrarich\nultraright\nultrarightist\nultrarightists\nultraromantic\nultraroyalist\nultraroyalists\nultras\nultrasafe\nultrasecret\nultrasegregationist\nultrasegregationists\nultrasensitive\nultraserious\nultrasharp\nultrashort\nultrasimple\nultraslick\nultraslow\nultrasmall\nultrasmart\nultrasmooth\nultrasoft\nultrasonic\nultrasonically\nultrasonics\nultrasonogram\nultrasonograms\nultrasonograph\nultrasonographer\nultrasonographers\nultrasonographic\nultrasonographs\nultrasonography\nultrasophisticated\nultrasound\nultrasounds\nultrastructural\nultrastructurally\nultrastructure\nultrastructures\nultrathin\nultravacuum\nultraviolence\nultraviolent\nultraviolet\nultraviolets\nultravirile\nultravirility\nultravirus\nultraviruses\nultrawide\nululant\nululate\nululated\nululates\nululating\nululation\nululations\nulva\nulysses\num\numatilla\numatillas\numbel\numbellate\numbellated\numbellately\numbellet\numbellets\numbellifer\numbelliferous\numbellifers\numbellule\numbellules\numbels\number\numbered\numbering\numbers\numbilical\numbilically\numbilicals\numbilicate\numbilicated\numbilication\numbilications\numbilici\numbilicus\numbilicuses\numbles\numbo\numbonal\numbonate\numbones\numbonic\numbos\numbra\numbrae\numbrage\numbrageous\numbrageously\numbrageousness\numbral\numbras\numbrella\numbrellaless\numbrellas\numbrette\numbrettes\numbria\numbrian\numbrians\numbriel\numbundu\numiak\numiaks\numlaut\numlauted\numlauting\numlauts\numm\numnak\nump\numped\numping\numpirage\numpirages\numpire\numpired\numpires\numpiring\numps\numpteen\numpteenth\numtata\nun\nuna\nunabashed\nunabashedly\nunabated\nunabatedly\nunabbreviated\nunable\nunabraded\nunabridged\nunabsorbed\nunabsorbent\nunacademic\nunacademically\nunaccented\nunacceptability\nunacceptable\nunacceptably\nunaccepted\nunacclimated\nunacclimatized\nunaccommodated\nunaccommodating\nunaccompanied\nunaccomplished\nunaccountability\nunaccountable\nunaccountableness\nunaccountably\nunaccounted\nunaccredited\nunacculturated\nunaccustomed\nunaccustomedly\nunaccustomedness\nunachievable\nunachieved\nunacknowledged\nunacquainted\nunacquaintedness\nunactable\nunacted\nunactorish\nunadaptable\nunadapted\nunaddressed\nunadjudicated\nunadjusted\nunadmired\nunadmitted\nunadoptable\nunadorned\nunadult\nunadulterated\nunadulteratedly\nunadventurous\nunadvertised\nunadvised\nunadvisedly\nunadvisedness\nunaesthetic\nunaffected\nunaffectedly\nunaffectedness\nunaffecting\nunaffectionate\nunaffectionately\nunaffiliated\nunaffluent\nunaffordability\nunaffordable\nunaffordably\nunafraid\nunageing\nunaggressive\nunaging\nunai\nunaided\nunais\nunakin\nunakite\nunakites\nunalarmed\nunalaska\nunalienable\nunalienated\nunaligned\nunalike\nunalleviated\nunallied\nunallocated\nunallowable\nunalloyed\nunalloyedly\nunalluring\nunalterability\nunalterable\nunalterableness\nunalterably\nunaltered\nunambiguous\nunambiguously\nunambitious\nunambivalent\nunambivalently\nunamenable\nunamended\nunami\nunamiable\nunamis\nunamortized\nunamplified\nunamusing\nunanalyzable\nunanalyzably\nunanalyzed\nunanchored\nunaneled\nunanesthetized\nunanimated\nunanimity\nunanimous\nunanimously\nunanimousness\nunannotated\nunannounced\nunanswerability\nunanswerable\nunanswerableness\nunanswerably\nunanswered\nunanticipated\nunanticipatedly\nunapologetic\nunapologetically\nunapologizing\nunapparent\nunappealable\nunappealably\nunappealing\nunappealingly\nunappeasable\nunappeasably\nunappeased\nunappetizing\nunappetizingly\nunapplied\nunappreciable\nunappreciated\nunappreciation\nunappreciative\nunappreciatively\nunapprised\nunapproachability\nunapproachable\nunapproachableness\nunapproachably\nunappropriated\nunapproved\nunapt\nunaptly\nunaptness\nunarguable\nunarguably\nunarm\nunarmed\nunarming\nunarmored\nunarms\nunarrogant\nunarticulated\nunartistic\nunary\nunascertainable\nunascertained\nunashamed\nunashamedly\nunashamedness\nunasked\nunaspirated\nunassailability\nunassailable\nunassailableness\nunassailably\nunassailed\nunassembled\nunasserted\nunassertive\nunassertively\nunassertiveness\nunassigned\nunassimilable\nunassimilated\nunassisted\nunassociated\nunassuageable\nunassuaged\nunassuming\nunassumingly\nunassumingness\nunathletic\nunattached\nunattainability\nunattainable\nunattainableness\nunattainably\nunattained\nunattended\nunattenuated\nunattested\nunattractive\nunattractively\nunattractiveness\nunattributable\nunattributed\nunattuned\nunau\nunaudited\nunaus\nunauthentic\nunauthenticated\nunauthorized\nunautomated\nunavailability\nunavailable\nunavailing\nunavailingly\nunavailingness\nunaverage\nunavoidability\nunavoidable\nunavoidableness\nunavoidably\nunavowed\nunawake\nunawakened\nunawarded\nunaware\nunawarely\nunawareness\nunawares\nunawesome\nunbacked\nunbaked\nunbalance\nunbalanceable\nunbalanced\nunbalances\nunbalancing\nunballasted\nunban\nunbandage\nunbandaged\nunbandages\nunbandaging\nunbanned\nunbanning\nunbans\nunbaptized\nunbar\nunbarbed\nunbarbered\nunbarred\nunbarricaded\nunbarring\nunbars\nunbated\nunbearable\nunbearableness\nunbearably\nunbeatable\nunbeatably\nunbeaten\nunbeautiful\nunbeautifully\nunbecoming\nunbecomingly\nunbecomingness\nunbefitting\nunbegotten\nunbeholden\nunbeknown\nunbeknownst\nunbelief\nunbelievable\nunbelievably\nunbeliever\nunbelievers\nunbelieving\nunbelievingly\nunbelievingness\nunbelligerent\nunbeloved\nunbelted\nunbemused\nunbend\nunbendable\nunbending\nunbendingly\nunbends\nunbent\nunbeseeming\nunbiased\nunbiasedly\nunbiasedness\nunbiassed\nunbiblical\nunbid\nunbidden\nunbigoted\nunbilled\nunbind\nunbinding\nunbinds\nunbitted\nunbitten\nunbitter\nunbleached\nunblemished\nunblenched\nunblended\nunblessed\nunblessedness\nunblest\nunblinded\nunblinking\nunblinkingly\nunblock\nunblocked\nunblocking\nunblocks\nunblooded\nunblushing\nunblushingly\nunblushingness\nunbodied\nunbolt\nunbolted\nunbolting\nunbolts\nunbonneted\nunbookish\nunborn\nunbosom\nunbosomed\nunbosomer\nunbosomers\nunbosoming\nunbosoms\nunbought\nunbound\nunbounded\nunboundedly\nunboundedness\nunbowdlerized\nunbowed\nunbox\nunboxed\nunboxes\nunboxing\nunbrace\nunbraced\nunbraces\nunbracing\nunbracketed\nunbraid\nunbraided\nunbraiding\nunbraids\nunbrake\nunbraked\nunbrakes\nunbraking\nunbranched\nunbranded\nunbreachable\nunbreakable\nunbreakableness\nunbreakables\nunbreakably\nunbreathable\nunbred\nunbridgeable\nunbridgeably\nunbridged\nunbridle\nunbridled\nunbridledly\nunbridles\nunbridling\nunbriefed\nunbright\nunbrilliant\nunbroke\nunbroken\nunbrokenly\nunbrokenness\nunbruised\nunbrushed\nunbuckle\nunbuckled\nunbuckles\nunbuckling\nunbudgeable\nunbudgeably\nunbudgeted\nunbudging\nunbudgingly\nunbuffered\nunbuild\nunbuildable\nunbuilding\nunbuilds\nunbuilt\nunbulky\nunbundle\nunbundled\nunbundles\nunbundling\nunbundlings\nunburden\nunburdened\nunburdening\nunburdens\nunbureaucratic\nunburied\nunburnable\nunburned\nunburnt\nunbusinesslike\nunbusy\nunbuttered\nunbutton\nunbuttoned\nunbuttoning\nunbuttons\nuncage\nuncaged\nuncages\nuncaging\nuncalcified\nuncalcined\nuncalculated\nuncalculating\nuncalibrated\nuncalled\nuncalloused\nuncanceled\nuncandid\nuncandidly\nuncannier\nuncanniest\nuncannily\nuncanniness\nuncanny\nuncanonical\nuncap\nuncapitalized\nuncapped\nuncapping\nuncaps\nuncaptioned\nuncapturable\nuncared\nuncaring\nuncaringly\nuncarpeted\nuncase\nuncased\nuncases\nuncasing\nuncastrated\nuncataloged\nuncatchable\nuncatchy\nuncategorizable\nuncaught\nuncaused\nunceasing\nunceasingly\nunceasingness\nuncelebrated\nuncensored\nuncensorious\nuncensured\nunceremonious\nunceremoniously\nunceremoniousness\nuncertain\nuncertainly\nuncertainness\nuncertainties\nuncertainty\nuncertified\nunchain\nunchainable\nunchained\nunchaining\nunchains\nunchallengeable\nunchallengeably\nunchallenged\nunchallenging\nunchancy\nunchangeability\nunchangeable\nunchangeableness\nunchangeably\nunchanged\nunchanging\nunchangingly\nunchangingness\nunchanneled\nunchaperoned\nuncharacteristic\nuncharacteristically\nuncharacterized\nuncharged\nuncharismatic\nuncharitable\nuncharitableness\nuncharitably\nuncharming\nuncharted\nunchartered\nunchaste\nunchastely\nunchasteness\nunchaster\nunchastest\nunchastity\nunchauvinistic\nuncheck\nuncheckable\nunchecked\nunchecking\nunchecks\nuncheerful\nunchewable\nunchewed\nunchic\nunchildlike\nunchivalrous\nunchivalrously\nunchlorinated\nunchoke\nunchoked\nunchokes\nunchoking\nunchoreographed\nunchristened\nunchristian\nunchronicled\nunchronological\nunchurch\nunchurched\nunchurches\nunchurching\nunchurchly\nunci\nuncial\nuncially\nuncials\nunciform\nunciforms\nunciliated\nuncinaria\nuncinarias\nuncinariasis\nuncinate\nuncinematic\nuncirculated\nuncircumcised\nuncircumcision\nuncircumcisions\nuncivil\nuncivilized\nuncivilizedly\nuncivilizedness\nuncivilly\nuncivilness\nunclad\nunclaimed\nunclamp\nunclamped\nunclamping\nunclamps\nunclarified\nunclarities\nunclarity\nunclasp\nunclasped\nunclasping\nunclasps\nunclassical\nunclassifiable\nunclassified\nuncle\nunclean\nuncleaned\nuncleaner\nuncleanest\nuncleanlier\nuncleanliest\nuncleanliness\nuncleanly\nuncleanness\nunclear\nunclearer\nunclearest\nunclearly\nunclearness\nuncleless\nunclench\nunclenched\nunclenches\nunclenching\nuncles\nunclichéd\nunclimbable\nunclimbableness\nunclinch\nunclinched\nunclinches\nunclinching\nunclip\nunclipped\nunclipping\nunclips\nuncloak\nuncloaked\nuncloaking\nuncloaks\nunclog\nunclogged\nunclogging\nunclogs\nunclose\nunclosed\nuncloses\nunclosing\nunclothe\nunclothed\nunclothes\nunclothing\nunclouded\nuncloudedly\nuncloying\nunclubbable\nunclutter\nuncluttered\nuncluttering\nunclutters\nuncoalesce\nuncoalesced\nuncoalesces\nuncoalescing\nuncoated\nuncoating\nuncock\nuncocked\nuncocking\nuncocks\nuncoded\nuncodified\nuncoerced\nuncoercive\nuncoercively\nuncoffin\nuncoffined\nuncoffining\nuncoffins\nuncoil\nuncoiled\nuncoiling\nuncoils\nuncoined\nuncollected\nuncollectible\nuncolored\nuncombative\nuncombed\nuncombined\nuncomely\nuncomfortable\nuncomfortableness\nuncomfortably\nuncomforted\nuncomic\nuncomment\nuncommented\nuncommenting\nuncomments\nuncommercial\nuncommercialized\nuncommitted\nuncommon\nuncommoner\nuncommonest\nuncommonly\nuncommonness\nuncommunicable\nuncommunicative\nuncommunicatively\nuncommunicativeness\nuncompahgre\nuncompassionate\nuncompelled\nuncompelling\nuncompensated\nuncompetitive\nuncompetitively\nuncompetitiveness\nuncomplacent\nuncomplaining\nuncomplainingly\nuncompleted\nuncomplicated\nuncomplimentary\nuncompounded\nuncomprehended\nuncomprehending\nuncomprehendingly\nuncompress\nuncompressed\nuncompresses\nuncompressing\nuncompromisable\nuncompromising\nuncompromisingly\nuncompromisingness\nuncomputerized\nunconcealed\nunconceivable\nunconceivableness\nunconceivably\nunconcern\nunconcerned\nunconcernedly\nunconcernedness\nunconcluded\nuncondensed\nunconditional\nunconditionality\nunconditionally\nunconditionalness\nunconditioned\nunconditionedness\nunconfessed\nunconfident\nunconfidently\nunconfined\nunconfirmed\nunconformability\nunconformable\nunconformableness\nunconformably\nunconformities\nunconformity\nunconfounded\nunconfuse\nunconfused\nunconfuses\nunconfusing\nuncongealed\nuncongenial\nuncongeniality\nunconjugated\nunconnected\nunconnectedly\nunconnectedness\nunconquerable\nunconquerably\nunconquered\nunconscionability\nunconscionable\nunconscionableness\nunconscionably\nunconscious\nunconsciously\nunconsciousness\nunconsecrated\nunconsidered\nunconsolidated\nunconstitutional\nunconstitutionality\nunconstitutionally\nunconstrained\nunconstraint\nunconstricted\nunconstructed\nunconstructive\nunconsumed\nunconsummated\nuncontainable\nuncontaminated\nuncontemplated\nuncontemporary\nuncontentious\nuncontested\nuncontracted\nuncontradicted\nuncontrived\nuncontrollability\nuncontrollable\nuncontrollableness\nuncontrollably\nuncontrolled\nuncontrolledness\nuncontroversial\nuncontroversially\nunconventional\nunconventionality\nunconventionally\nunconverted\nunconvertible\nunconvinced\nunconvincing\nunconvincingly\nunconvincingness\nunconvoyed\nuncooked\nuncool\nuncooled\nuncooperative\nuncooperatively\nuncooperativeness\nuncoordinated\nuncoordinatedly\nuncopyrightable\nuncork\nuncorked\nuncorking\nuncorks\nuncorrectable\nuncorrected\nuncorrelated\nuncorroborated\nuncorrupt\nuncorrupted\nuncorrupting\nuncorseted\nuncountable\nuncounted\nuncouple\nuncoupled\nuncoupler\nuncouplers\nuncouples\nuncoupling\nuncourageous\nuncouth\nuncouthly\nuncouthness\nuncovenanted\nuncover\nuncovered\nuncovering\nuncovers\nuncoy\nuncracked\nuncrate\nuncrated\nuncrates\nuncrating\nuncrazy\nuncreated\nuncreative\nuncredentialed\nuncredited\nuncrewed\nuncrippled\nuncritical\nuncritically\nuncropped\nuncross\nuncrossable\nuncrossed\nuncrosses\nuncrossing\nuncrowded\nuncrown\nuncrowned\nuncrowning\nuncrowns\nuncrumple\nuncrumpled\nuncrumples\nuncrumpling\nuncrushable\nuncrushed\nuncrystallized\nunction\nunctuosity\nunctuous\nunctuously\nunctuousness\nuncuff\nuncuffed\nuncuffing\nuncuffs\nuncultivable\nuncultivated\nuncultured\nuncurbed\nuncured\nuncurious\nuncurl\nuncurled\nuncurling\nuncurls\nuncurrent\nuncurtained\nuncus\nuncustomarily\nuncustomary\nuncut\nuncute\nuncuttable\nuncynical\nuncynically\nund\nundamaged\nundamped\nundanceable\nundated\nundauntable\nundaunted\nundauntedly\nundauntedness\nundead\nundebatable\nundebatably\nundecadent\nundecayed\nundeceivable\nundeceivably\nundeceive\nundeceived\nundeceives\nundeceiving\nundecidability\nundecidable\nundecided\nundecidedly\nundecidedness\nundecideds\nundecillion\nundecillions\nundecipherable\nundeciphered\nundecked\nundeclared\nundecomposed\nundecorated\nundecylenic\nundedicated\nundefeatable\nundefeated\nundefended\nundefiled\nundefinable\nundefined\nundeflected\nundefoliated\nundeformed\nundelegated\nundelete\nundeleted\nundeliverable\nundeliverably\nundelivered\nundeluded\nundemanding\nundemocratic\nundemocratically\nundemonstrated\nundemonstrative\nundemonstratively\nundemonstrativeness\nundeniable\nundeniableness\nundeniably\nundenominational\nundented\nundependability\nundependable\nunder\nunderachieve\nunderachieved\nunderachievement\nunderachiever\nunderachievers\nunderachieves\nunderachieving\nunderact\nunderacted\nunderacting\nunderactive\nunderactivity\nunderacts\nunderage\nunderaged\nunderappreciated\nunderarm\nunderarms\nunderassessment\nunderbellies\nunderbelly\nunderbid\nunderbidder\nunderbidders\nunderbidding\nunderbids\nunderbodies\nunderbody\nunderboss\nunderbosses\nunderbought\nunderbracing\nunderbred\nunderbrim\nunderbrims\nunderbrush\nunderbudgeted\nunderbuy\nunderbuying\nunderbuys\nundercapitalization\nundercapitalizations\nundercapitalize\nundercapitalized\nundercapitalizes\nundercapitalizing\nundercard\nundercards\nundercarriage\nundercarriages\nundercharge\nundercharged\nundercharges\nundercharging\nunderclass\nunderclasses\nunderclassman\nunderclassmen\nunderclothes\nunderclothing\nundercoat\nundercoated\nundercoating\nundercoats\nundercook\nundercooked\nundercooking\nundercooks\nundercool\nundercooled\nundercooling\nundercools\nundercount\nundercounted\nundercounting\nundercounts\nundercover\nundercroft\nundercrofts\nundercurrent\nundercurrents\nundercut\nundercuts\nundercutting\nunderdeveloped\nunderdevelopment\nunderdid\nunderdo\nunderdoes\nunderdog\nunderdogs\nunderdoing\nunderdone\nunderdrawers\nunderdress\nunderdressed\nunderdresses\nunderdressing\nunderdrive\nunderdrives\nundereducated\nunderemphasis\nunderemphasize\nunderemphasized\nunderemphasizes\nunderemphasizing\nunderemployed\nunderemployment\nunderendow\nunderendowed\nunderendowing\nunderendowment\nunderendows\nunderestimate\nunderestimated\nunderestimates\nunderestimating\nunderestimation\nunderestimations\nunderexpose\nunderexposed\nunderexposes\nunderexposing\nunderexposure\nunderexposures\nunderfed\nunderfeed\nunderfeeding\nunderfeeds\nunderfinanced\nunderflow\nunderflows\nunderfoot\nunderfund\nunderfunded\nunderfunding\nunderfunds\nunderfur\nunderfurs\nundergarment\nundergarments\nundergird\nundergirded\nundergirding\nundergirds\nundergirt\nunderglaze\nunderglazes\nundergo\nundergoes\nundergoing\nundergone\nundergrad\nundergrads\nundergraduate\nundergraduates\nunderground\nundergrounded\nundergrounder\nundergrounders\nundergrounding\nundergrounds\nundergrown\nundergrowth\nunderhair\nunderhairs\nunderhand\nunderhanded\nunderhandedly\nunderhandedness\nunderhung\nunderinflated\nunderinflation\nunderinsurance\nunderinsure\nunderinsured\nunderinsures\nunderinsuring\nunderinvestment\nunderkill\nunderlaid\nunderlain\nunderlay\nunderlaying\nunderlayment\nunderlayments\nunderlays\nunderlet\nunderlets\nunderletting\nunderlie\nunderlies\nunderline\nunderlined\nunderlines\nunderling\nunderlings\nunderlining\nunderlinings\nunderlip\nunderlips\nunderlying\nunderlyingly\nundermanned\nundermine\nundermined\nundermines\nundermining\nundermodulate\nundermodulated\nundermodulates\nundermodulating\nundermodulation\nundermodulations\nundermost\nunderneath\nunderneaths\nundernourish\nundernourished\nundernourishes\nundernourishing\nundernourishment\nundernutrition\nundernutritions\nunderpaid\nunderpainting\nunderpants\nunderpart\nunderparts\nunderpass\nunderpasses\nunderpay\nunderpaying\nunderpayment\nunderpayments\nunderpays\nunderperform\nunderperformance\nunderperformances\nunderperformed\nunderperformer\nunderperformers\nunderperforming\nunderperforms\nunderpin\nunderpinned\nunderpinning\nunderpinnings\nunderpins\nunderplay\nunderplayed\nunderplaying\nunderplays\nunderplot\nunderplots\nunderpopulated\nunderpopulation\nunderpowered\nunderprepared\nunderprice\nunderpriced\nunderprices\nunderpricing\nunderprivileged\nunderproduce\nunderproduced\nunderproduces\nunderproducing\nunderproduction\nunderproductions\nunderproductive\nunderproof\nunderprop\nunderpropped\nunderpropping\nunderprops\nunderpublicized\nunderquote\nunderquoted\nunderquotes\nunderquoting\nunderran\nunderrate\nunderrated\nunderrates\nunderrating\nunderreact\nunderreacted\nunderreacting\nunderreaction\nunderreactions\nunderreacts\nunderreport\nunderreported\nunderreporting\nunderreports\nunderrepresent\nunderrepresentation\nunderrepresentations\nunderrepresented\nunderrepresenting\nunderrepresents\nunderrun\nunderrunning\nunderruns\nundersaturated\nunderscore\nunderscored\nunderscores\nunderscoring\nundersea\nunderseas\nundersecretariat\nundersecretariats\nundersecretaries\nundersecretary\nundersell\nunderseller\nundersellers\nunderselling\nundersells\nunderserve\nunderserved\nunderserves\nunderserving\nunderset\nundersets\nundersexed\nundershirt\nundershirted\nundershirts\nundershoot\nundershooting\nundershoots\nundershorts\nundershot\nundershrub\nundershrubs\nunderside\nundersides\nundersign\nundersigned\nundersigning\nundersigns\nundersize\nundersized\nunderskirt\nunderskirts\nundersleeve\nundersleeves\nunderslung\nundersoil\nundersoils\nundersold\nunderspin\nunderspins\nunderstaff\nunderstaffed\nunderstaffing\nunderstaffs\nunderstand\nunderstandability\nunderstandable\nunderstandably\nunderstanding\nunderstandingly\nunderstandings\nunderstands\nunderstate\nunderstated\nunderstatedly\nunderstatement\nunderstatements\nunderstates\nunderstating\nundersteer\nundersteered\nundersteering\nundersteers\nunderstood\nunderstories\nunderstory\nunderstrapper\nunderstrappers\nunderstrata\nunderstratum\nunderstratums\nunderstrength\nunderstructure\nunderstructures\nunderstudied\nunderstudies\nunderstudy\nunderstudying\nundersubscribe\nundersubscribed\nundersubscribes\nundersubscribing\nundersubscription\nundersubscriptions\nundersupplied\nundersupplies\nundersupply\nundersupplying\nundersurface\nundersurfaces\nundertake\nundertaken\nundertaker\nundertakers\nundertakes\nundertaking\nundertakings\nundertenant\nundertenants\nunderthings\nunderthrust\nunderthrusting\nunderthrusts\nundertint\nundertints\nundertone\nundertones\nundertook\nundertow\nundertows\nundertrick\nundertricks\nundertrump\nundertrumped\nundertrumping\nundertrumps\nunderused\nunderutilization\nunderutilize\nunderutilized\nunderutilizes\nunderutilizing\nundervaluation\nundervaluations\nundervalue\nundervalued\nundervalues\nundervaluing\nundervest\nundervests\nunderwater\nunderway\nunderwear\nunderweight\nunderwent\nunderwhelm\nunderwhelmed\nunderwhelming\nunderwhelms\nunderwing\nunderwings\nunderwood\nunderwoods\nunderwool\nunderwools\nunderworld\nunderworlds\nunderwrite\nunderwriter\nunderwriters\nunderwrites\nunderwriting\nunderwritten\nunderwrote\nundescended\nundescribable\nundeserved\nundeservedly\nundeserving\nundeservingly\nundesignated\nundesigning\nundesirability\nundesirable\nundesirableness\nundesirables\nundesirably\nundesired\nundestroyed\nundetached\nundetectable\nundetectably\nundetected\nundeterminable\nundetermined\nundeterred\nundeveloped\nundeviating\nundeviatingly\nundiagnosable\nundiagnosed\nundialectical\nundid\nundidactic\nundies\nundifferentiated\nundiffused\nundigested\nundigestible\nundignified\nundiluted\nundiminished\nundimmed\nundimpled\nundine\nundines\nundiplomatic\nundiplomatically\nundirected\nundiscerning\nundischarged\nundisciplined\nundisclosed\nundiscouraged\nundiscoverable\nundiscovered\nundiscriminating\nundiscussed\nundisguised\nundisguisedly\nundismayed\nundisposed\nundisputable\nundisputed\nundisputedly\nundisrupted\nundissociated\nundissolved\nundistinguished\nundistinguishing\nundistorted\nundistracted\nundistributed\nundisturbed\nundivided\nundividedly\nundo\nundoable\nundocile\nundock\nundocked\nundocking\nundocks\nundoctored\nundoctrinaire\nundocumented\nundocumenteds\nundoer\nundoers\nundoes\nundogmatic\nundogmatically\nundoing\nundomestic\nundomesticated\nundone\nundotted\nundouble\nundoubled\nundoubles\nundoubling\nundoubtable\nundoubted\nundoubtedly\nundoubting\nundrained\nundramatic\nundramatically\nundramatized\nundrape\nundraped\nundrapes\nundraping\nundraw\nundrawing\nundrawn\nundraws\nundreamed\nundreamt\nundress\nundressed\nundresses\nundressing\nundrew\nundrilled\nundrinkable\nundrunk\nundubbed\nundue\nundulant\nundulate\nundulated\nundulates\nundulating\nundulation\nundulations\nundulatory\nundulled\nunduly\nunduplicated\nundusted\nundutiful\nundutifully\nundutifulness\nundyed\nundying\nundyingly\nundynamic\nuneager\nunearmarked\nunearned\nunearth\nunearthed\nunearthing\nunearthlier\nunearthliest\nunearthliness\nunearthly\nunearths\nunease\nuneasier\nuneasiest\nuneasily\nuneasiness\nuneasy\nuneatable\nuneaten\nuneccentric\nunecological\nuneconomic\nuneconomical\nuneconomically\nunedifying\nunedifyingly\nunedited\nuneducable\nuneducated\nunelaborate\nunelaborated\nunelectable\nunelected\nunelectrified\nunembarrassed\nunembellished\nunembittered\nunemotional\nunemotionally\nunemphatic\nunemphatically\nunempirical\nunemployability\nunemployable\nunemployables\nunemployed\nunemployment\nunenchanted\nunenclosed\nunencouraging\nunencumbered\nunendearing\nunending\nunendingly\nunendorsed\nunendurable\nunendurableness\nunendurably\nunenforceable\nunenforced\nunengaged\nunenlarged\nunenlightened\nunenlightening\nunenriched\nunenterprising\nunentertaining\nunenthusiastic\nunenthusiastically\nunenviable\nunenvied\nunenvious\nunequal\nunequaled\nunequalize\nunequalized\nunequalizes\nunequalizing\nunequalled\nunequally\nunequals\nunequipped\nunequivocably\nunequivocal\nunequivocally\nunerotic\nunerring\nunerringly\nunescapable\nunesco\nunescorted\nunessential\nunessentials\nunestablished\nunethical\nunethically\nunevaluated\nuneven\nunevener\nunevenest\nunevenly\nunevenness\nuneventful\nuneventfully\nuneventfulness\nunexacting\nunexaggerated\nunexamined\nunexampled\nunexcelled\nunexceptionable\nunexceptionableness\nunexceptionably\nunexceptional\nunexceptionally\nunexcitable\nunexcited\nunexciting\nunexcused\nunexecuted\nunexercised\nunexhausted\nunexotic\nunexpanded\nunexpected\nunexpectedly\nunexpectedness\nunexpended\nunexpired\nunexplainable\nunexplainably\nunexplained\nunexploded\nunexploited\nunexplored\nunexposed\nunexpressed\nunexpressive\nunexpressively\nunexpressiveness\nunexpurgated\nunextraordinary\nunfading\nunfadingly\nunfailing\nunfailingly\nunfailingness\nunfair\nunfairer\nunfairest\nunfairly\nunfairness\nunfaith\nunfaithful\nunfaithfully\nunfaithfulness\nunfaked\nunfallen\nunfalsifiable\nunfaltering\nunfalteringly\nunfamiliar\nunfamiliarity\nunfamiliarly\nunfamous\nunfancy\nunfashionable\nunfashionableness\nunfashionably\nunfasten\nunfastened\nunfastening\nunfastens\nunfastidious\nunfathered\nunfathomable\nunfathomed\nunfavorable\nunfavorableness\nunfavorably\nunfavorite\nunfazed\nunfeasibility\nunfeasible\nunfecundated\nunfeeling\nunfeelingly\nunfeelingness\nunfeigned\nunfeignedly\nunfelt\nunfeminine\nunfenced\nunfermented\nunfertile\nunfertilized\nunfetter\nunfettered\nunfettering\nunfetters\nunfilial\nunfilially\nunfilled\nunfiltered\nunfindable\nunfinished\nunfired\nunfit\nunfitly\nunfitness\nunfits\nunfitted\nunfitting\nunfittingly\nunfix\nunfixable\nunfixed\nunfixes\nunfixing\nunflagging\nunflaggingly\nunflamboyant\nunflappability\nunflappable\nunflappably\nunflapped\nunflashy\nunflattering\nunflatteringly\nunflavored\nunflawed\nunfledged\nunflinching\nunflinchingly\nunflinchingness\nunflustered\nunflyable\nunfocused\nunfocussed\nunfold\nunfolded\nunfolding\nunfoldment\nunfolds\nunfond\nunforced\nunforeseeable\nunforeseeably\nunforeseen\nunforested\nunforgettability\nunforgettable\nunforgettableness\nunforgettably\nunforgivable\nunforgivably\nunforgiving\nunforgivingness\nunforgotten\nunforked\nunformatted\nunformed\nunformulated\nunforthcoming\nunfortified\nunfortunate\nunfortunately\nunfortunateness\nunfortunates\nunfossiliferous\nunfound\nunfounded\nunfoundedly\nunfoundedness\nunframed\nunfree\nunfreedom\nunfreeze\nunfreezes\nunfreezing\nunfrequented\nunfriended\nunfriendlier\nunfriendliest\nunfriendliness\nunfriendly\nunfrivolous\nunfrock\nunfrocked\nunfrocking\nunfrocks\nunfrosted\nunfroze\nunfrozen\nunfruitful\nunfruitfully\nunfruitfulness\nunfulfillable\nunfulfilled\nunfulfilling\nunfunded\nunfunny\nunfurl\nunfurled\nunfurling\nunfurls\nunfurnished\nunfused\nunfussily\nunfussy\nungainlier\nungainliest\nungainliness\nungainly\nungallant\nungallantly\nungarnished\nungava\nungenerosity\nungenerous\nungenerously\nungenial\nungenteel\nungentle\nungentlemanly\nungentrified\nungerminated\nungifted\nungimmicky\nungird\nungirded\nungirding\nungirds\nungirt\nunglamorized\nunglamorous\nunglamorously\nunglazed\nunglue\nunglued\nunglues\nungluing\nungodlier\nungodliest\nungodliness\nungodly\nungot\nungotten\nungovernable\nungovernableness\nungovernably\nungoverned\nungraceful\nungracefully\nungracious\nungraciously\nungraciousness\nungraded\nungrammatical\nungrammaticality\nungrammatically\nungraspable\nungrateful\nungratefully\nungratefulness\nungratified\nunground\nungrounded\nungrouped\nungrudging\nungrudgingly\nungual\nunguard\nunguarded\nunguardedly\nunguardedness\nunguarding\nunguards\nunguent\nunguentary\nunguents\nungues\nunguessable\nunguiculate\nunguiculated\nunguided\nunguis\nungula\nungulate\nungulates\nunguligrade\nunguligrades\nunhackneyed\nunhallow\nunhallowed\nunhallowing\nunhallows\nunhampered\nunhand\nunhanded\nunhandier\nunhandiest\nunhandily\nunhandiness\nunhanding\nunhands\nunhandsome\nunhandsomely\nunhandsomeness\nunhandy\nunhappier\nunhappiest\nunhappily\nunhappiness\nunhappinesses\nunhappy\nunhardened\nunharmed\nunharmonious\nunharness\nunharnessed\nunharnesses\nunharnessing\nunharvested\nunhatched\nunhealed\nunhealthful\nunhealthier\nunhealthiest\nunhealthily\nunhealthiness\nunhealthy\nunheard\nunhearing\nunheated\nunhedged\nunheeded\nunheeding\nunheedingly\nunhelpful\nunhelpfully\nunheralded\nunheroic\nunhesitant\nunhesitating\nunhesitatingly\nunhidden\nunhighlight\nunhighlighted\nunhighlighting\nunhighlights\nunhindered\nunhinge\nunhinged\nunhinges\nunhinging\nunhip\nunhistorical\nunhitch\nunhitched\nunhitches\nunhitching\nunholier\nunholiest\nunholily\nunholiness\nunholy\nunhomogenized\nunhonored\nunhood\nunhooded\nunhooding\nunhoods\nunhook\nunhooked\nunhooking\nunhooks\nunhoped\nunhopeful\nunhorse\nunhorsed\nunhorses\nunhorsing\nunhoused\nunhouseled\nunhumorous\nunhurried\nunhurriedly\nunhurt\nunhydrolyzed\nunhygienic\nunhyphenated\nunhysterical\nunhysterically\nunialgal\nuniat\nuniate\nuniaxial\nuniaxially\nunicameral\nunicamerally\nunicef\nunicellular\nunicellularity\nunicolor\nunicorn\nunicorns\nunicostate\nunicuspid\nunicuspids\nunicycle\nunicycles\nunicyclist\nunicyclists\nunidentifiable\nunidentifiably\nunidentified\nunideological\nunidimensional\nunidimensionality\nunidiomatic\nunidirectional\nunidirectionally\nunifactorial\nunifiable\nunification\nunifications\nunified\nunifier\nunifiers\nunifies\nunifilar\nuniflow\nunifoliate\nunifoliolate\nuniform\nuniformed\nuniforming\nuniformitarian\nuniformitarianism\nuniformitarians\nuniformity\nuniformly\nuniformness\nuniforms\nunify\nunifying\nunignorable\nunilateral\nunilateralism\nunilateralisms\nunilateralist\nunilateralists\nunilaterally\nunilineal\nunilinear\nunilingual\nunilingually\nuniliteral\nunilluminated\nunilluminating\nunillusioned\nunillustrated\nunilobar\nunilocular\nunimaginable\nunimaginably\nunimaginative\nunimaginatively\nunimagined\nunimak\nunimmunized\nunimpaired\nunimpassioned\nunimpeachable\nunimpeachably\nunimpeded\nunimplemented\nunimportance\nunimportant\nunimposing\nunimpressed\nunimpressionable\nunimpressive\nunimpressively\nunimproved\nunincorporated\nunindexed\nunindicted\nunindustrialized\nuninfected\nuninflammable\nuninflated\nuninflected\nuninfluenced\nuninformative\nuninformatively\nuninformed\nuningratiating\nuninhabitability\nuninhabitable\nuninhabited\nuninhibited\nuninhibitedly\nuninhibitedness\nuninitialized\nuninitiate\nuninitiated\nuninitiates\nuninjured\nuninoculated\nuninominal\nuninspected\nuninspired\nuninspiring\nuninstalled\nuninstructed\nuninstructive\nuninsulated\nuninsurability\nuninsurable\nuninsured\nuninsureds\nunintegrated\nunintellectual\nunintelligence\nunintelligent\nunintelligently\nunintelligibility\nunintelligible\nunintelligibleness\nunintelligibly\nunintended\nunintentional\nunintentionally\nuninterest\nuninterested\nuninterestedly\nuninterestedness\nuninteresting\nuninterestingly\nuninterrupted\nuninterruptedly\nunintimidated\nunintuitive\nuninucleate\nuninventive\nuninvestigated\nuninvited\nuninviting\nuninvitingly\nuninvolved\nunion\nunionism\nunionist\nunionistic\nunionists\nunionization\nunionizations\nunionize\nunionized\nunionizer\nunionizers\nunionizes\nunionizing\nunions\nuniparental\nuniparentally\nuniparous\nuniped\nunipersonal\nuniplanar\nunipolar\nunipolarity\nunipotent\nunique\nuniquely\nuniqueness\nunironically\nunirradiated\nunirrigated\nuniserial\nuniseriate\nunisex\nunisexual\nunisexuality\nunisexually\nunison\nunisonant\nunisonous\nunisons\nunissued\nunit\nunitage\nunitard\nunitards\nunitarian\nunitarianism\nunitarians\nunitarily\nunitary\nunite\nunited\nunitedly\nunitedness\nuniter\nuniters\nunites\nunities\nuniting\nunitive\nunitization\nunitizations\nunitize\nunitized\nunitizes\nunitizing\nunitrust\nunitrusts\nunits\nunity\nunivalent\nunivalents\nunivalve\nunivalves\nunivariate\nuniversal\nuniversalism\nuniversalist\nuniversalistic\nuniversalists\nuniversalities\nuniversality\nuniversalizability\nuniversalization\nuniversalizations\nuniversalize\nuniversalized\nuniversalizes\nuniversalizing\nuniversally\nuniversalness\nuniversals\nuniverse\nuniverses\nuniversities\nuniversity\nunivocal\nunivocally\nunivocals\nunix\nunjacketed\nunjaded\nunjoined\nunjoint\nunjointed\nunjointing\nunjoints\nunjust\nunjustifiable\nunjustifiably\nunjustified\nunjustly\nunjustness\nunjustnesses\nunkempt\nunkennel\nunkenneled\nunkenneling\nunkennelled\nunkennelling\nunkennels\nunkept\nunkind\nunkinder\nunkindest\nunkindlier\nunkindliest\nunkindliness\nunkindly\nunkindness\nunkindnesses\nunkink\nunkinked\nunkinking\nunkinks\nunknit\nunknits\nunknitted\nunknitting\nunknot\nunknots\nunknotted\nunknotting\nunknowability\nunknowable\nunknowableness\nunknowably\nunknowing\nunknowingly\nunknowingness\nunknowledgeable\nunknown\nunknowns\nunkosher\nunlabeled\nunlabored\nunlace\nunlaced\nunlaces\nunlacing\nunlade\nunladed\nunladen\nunlades\nunlading\nunladylike\nunlaid\nunlamented\nunlash\nunlashed\nunlashes\nunlashing\nunlatch\nunlatched\nunlatches\nunlatching\nunlaundered\nunlawful\nunlawfully\nunlawfulness\nunlay\nunlaying\nunlays\nunlead\nunleaded\nunleading\nunleads\nunlearn\nunlearnable\nunlearned\nunlearnedly\nunlearning\nunlearns\nunlearnt\nunleash\nunleashed\nunleashes\nunleashing\nunleavened\nunless\nunlettered\nunleveled\nunliberated\nunlicensed\nunlicked\nunlighted\nunlikable\nunlike\nunlikelier\nunlikeliest\nunlikelihood\nunlikeliness\nunlikely\nunlikeness\nunlimber\nunlimbered\nunlimbering\nunlimbers\nunlimited\nunlimitedly\nunlimitedness\nunlined\nunlink\nunlinked\nunlinking\nunlinks\nunliquidated\nunlisted\nunlistenable\nunlit\nunliterary\nunlivable\nunlive\nunlived\nunlives\nunliving\nunload\nunloaded\nunloader\nunloaders\nunloading\nunloads\nunlocalized\nunlock\nunlocked\nunlocking\nunlocks\nunlooked\nunloose\nunloosed\nunloosen\nunloosened\nunloosening\nunloosens\nunlooses\nunloosing\nunlovable\nunloved\nunlovelier\nunloveliest\nunloveliness\nunlovely\nunloving\nunluckier\nunluckiest\nunluckily\nunluckiness\nunlucky\nunlyrical\nunmacho\nunmade\nunmagnified\nunmake\nunmakes\nunmaking\nunmalicious\nunmaliciously\nunman\nunmanageability\nunmanageable\nunmanageably\nunmanaged\nunmanipulated\nunmanlier\nunmanliest\nunmanliness\nunmanly\nunmanned\nunmannered\nunmanneredly\nunmannerliness\nunmannerly\nunmanning\nunmans\nunmapped\nunmarked\nunmarketable\nunmarred\nunmarriageable\nunmarried\nunmarrieds\nunmasculine\nunmask\nunmasked\nunmasking\nunmasks\nunmatchable\nunmatched\nunmated\nunmeaning\nunmeaningly\nunmeant\nunmeasurable\nunmeasured\nunmechanical\nunmechanically\nunmechanized\nunmediated\nunmedicated\nunmeet\nunmelodic\nunmelodious\nunmelodiousness\nunmemorable\nunmemorably\nunmentionable\nunmentionableness\nunmentionables\nunmentionably\nunmentioned\nunmerciful\nunmercifully\nunmercifulness\nunmerited\nunmeritorious\nunmerry\nunmeshed\nunmet\nunmetabolized\nunmethodical\nunmethodically\nunmilitary\nunmilled\nunmindful\nunmindfully\nunmindfulness\nunmined\nunmingled\nunmissed\nunmistakable\nunmistakably\nunmitigated\nunmitigatedly\nunmitigatedness\nunmix\nunmixable\nunmixed\nunmixedly\nunmixes\nunmixing\nunmodernized\nunmodified\nunmodish\nunmold\nunmolded\nunmolding\nunmolds\nunmolested\nunmonitored\nunmoor\nunmoored\nunmooring\nunmoors\nunmoral\nunmorality\nunmorally\nunmortise\nunmortised\nunmortises\nunmortising\nunmotivated\nunmounted\nunmovable\nunmoved\nunmoving\nunmuffle\nunmuffled\nunmuffles\nunmuffling\nunmurmuring\nunmusical\nunmusically\nunmusicalness\nunmuzzle\nunmuzzled\nunmuzzles\nunmuzzling\nunmyelinated\nunnail\nunnailed\nunnailing\nunnails\nunnamable\nunnameable\nunnamed\nunnatural\nunnaturally\nunnaturalness\nunnecessarily\nunnecessary\nunneeded\nunnegotiable\nunnerve\nunnerved\nunnerves\nunnerving\nunnervingly\nunneurotic\nunnewsworthy\nunnilhexium\nunnilpentium\nunnilquadium\nunnilquintium\nunnormalized\nunnoted\nunnoticeable\nunnoticeably\nunnoticed\nunnoticing\nunnourished\nunnourishing\nunnumbered\nunobjectionable\nunobscured\nunobservable\nunobservant\nunobserved\nunobserving\nunobstructed\nunobtainable\nunobtrusive\nunobtrusively\nunobtrusiveness\nunoccupied\nunoffending\nunofficial\nunofficially\nunopenable\nunopened\nunopposed\nunordered\nunordinary\nunorganized\nunoriginal\nunornament\nunornamented\nunornamenting\nunornaments\nunorthodox\nunorthodoxly\nunorthodoxy\nunostentatious\nunostentatiously\nunostentatiousness\nunowned\nunoxygenated\nunpack\nunpacked\nunpacker\nunpackers\nunpacking\nunpacks\nunpadded\nunpaged\nunpaginated\nunpaid\nunpainted\nunpaired\nunpalatability\nunpalatable\nunpalatably\nunparalleled\nunparasitized\nunpardonable\nunparliamentary\nunparsed\nunparticular\nunpartisan\nunpassable\nunpasteurized\nunpastoral\nunpatentable\nunpatriotic\nunpatriotically\nunpatronizing\nunpaved\nunpedantic\nunpeeled\nunpeg\nunpegged\nunpegging\nunpegs\nunpeople\nunpeopled\nunpeoples\nunpeopling\nunperceived\nunperceiving\nunperceptive\nunperfect\nunperfected\nunperforated\nunperformable\nunperformed\nunperson\nunpersuaded\nunpersuasive\nunperturbed\nunphysical\nunpick\nunpicked\nunpicking\nunpicks\nunpicturesque\nunpile\nunpiled\nunpiles\nunpiling\nunpin\nunpinned\nunpinning\nunpins\nunpitying\nunpityingly\nunplaced\nunplanned\nunplanted\nunplausible\nunplayable\nunpleasant\nunpleasantly\nunpleasantness\nunpleasantries\nunpleasantry\nunpleased\nunpleasing\nunplowed\nunplug\nunplugged\nunplugging\nunplugs\nunplumbed\nunpoetic\nunpolarized\nunpoliced\nunpolished\nunpolitical\nunpolled\nunpolluted\nunpopular\nunpopularity\nunpopulated\nunposed\nunpractical\nunpracticed\nunprecedented\nunprecedentedly\nunpredictability\nunpredictable\nunpredictables\nunpredictably\nunpredicted\nunpregnant\nunprejudiced\nunpremeditated\nunpremeditatedly\nunprepared\nunpreparedly\nunpreparedness\nunprepossessing\nunprepossessingly\nunpressed\nunpressured\nunpressurized\nunpresuming\nunpretending\nunpretentious\nunpretentiously\nunpretentiousness\nunpretty\nunpriced\nunprimed\nunprincipled\nunprincipledness\nunprintable\nunprintably\nunprivileged\nunproblematic\nunprocessed\nunprocurable\nunproduced\nunproductive\nunproductively\nunproductiveness\nunprofaned\nunprofessed\nunprofessional\nunprofessionalism\nunprofessionally\nunprofitability\nunprofitable\nunprofitableness\nunprofitably\nunprogrammable\nunprogrammed\nunprogressive\nunprolific\nunpromising\nunpromisingly\nunprompted\nunpronounceable\nunpronounced\nunpropitious\nunpropitiously\nunprosperous\nunprotected\nunprovable\nunproved\nunproven\nunprovided\nunprovidedly\nunprovoked\nunpruned\nunpublicized\nunpublishable\nunpublished\nunpunctual\nunpunctuality\nunpunctuated\nunpunished\nunpurified\nunputdownable\nunqualified\nunqualifiedly\nunquantifiable\nunquantified\nunquenchable\nunquenchably\nunquenched\nunquestionability\nunquestionable\nunquestionableness\nunquestionably\nunquestioned\nunquestioning\nunquestioningly\nunquiet\nunquieter\nunquietest\nunquietly\nunquietness\nunquotable\nunquote\nunquoted\nunraised\nunranked\nunrated\nunravel\nunraveled\nunraveling\nunravelled\nunravelling\nunravels\nunravished\nunreachability\nunreachable\nunreachably\nunreached\nunread\nunreadability\nunreadable\nunreadier\nunreadiest\nunreadily\nunreadiness\nunready\nunreal\nunrealistic\nunrealistically\nunrealities\nunreality\nunrealizable\nunrealized\nunreason\nunreasonable\nunreasonableness\nunreasonably\nunreasoned\nunreasoning\nunreasoningly\nunreassuringly\nunrecalled\nunreceptive\nunreckonable\nunreclaimable\nunreclaimed\nunrecognizable\nunrecognizableness\nunrecognizably\nunrecognized\nunrecognizing\nunrecompensed\nunreconcilable\nunreconciled\nunreconstructed\nunrecorded\nunrecoverable\nunrecovered\nunrectified\nunrecyclable\nunredeemable\nunredeemed\nunredressed\nunreduced\nunreel\nunreeled\nunreeling\nunreels\nunreeve\nunreeved\nunreeves\nunreeving\nunrefined\nunreflecting\nunreflectingly\nunreflective\nunreflectively\nunreformed\nunrefrigerated\nunregenerable\nunregeneracy\nunregenerate\nunregenerately\nunregimented\nunregistered\nunregulated\nunrehearsed\nunreinforced\nunrelated\nunrelaxed\nunreleased\nunrelenting\nunrelentingly\nunreliability\nunreliable\nunreliableness\nunreliably\nunrelieved\nunrelievedly\nunreligious\nunreluctant\nunremarkable\nunremarkably\nunremarked\nunremembered\nunreminiscent\nunremitting\nunremittingly\nunremittingness\nunremovable\nunremunerated\nunremunerative\nunrenowned\nunrepaired\nunrepeatable\nunrepentant\nunrepentantly\nunreported\nunrepresentative\nunrepresentativeness\nunrepresented\nunrepressed\nunreproved\nunrequited\nunrequitedly\nunreserve\nunreserved\nunreservedly\nunreservedness\nunresistant\nunresisting\nunresistingly\nunresolvable\nunresolved\nunrespectable\nunresponsive\nunresponsively\nunresponsiveness\nunrest\nunrestful\nunrestored\nunrestrained\nunrestrainedly\nunrestrainedness\nunrestraint\nunrestraints\nunrestricted\nunrestrictedly\nunretouched\nunreturnable\nunrevealed\nunrevealing\nunrevealingly\nunreviewable\nunreviewed\nunrevised\nunrevolutionary\nunrewarded\nunrewarding\nunrhetorical\nunrhymed\nunrhythmic\nunridable\nunriddle\nunriddled\nunriddler\nunriddlers\nunriddles\nunriddling\nunrifled\nunrig\nunrigged\nunrigging\nunrighteous\nunrighteously\nunrighteousness\nunrightfully\nunrigs\nunrip\nunripe\nunripened\nunripeness\nunriper\nunripest\nunripped\nunripping\nunrips\nunrivaled\nunrivalled\nunrobed\nunroll\nunrolled\nunrolling\nunrolls\nunromantic\nunromantically\nunromanticized\nunroof\nunroofed\nunroofing\nunroofs\nunroot\nunrooted\nunrooting\nunroots\nunround\nunrounded\nunrounding\nunrounds\nunrove\nunroven\nunruffled\nunruled\nunrulier\nunruliest\nunruliness\nunruly\nunrushed\nuns\nunsacred\nunsaddle\nunsaddled\nunsaddles\nunsaddling\nunsafe\nunsafer\nunsafest\nunsaid\nunsalable\nunsalaried\nunsalted\nunsalvageable\nunsanctified\nunsanctioned\nunsanitary\nunsatisfactorily\nunsatisfactoriness\nunsatisfactory\nunsatisfied\nunsatisfiedness\nunsatisfying\nunsatisfyingly\nunsaturate\nunsaturated\nunsaturates\nunsaved\nunsavorily\nunsavoriness\nunsavory\nunsay\nunsayable\nunsayables\nunsaying\nunsays\nunscalable\nunscarred\nunscathed\nunscented\nunscheduled\nunscholarly\nunschooled\nunscientific\nunscientifically\nunscramble\nunscrambled\nunscrambler\nunscramblers\nunscrambles\nunscrambling\nunscratched\nunscreened\nunscrew\nunscrewed\nunscrewing\nunscrews\nunscripted\nunscriptural\nunscrupulous\nunscrupulously\nunscrupulousness\nunseal\nunsealed\nunsealing\nunseals\nunseam\nunseamed\nunseaming\nunseams\nunsearchable\nunsearchably\nunseasonable\nunseasonableness\nunseasonably\nunseasoned\nunseat\nunseated\nunseating\nunseats\nunseaworthy\nunsecured\nunseeded\nunseeing\nunseeingly\nunseemlier\nunseemliest\nunseemliness\nunseemly\nunseen\nunsegmented\nunsegregated\nunselected\nunselective\nunselectively\nunself\nunselfconscious\nunselfconsciously\nunselfconsciousness\nunselfish\nunselfishly\nunselfishness\nunsell\nunsellable\nunselling\nunsells\nunsensational\nunsensitized\nunsent\nunsentimental\nunsentimentally\nunseparated\nunserious\nunseriousness\nunserved\nunserviceable\nunset\nunsetting\nunsettle\nunsettled\nunsettledness\nunsettlement\nunsettles\nunsettling\nunsettlingly\nunsew\nunsewed\nunsewing\nunsewn\nunsex\nunsexed\nunsexes\nunsexing\nunsexual\nunsexy\nunshackle\nunshackled\nunshackles\nunshackling\nunshaded\nunshakable\nunshakably\nunshaken\nunshaped\nunshapely\nunshapen\nunshared\nunsharp\nunsharpened\nunshaved\nunshaven\nunsheathe\nunsheathed\nunsheathes\nunsheathing\nunshed\nunshell\nunshelled\nunshelling\nunshells\nunsheltered\nunshielded\nunshift\nunshifted\nunshifting\nunshifts\nunship\nunshipped\nunshipping\nunships\nunshockable\nunshod\nunshorn\nunshowy\nunshrinking\nunsight\nunsighted\nunsighting\nunsightlier\nunsightliest\nunsightliness\nunsightly\nunsights\nunsigned\nunsinkable\nunsized\nunskilled\nunskillful\nunskillfully\nunskillfulness\nunslakable\nunslaked\nunsleeping\nunsling\nunslinging\nunslings\nunslung\nunsmart\nunsmiling\nunsmilingly\nunsmoothed\nunsnag\nunsnagged\nunsnagging\nunsnags\nunsnap\nunsnapped\nunsnapping\nunsnaps\nunsnarl\nunsnarled\nunsnarling\nunsnarls\nunsociability\nunsociable\nunsociableness\nunsociably\nunsocial\nunsocially\nunsoiled\nunsold\nunsolder\nunsoldered\nunsoldering\nunsolders\nunsoldierly\nunsolicited\nunsolvable\nunsolved\nunsophisticated\nunsophisticatedly\nunsophisticatedness\nunsophistication\nunsorted\nunsought\nunsound\nunsounded\nunsounder\nunsoundest\nunsoundly\nunsoundness\nunsowed\nunsown\nunsparing\nunsparingly\nunsparingness\nunspeak\nunspeakable\nunspeakableness\nunspeakably\nunspeaking\nunspeaks\nunspecialized\nunspecifiable\nunspecific\nunspecified\nunspectacular\nunspectacularly\nunspent\nunsphere\nunsphered\nunspheres\nunsphering\nunspiritual\nunsplit\nunspoiled\nunspoilt\nunspoke\nunspoken\nunsporting\nunsportsmanlike\nunspotted\nunspottedness\nunsprayed\nunsprung\nunstable\nunstableness\nunstabler\nunstablest\nunstably\nunstained\nunstamped\nunstandardized\nunstapled\nunstaring\nunstartling\nunstated\nunstaunched\nunstayed\nunsteadied\nunsteadier\nunsteadies\nunsteadiest\nunsteadily\nunsteadiness\nunsteady\nunsteadying\nunsteel\nunsteeled\nunsteeling\nunsteels\nunstep\nunstepped\nunstepping\nunsteps\nunsterile\nunsterilized\nunstick\nunsticking\nunsticks\nunstilted\nunstinted\nunstinting\nunstintingly\nunstirred\nunstitch\nunstitched\nunstitches\nunstitching\nunstop\nunstoppable\nunstoppably\nunstopped\nunstopper\nunstopping\nunstops\nunstrained\nunstrap\nunstrapped\nunstrapping\nunstraps\nunstratified\nunstressed\nunstriated\nunstring\nunstringing\nunstrings\nunstructured\nunstrung\nunstuck\nunstudied\nunstuffy\nunstylish\nunsubdued\nunsubscribe\nunsubscribed\nunsubscribes\nunsubscribing\nunsubsidized\nunsubstantial\nunsubstantiality\nunsubstantially\nunsubstantiated\nunsubtle\nunsubtly\nunsuccess\nunsuccessful\nunsuccessfully\nunsuccessfulness\nunsuitability\nunsuitable\nunsuitableness\nunsuitably\nunsuited\nunsullied\nunsung\nunsupervised\nunsupportable\nunsupported\nunsuppressed\nunsure\nunsurpassable\nunsurpassed\nunsurprised\nunsurprising\nunsurprisingly\nunsusceptible\nunsuspected\nunsuspectedly\nunsuspecting\nunsuspectingly\nunsuspended\nunsuspicious\nunsustainable\nunswathe\nunswathed\nunswathes\nunswathing\nunswayable\nunswear\nunswearing\nunswears\nunsweetened\nunswerving\nunswervingly\nunswore\nunsworn\nunsymmetrical\nunsymmetrically\nunsympathetic\nunsympathetically\nunsynchronized\nunsystematic\nunsystematically\nunsystematized\nuntactful\nuntagged\nuntainted\nuntalented\nuntamable\nuntamed\nuntangle\nuntangled\nuntangles\nuntangling\nuntanned\nuntapped\nuntarnished\nuntaught\nuntaxed\nunteach\nunteachable\nunteaches\nunteaching\nuntechnical\nuntellable\nuntempered\nuntenability\nuntenable\nuntenableness\nuntenably\nuntenanted\nuntended\nuntented\nuntenured\nuntestable\nuntested\nuntether\nuntethered\nuntethering\nuntethers\nunthankful\nunthankfully\nunthankfulness\nunthawed\nunthawing\nuntheoretical\nuntheorized\nunthink\nunthinkability\nunthinkable\nunthinkableness\nunthinkably\nunthinking\nunthinkingly\nunthinkingness\nunthinks\nunthought\nunthread\nunthreaded\nunthreading\nunthreads\nunthreatening\nunthrift\nunthrifty\nunthrone\nunthroned\nunthrones\nunthroning\nuntidier\nuntidiest\nuntidily\nuntidiness\nuntidy\nuntie\nuntied\nunties\nuntil\nuntillable\nuntilled\nuntimelier\nuntimeliest\nuntimeliness\nuntimely\nuntiring\nuntiringly\nuntitled\nunto\nuntogether\nuntold\nuntouchability\nuntouchable\nuntouchables\nuntouchably\nuntouched\nuntoward\nuntowardly\nuntowardness\nuntraceable\nuntracked\nuntraditional\nuntraditionally\nuntrained\nuntrammeled\nuntransformed\nuntranslatability\nuntranslatable\nuntranslated\nuntraveled\nuntraversed\nuntread\nuntreading\nuntreads\nuntreatable\nuntreatably\nuntreated\nuntrendy\nuntried\nuntrimmed\nuntrod\nuntrodden\nuntroubled\nuntroubledness\nuntrue\nuntruer\nuntruest\nuntruly\nuntruss\nuntrussed\nuntrusses\nuntrussing\nuntrusting\nuntrustworthily\nuntrustworthiness\nuntrustworthy\nuntruth\nuntruthful\nuntruthfully\nuntruthfulness\nuntruths\nuntuck\nuntucked\nuntucking\nuntucks\nuntufted\nuntune\nuntuned\nuntunes\nuntuning\nunturned\nuntutored\nuntwine\nuntwined\nuntwines\nuntwining\nuntwist\nuntwisted\nuntwisting\nuntwists\nuntying\nuntypical\nuntypically\nununderstandable\nunusable\nunused\nunusual\nunusually\nunusualness\nunutilized\nunutterable\nunutterableness\nunutterably\nunuttered\nunvaccinated\nunvalued\nunvanquished\nunvaried\nunvarnished\nunvarying\nunvaryingly\nunveil\nunveiled\nunveiling\nunveilings\nunveils\nunventilated\nunverbalized\nunverifiable\nunverified\nunversed\nunvested\nunviable\nunviewed\nunvigilant\nunviolated\nunvisited\nunvocal\nunvoice\nunvoiced\nunvoices\nunvoicing\nunwanted\nunwarier\nunwariest\nunwarily\nunwariness\nunwarlike\nunwarned\nunwarrantable\nunwarrantably\nunwarranted\nunwarrantedly\nunwary\nunwashed\nunwashedness\nunwatchable\nunwatched\nunwatchful\nunwavering\nunwaveringly\nunwaxed\nunweakened\nunweaned\nunwearable\nunwearied\nunweariedly\nunweathered\nunweave\nunweaves\nunweaving\nunwed\nunwedded\nunweeting\nunweetingly\nunweight\nunweighted\nunweighting\nunweights\nunwelcome\nunwell\nunwept\nunwhite\nunwholesome\nunwholesomely\nunwholesomeness\nunwieldier\nunwieldiest\nunwieldily\nunwieldiness\nunwieldy\nunwilled\nunwilling\nunwillingly\nunwillingness\nunwind\nunwinding\nunwinds\nunwinnable\nunwire\nunwired\nunwires\nunwiring\nunwisdom\nunwisdoms\nunwise\nunwisely\nunwiser\nunwisest\nunwish\nunwished\nunwishes\nunwishing\nunwitting\nunwittingly\nunwomanly\nunwon\nunwonted\nunwontedly\nunwontedness\nunworkability\nunworkable\nunworkableness\nunworkably\nunworked\nunworldlier\nunworldliest\nunworldliness\nunworldly\nunworn\nunworried\nunworthier\nunworthiest\nunworthily\nunworthiness\nunworthy\nunwound\nunwounded\nunwove\nunwoven\nunwrap\nunwrapped\nunwrapping\nunwraps\nunwreathe\nunwreathed\nunwreathes\nunwreathing\nunwrinkled\nunwritten\nunyielding\nunyieldingly\nunyieldingness\nunyoke\nunyoked\nunyokes\nunyoking\nunyoung\nunzip\nunzipped\nunzipping\nunzips\nup\nupanishad\nupanishadic\nupanishads\nupas\nupbeat\nupbeats\nupbraid\nupbraided\nupbraider\nupbraiders\nupbraiding\nupbraidingly\nupbraids\nupbringing\nupbringings\nupbuild\nupbuilder\nupbuilders\nupbuilding\nupbuilds\nupbuilt\nupcast\nupcasts\nupchuck\nupchucked\nupchucking\nupchucks\nupcoast\nupcoming\nupcountry\nupdate\nupdated\nupdates\nupdating\nupdo\nupdos\nupdraft\nupdrafts\nupend\nupended\nupending\nupends\nupfield\nupfront\nupgrade\nupgraded\nupgrades\nupgrading\nupgrowth\nupgrowths\nupheaval\nupheavals\nupheave\nupheaved\nupheaver\nupheavers\nupheaves\nupheaving\nupheld\nuphill\nuphills\nuphold\nupholder\nupholders\nupholding\nupholds\nupholster\nupholstered\nupholsterer\nupholsterers\nupholsteries\nupholstering\nupholsters\nupholstery\nupityness\nupkeep\nupland\nuplander\nuplanders\nuplands\nuplift\nuplifted\nuplifter\nuplifters\nuplifting\nuplifts\nuplink\nuplinks\nupload\nuploaded\nuploading\nuploads\nupmanship\nupmanships\nupmarket\nupmost\nupolu\nupon\nupped\nupper\nuppercase\nuppercased\nuppercases\nuppercasing\nupperclassman\nupperclassmen\nuppercut\nuppercuts\nuppermost\nupperpart\nupperparts\nuppers\nupping\nuppish\nuppishly\nuppishness\nuppitiness\nuppity\nuppityness\nuppsala\nupraise\nupraised\nupraises\nupraising\nuprate\nuprated\nuprates\nuprating\nuprear\nupreared\nuprearing\nuprears\nupright\nuprightly\nuprightness\nuprights\nuprise\nuprisen\nupriser\nuprisers\nuprises\nuprising\nuprisings\nupriver\nuproar\nuproarious\nuproariously\nuproariousness\nuproars\nuproot\nuprooted\nuprootedness\nuprooter\nuprooters\nuprooting\nuproots\nuprose\nuprush\nuprushes\nups\nupscale\nupscaled\nupscales\nupscaling\nupset\nupsets\nupsetter\nupsetters\nupsetting\nupsettingly\nupshift\nupshifted\nupshifting\nupshifts\nupshot\nupshots\nupside\nupsides\nupsilon\nupsmanship\nupsprang\nupspring\nupspringing\nupsprings\nupsprung\nupstage\nupstaged\nupstager\nupstagers\nupstages\nupstaging\nupstairs\nupstanding\nupstandingness\nupstart\nupstarted\nupstarting\nupstarts\nupstate\nupstater\nupstaters\nupstream\nupstroke\nupstrokes\nupsurge\nupsurged\nupsurges\nupsurging\nupsweep\nupsweeping\nupsweeps\nupswept\nupswing\nupswings\nuptake\nuptakes\nuptempo\nuptempos\nupthrow\nupthrows\nupthrust\nupthrusting\nupthrusts\nuptick\nupticks\nuptight\nuptightness\nuptilt\nuptilted\nuptilting\nuptilts\nuptime\nuptimes\nuptown\nuptowner\nuptowners\nuptowns\nuptrend\nuptrended\nuptrending\nuptrends\nupturn\nupturned\nupturning\nupturns\nupward\nupwardly\nupwardness\nupwards\nupwell\nupwelled\nupwelling\nupwells\nupwind\nuracil\nuraei\nuraemia\nuraemias\nuraeus\nuraeuses\nural\nuralian\nuralic\nurals\nurania\nuranian\nuranias\nuranic\nuraninite\nuraninites\nuranium\nuranography\nuranous\nuranus\nuranyl\nurase\nurases\nurate\nurates\nuratic\nurban\nurbane\nurbanely\nurbaner\nurbanest\nurbanism\nurbanist\nurbanistic\nurbanistically\nurbanists\nurbanite\nurbanites\nurbanities\nurbanity\nurbanization\nurbanizations\nurbanize\nurbanized\nurbanizes\nurbanizing\nurbanologist\nurbanologists\nurbanology\nurbino\nurceolate\nurchin\nurchins\nurd\nurds\nurdu\nurea\nurease\nureases\nuredia\nuredinia\nuredinial\nurediniospore\nurediniospores\nuredinium\nurediospore\nurediospores\nuredium\nuredospore\nuredospores\nuredostage\nuredostages\nureide\nureides\nuremia\nuremias\nuremic\nureotelic\nureotelism\nureter\nureteral\nureteric\nureters\nurethan\nurethane\nurethanes\nurethans\nurethra\nurethrae\nurethral\nurethras\nurethrectomies\nurethrectomy\nurethritis\nurethritises\nurethroscope\nurethroscopes\nurethroscopy\nuretic\nurge\nurged\nurgencies\nurgency\nurgent\nurgently\nurger\nurgers\nurges\nurging\nurgings\nurial\nuric\nuricosuric\nuricotelic\nuricotelism\nuridine\nuridines\nurim\nurinal\nurinals\nurinalyses\nurinalysis\nurinary\nurinate\nurinated\nurinates\nurinating\nurination\nurinations\nurinative\nurinator\nurinators\nurine\nuriniferous\nurinogenital\nurinometer\nurinometers\nurinose\nurinous\nurn\nurns\nurocanic\nurochord\nurochordate\nurochordates\nurochords\nurochrome\nurochromes\nurodele\nurodeles\nurogenital\nurogenous\nurogram\nurograms\nurographic\nurographies\nurography\nurokinase\nurokinases\nurolith\nurolithiasis\nurolithic\nuroliths\nurologic\nurological\nurologist\nurologists\nurology\nuronic\nuropod\nuropods\nuropygial\nuropygium\nuropygiums\nuroscopies\nuroscopy\nurostomies\nurostomy\nurostyle\nurostyles\nursa\nursine\nursprache\nursula\nursuline\nursulines\nurtext\nurtexts\nurticant\nurticants\nurticaria\nurticarial\nurticate\nurticated\nurticates\nurticating\nurtication\nurtications\nuruguay\nuruguayan\nuruguayans\nurus\nuruses\nurushiol\nurushiols\nus\nusa\nusability\nusable\nusableness\nusably\nusage\nusages\nusance\nusances\nuse\nuseable\nused\nuseful\nusefully\nusefulness\nuseless\nuselessly\nuselessness\nuser\nusers\nuses\nushak\nushant\nusher\nushered\nusherette\nusherettes\nushering\nushers\nusing\nusnea\nusneas\nusnic\nusquebaugh\nusquebaughs\nusual\nusually\nusualness\nusufruct\nusufructs\nusufructuaries\nusufructuary\nusurer\nusurers\nusuries\nusurious\nusuriously\nusuriousness\nusurp\nusurpation\nusurpations\nusurped\nusurper\nusurpers\nusurping\nusurpingly\nusurps\nusury\nut\nutah\nutahan\nutahans\nute\nutensil\nutensils\nuteri\nuterine\nutero\nuterus\nuteruses\nutes\nutile\nutilitarian\nutilitarianism\nutilitarians\nutilities\nutility\nutilizable\nutilization\nutilizations\nutilize\nutilized\nutilizer\nutilizers\nutilizes\nutilizing\nutmost\nutopia\nutopian\nutopianism\nutopians\nutopias\nutopism\nutopist\nutopistic\nutopists\nutrecht\nutricle\nutricles\nutricular\nutriculi\nutriculus\nutrillo\nuttar\nutter\nutterable\nutterance\nutterances\nuttered\nutterer\nutterers\nuttering\nutterly\nuttermost\nutters\nuvarovite\nuvarovites\nuvea\nuveal\nuveas\nuveitis\nuvula\nuvulae\nuvular\nuvulas\nuvulitis\nuvulitises\nuxorial\nuxorially\nuxoricide\nuxoricides\nuxorious\nuxoriously\nuxoriousness\nuzbeg\nuzbek\nuzbekistan\nuzbeks\nuzès\nv\nvac\nvacancies\nvacancy\nvacant\nvacantly\nvacantness\nvacatable\nvacate\nvacated\nvacates\nvacating\nvacation\nvacationed\nvacationeer\nvacationeers\nvacationer\nvacationers\nvacationing\nvacationist\nvacationists\nvacationland\nvacationlands\nvacationless\nvacations\nvaccinal\nvaccinate\nvaccinated\nvaccinates\nvaccinating\nvaccination\nvaccinations\nvaccinator\nvaccinators\nvaccine\nvaccinee\nvaccinees\nvaccines\nvaccinia\nvaccinial\nvaccinias\nvacillant\nvacillate\nvacillated\nvacillates\nvacillating\nvacillatingly\nvacillation\nvacillations\nvacillator\nvacillators\nvacillatory\nvacs\nvacua\nvacuities\nvacuity\nvacuo\nvacuolar\nvacuolate\nvacuolated\nvacuolation\nvacuole\nvacuoles\nvacuolization\nvacuous\nvacuously\nvacuousness\nvacuum\nvacuumed\nvacuumes\nvacuuming\nvacuums\nvade\nvadose\nvaduz\nvagabond\nvagabondage\nvagabondages\nvagabonded\nvagabonding\nvagabondish\nvagabondism\nvagabonds\nvagal\nvagally\nvagaries\nvagarious\nvagariously\nvagary\nvagi\nvagile\nvagility\nvagina\nvaginae\nvaginal\nvaginally\nvaginas\nvaginate\nvaginated\nvaginectomies\nvaginectomy\nvaginismus\nvaginismuses\nvaginitis\nvaginitises\nvagotomies\nvagotomy\nvagotonia\nvagotonic\nvagotropic\nvagrancies\nvagrancy\nvagrant\nvagrantly\nvagrants\nvagrom\nvague\nvaguely\nvagueness\nvaguer\nvaguest\nvagus\nvahine\nvahines\nvail\nvailed\nvailing\nvails\nvain\nvainer\nvainest\nvainglories\nvainglorious\nvaingloriously\nvaingloriousness\nvainglory\nvainly\nvainness\nvair\nvairs\nvaishnava\nvaishnavas\nvaishnavism\nvaisya\nvaisyas\nvalance\nvalanced\nvalances\nvalancing\nvale\nvalediction\nvaledictions\nvaledictorian\nvaledictorians\nvaledictories\nvaledictory\nvalence\nvalences\nvalencia\nvalenciennes\nvalency\nvalentine\nvalentines\nvalera\nvalerate\nvalerates\nvalerian\nvalerians\nvaleric\nvales\nvalet\nvaleted\nvaleting\nvalets\nvaletudinarian\nvaletudinarianism\nvaletudinarians\nvaletudinaries\nvaletudinary\nvalgoid\nvalgus\nvalhalla\nvaliance\nvaliancy\nvaliant\nvaliantly\nvaliantness\nvaliants\nvalid\nvalidate\nvalidated\nvalidates\nvalidating\nvalidation\nvalidations\nvalidity\nvalidly\nvalidness\nvaline\nvalines\nvalinomycin\nvalinomycins\nvalise\nvalises\nvalium\nvalkyrie\nvalkyries\nvallate\nvallation\nvallations\nvallatory\nvallecula\nvalleculae\nvallecular\nvalleculate\nvallences\nvallencies\nvalletta\nvalley\nvalleyed\nvalleys\nvalois\nvalonia\nvalonias\nvalor\nvalorem\nvalorization\nvalorizations\nvalorize\nvalorized\nvalorizes\nvalorizing\nvalorous\nvalorously\nvalorousness\nvalors\nvalparaiso\nvalpolicella\nvalproate\nvalproates\nvalsalva\nvalse\nvalses\nvaluable\nvaluableness\nvaluables\nvaluably\nvaluate\nvaluated\nvaluates\nvaluating\nvaluation\nvaluational\nvaluationally\nvaluations\nvaluator\nvaluators\nvalue\nvalued\nvalueless\nvaluelessness\nvaluer\nvaluers\nvalues\nvaluing\nvaluta\nvalvar\nvalvate\nvalve\nvalved\nvalveless\nvalves\nvalving\nvalvula\nvalvulae\nvalvular\nvalvule\nvalvules\nvalvulitis\nvalvulitises\nvalvuloplasties\nvalvuloplasty\nvambrace\nvambraces\nvamoose\nvamoosed\nvamooses\nvamoosing\nvamp\nvamped\nvamper\nvampers\nvamping\nvampire\nvampires\nvampirical\nvampirish\nvampirism\nvampish\nvampishly\nvamps\nvampy\nvan\nvanadate\nvanadates\nvanadic\nvanadinite\nvanadinites\nvanadium\nvanaspati\nvanbrugh\nvancomycin\nvancomycins\nvancouver\nvanda\nvandal\nvandalic\nvandalism\nvandalistic\nvandalization\nvandalizations\nvandalize\nvandalized\nvandalizes\nvandalizing\nvandals\nvanderbilt\nvandyke\nvandyked\nvandykes\nvane\nvaned\nvanes\nvang\nvangs\nvanguard\nvanguardism\nvanguardist\nvanguardists\nvanguards\nvanilla\nvanillas\nvanillic\nvanillin\nvanir\nvanish\nvanished\nvanisher\nvanishers\nvanishes\nvanishing\nvanishingly\nvanishment\nvanities\nvanity\nvanload\nvanloads\nvanned\nvanner\nvanners\nvanning\nvanpool\nvanpooled\nvanpooler\nvanpoolers\nvanpooling\nvanpools\nvanquish\nvanquishable\nvanquished\nvanquisher\nvanquishers\nvanquishes\nvanquishing\nvanquishment\nvans\nvansittart\nvantage\nvantages\nvanuatu\nvanuatuan\nvanuatuans\nvanward\nvapid\nvapidity\nvapidly\nvapidness\nvapor\nvapored\nvaporer\nvaporers\nvaporescence\nvaporetti\nvaporetto\nvaporettos\nvaporific\nvaporing\nvaporingly\nvaporings\nvaporish\nvaporishness\nvaporizable\nvaporization\nvaporizations\nvaporize\nvaporized\nvaporizer\nvaporizers\nvaporizes\nvaporizing\nvaporosity\nvaporous\nvaporously\nvaporousness\nvapors\nvaporware\nvapory\nvaquero\nvaqueros\nvara\nvaractor\nvaractors\nvaras\nvaria\nvariabilities\nvariability\nvariable\nvariableness\nvariables\nvariably\nvariance\nvariances\nvariant\nvariants\nvarias\nvariate\nvariates\nvariation\nvariational\nvariationally\nvariations\nvariceal\nvaricella\nvaricellas\nvaricellate\nvaricelloid\nvarices\nvaricocele\nvaricoceles\nvaricolored\nvaricose\nvaricosed\nvaricoses\nvaricosis\nvaricosities\nvaricosity\nvaricotomies\nvaricotomy\nvaried\nvariedly\nvariegate\nvariegated\nvariegates\nvariegating\nvariegation\nvariegations\nvariegator\nvariegators\nvarier\nvariers\nvaries\nvarietal\nvarietally\nvarietals\nvarieties\nvariety\nvariform\nvariola\nvariolas\nvariolate\nvariolated\nvariolates\nvariolating\nvariole\nvarioles\nvariolite\nvariolites\nvarioloid\nvarioloids\nvariolous\nvariometer\nvariometers\nvariorum\nvariorums\nvarious\nvariously\nvariousness\nvarisized\nvaristor\nvaristors\nvaritype\nvarityped\nvaritypes\nvarityping\nvarix\nvarlet\nvarletry\nvarlets\nvarlettries\nvarmint\nvarmints\nvarnish\nvarnished\nvarnisher\nvarnishers\nvarnishes\nvarnishing\nvarnishy\nvaroom\nvaroomed\nvarooming\nvarooms\nvarsities\nvarsity\nvarsovian\nvaruna\nvarus\nvarve\nvarved\nvarves\nvary\nvarying\nvaryingly\nvas\nvasa\nvasal\nvascula\nvascular\nvascularity\nvascularization\nvascularizations\nvascularize\nvascularized\nvascularizes\nvascularizing\nvasculature\nvasculatures\nvasculitis\nvasculitises\nvasculum\nvase\nvasectomies\nvasectomize\nvasectomized\nvasectomizes\nvasectomizing\nvasectomy\nvaselike\nvaseline\nvases\nvashon\nvasoactive\nvasoactivity\nvasoconstriction\nvasoconstrictions\nvasoconstrictive\nvasoconstrictor\nvasoconstrictors\nvasodilatation\nvasodilatations\nvasodilation\nvasodilations\nvasodilator\nvasodilators\nvasoligate\nvasoligated\nvasoligates\nvasoligating\nvasoligation\nvasoligations\nvasomotor\nvasopressin\nvasopressins\nvasopressor\nvasopressors\nvasospasm\nvasospasms\nvasospastic\nvasotocin\nvasotocins\nvasovagal\nvassal\nvassalage\nvassals\nvast\nvaster\nvastest\nvastier\nvastiest\nvastities\nvastitude\nvastitudes\nvastity\nvastly\nvastness\nvasty\nvat\nvatic\nvatical\nvatican\nvaticanism\nvaticinal\nvaticinate\nvaticinated\nvaticinates\nvaticinating\nvaticination\nvaticinations\nvaticinator\nvaticinators\nvats\nvatted\nvatting\nvatu\nvatus\nvau\nvaudeville\nvaudevilles\nvaudevillian\nvaudevillians\nvaudois\nvaughan\nvault\nvaulted\nvaulter\nvaulters\nvaulting\nvaultingly\nvaultings\nvaults\nvaulty\nvaunt\nvaunted\nvaunter\nvaunters\nvauntful\nvaunting\nvauntingly\nvaunts\nvav\nvavasor\nvavasors\nvavasour\nvavasours\nvcr\nvd\nve\nveadar\nveal\nvealer\nvealers\nvealy\nvector\nvectored\nvectorial\nvectorially\nvectoring\nvectorization\nvectorizations\nvectorize\nvectorized\nvectorizes\nvectorizing\nvectors\nveda\nvedalia\nvedalias\nvedanta\nvedantic\nvedantism\nvedantist\nvedantists\nvedas\nvedda\nveddah\nveddahs\nveddas\nveddoid\nveddoids\nvedette\nvedettes\nvedic\nvee\nveejay\nveejays\nveena\nveenas\nveep\nveeps\nveer\nveered\nveeries\nveering\nveeringly\nveers\nveery\nvees\nvega\nvegan\nveganism\nvegans\nvegas\nvegetable\nvegetables\nvegetably\nvegetal\nvegetarian\nvegetarianism\nvegetarians\nvegetate\nvegetated\nvegetates\nvegetating\nvegetation\nvegetational\nvegetations\nvegetative\nvegetatively\nvegetativeness\nvegetive\nvegged\nveggie\nveggies\nvegging\nvegie\nvegies\nvehemence\nvehemency\nvehement\nvehemently\nvehicle\nvehicles\nvehicular\nveil\nveiled\nveiling\nveilings\nveils\nvein\nveinal\nveined\nveiner\nveiners\nveinier\nveiniest\nveining\nveinings\nveinlet\nveinlets\nveins\nveinstone\nveinstones\nveinule\nveinules\nveiny\nvela\nvelamen\nvelamentous\nvelamina\nvelar\nvelaria\nvelarium\nvelarization\nvelarizations\nvelarize\nvelarized\nvelarizes\nvelarizing\nvelars\nvelasquez\nvelate\nvelcro\nveld\nvelds\nveldt\nveldts\nveliger\nveligers\nvelleities\nvelleity\nvellum\nvellums\nveloce\nvelocimeter\nvelocimeters\nvelocipede\nvelocipedes\nvelocities\nvelocity\nvelodrome\nvelodromes\nvelour\nvelours\nvelouté\nvelum\nvelums\nvelure\nvelures\nvelutinous\nvelvet\nvelveteen\nvelveteens\nvelvetier\nvelvetiest\nvelvetleaf\nvelvetleafs\nvelvetlike\nvelvets\nvelvety\nvena\nvenae\nvenal\nvenalities\nvenality\nvenally\nvenatic\nvenatical\nvenation\nvenational\nvend\nvenda\nvendable\nvendace\nvendaces\nvended\nvendee\nvendees\nvender\nvenders\nvendetta\nvendettas\nvendeuse\nvendeuses\nvendibility\nvendible\nvending\nvendor\nvendors\nvends\nvendue\nvendues\nvendôme\nveneer\nveneered\nveneerer\nveneerers\nveneering\nveneers\nvenenation\nvenenations\nvenene\nvenenes\nvenepuncture\nvenepunctures\nvenerability\nvenerable\nvenerableness\nvenerably\nvenerate\nvenerated\nvenerates\nvenerating\nveneration\nvenerational\nvenerator\nvenerators\nvenereal\nvenereological\nvenereologist\nvenereologists\nvenereology\nvenereum\nveneries\nveneris\nvenery\nvenesection\nvenesections\nveneti\nvenetia\nvenetian\nvenetians\nvenetic\nveneto\nvenezia\nvenezuela\nvenezuelan\nvenezuelans\nvenge\nvengeance\nvenged\nvengeful\nvengefully\nvengefulness\nvenges\nvenging\nvenial\nveniality\nvenially\nvenialness\nvenice\nvenin\nvenins\nvenipuncture\nvenipunctures\nvenire\nvenireman\nveniremen\nvenires\nvenison\nvenisons\nvenite\nvenites\nvenn\nvenogram\nvenograms\nvenography\nvenom\nvenomous\nvenomously\nvenomousness\nvenose\nvenosity\nvenosus\nvenous\nvenously\nvenousness\nvent\nventage\nventages\nventail\nventails\nvented\nventer\nventers\nventifact\nventifacts\nventilate\nventilated\nventilates\nventilating\nventilation\nventilations\nventilator\nventilators\nventilatory\nventing\nventless\nventrad\nventral\nventrally\nventrals\nventricle\nventricles\nventricose\nventricosity\nventricous\nventricular\nventriculi\nventriculus\nventriloquial\nventriloquially\nventriloquism\nventriloquist\nventriloquistic\nventriloquists\nventriloquize\nventriloquized\nventriloquizes\nventriloquizing\nventriloquy\nventrodorsal\nventrodorsally\nventrolateral\nventrolaterally\nventromedial\nventromedially\nvents\nventure\nventured\nventurer\nventurers\nventures\nventuresome\nventuresomely\nventuresomeness\nventuri\nventuring\nventuris\nventurous\nventurously\nventurousness\nvenue\nvenues\nvenular\nvenule\nvenules\nvenus\nvenusberg\nvenushair\nvenusian\nvenusians\nvera\nveracious\nveraciously\nveraciousness\nveracities\nveracity\nveranda\nverandaed\nverandah\nverandahed\nverandahs\nverandas\nverapamil\nverapamils\nveratridine\nveratridines\nveratrine\nveratrines\nveratrum\nverb\nverba\nverbal\nverbalism\nverbalisms\nverbalist\nverbalistic\nverbalists\nverbalizable\nverbalization\nverbalizations\nverbalize\nverbalized\nverbalizer\nverbalizers\nverbalizes\nverbalizing\nverbally\nverbals\nverbatim\nverbaux\nverbena\nverbenas\nverbiage\nverbicide\nverbicides\nverbid\nverbified\nverbifies\nverbify\nverbifying\nverbigeration\nverbigerations\nverbless\nverbose\nverbosely\nverboseness\nverbosity\nverboten\nverbs\nverbum\nverd\nverdancy\nverdant\nverdantly\nverde\nverdean\nverdeans\nverderer\nverderers\nverderor\nverderors\nverdi\nverdict\nverdicts\nverdigris\nverdin\nverdins\nverditer\nverditers\nverdun\nverdure\nverdured\nverdurous\nverdurousness\nverge\nverged\nverger\nvergers\nverges\nverging\nverglas\nverglases\nveridic\nveridical\nveridicality\nveridically\nverier\nveriest\nverifiability\nverifiable\nverifiableness\nverifiably\nverification\nverifications\nverificative\nverified\nverifier\nverifiers\nverifies\nverify\nverifying\nverily\nverisimilar\nverisimilarly\nverisimilitude\nverisimilitudes\nverisimilitudinous\nverism\nverismo\nverismos\nverist\nveristic\nverists\nveritable\nveritableness\nveritably\nverities\nverity\nverjuice\nverjuices\nverkhoyansk\nverlaine\nvermeer\nvermeil\nvermicelli\nvermicidal\nvermicide\nvermicides\nvermicular\nvermicularly\nvermiculate\nvermiculated\nvermiculates\nvermiculating\nvermiculation\nvermiculations\nvermiculite\nvermiculites\nvermiform\nvermifuge\nvermifuges\nvermilion\nvermilioned\nvermilioning\nvermilions\nvermillion\nvermillioned\nvermillioning\nvermillions\nvermin\nvermination\nverminations\nverminous\nverminously\nvermivorous\nvermont\nvermonter\nvermonters\nvermouth\nvermouths\nvernacle\nvernacular\nvernacularism\nvernacularisms\nvernacularize\nvernacularized\nvernacularizes\nvernacularizing\nvernacularly\nvernaculars\nvernal\nvernalization\nvernalizations\nvernalize\nvernalized\nvernalizes\nvernalizing\nvernally\nvernation\nvernations\nverner\nvernicle\nvernier\nverniers\nvernissage\nvernissages\nvernix\nvernon\nverona\nveronese\nveronica\nveronicas\nverruca\nverrucae\nverrucose\nverrucous\nvers\nversa\nversailles\nversant\nversants\nversatile\nversatilely\nversatileness\nversatility\nverse\nversed\nverses\nverset\nversets\nversicle\nversicles\nversicolor\nversicolored\nversicular\nversification\nversifications\nversified\nversifier\nversifiers\nversifies\nversify\nversifying\nversine\nversing\nversion\nversional\nversions\nverso\nversos\nverst\nversts\nversus\nvert\nverte\nvertebra\nvertebrae\nvertebral\nvertebrally\nvertebras\nvertebrate\nvertebrates\nvertebration\nvertebrations\nvertex\nvertexes\nvertical\nverticality\nvertically\nverticalness\nverticals\nvertices\nverticil\nverticillaster\nverticillasters\nverticillastrate\nverticillate\nverticillated\nverticillately\nverticillation\nverticillations\nverticillium\nverticils\nvertiginous\nvertiginously\nvertiginousness\nvertigo\nvertigoes\nvertigos\nverts\nvertu\nvertus\nvervain\nvervains\nverve\nvervet\nvervets\nvery\nvesalius\nvesica\nvesicae\nvesical\nvesicant\nvesicants\nvesicate\nvesicated\nvesicates\nvesicating\nvesication\nvesications\nvesicatories\nvesicatory\nvesicle\nvesicles\nvesicular\nvesicularity\nvesicularly\nvesiculate\nvesiculated\nvesiculates\nvesiculating\nvesiculation\nvesiculations\nvespasian\nvesper\nvesperal\nvesperals\nvespers\nvespertilian\nvespertilionid\nvespertilionids\nvespertinal\nvespertine\nvespiaries\nvespiary\nvespid\nvespids\nvespine\nvespucci\nvessel\nvessels\nvest\nvesta\nvestal\nvestals\nvestas\nvested\nvestee\nvestees\nvestiaries\nvestiary\nvestibular\nvestibule\nvestibuled\nvestibules\nvestibulocochlear\nvestige\nvestiges\nvestigia\nvestigial\nvestigially\nvestigium\nvesting\nvestings\nvestlike\nvestment\nvestmental\nvestments\nvestries\nvestry\nvestryman\nvestrymen\nvestrywoman\nvestrywomen\nvests\nvesture\nvestured\nvestures\nvesturing\nvesuvian\nvesuvianite\nvesuvianites\nvesuvians\nvesuvius\nvet\nvetch\nvetches\nvetchling\nvetchlings\nveteran\nveterans\nveterinarian\nveterinarians\nveterinaries\nveterinary\nvetiver\nvetivers\nvetivert\nvetiverts\nveto\nvetoed\nvetoer\nvetoers\nvetoes\nvetoing\nvets\nvetted\nvetting\nvex\nvexation\nvexations\nvexatious\nvexatiously\nvexatiousness\nvexed\nvexedly\nvexer\nvexers\nvexes\nvexilla\nvexillaries\nvexillary\nvexillate\nvexillologic\nvexillological\nvexillologist\nvexillologists\nvexillology\nvexillum\nvexing\nvexingly\nvext\nvhf\nvia\nviability\nviable\nviably\nviaduct\nviaducts\nvial\nvialed\nvialing\nvialled\nvialling\nvials\nviand\nviands\nviatic\nviatica\nviatical\nviaticum\nviaticums\nvibe\nvibes\nvibist\nvibists\nvibracula\nvibracular\nvibraculoid\nvibraculum\nvibraharp\nvibraharpist\nvibraharpists\nvibraharps\nvibrance\nvibrancy\nvibrant\nvibrantly\nvibraphone\nvibraphones\nvibraphonist\nvibraphonists\nvibrate\nvibrated\nvibrates\nvibratile\nvibratility\nvibrating\nvibration\nvibrational\nvibrationless\nvibrations\nvibrative\nvibrato\nvibratoless\nvibrator\nvibrators\nvibratory\nvibratos\nvibrio\nvibrioid\nvibrion\nvibrionic\nvibrions\nvibrios\nvibrioses\nvibriosis\nvibrissa\nvibrissae\nvibronic\nviburnum\nvicar\nvicarage\nvicarages\nvicarate\nvicarates\nvicarial\nvicariance\nvicariances\nvicariant\nvicariants\nvicariate\nvicariates\nvicarious\nvicariously\nvicariousness\nvicars\nvicarship\nvice\nviced\nvicegeral\nvicegerencies\nvicegerency\nvicegerent\nvicegerents\nvicenary\nvicennial\nvicenza\nviceregal\nviceregally\nvicereine\nvicereines\nviceroy\nviceroyalties\nviceroyalty\nviceroys\nviceroyship\nviceroyships\nvices\nvichy\nvichyssoise\nvichyssoises\nvicinage\nvicinal\nvicing\nvicinities\nvicinity\nvicious\nviciously\nviciousness\nvicissitude\nvicissitudes\nvicissitudinary\nvicissitudinous\nvictim\nvictimhood\nvictimization\nvictimizations\nvictimize\nvictimized\nvictimizer\nvictimizers\nvictimizes\nvictimizing\nvictimless\nvictimologist\nvictimologists\nvictimology\nvictims\nvictor\nvictoria\nvictorian\nvictoriana\nvictorianism\nvictorianisms\nvictorianization\nvictorianizations\nvictorianize\nvictorianized\nvictorianizes\nvictorianizing\nvictorians\nvictorias\nvictories\nvictorious\nvictoriously\nvictoriousness\nvictors\nvictory\nvictrola\nvictual\nvictualed\nvictualer\nvictualers\nvictualing\nvictualled\nvictualler\nvictuallers\nvictualling\nvictuals\nvicuna\nvicunas\nvicuña\nvicuñas\nvidalia\nvide\nvidelicet\nvideo\nvideocassette\nvideocassettes\nvideoconference\nvideoconferences\nvideoconferencing\nvideodisc\nvideodiscs\nvideodisk\nvideodisks\nvideogenic\nvideographer\nvideographers\nvideography\nvideoland\nvideophile\nvideophiles\nvideophone\nvideophones\nvideos\nvideotape\nvideotaped\nvideotapes\nvideotaping\nvideotex\nvideotexs\nvideotext\nvideotexts\nvidette\nvidettes\nvidicon\nvidicons\nviduity\nvie\nvied\nvienna\nviennese\nvientiane\nvier\nviers\nvies\nvietcong\nvietminh\nvietnam\nvietnamese\nvietnamization\nvietnamize\nvietnamized\nvietnamizes\nvietnamizing\nview\nviewable\nviewdata\nviewed\nviewer\nviewers\nviewership\nviewfinder\nviewfinders\nviewier\nviewiest\nviewing\nviewings\nviewless\nviewlessly\nviewpoint\nviewpoints\nviews\nviewy\nvig\nviga\nvigas\nvigesimal\nvigil\nvigilance\nvigilant\nvigilante\nvigilanteism\nvigilantes\nvigilantism\nvigilantly\nvigils\nvigintillion\nvigneron\nvignerons\nvignette\nvignetted\nvignetter\nvignetters\nvignettes\nvignetting\nvignettist\nvignettists\nvigor\nvigorish\nvigoroso\nvigorous\nvigorously\nvigorousness\nviking\nvikings\nvilayet\nvilayets\nvile\nvilely\nvileness\nviler\nvilest\nvilification\nvilifications\nvilified\nvilifier\nvilifiers\nvilifies\nvilify\nvilifying\nvilipend\nvilipended\nvilipending\nvilipends\nvill\nvilla\nvilladom\nvillage\nvillager\nvillagers\nvillagery\nvillages\nvillain\nvillainage\nvillainages\nvillainess\nvillainies\nvillainous\nvillainously\nvillainousness\nvillains\nvillainy\nvillanella\nvillanelle\nvillanelles\nvillanueva\nvillas\nvillatic\nvillein\nvilleinage\nvilleinages\nvilleins\nvillenage\nvilleneuve\nvilli\nvilliers\nvilliform\nvillon\nvillose\nvillosities\nvillosity\nvillous\nvillously\nvills\nvillus\nvim\nviminal\nvin\nvina\nvinaceous\nvinaigrette\nvinaigrettes\nvinal\nvinas\nvinasse\nvinasses\nvinblastine\nvinblastines\nvinca\nvincent\nvincentian\nvincentians\nvinci\nvincibility\nvincible\nvincibly\nvincristine\nvincristines\nvincula\nvinculum\nvinculums\nvindaloo\nvindicable\nvindicate\nvindicated\nvindicates\nvindicating\nvindication\nvindications\nvindicator\nvindicators\nvindicatory\nvindictive\nvindictively\nvindictiveness\nvine\nvined\nvinedresser\nvinedressers\nvinegar\nvinegared\nvinegarish\nvinegarone\nvinegarones\nvinegarroon\nvinegarroons\nvinegars\nvinegary\nvineries\nvinery\nvines\nvineyard\nvineyardist\nvineyardists\nvineyards\nvinic\nvinicultural\nviniculture\nvinicultures\nviniculturist\nviniculturists\nvinier\nviniest\nvinifera\nviniferous\nvinification\nvinifications\nvinified\nvinifies\nvinify\nvinifying\nvining\nvino\nvinogradoff\nvinometer\nvinometers\nvinos\nvinosities\nvinosity\nvinous\nvinously\nvintage\nvintager\nvintagers\nvintages\nvintner\nvintners\nviny\nvinyl\nvinylic\nvinylidene\nvinylidenes\nvinyls\nviol\nviola\nviolability\nviolable\nviolableness\nviolably\nviolaceous\nviolas\nviolate\nviolated\nviolates\nviolating\nviolation\nviolations\nviolative\nviolator\nviolators\nviole\nviolence\nviolent\nviolently\nviolet\nviolets\nviolin\nviolinist\nviolinistic\nviolinists\nviolinmaker\nviolinmakers\nviolinmaking\nviolins\nviolist\nviolists\nvioloncellist\nvioloncellists\nvioloncello\nvioloncellos\nviolone\nviolones\nviols\nviomycin\nviomycins\nviosterol\nviosterols\nviper\nviperfish\nviperfishes\nviperine\nviperish\nviperous\nviperously\nvipers\nviraginous\nvirago\nviragoes\nviragos\nviral\nvirally\nvirelay\nvirelays\nviremia\nviremias\nviremic\nvireo\nvireos\nvires\nvirescence\nvirescent\nvirga\nvirgas\nvirgate\nvirgates\nvirgil\nvirgilia\nvirgilian\nvirgin\nvirginal\nvirginalist\nvirginalists\nvirginally\nvirginals\nvirginia\nvirginiamycin\nvirginiamycins\nvirginian\nvirginians\nvirginities\nvirginity\nvirgins\nvirgo\nvirgoan\nvirgoans\nvirgos\nvirgulate\nvirgule\nvirgules\nviricidal\nviricide\nviricides\nvirid\nviridescence\nviridescent\nviridian\nviridity\nvirile\nvirilely\nviriles\nvirilis\nvirilism\nvirilisms\nvirility\nvirilization\nvirilizations\nvirilize\nvirilized\nvirilizes\nvirilizing\nvirion\nvirions\nvirogene\nvirogenes\nvirogeneses\nvirogenesis\nvirogenetic\nvirogenic\nviroid\nviroids\nvirologic\nvirological\nvirologically\nvirologist\nvirologists\nvirology\nviroses\nvirosis\nvirtu\nvirtual\nvirtuality\nvirtualizes\nvirtually\nvirtue\nvirtueless\nvirtues\nvirtuosa\nvirtuosas\nvirtuosi\nvirtuosic\nvirtuosically\nvirtuosities\nvirtuosity\nvirtuoso\nvirtuosos\nvirtuous\nvirtuously\nvirtuousness\nvirtus\nvirucidal\nvirucide\nvirucides\nvirulence\nvirulency\nvirulent\nvirulently\nviruliferous\nvirus\nviruses\nvis\nvisa\nvisaed\nvisage\nvisaged\nvisages\nvisaing\nvisard\nvisards\nvisas\nvisayan\nvisayans\nviscacha\nviscachas\nviscera\nvisceral\nviscerally\nvisceromotor\nviscid\nviscidity\nviscidly\nviscidness\nviscoelastic\nviscoelasticity\nviscometer\nviscometers\nviscometric\nviscometry\nvisconti\nviscose\nviscosimeter\nviscosimeters\nviscosimetric\nviscosities\nviscosity\nviscount\nviscountcies\nviscountcy\nviscountess\nviscountesses\nviscounties\nviscounts\nviscounty\nviscous\nviscously\nviscousness\nviscus\nvise\nvised\nviseed\nviseing\nviselike\nvises\nvishnu\nvisibilities\nvisibility\nvisible\nvisibleness\nvisibly\nvisigoth\nvisigothic\nvisigoths\nvising\nvision\nvisional\nvisionally\nvisionaries\nvisionariness\nvisionary\nvisioned\nvisioning\nvisionless\nvisions\nvisit\nvisitable\nvisitant\nvisitants\nvisitation\nvisitational\nvisitations\nvisitatorial\nvisited\nvisiting\nvisitor\nvisitors\nvisits\nvisor\nvisored\nvisoring\nvisorless\nvisors\nvista\nvistaed\nvistas\nvistula\nvisual\nvisuality\nvisualizable\nvisualization\nvisualizations\nvisualize\nvisualized\nvisualizer\nvisualizers\nvisualizes\nvisualizing\nvisually\nvisualness\nvisuals\nvisuomotor\nvisuomotors\nvisuospatial\nvita\nvitae\nvitaes\nvital\nvitalism\nvitalist\nvitalistic\nvitalists\nvitalities\nvitality\nvitalization\nvitalizations\nvitalize\nvitalized\nvitalizer\nvitalizers\nvitalizes\nvitalizing\nvitally\nvitalness\nvitals\nvitamer\nvitameric\nvitamers\nvitamin\nvitaminic\nvitamins\nvitellaria\nvitellarium\nvitellariums\nvitellin\nvitelline\nvitellines\nvitellins\nvitellogenesis\nvitellogenetic\nvitellogenic\nvitellus\nvitelluses\nviterbo\nvitiable\nvitiate\nvitiated\nvitiates\nvitiating\nvitiation\nvitiations\nvitiator\nvitiators\nviticultural\nviticulturally\nviticulture\nviticulturist\nviticulturists\nvitiligo\nvitiligos\nvitrectomies\nvitrectomy\nvitreosity\nvitreous\nvitreousness\nvitrescence\nvitrescent\nvitrifaction\nvitrifactions\nvitrifiability\nvitrifiable\nvitrification\nvitrifications\nvitrified\nvitrifies\nvitrify\nvitrifying\nvitrine\nvitrines\nvitriol\nvitrioled\nvitriolic\nvitrioling\nvitriolled\nvitriolling\nvitriols\nvitro\nvitruvius\nvitta\nvittae\nvittate\nvittle\nvittles\nvituline\nvituperate\nvituperated\nvituperates\nvituperating\nvituperation\nvituperations\nvituperative\nvituperatively\nvituperativeness\nvituperator\nvituperators\nvituperatory\nvitus\nviva\nvivace\nvivacious\nvivaciously\nvivaciousness\nvivacity\nvivaldi\nvivandière\nvivandières\nvivant\nvivants\nvivaria\nvivarium\nvivariums\nvivax\nvivaxs\nvivendi\nviverrid\nviverrids\nviverrine\nviverrines\nvivian\nvivid\nvivider\nvividest\nvividly\nvividness\nvivific\nvivification\nvivifications\nvivified\nvivifier\nvivifiers\nvivifies\nvivify\nvivifying\nviviparity\nviviparous\nviviparously\nvivisect\nvivisected\nvivisecting\nvivisection\nvivisectional\nvivisectionally\nvivisectionist\nvivisectionists\nvivisector\nvivisectors\nvivisects\nvivo\nvivos\nvivre\nvixen\nvixenish\nvixenishly\nvixenishness\nvixens\nviz\nvizard\nvizards\nvizcacha\nvizier\nvizierate\nvizierial\nviziers\nviziership\nvizor\nvizored\nvizoring\nvizors\nvizsla\nvizslas\nvladivostok\nvlaminck\nvocable\nvocables\nvocabular\nvocabularies\nvocabulary\nvocal\nvocalic\nvocalically\nvocalism\nvocalist\nvocalistic\nvocalists\nvocality\nvocalization\nvocalizations\nvocalize\nvocalized\nvocalizer\nvocalizers\nvocalizes\nvocalizing\nvocally\nvocalness\nvocals\nvocation\nvocational\nvocationalism\nvocationalisms\nvocationalist\nvocationalists\nvocationally\nvocations\nvocative\nvocatively\nvocatives\nvoce\nvociferant\nvociferate\nvociferated\nvociferates\nvociferating\nvociferation\nvociferations\nvociferator\nvociferators\nvociferous\nvociferously\nvociferousness\nvocoder\nvocoders\nvodka\nvodkas\nvodoun\nvodouns\nvodun\nvoduns\nvogue\nvogues\nvoguish\nvoguishly\nvoguishness\nvogul\nvoguls\nvoice\nvoiced\nvoicedness\nvoiceful\nvoicefulness\nvoiceless\nvoicelessly\nvoicelessness\nvoiceover\nvoiceovers\nvoiceprint\nvoiceprints\nvoicer\nvoicers\nvoices\nvoicing\nvoicings\nvoid\nvoidable\nvoidableness\nvoidance\nvoidances\nvoided\nvoider\nvoiders\nvoiding\nvoidness\nvoids\nvoile\nvoiles\nvoilà\nvoir\nvolans\nvolant\nvolante\nvolapük\nvolar\nvolatile\nvolatileness\nvolatiles\nvolatility\nvolatilizable\nvolatilization\nvolatilizations\nvolatilize\nvolatilized\nvolatilizer\nvolatilizers\nvolatilizes\nvolatilizing\nvolcanic\nvolcanically\nvolcanicity\nvolcanism\nvolcanisms\nvolcanization\nvolcanizations\nvolcanize\nvolcanized\nvolcanizes\nvolcanizing\nvolcano\nvolcanoes\nvolcanogenic\nvolcanologic\nvolcanological\nvolcanologist\nvolcanologists\nvolcanology\nvolcanos\nvole\nvolens\nvolente\nvoles\nvolga\nvolgograd\nvolitant\nvolitantes\nvolitation\nvolitational\nvolitations\nvolition\nvolitional\nvolitionally\nvolitive\nvolkslied\nvolkslieder\nvolkswagen\nvolkswagens\nvolley\nvolleyball\nvolleyballer\nvolleyballers\nvolleyballs\nvolleyed\nvolleyer\nvolleyers\nvolleying\nvolleys\nvolplane\nvolplaned\nvolplanes\nvolplaning\nvolpone\nvolsci\nvolscian\nvolscians\nvolt\nvolta\nvoltage\nvoltages\nvoltaic\nvoltaire\nvolte\nvoltes\nvoltmeter\nvoltmeters\nvolts\nvolubility\nvoluble\nvolubleness\nvolubly\nvolume\nvolumed\nvolumes\nvolumeter\nvolumeters\nvolumetric\nvolumetrically\nvoluming\nvoluminosity\nvoluminous\nvoluminously\nvoluminousness\nvolumnia\nvoluntaries\nvoluntarily\nvoluntariness\nvoluntarism\nvoluntarist\nvoluntaristic\nvoluntarists\nvoluntary\nvoluntaryism\nvoluntaryist\nvoluntaryists\nvolunteer\nvolunteered\nvolunteering\nvolunteerism\nvolunteers\nvoluptuaries\nvoluptuary\nvoluptuous\nvoluptuously\nvoluptuousness\nvolute\nvoluted\nvolutes\nvolutin\nvolutins\nvolution\nvolutions\nvolva\nvolvas\nvolvate\nvolvent\nvolvents\nvolvox\nvolvoxes\nvolvulus\nvolvuluses\nvomer\nvomerine\nvomers\nvomica\nvomicae\nvomit\nvomited\nvomiter\nvomiters\nvomiting\nvomitive\nvomitives\nvomitories\nvomitory\nvomits\nvomiturition\nvomituritions\nvomitus\nvomituses\nvon\nvoodoo\nvoodooed\nvoodooing\nvoodooism\nvoodooist\nvoodooistic\nvoodooists\nvoodoos\nvoracious\nvoraciously\nvoraciousness\nvoracity\nvorlage\nvorlages\nvortex\nvortexes\nvortical\nvortically\nvorticella\nvorticellae\nvorticellas\nvortices\nvorticism\nvorticist\nvorticists\nvorticity\nvorticose\nvortigern\nvortiginous\nvosges\nvotable\nvotaress\nvotaresses\nvotaries\nvotarist\nvotarists\nvotary\nvote\nvoteable\nvoted\nvoteless\nvoter\nvoters\nvotes\nvoting\nvotive\nvotively\nvotiveness\nvoto\nvotos\nvouch\nvouched\nvouchee\nvouchees\nvoucher\nvouchered\nvouchering\nvouchers\nvouches\nvouching\nvouchsafe\nvouchsafed\nvouchsafement\nvouchsafes\nvouchsafing\nvoussoir\nvoussoirs\nvouvray\nvouvrays\nvow\nvowed\nvowel\nvowelization\nvowelizations\nvowelize\nvowelized\nvowelizes\nvowelizing\nvowels\nvower\nvowers\nvowing\nvows\nvox\nvoyage\nvoyaged\nvoyager\nvoyagers\nvoyages\nvoyageur\nvoyageurs\nvoyaging\nvoyeur\nvoyeurism\nvoyeuristic\nvoyeuristically\nvoyeurs\nvroom\nvroomed\nvrooming\nvrooms\nvu\nvug\nvuggy\nvugs\nvulcan\nvulcanian\nvulcanicity\nvulcanism\nvulcanisms\nvulcanite\nvulcanizable\nvulcanizate\nvulcanizates\nvulcanization\nvulcanizations\nvulcanize\nvulcanized\nvulcanizer\nvulcanizers\nvulcanizes\nvulcanizing\nvulcanologist\nvulcanologists\nvulcanology\nvulgar\nvulgarian\nvulgarians\nvulgaris\nvulgarism\nvulgarisms\nvulgarities\nvulgarity\nvulgarization\nvulgarizations\nvulgarize\nvulgarized\nvulgarizer\nvulgarizers\nvulgarizes\nvulgarizing\nvulgarly\nvulgarness\nvulgate\nvulgates\nvulgus\nvulnerabilities\nvulnerability\nvulnerable\nvulnerableness\nvulnerably\nvulneraries\nvulnerary\nvulpecula\nvulpecular\nvulpine\nvulture\nvultures\nvulturine\nvulturish\nvulturous\nvulva\nvulvae\nvulval\nvulvar\nvulvas\nvulvate\nvulvectomies\nvulvectomy\nvulviform\nvulvitis\nvulvitises\nvulvovaginitis\nvulvovaginitises\nvying\nvänern\nvättern\nvérité\nvéronique\nw\nwaals\nwabanaki\nwabanakis\nwabble\nwabbled\nwabbles\nwabbling\nwac\nwack\nwacked\nwackier\nwackiest\nwackily\nwackiness\nwacko\nwackos\nwacks\nwacky\nwaco\nwacs\nwad\nwadable\nwadded\nwaddenzee\nwadder\nwadders\nwaddied\nwaddies\nwadding\nwaddle\nwaddled\nwaddler\nwaddlers\nwaddles\nwaddling\nwaddy\nwaddying\nwade\nwadeable\nwaded\nwader\nwaders\nwades\nwadi\nwadies\nwading\nwadis\nwadmal\nwadmel\nwadmol\nwads\nwady\nwaf\nwafer\nwafered\nwafering\nwafers\nwaffle\nwaffled\nwaffler\nwafflers\nwaffles\nwafflestomper\nwafflestompers\nwaffling\nwafflingly\nwaffly\nwafs\nwaft\nwaftage\nwafted\nwafter\nwafters\nwafting\nwafts\nwafture\nwag\nwage\nwaged\nwageless\nwager\nwagered\nwagerer\nwagerers\nwagering\nwagers\nwages\nwageworker\nwageworkers\nwagged\nwagger\nwaggeries\nwaggers\nwaggery\nwagging\nwaggish\nwaggishly\nwaggishness\nwaggle\nwaggled\nwaggles\nwaggling\nwaggly\nwaging\nwagner\nwagnerian\nwagnerians\nwagnerite\nwagnerites\nwagon\nwagoned\nwagoner\nwagoners\nwagonette\nwagonettes\nwagoning\nwagonload\nwagonloads\nwagons\nwags\nwagtail\nwagtails\nwahabi\nwahabis\nwahhabi\nwahhabis\nwahhabism\nwahhabite\nwahhabites\nwahine\nwahines\nwahoo\nwahoos\nwahpekute\nwahpekutes\nwahpeton\nwahpetons\nwahwah\nwaianae\nwaif\nwaiflike\nwaifs\nwaikiki\nwail\nwailed\nwailer\nwailers\nwailful\nwailfully\nwailing\nwailingly\nwails\nwain\nwains\nwainscot\nwainscoted\nwainscoting\nwainscots\nwainscotted\nwainscotting\nwainwright\nwainwrights\nwaist\nwaistband\nwaistbands\nwaistcloth\nwaistcloths\nwaistcoat\nwaistcoated\nwaistcoats\nwaisted\nwaistless\nwaistline\nwaistlines\nwaists\nwait\nwaited\nwaiter\nwaiters\nwaiting\nwaitings\nwaitpeople\nwaitperson\nwaitpersons\nwaitress\nwaitresses\nwaitron\nwaitrons\nwaits\nwaive\nwaived\nwaiver\nwaivers\nwaives\nwaiving\nwakame\nwakames\nwakashan\nwake\nwaked\nwakeful\nwakefully\nwakefulness\nwakeless\nwaken\nwakened\nwakener\nwakeners\nwakening\nwakens\nwaker\nwakers\nwakes\nwakeup\nwaking\nwalachia\nwalapai\nwalapais\nwalcheren\nwalden\nwaldenses\nwaldensian\nwaldensians\nwaldorf\nwale\nwaled\nwaler\nwalers\nwales\nwalhalla\nwaling\nwalk\nwalkability\nwalkable\nwalkabout\nwalkabouts\nwalkathon\nwalkathons\nwalkaway\nwalkaways\nwalked\nwalker\nwalkers\nwalkie\nwalking\nwalkingstick\nwalkingsticks\nwalkman\nwalkout\nwalkouts\nwalkover\nwalkovers\nwalks\nwalkup\nwalkups\nwalkway\nwalkways\nwalky\nwalkyrie\nwall\nwalla\nwallabies\nwallaby\nwallace\nwallachia\nwallachian\nwallachians\nwallah\nwallahs\nwallaroo\nwallaroos\nwallas\nwallboard\nwalled\nwallenberg\nwallet\nwallets\nwalleye\nwalleyed\nwalleyes\nwallflower\nwallflowers\nwalling\nwallis\nwallless\nwallonia\nwalloon\nwalloons\nwallop\nwalloped\nwalloper\nwallopers\nwalloping\nwallopings\nwallops\nwallow\nwallowa\nwallowed\nwallower\nwallowers\nwallowing\nwallows\nwallpaper\nwallpapered\nwallpapering\nwallpapers\nwalls\nwalnut\nwalnuts\nwalpole\nwalpurgis\nwalpurgisnacht\nwalrus\nwalruses\nwalsingham\nwalsy\nwalter\nwalton\nwaltz\nwaltzed\nwaltzer\nwaltzers\nwaltzes\nwaltzing\nwamble\nwambled\nwambles\nwambliness\nwambling\nwamblingly\nwambly\nwampanoag\nwampanoags\nwampum\nwampumpeag\nwan\nwand\nwander\nwandered\nwanderer\nwanderers\nwandering\nwanderingly\nwanderings\nwanderlust\nwanderoo\nwanderoos\nwanders\nwandflower\nwandflowers\nwands\nwane\nwaned\nwanes\nwangle\nwangled\nwangler\nwanglers\nwangles\nwangling\nwanigan\nwanigans\nwaning\nwanion\nwankel\nwanly\nwanna\nwanned\nwanner\nwanness\nwannest\nwannigan\nwannigans\nwanning\nwans\nwant\nwanted\nwanter\nwanters\nwanting\nwantless\nwantlessness\nwanton\nwantoned\nwantoner\nwantoners\nwantoning\nwantonly\nwantonness\nwantons\nwants\nwapentake\nwapentakes\nwapiti\nwapitis\nwappenschawing\nwappinger\nwappingers\nwapsipinicon\nwar\nwarble\nwarbled\nwarbler\nwarblers\nwarbles\nwarbling\nwarbonnet\nwarbonnets\nwarburg\nward\nwarded\nwarden\nwardenries\nwardenry\nwardens\nwardenship\nwarder\nwarders\nwardership\nwardian\nwarding\nwardress\nwardresses\nwardrobe\nwardrobes\nwardroom\nwardrooms\nwards\nwardship\nwardships\nware\nwared\nwarehouse\nwarehoused\nwarehouseman\nwarehousemen\nwarehouser\nwarehousers\nwarehouses\nwarehousing\nwareroom\nwarerooms\nwares\nwarfare\nwarfarin\nwarfront\nwarfronts\nwarhead\nwarheads\nwarhorse\nwarhorses\nwarier\nwariest\nwarily\nwariness\nwaring\nwarison\nwarless\nwarlike\nwarlock\nwarlocks\nwarlord\nwarlordism\nwarlords\nwarm\nwarmed\nwarmer\nwarmers\nwarmest\nwarmhearted\nwarmheartedly\nwarmheartedness\nwarming\nwarmish\nwarmly\nwarmness\nwarmonger\nwarmongering\nwarmongers\nwarmouth\nwarmouths\nwarms\nwarmth\nwarmup\nwarmups\nwarn\nwarned\nwarner\nwarners\nwarning\nwarningly\nwarnings\nwarns\nwarp\nwarpage\nwarpath\nwarpaths\nwarped\nwarper\nwarpers\nwarping\nwarplane\nwarplanes\nwarps\nwarrant\nwarrantability\nwarrantable\nwarrantableness\nwarrantably\nwarranted\nwarrantee\nwarrantees\nwarranter\nwarranters\nwarranties\nwarranting\nwarrantless\nwarrantor\nwarrantors\nwarrants\nwarranty\nwarred\nwarren\nwarrener\nwarreners\nwarrens\nwarring\nwarrior\nwarriors\nwars\nwarsaw\nwarship\nwarships\nwart\nwarted\nwarthog\nwarthogs\nwartime\nwartless\nwarts\nwarty\nwarwickshire\nwary\nwas\nwasabi\nwasatch\nwash\nwashability\nwashable\nwashbasin\nwashbasins\nwashboard\nwashboards\nwashbowl\nwashbowls\nwashcloth\nwashcloths\nwashday\nwashdays\nwashed\nwasher\nwasherman\nwashermen\nwashers\nwasherwoman\nwasherwomen\nwashes\nwashhouse\nwashhouses\nwashier\nwashiest\nwashiness\nwashing\nwashings\nwashington\nwashingtonian\nwashingtonians\nwashout\nwashouts\nwashrag\nwashrags\nwashroom\nwashrooms\nwashstand\nwashstands\nwashtub\nwashtubs\nwashup\nwashups\nwashwoman\nwashwomen\nwashy\nwasn\nwasn't\nwasp\nwaspdom\nwaspier\nwaspiest\nwaspish\nwaspishly\nwaspishness\nwasplike\nwasps\nwaspy\nwassail\nwassailed\nwassailer\nwassailers\nwassailing\nwassails\nwassermann\nwastage\nwaste\nwastebasket\nwastebaskets\nwasted\nwasteful\nwastefully\nwastefulness\nwasteland\nwastelands\nwastepaper\nwaster\nwasters\nwastes\nwastewater\nwastewaters\nwasting\nwastingly\nwastrel\nwastrels\nwatap\nwatape\nwatapes\nwataps\nwatch\nwatchable\nwatchband\nwatchbands\nwatchcase\nwatchcases\nwatchdog\nwatchdogged\nwatchdogging\nwatchdogs\nwatched\nwatcher\nwatchers\nwatches\nwatcheye\nwatcheyes\nwatchful\nwatchfully\nwatchfulness\nwatching\nwatchmaker\nwatchmakers\nwatchmaking\nwatchman\nwatchmen\nwatchstrap\nwatchstraps\nwatchtower\nwatchtowers\nwatchword\nwatchwords\nwater\nwaterbed\nwaterbeds\nwaterbird\nwaterbirds\nwaterborne\nwaterbuck\nwaterbucks\nwaterbus\nwaterbuses\nwaterbusses\nwatercolor\nwatercolorist\nwatercolorists\nwatercolors\nwatercooler\nwatercoolers\nwatercourse\nwatercourses\nwatercraft\nwatercrafts\nwatercress\nwaterdog\nwaterdogging\nwaterdogs\nwatered\nwaterer\nwaterers\nwaterfall\nwaterfalls\nwaterfinder\nwaterfinders\nwaterflood\nwaterflooded\nwaterflooding\nwaterfloods\nwaterfowl\nwaterfowler\nwaterfowlers\nwaterfowling\nwaterfowls\nwaterfront\nwaterfronts\nwatergate\nwatergates\nwaterhole\nwaterholes\nwaterier\nwateriest\nwaterily\nwateriness\nwatering\nwaterish\nwaterishness\nwaterleaf\nwaterleafs\nwaterless\nwaterlessness\nwaterline\nwaterlines\nwaterlog\nwaterlogged\nwaterlogging\nwaterlogs\nwaterloo\nwaterloos\nwaterman\nwatermanship\nwatermark\nwatermarked\nwatermarking\nwatermarks\nwatermelon\nwatermelons\nwatermen\nwaterpower\nwaterproof\nwaterproofed\nwaterproofer\nwaterproofers\nwaterproofing\nwaterproofness\nwaterproofs\nwaters\nwaterscape\nwaterscapes\nwatershed\nwatersheds\nwaterside\nwatersides\nwaterskiing\nwaterspout\nwaterspouts\nwaterthrush\nwaterthrushes\nwatertight\nwatertightness\nwaterway\nwaterways\nwaterweed\nwaterweeds\nwaterwheel\nwaterwheels\nwaterworks\nwaterworn\nwatery\nwaterzooi\nwatlings\nwatson\nwatt\nwattage\nwattages\nwatteau\nwattle\nwattlebird\nwattlebirds\nwattled\nwattles\nwattling\nwattmeter\nwattmeters\nwatts\nwatusi\nwatusis\nwaugh\nwave\nwaveband\nwavebands\nwaved\nwaveform\nwaveforms\nwaveguide\nwaveguides\nwavelength\nwavelengths\nwaveless\nwavelessly\nwavelet\nwavelets\nwavelike\nwavell\nwaver\nwavered\nwaverer\nwaverers\nwavering\nwaveringly\nwaverley\nwavers\nwavery\nwaves\nwaveshape\nwaveshapes\nwavier\nwaviest\nwavily\nwaviness\nwaving\nwavy\nwaw\nwax\nwaxberries\nwaxberry\nwaxbill\nwaxbills\nwaxed\nwaxen\nwaxer\nwaxers\nwaxes\nwaxier\nwaxiest\nwaxiness\nwaxing\nwaxlike\nwaxwing\nwaxwings\nwaxwork\nwaxworks\nwaxy\nway\nwaybill\nwaybills\nwayfarer\nwayfarers\nwayfaring\nwaylaid\nwaylay\nwaylayer\nwaylayers\nwaylaying\nwaylays\nwayless\nwaypoint\nwaypoints\nways\nwayside\nwaysides\nwayward\nwaywardly\nwaywardness\nwayworn\nwaziristan\nwazoo\nwazoos\nwe\nwe'd\nwe'll\nwe're\nwe've\nweak\nweaken\nweakened\nweakener\nweakeners\nweakening\nweakens\nweaker\nweakest\nweakfish\nweakfishes\nweakhearted\nweakish\nweaklier\nweakliest\nweakliness\nweakling\nweaklings\nweakly\nweakness\nweaknesses\nweakon\nweakons\nweakside\nweal\nweald\nwealds\nwealth\nwealthier\nwealthiest\nwealthily\nwealthiness\nwealthy\nwean\nweaned\nweaner\nweaners\nweaning\nweanling\nweanlings\nweans\nweapon\nweaponed\nweaponeer\nweaponeering\nweaponeers\nweaponing\nweaponless\nweaponry\nweapons\nwear\nwearability\nwearable\nwearables\nwearer\nwearers\nwearied\nwearier\nwearies\nweariest\nweariful\nwearifully\nwearifulness\nweariless\nwearilessly\nwearilessness\nwearily\nweariness\nwearing\nwearingly\nwearisome\nwearisomely\nwearisomeness\nwears\nweary\nwearying\nweasand\nweasands\nweasel\nweaseled\nweaseling\nweaselled\nweaselling\nweaselly\nweasels\nweasely\nweather\nweatherability\nweatherboard\nweatherboarded\nweatherboarding\nweathercast\nweathercaster\nweathercasters\nweathercasts\nweathercock\nweathercocked\nweathercocking\nweathercocks\nweathered\nweatherglass\nweatherglasses\nweathering\nweatherization\nweatherizations\nweatherize\nweatherized\nweatherizes\nweatherizing\nweatherliness\nweatherly\nweatherman\nweathermen\nweatherperson\nweatherproof\nweatherproofed\nweatherproofing\nweatherproofness\nweatherproofs\nweathers\nweathervane\nweathervanes\nweatherworn\nweave\nweaved\nweaver\nweaverbird\nweaverbirds\nweavers\nweaves\nweaving\nweavings\nweb\nwebbed\nwebbier\nwebbiest\nwebbing\nwebbings\nwebby\nweber\nwebers\nwebfed\nwebfeet\nwebfoot\nweblike\nwebs\nwebster\nwebsters\nwebworm\nwebworms\nweck\nwecks\nwed\nwedded\nweddell\nwedder\nwedders\nwedding\nweddings\nwedel\nwedeled\nwedelling\nwedeln\nwedelns\nwedels\nwedge\nwedged\nwedges\nwedgie\nwedgies\nwedging\nwedgwood\nwedgy\nwedlock\nwednesday\nwednesdays\nweds\nwee\nweed\nweeded\nweeder\nweeders\nweedier\nweediest\nweedily\nweediness\nweeding\nweeds\nweedy\nweek\nweekday\nweekdays\nweekend\nweekended\nweekender\nweekenders\nweekending\nweekends\nweeklies\nweeklong\nweekly\nweeknight\nweeknights\nweeks\nweenie\nweenier\nweenies\nweeniest\nweensy\nweeny\nweep\nweeper\nweepers\nweepie\nweepier\nweepies\nweepiest\nweeping\nweeps\nweepy\nweer\nweest\nweever\nweevers\nweevil\nweevilly\nweevils\nweevily\nweft\nwefts\nwegener\nwehrmacht\nweigela\nweigelas\nweigh\nweighable\nweighed\nweigher\nweighers\nweighing\nweighs\nweight\nweighted\nweightier\nweightiest\nweightily\nweightiness\nweighting\nweightings\nweightless\nweightlessly\nweightlessness\nweightlifter\nweightlifters\nweightlifting\nweights\nweighty\nweil\nweil's\nweimar\nweimaraner\nweimaraners\nweinberg\nweiner\nweiners\nweir\nweird\nweirder\nweirdest\nweirdie\nweirdies\nweirdly\nweirdness\nweirdnesses\nweirdo\nweirdoes\nweirdos\nweirdy\nweirs\nweisenheimer\nweisenheimers\nweismann\nweismannism\nwejack\nwejacks\nweka\nwekas\nwelch\nwelched\nwelches\nwelching\nwelcome\nwelcomed\nwelcomely\nwelcomeness\nwelcomer\nwelcomers\nwelcomes\nwelcoming\nweld\nweldable\nwelded\nwelder\nwelders\nwelding\nweldment\nweldments\nweldor\nweldors\nwelds\nwelfare\nwelfarism\nwelfarist\nwelfarists\nwelkin\nwelkins\nwell\nwelladay\nwellaway\nwellaways\nwellbeing\nwellborn\nwelled\nwellerism\nwellerisms\nwellhead\nwellheads\nwellie\nwellies\nwelling\nwellington\nwellingtons\nwellness\nwells\nwellspring\nwellsprings\nwelly\nwelsbach\nwelsh\nwelshed\nwelsher\nwelshers\nwelshes\nwelshing\nwelshman\nwelshmen\nwelshwoman\nwelshwomen\nwelt\nweltanschauung\nweltanschauungen\nweltanschauungs\nwelted\nwelter\nweltered\nweltering\nwelters\nwelterweight\nwelterweights\nwelting\nwelts\nweltschmerz\nwen\nwenceslas\nwench\nwenched\nwencher\nwenchers\nwenches\nwenching\nwend\nwended\nwending\nwendish\nwends\nwens\nwent\nwentletrap\nwentletraps\nwept\nwere\nweregild\nweregilds\nweren\nweren't\nwerewolf\nwerewolves\nwergeld\nwergelds\nwergild\nwergilds\nwerner\nwernerite\nwernerites\nwernicke\nwerwolf\nwerwolves\nweser\nweskit\nweskits\nwesley\nwesleyan\nwesleyanism\nwesleyans\nwest\nwestbound\nwester\nwestered\nwestering\nwesterlies\nwesterly\nwestern\nwesterner\nwesterners\nwesternization\nwesternizations\nwesternize\nwesternized\nwesternizes\nwesternizing\nwesternmost\nwesternness\nwesterns\nwesters\nwesting\nwestinghouse\nwestings\nwestphalia\nwestphalian\nwestphalians\nwestward\nwestwardly\nwestwards\nwet\nwetback\nwetbacks\nwether\nwethers\nwetland\nwetlands\nwetly\nwetness\nwets\nwetsuit\nwetsuits\nwettability\nwettable\nwetted\nwetter\nwetterhorn\nwetters\nwettest\nwetting\nwettings\nwettish\nwhack\nwhacked\nwhacker\nwhackers\nwhackier\nwhackiest\nwhacking\nwhacko\nwhackos\nwhacks\nwhacky\nwhale\nwhaleback\nwhalebacks\nwhaleboat\nwhaleboats\nwhalebone\nwhalebones\nwhaled\nwhalelike\nwhaler\nwhalers\nwhales\nwhaling\nwham\nwhammed\nwhammies\nwhamming\nwhammo\nwhammy\nwhams\nwhang\nwhanged\nwhangee\nwhangees\nwhanging\nwhangs\nwhap\nwhapped\nwhapping\nwhaps\nwharf\nwharfage\nwharfed\nwharfing\nwharfinger\nwharfingers\nwharfmaster\nwharfmasters\nwharfs\nwharves\nwhat\nwhat'd\nwhat're\nwhat's\nwhatchamacallit\nwhatchamacallum\nwhatever\nwhatness\nwhatnot\nwhatnots\nwhatsis\nwhatsit\nwhatsits\nwhatsoever\nwheal\nwheals\nwheat\nwheatear\nwheatears\nwheaten\nwheatgrass\nwheatstone\nwheatworm\nwheatworms\nwhee\nwheedle\nwheedled\nwheedler\nwheedlers\nwheedles\nwheedling\nwheedlingly\nwheel\nwheelbarrow\nwheelbarrows\nwheelbase\nwheelchair\nwheelchairs\nwheeled\nwheeler\nwheelers\nwheelhorse\nwheelhorses\nwheelhouse\nwheelhouses\nwheelie\nwheelies\nwheeling\nwheelings\nwheelless\nwheelman\nwheelmen\nwheels\nwheelsman\nwheelsmen\nwheelwork\nwheelworks\nwheelwright\nwheelwrights\nwheeze\nwheezed\nwheezer\nwheezers\nwheezes\nwheezier\nwheeziest\nwheezily\nwheeziness\nwheezing\nwheezingly\nwheezy\nwhelk\nwhelks\nwhelky\nwhelm\nwhelmed\nwhelming\nwhelms\nwhelp\nwhelped\nwhelping\nwhelps\nwhen\nwhence\nwhencesoever\nwhenever\nwhensoever\nwhere\nwhere'd\nwhere're\nwhere's\nwhereabout\nwhereabouts\nwhereas\nwhereat\nwhereby\nwherefore\nwherefores\nwherefrom\nwherein\nwhereinto\nwhereof\nwhereon\nwheresoever\nwherethrough\nwhereto\nwhereunto\nwhereupon\nwherever\nwherewith\nwherewithal\nwherries\nwherry\nwhet\nwhether\nwhets\nwhetstone\nwhetstones\nwhetted\nwhetter\nwhetters\nwhetting\nwhew\nwhey\nwheyey\nwheylike\nwhich\nwhichever\nwhichsoever\nwhicker\nwhickered\nwhickering\nwhickers\nwhidah\nwhidahs\nwhidbey\nwhiff\nwhiffed\nwhiffer\nwhiffers\nwhiffet\nwhiffets\nwhiffing\nwhiffle\nwhiffled\nwhiffler\nwhifflers\nwhiffles\nwhiffletree\nwhiffling\nwhiffs\nwhig\nwhiggery\nwhiggish\nwhiggism\nwhigs\nwhile\nwhiled\nwhiles\nwhiling\nwhilom\nwhilst\nwhim\nwhimbrel\nwhimbrels\nwhimper\nwhimpered\nwhimperer\nwhimperers\nwhimpering\nwhimperingly\nwhimpers\nwhims\nwhimsey\nwhimseys\nwhimsical\nwhimsicalities\nwhimsicality\nwhimsically\nwhimsicalness\nwhimsies\nwhimsy\nwhin\nwhinchat\nwhinchats\nwhine\nwhined\nwhiner\nwhiners\nwhines\nwhiney\nwhing\nwhinge\nwhinged\nwhingeing\nwhinges\nwhinging\nwhinier\nwhiniest\nwhininess\nwhining\nwhiningly\nwhinnied\nwhinnies\nwhinny\nwhinnying\nwhins\nwhinstone\nwhinstones\nwhiny\nwhip\nwhipcord\nwhipcords\nwhiplash\nwhiplashes\nwhiplike\nwhipped\nwhipper\nwhippers\nwhippersnapper\nwhippersnappers\nwhippet\nwhippets\nwhippier\nwhippiest\nwhipping\nwhippings\nwhippletree\nwhippletrees\nwhippoorwill\nwhippoorwills\nwhippy\nwhips\nwhipsaw\nwhipsawed\nwhipsawing\nwhipsawn\nwhipsaws\nwhipstall\nwhipstalls\nwhipstitch\nwhipstitched\nwhipstitches\nwhipstitching\nwhipstock\nwhipstocks\nwhipt\nwhiptail\nwhiptails\nwhipworm\nwhipworms\nwhir\nwhirl\nwhirled\nwhirler\nwhirlers\nwhirlies\nwhirligig\nwhirligigs\nwhirling\nwhirlpool\nwhirlpools\nwhirls\nwhirlwind\nwhirlwinds\nwhirly\nwhirlybird\nwhirlybirds\nwhirr\nwhirred\nwhirring\nwhirrs\nwhirs\nwhish\nwhished\nwhishes\nwhishing\nwhisk\nwhiskbroom\nwhiskbrooms\nwhisked\nwhisker\nwhiskered\nwhiskerless\nwhiskers\nwhiskery\nwhiskey\nwhiskeys\nwhiskies\nwhisking\nwhisks\nwhisky\nwhisper\nwhispered\nwhisperer\nwhisperers\nwhispering\nwhisperingly\nwhisperings\nwhispers\nwhispery\nwhist\nwhistle\nwhistleable\nwhistleblower\nwhistleblowers\nwhistled\nwhistler\nwhistlers\nwhistles\nwhistling\nwhit\nwhite\nwhitebait\nwhitebark\nwhitebeard\nwhitebeards\nwhitecap\nwhitecaps\nwhited\nwhiteface\nwhitefaces\nwhitefish\nwhitefishes\nwhiteflies\nwhitefly\nwhitefriars\nwhitehall\nwhitehead\nwhiteheads\nwhitehorse\nwhitely\nwhiten\nwhitened\nwhitener\nwhiteners\nwhiteness\nwhitening\nwhitens\nwhiteout\nwhiteouts\nwhiteprint\nwhiteprints\nwhiter\nwhites\nwhitesmith\nwhitesmiths\nwhitest\nwhitetail\nwhitetails\nwhitethroat\nwhitethroats\nwhitewall\nwhitewalls\nwhitewash\nwhitewashed\nwhitewasher\nwhitewashers\nwhitewashes\nwhitewashing\nwhitewater\nwhitewing\nwhitewings\nwhitewood\nwhitewoods\nwhitey\nwhiteys\nwhither\nwhithersoever\nwhitherward\nwhiting\nwhitings\nwhitish\nwhitleather\nwhitlow\nwhitman\nwhitmonday\nwhitney\nwhitsun\nwhitsunday\nwhitsuntide\nwhittington\nwhittle\nwhittled\nwhittler\nwhittlers\nwhittles\nwhittling\nwhity\nwhiz\nwhizbang\nwhizbangs\nwhizz\nwhizzbang\nwhizzed\nwhizzer\nwhizzers\nwhizzes\nwhizzing\nwho\nwho'd\nwho'll\nwho's\nwho've\nwhoa\nwhodunit\nwhodunits\nwhodunnit\nwhodunnits\nwhoever\nwhole\nwholehearted\nwholeheartedly\nwholeheartedness\nwholeness\nwholes\nwholesale\nwholesaled\nwholesaler\nwholesalers\nwholesales\nwholesaling\nwholesome\nwholesomely\nwholesomeness\nwholesomer\nwholesomest\nwholistic\nwholly\nwhom\nwhomever\nwhomp\nwhomped\nwhomping\nwhomps\nwhomso\nwhomsoever\nwhoo\nwhoop\nwhooped\nwhoopee\nwhoopees\nwhooper\nwhoopers\nwhooping\nwhoopla\nwhooplas\nwhoops\nwhoos\nwhoosh\nwhooshed\nwhooshes\nwhooshing\nwhop\nwhopped\nwhopper\nwhoppers\nwhopping\nwhops\nwhore\nwhored\nwhoredom\nwhoredoms\nwhorehouse\nwhorehouses\nwhoremaster\nwhoremasters\nwhoremonger\nwhoremongers\nwhores\nwhoreson\nwhoresons\nwhorfian\nwhoring\nwhorish\nwhorishly\nwhorishness\nwhorl\nwhorled\nwhorls\nwhort\nwhortle\nwhortleberries\nwhortleberry\nwhortles\nwhorts\nwhose\nwhosesoever\nwhoso\nwhosoever\nwhump\nwhumped\nwhumping\nwhumps\nwhy\nwhydah\nwhydahs\nwhys\nwicca\nwiccan\nwiccans\nwichita\nwichitas\nwick\nwicked\nwickeder\nwickedest\nwickedly\nwickedness\nwicker\nwickerwork\nwicket\nwicketkeeper\nwicketkeepers\nwickets\nwicking\nwickiup\nwickiups\nwicks\nwicopies\nwicopy\nwidal\nwiddershins\nwide\nwideawake\nwideawakes\nwideband\nwidely\nwidemouthed\nwiden\nwidened\nwidener\nwideners\nwideness\nwidening\nwidens\nwideout\nwideouts\nwider\nwidespread\nwidest\nwidgeon\nwidgeons\nwidget\nwidgets\nwidish\nwidow\nwidowed\nwidower\nwidowerhood\nwidowers\nwidowhood\nwidowing\nwidows\nwidth\nwidths\nwidthwise\nwiedersehen\nwield\nwieldable\nwielded\nwielder\nwielders\nwieldier\nwieldiest\nwielding\nwields\nwieldy\nwien\nwiener\nwieners\nwienerwurst\nwienerwursts\nwienie\nwienies\nwiesbaden\nwiesel\nwife\nwifehood\nwifeless\nwifeliness\nwifely\nwiffle\nwifty\nwig\nwigan\nwigans\nwigeon\nwigeons\nwigged\nwigging\nwiggle\nwiggled\nwiggler\nwigglers\nwiggles\nwiggling\nwiggly\nwight\nwights\nwiglet\nwiglets\nwigmaker\nwigmakers\nwigs\nwigwag\nwigwagged\nwigwagger\nwigwaggers\nwigwagging\nwigwags\nwigwam\nwigwams\nwikiup\nwikiups\nwilberforce\nwilco\nwild\nwildcard\nwildcards\nwildcat\nwildcats\nwildcatted\nwildcatter\nwildcatters\nwildcatting\nwildebeest\nwildebeests\nwilder\nwildered\nwildering\nwilderment\nwilderness\nwildernesses\nwilders\nwildest\nwildfire\nwildfires\nwildflower\nwildflowers\nwildfowl\nwildfowler\nwildfowlers\nwildfowling\nwildfowls\nwilding\nwildings\nwildish\nwildland\nwildlands\nwildlife\nwildling\nwildlings\nwildly\nwildness\nwilds\nwildwood\nwildwoods\nwile\nwiled\nwiles\nwilful\nwilhelmshaven\nwilier\nwiliest\nwilily\nwiliness\nwiling\nwilkes\nwill\nwillamette\nwilled\nwilledly\nwilledness\nwillemite\nwillemites\nwillemstad\nwillet\nwillets\nwillful\nwillfully\nwillfulness\nwilliam\nwillies\nwilling\nwillingly\nwillingness\nwilliwaw\nwilliwaws\nwillow\nwillowed\nwillowier\nwillowiest\nwillowing\nwillowlike\nwillows\nwillowware\nwillowy\nwillpower\nwills\nwilly\nwilmington\nwilms\nwilson\nwilt\nwilted\nwilting\nwilton\nwilts\nwiltshire\nwily\nwimble\nwimbled\nwimbledon\nwimbles\nwimbling\nwimp\nwimpiness\nwimpish\nwimpishness\nwimple\nwimpled\nwimples\nwimpling\nwimps\nwimpy\nwimshurst\nwin\nwince\nwinced\nwincer\nwincers\nwinces\nwinch\nwinched\nwincher\nwinchers\nwinches\nwinchester\nwinchesters\nwinching\nwincing\nwind\nwindage\nwindbag\nwindbags\nwindblast\nwindblasts\nwindblown\nwindbreak\nwindbreaker\nwindbreakers\nwindbreaks\nwindburn\nwindburned\nwindburns\nwindcheater\nwindcheaters\nwindchill\nwindchills\nwinded\nwindedly\nwindedness\nwinder\nwinders\nwindfall\nwindfalls\nwindflaw\nwindflaws\nwindflower\nwindflowers\nwindgall\nwindgalls\nwindhoek\nwindhover\nwindhovers\nwindier\nwindiest\nwindily\nwindiness\nwinding\nwindingly\nwindings\nwindjammer\nwindjammers\nwindjamming\nwindlass\nwindlassed\nwindlasses\nwindlassing\nwindless\nwindlessly\nwindlestraw\nwindlestraws\nwindmill\nwindmilled\nwindmilling\nwindmills\nwindow\nwindowed\nwindowing\nwindowless\nwindowpane\nwindowpanes\nwindows\nwindowsill\nwindowsills\nwindpipe\nwindpipes\nwindproof\nwindrow\nwindrowed\nwindrower\nwindrowers\nwindrowing\nwindrows\nwinds\nwindsailing\nwindscreen\nwindscreens\nwindshake\nwindshakes\nwindshield\nwindshields\nwindsock\nwindsocks\nwindsor\nwindstorm\nwindstorms\nwindsucker\nwindsuckers\nwindsucking\nwindsurf\nwindsurfed\nwindsurfer\nwindsurfers\nwindsurfing\nwindsurfs\nwindswept\nwindthrow\nwindup\nwindups\nwindward\nwindwards\nwindway\nwindways\nwindy\nwine\nwinebibber\nwinebibbers\nwinebibbing\nwinebibbings\nwined\nwineglass\nwineglasses\nwinegrower\nwinegrowers\nwinemaker\nwinemakers\nwinemaking\nwinepress\nwinepresses\nwineries\nwinery\nwines\nwinesap\nwinesaps\nwineshop\nwineshops\nwineskin\nwineskins\nwinetasting\nwinetastings\nwiney\nwing\nwingback\nwingbacks\nwingbow\nwingbows\nwingchair\nwingchairs\nwingding\nwingdings\nwinged\nwinger\nwingers\nwinging\nwingless\nwinglessness\nwinglet\nwinglets\nwinglike\nwingman\nwingmen\nwingover\nwingovers\nwings\nwingspan\nwingspans\nwingspread\nwingspreads\nwingtip\nwingtips\nwingy\nwinier\nwiniest\nwining\nwink\nwinked\nwinker\nwinkers\nwinking\nwinkle\nwinkled\nwinkles\nwinkling\nwinks\nwinless\nwinnability\nwinnable\nwinnebago\nwinnebagoes\nwinnebagos\nwinner\nwinners\nwinnie\nwinnies\nwinning\nwinningest\nwinningly\nwinningness\nwinnings\nwinnipeg\nwinnipegosis\nwinnipesaukee\nwinnow\nwinnowed\nwinnower\nwinnowers\nwinnowing\nwinnows\nwino\nwinos\nwins\nwinsome\nwinsomely\nwinsomeness\nwinter\nwinterberries\nwinterberry\nwintered\nwinterer\nwinterers\nwintergreen\nwintergreens\nwinterier\nwinteriest\nwintering\nwinterish\nwinterization\nwinterizations\nwinterize\nwinterized\nwinterizes\nwinterizing\nwinterkill\nwinterkilled\nwinterkilling\nwinterkills\nwinterly\nwinters\nwintertide\nwintertime\nwintery\nwintrier\nwintriest\nwintrily\nwintriness\nwintry\nwiny\nwinze\nwinzes\nwipe\nwiped\nwipeout\nwipeouts\nwiper\nwipers\nwipes\nwiping\nwirable\nwire\nwired\nwiredraw\nwiredrawer\nwiredrawers\nwiredrawing\nwiredrawn\nwiredraws\nwiredrew\nwiregrass\nwiregrasses\nwirehair\nwirehaired\nwirehairs\nwireless\nwirelessed\nwirelesses\nwirelessing\nwirelike\nwireman\nwiremen\nwirephoto\nwirepuller\nwirepullers\nwirepulling\nwirer\nwirers\nwires\nwiretap\nwiretapped\nwiretapper\nwiretappers\nwiretapping\nwiretaps\nwirewalker\nwirewalkers\nwirework\nwireworks\nwireworm\nwireworms\nwirier\nwiriest\nwirily\nwiriness\nwiring\nwiry\nwisconsin\nwisconsinite\nwisconsinites\nwisdom\nwise\nwiseacre\nwiseacres\nwiseass\nwiseasses\nwisecrack\nwisecracked\nwisecracker\nwisecrackers\nwisecracking\nwisecracks\nwised\nwisely\nwiseness\nwisenheimer\nwisenheimers\nwisent\nwisents\nwiser\nwises\nwisest\nwisewoman\nwisewomen\nwish\nwishbone\nwishbones\nwished\nwisher\nwishers\nwishes\nwishful\nwishfully\nwishfulness\nwishing\nwishy\nwising\nwisp\nwisped\nwispily\nwispiness\nwisping\nwispish\nwisps\nwispy\nwistaria\nwistarias\nwisteria\nwisterias\nwistful\nwistfully\nwistfulness\nwit\nwitan\nwitch\nwitchcraft\nwitched\nwitcher\nwitcheries\nwitchers\nwitchery\nwitches\nwitchgrass\nwitchgrasses\nwitching\nwitchingly\nwitchlike\nwitchweed\nwitchweeds\nwitchy\nwitenagemot\nwitenagemote\nwith\nwithal\nwithdraw\nwithdrawable\nwithdrawal\nwithdrawals\nwithdrawer\nwithdrawers\nwithdrawing\nwithdrawn\nwithdrawnness\nwithdraws\nwithdrew\nwithe\nwither\nwithered\nwithering\nwitheringly\nwitherite\nwitherites\nwithers\nwithershins\nwithes\nwithheld\nwithhold\nwithholder\nwithholders\nwithholding\nwithholdings\nwithholds\nwithies\nwithin\nwithindoors\nwithout\nwithoutdoors\nwithstand\nwithstander\nwithstanders\nwithstanding\nwithstands\nwithstood\nwithy\nwitless\nwitlessly\nwitlessness\nwitling\nwitlings\nwitloof\nwitloofs\nwitness\nwitnessed\nwitnesser\nwitnessers\nwitnesses\nwitnessing\nwits\nwitted\nwittedly\nwittedness\nwittenberg\nwittgenstein\nwittgensteinian\nwitticism\nwitticisms\nwittier\nwittiest\nwittily\nwittiness\nwitting\nwittingly\nwittings\nwittol\nwittols\nwitty\nwitwatersrand\nwive\nwived\nwivern\nwiverns\nwives\nwiving\nwiz\nwizard\nwizardly\nwizardries\nwizardry\nwizards\nwizen\nwizened\nwizening\nwizens\nwizes\nwkly\nwoad\nwoads\nwoadwaxen\nwoadwaxens\nwobble\nwobbled\nwobbler\nwobblers\nwobbles\nwobblier\nwobblies\nwobbliest\nwobbliness\nwobbling\nwobbly\nwodehouse\nwoden\nwodge\nwodges\nwoe\nwoebegone\nwoebegoneness\nwoeful\nwoefully\nwoefulness\nwoes\nwoffington\nwoful\nwok\nwoke\nwoken\nwoks\nwold\nwolds\nwolf\nwolfberries\nwolfberry\nwolfed\nwolfer\nwolfers\nwolffian\nwolffish\nwolfhound\nwolfhounds\nwolfing\nwolfish\nwolfishly\nwolfishness\nwolflike\nwolfram\nwolframite\nwolframites\nwolframs\nwolfs\nwolfsbane\nwolfsbanes\nwollastonite\nwollastonites\nwolof\nwolsey\nwolverine\nwolverines\nwolves\nwoman\nwomanfully\nwomanhood\nwomanish\nwomanishly\nwomanishness\nwomanism\nwomanist\nwomanists\nwomanize\nwomanized\nwomanizer\nwomanizers\nwomanizes\nwomanizing\nwomankind\nwomanless\nwomanlier\nwomanliest\nwomanlike\nwomanliness\nwomanly\nwomanpower\nwomb\nwombat\nwombats\nwombed\nwombs\nwomen\nwomenfolk\nwomenfolks\nwomenkind\nwomera\nwomeras\nwommera\nwommeras\nwon\nwon't\nwonder\nwondered\nwonderer\nwonderers\nwonderful\nwonderfully\nwonderfulness\nwondering\nwonderingly\nwonderland\nwonderlands\nwonderment\nwonders\nwonderwork\nwonderworker\nwonderworkers\nwonderworking\nwonderworks\nwondrous\nwondrously\nwondrousness\nwonk\nwonkier\nwonkiest\nwonks\nwonky\nwont\nwonted\nwontedly\nwontedness\nwonting\nwonton\nwontons\nwonts\nwoo\nwood\nwoodbin\nwoodbine\nwoodbines\nwoodbins\nwoodblock\nwoodblocks\nwoodborer\nwoodborers\nwoodboring\nwoodcarver\nwoodcarvers\nwoodcarving\nwoodcarvings\nwoodchat\nwoodchats\nwoodchopper\nwoodchoppers\nwoodchopping\nwoodchuck\nwoodchucks\nwoodcock\nwoodcocks\nwoodcraft\nwoodcrafter\nwoodcrafters\nwoodcrafting\nwoodcrafts\nwoodcut\nwoodcuts\nwoodcutter\nwoodcutters\nwoodcutting\nwoodcuttings\nwooded\nwooden\nwoodenhead\nwoodenheaded\nwoodenheads\nwoodenly\nwoodenness\nwoodenware\nwoodie\nwoodier\nwoodies\nwoodiest\nwoodiness\nwooding\nwoodland\nwoodlander\nwoodlanders\nwoodlands\nwoodlark\nwoodlarks\nwoodlore\nwoodlot\nwoodlots\nwoodman\nwoodmen\nwoodnote\nwoodnotes\nwoodpecker\nwoodpeckers\nwoodpile\nwoodpiles\nwoodprint\nwoodprints\nwoodruff\nwoodruffs\nwoods\nwoodshed\nwoodshedded\nwoodshedding\nwoodsheds\nwoodshop\nwoodshops\nwoodsia\nwoodsias\nwoodsier\nwoodsiest\nwoodsman\nwoodsmen\nwoodstove\nwoodstoves\nwoodsy\nwoodturner\nwoodturners\nwoodturning\nwoodville\nwoodwaxen\nwoodwaxens\nwoodwind\nwoodwinds\nwoodwork\nwoodworker\nwoodworkers\nwoodworking\nwoodworks\nwoodworm\nwoodworms\nwoody\nwooed\nwooer\nwooers\nwoof\nwoofed\nwoofer\nwoofers\nwoofing\nwoofs\nwoogie\nwooing\nwool\nwooled\nwoolen\nwoolens\nwoolgather\nwoolgathered\nwoolgatherer\nwoolgatherers\nwoolgathering\nwoolgathers\nwoolgrower\nwoolgrowers\nwoolgrowing\nwoolie\nwoolier\nwoolies\nwooliest\nwoolled\nwoollen\nwoollens\nwoollier\nwoollies\nwoolliest\nwoollily\nwoolliness\nwoolly\nwoolpack\nwoolpacks\nwools\nwoolsack\nwoolsacks\nwoolsey\nwoolshed\nwoolsheds\nwoolskin\nwoolskins\nwoolsorter\nwoolworker\nwoolworkers\nwoolworth\nwooly\nwoomera\nwoomeras\nwoops\nwoos\nwoozier\nwooziest\nwoozily\nwooziness\nwoozy\nwop\nwops\nworcester\nworcestershire\nword\nwordage\nwordbook\nwordbooks\nworded\nwordier\nwordiest\nwordily\nwordiness\nwording\nwordings\nwordless\nwordlessly\nwordlessness\nwordmonger\nwordmongering\nwordmongers\nwordplay\nwordplays\nwords\nwordsmith\nwordsmithery\nwordsmiths\nwordsworth\nwordsworthian\nwordy\nwore\nwork\nworkability\nworkable\nworkableness\nworkably\nworkaday\nworkaholic\nworkaholics\nworkaholism\nworkaround\nworkarounds\nworkbag\nworkbags\nworkbasket\nworkbaskets\nworkbench\nworkbenches\nworkboat\nworkboats\nworkbook\nworkbooks\nworkbox\nworkboxes\nworkday\nworkdays\nworked\nworker\nworkers\nworkfare\nworkflow\nworkflows\nworkfolk\nworkfolks\nworkforce\nworkforces\nworkhorse\nworkhorses\nworkhouse\nworkhouses\nworking\nworkingman\nworkingmen\nworkings\nworkingwoman\nworkingwomen\nworkless\nworklessness\nworkload\nworkloads\nworkman\nworkmanlike\nworkmanly\nworkmanship\nworkmate\nworkmates\nworkmen\nworkout\nworkouts\nworkpeople\nworkpiece\nworkpieces\nworkplace\nworkplaces\nworkroom\nworkrooms\nworks\nworksheet\nworksheets\nworkshop\nworkshops\nworkspace\nworkspaces\nworkstation\nworkstations\nworktable\nworktables\nworkup\nworkups\nworkweek\nworkweeks\nworkwoman\nworkwomen\nworld\nworlder\nworlders\nworldlier\nworldliest\nworldliness\nworldling\nworldlings\nworldly\nworlds\nworldview\nworldviews\nworldwide\nworm\nwormed\nwormer\nwormers\nwormgrass\nwormgrasses\nwormhole\nwormholes\nwormier\nwormiest\nworminess\nworming\nwormlike\nworms\nwormseed\nwormseeds\nwormwood\nwormwoods\nwormy\nworn\nworried\nworriedly\nworrier\nworriers\nworries\nworriment\nworriments\nworrisome\nworrisomely\nworrisomeness\nworry\nworrying\nworryingly\nworrywart\nworrywarts\nworse\nworsen\nworsened\nworsening\nworsens\nworship\nworshiped\nworshiper\nworshipers\nworshipful\nworshipfully\nworshipfulness\nworshiping\nworshipless\nworshipped\nworshipper\nworshippers\nworshipping\nworships\nworsleya\nworsleyas\nworst\nworsted\nworsteds\nworsting\nworsts\nwort\nworth\nworthed\nworthful\nworthier\nworthies\nworthiest\nworthily\nworthiness\nworthing\nworthless\nworthlessly\nworthlessness\nworths\nworthwhile\nworthwhileness\nworthy\nwot\nwotan\nwots\nwotted\nwotting\nwould\nwould've\nwouldest\nwouldn\nwouldn't\nwouldst\nwound\nwounded\nwoundedly\nwounding\nwoundingly\nwoundless\nwounds\nwoundwort\nwoundworts\nwove\nwoven\nwow\nwowed\nwowing\nwows\nwowser\nwowsers\nwp\nwpm\nwrack\nwracked\nwrackful\nwracking\nwracks\nwraith\nwraithlike\nwraiths\nwrangel\nwrangell\nwrangle\nwrangled\nwrangler\nwranglers\nwrangles\nwrangling\nwrap\nwraparound\nwraparounds\nwrapped\nwrapper\nwrappers\nwrapping\nwrappings\nwraps\nwrapt\nwrasse\nwrasses\nwrath\nwrathful\nwrathfully\nwrathfulness\nwrathy\nwreak\nwreaked\nwreaking\nwreaks\nwreath\nwreathe\nwreathed\nwreathes\nwreathing\nwreaths\nwreathy\nwreck\nwreckage\nwrecked\nwrecker\nwreckers\nwrecking\nwrecks\nwren\nwrench\nwrenched\nwrenches\nwrenching\nwrenchingly\nwrens\nwrest\nwrested\nwrester\nwresters\nwresting\nwrestle\nwrestled\nwrestler\nwrestlers\nwrestles\nwrestling\nwrests\nwretch\nwretched\nwretcheder\nwretchedest\nwretchedly\nwretchedness\nwretches\nwried\nwrier\nwries\nwriest\nwriggle\nwriggled\nwriggler\nwrigglers\nwriggles\nwriggling\nwriggly\nwright\nwrights\nwrigley\nwring\nwringer\nwringers\nwringing\nwrings\nwrinkle\nwrinkled\nwrinkles\nwrinkling\nwrinkly\nwrist\nwristband\nwristbands\nwristed\nwristier\nwristiest\nwristlet\nwristlets\nwristlock\nwristlocks\nwrists\nwristwatch\nwristwatches\nwristy\nwrit\nwritable\nwrite\nwriter\nwriterly\nwriters\nwrites\nwrithe\nwrithed\nwrithen\nwrither\nwrithers\nwrithes\nwrithing\nwriting\nwritings\nwrits\nwritten\nwrong\nwrongdoer\nwrongdoers\nwrongdoing\nwrongdoings\nwronged\nwronger\nwrongers\nwrongest\nwrongful\nwrongfully\nwrongfulness\nwrongheaded\nwrongheadedly\nwrongheadedness\nwronging\nwrongly\nwrongness\nwrongs\nwrote\nwroth\nwrought\nwrung\nwry\nwryer\nwryest\nwrying\nwryly\nwryneck\nwrynecks\nwryness\nwt\nwulfenite\nwulfenites\nwunderbar\nwunderkind\nwunderkinder\nwurst\nwurtemburg\nwurzburg\nwurzel\nwurzels\nwushu\nwyandot\nwyandots\nwyandotte\nwyandottes\nwyatt\nwych\nwycherley\nwyclif\nwycliffe\nwycliffite\nwycliffites\nwye\nwyes\nwyn\nwynn\nwynns\nwyoming\nwysiwyg\nwyvern\nwyverns\nwürttemberg\nx\nxanadu\nxanadus\nxanthan\nxanthate\nxanthates\nxanthene\nxanthenes\nxanthic\nxanthine\nxanthines\nxanthippe\nxanthochroic\nxanthochroid\nxanthochroids\nxanthoma\nxanthomas\nxanthomata\nxanthomatoses\nxanthomatosis\nxanthomatous\nxanthone\nxanthones\nxanthophore\nxanthophores\nxanthophyll\nxanthophyllic\nxanthophyllous\nxanthophylls\nxanthopterin\nxanthopterins\nxanthous\nxantippe\nxaverian\nxavier\nxebec\nxebecs\nxed\nxenia\nxenias\nxenobiotic\nxenobiotics\nxenoblast\nxenoblasts\nxenocryst\nxenocrysts\nxenodiagnoses\nxenodiagnosis\nxenodiagnostic\nxenogamies\nxenogamous\nxenogamy\nxenogeneic\nxenogenesis\nxenogenetic\nxenogenic\nxenograft\nxenografts\nxenolith\nxenolithic\nxenoliths\nxenon\nxenophanes\nxenophile\nxenophiles\nxenophilia\nxenophilous\nxenophobe\nxenophobes\nxenophobia\nxenophobic\nxenophobically\nxenophon\nxenotropic\nxerarch\nxeric\nxerically\nxericity\nxeriscape\nxeroderma\nxerodermas\nxerodermia\nxerodermias\nxerographer\nxerographers\nxerographic\nxerographically\nxerography\nxerophile\nxerophilous\nxerophily\nxerophthalmia\nxerophthalmias\nxerophthalmic\nxerophyte\nxerophytes\nxerophytic\nxerophytically\nxerophytism\nxeroradiography\nxerosere\nxeroseres\nxeroses\nxerosis\nxerothermic\nxerox\nxeroxed\nxeroxes\nxeroxing\nxerxes\nxhosa\nxhosas\nxi\nxinjiang\nxiphisterna\nxiphisternum\nxiphoid\nxiphoids\nxiphosuran\nxiphosurans\nxis\nxizang\nxmas\nxmases\nxosa\nxosas\nxray\nxs\nxu\nxylan\nxylans\nxylem\nxylene\nxylenes\nxylidine\nxylidines\nxylitol\nxylitols\nxylograph\nxylographed\nxylographer\nxylographers\nxylographic\nxylographical\nxylographically\nxylographing\nxylographs\nxylography\nxyloid\nxylol\nxylols\nxylophage\nxylophages\nxylophagous\nxylophone\nxylophones\nxylophonist\nxylophonists\nxylose\nxyloses\nxylotomies\nxylotomist\nxylotomists\nxylotomy\nxyster\nxysters\ny\ny'all\nyabber\nyabbered\nyabbering\nyabbers\nyablonovy\nyacht\nyachted\nyachter\nyachters\nyachting\nyachts\nyachtsman\nyachtsmen\nyachtswoman\nyachtswomen\nyack\nyacked\nyackety\nyacking\nyacks\nyag\nyagi\nyagis\nyahoo\nyahooism\nyahoos\nyahveh\nyahvist\nyahweh\nyahwism\nyahwist\nyahwistic\nyak\nyakima\nyakimas\nyakitori\nyakitoris\nyakked\nyakking\nyakow\nyakows\nyaks\nyakut\nyakuts\nyakuza\nyale\nyalta\nyam\nyamasee\nyamasees\nyamen\nyamens\nyammer\nyammered\nyammerer\nyammerers\nyammering\nyammers\nyams\nyang\nyangtze\nyank\nyanked\nyankee\nyankeedom\nyankeeism\nyankeeisms\nyankees\nyanking\nyanks\nyankton\nyanktonai\nyanktonais\nyanktons\nyanqui\nyantra\nyantras\nyao\nyaos\nyaoundé\nyap\nyapok\nyapoks\nyapped\nyapper\nyappers\nyapping\nyaps\nyaqui\nyaquis\nyarborough\nyarboroughs\nyard\nyardage\nyardarm\nyardarms\nyardbird\nyardbirds\nyarded\nyarding\nyardman\nyardmaster\nyardmasters\nyardmen\nyards\nyardstick\nyardsticks\nyare\nyarely\nyarmelke\nyarmelkes\nyarmulke\nyarmulkes\nyarn\nyarned\nyarner\nyarners\nyarning\nyarns\nyarrow\nyarrows\nyashmac\nyashmacs\nyashmak\nyashmaks\nyasmak\nyasmaks\nyatagan\nyatagans\nyataghan\nyataghans\nyaup\nyauped\nyauping\nyaupon\nyaupons\nyaups\nyautia\nyavapai\nyavapais\nyaw\nyawed\nyawing\nyawl\nyawls\nyawn\nyawned\nyawner\nyawners\nyawning\nyawningly\nyawns\nyawp\nyawped\nyawper\nyawpers\nyawping\nyawps\nyaws\nycleped\nyclept\nyd\nye\nyea\nyeah\nyean\nyeaned\nyeaning\nyeanling\nyeanlings\nyeans\nyear\nyearbook\nyearbooks\nyearend\nyearends\nyearlies\nyearling\nyearlings\nyearlong\nyearly\nyearn\nyearned\nyearner\nyearners\nyearning\nyearningly\nyearnings\nyearns\nyears\nyeas\nyeast\nyeasted\nyeastier\nyeastiest\nyeastily\nyeastiness\nyeasting\nyeasts\nyeasty\nyeats\nyeatsian\nyecch\nyech\nyegg\nyeggs\nyell\nyelled\nyeller\nyellers\nyelling\nyellow\nyellowbellied\nyellowbellies\nyellowbelly\nyellowbird\nyellowbirds\nyellowcake\nyellowcakes\nyellowed\nyellower\nyellowest\nyellowfin\nyellowhammer\nyellowhammers\nyellowing\nyellowish\nyellowishness\nyellowknife\nyellowlegs\nyellowness\nyellows\nyellowstone\nyellowtail\nyellowtails\nyellowthroat\nyellowthroats\nyellowware\nyellowweed\nyellowweeds\nyellowwood\nyellowwoods\nyellowy\nyells\nyelp\nyelped\nyelper\nyelpers\nyelping\nyelps\nyemen\nyemeni\nyemenis\nyemenite\nyemenites\nyen\nyenned\nyenning\nyens\nyenta\nyentas\nyeoman\nyeomanly\nyeomanries\nyeomanry\nyeomen\nyep\nyerba\nyerkish\nyersinia\nyersiniae\nyersinioses\nyersiniosis\nyes\nyeses\nyeshiva\nyeshivah\nyeshivahs\nyeshivas\nyeshivot\nyessed\nyessing\nyesterday\nyesterdays\nyestereve\nyestereven\nyesterevening\nyesterevenings\nyesterevens\nyestereves\nyestermorn\nyestermorning\nyestermornings\nyestermorns\nyesternight\nyesternights\nyesteryear\nyesteryears\nyet\nyeti\nyetis\nyew\nyews\nygdrasil\nyggdrasil\nyid\nyiddish\nyiddishism\nyiddishist\nyiddishists\nyids\nyield\nyielded\nyielder\nyielders\nyielding\nyieldingly\nyieldingness\nyields\nyikes\nyin\nyinglish\nyip\nyipe\nyipes\nyipped\nyippee\nyippie\nyippies\nyipping\nyips\nylang\nylem\nylems\nymca\nymir\nyo\nyock\nyocked\nyocking\nyocks\nyod\nyodel\nyodeled\nyodeler\nyodelers\nyodeling\nyodelled\nyodelling\nyodels\nyodh\nyoed\nyoga\nyogh\nyoghourt\nyoghourts\nyoghurt\nyoghurts\nyogi\nyogic\nyogin\nyogins\nyogis\nyogurt\nyogurts\nyohimbine\nyohimbines\nyoicks\nyoing\nyoke\nyoked\nyokefellow\nyokefellows\nyokel\nyokels\nyokes\nyoking\nyokohama\nyokuts\nyolk\nyolked\nyolks\nyolky\nyom\nyon\nyonder\nyoni\nyonic\nyonis\nyoo\nyore\nyorick\nyork\nyorker\nyorkers\nyorkie\nyorkies\nyorkist\nyorkists\nyorkshire\nyoruba\nyoruban\nyorubas\nyos\nyosemite\nyou\nyou'd\nyou'll\nyou're\nyou've\nyoung\nyoung'un\nyoung'uns\nyoungberries\nyoungberry\nyounger\nyoungest\nyoungish\nyoungling\nyounglings\nyoungness\nyoungster\nyoungsters\nyounker\nyounkers\nyour\nyours\nyourself\nyourselfer\nyourselfers\nyourselves\nyouth\nyouthful\nyouthfully\nyouthfulness\nyouthquake\nyouths\nyow\nyowl\nyowled\nyowling\nyowls\nypres\nyquem\nyquems\nytterbia\nytterbias\nytterbic\nytterbium\nyttria\nyttrias\nyttric\nyttrium\nyuan\nyuans\nyuca\nyucatec\nyucatecan\nyucatecans\nyucatecs\nyucatán\nyucca\nyuccas\nyuchi\nyuchis\nyuck\nyuckier\nyuckiest\nyuckiness\nyucky\nyuga\nyugoslav\nyugoslavia\nyugoslavian\nyugoslavians\nyugoslavs\nyuk\nyukon\nyulan\nyulans\nyule\nyuletide\nyum\nyuma\nyuman\nyumas\nyummier\nyummiest\nyumminess\nyummy\nyunnan\nyup\nyupik\nyupiks\nyuppie\nyuppiedom\nyuppies\nyurok\nyuroks\nyurt\nyurts\nywis\nz\nzabaglione\nzabagliones\nzacharias\nzaddik\nzaddikim\nzaffer\nzaffers\nzaffre\nzaffres\nzaftig\nzag\nzagged\nzagging\nzagreb\nzagreus\nzagros\nzags\nzaibatsu\nzaikai\nzaire\nzairean\nzaireans\nzaires\nzairian\nzairians\nzambesi\nzambezi\nzambia\nzambian\nzambians\nzamia\nzamias\nzamindar\nzamindari\nzamindaris\nzamindars\nzanana\nzananas\nzander\nzanders\nzanier\nzanies\nzaniest\nzanily\nzaniness\nzany\nzanzibar\nzap\nzapata\nzapateado\nzapateados\nzapateo\nzapotec\nzapotecs\nzapped\nzapper\nzappers\nzappier\nzappiest\nzapping\nzappy\nzaps\nzarathustra\nzareba\nzarebas\nzareeba\nzareebas\nzarf\nzarfs\nzariba\nzaribas\nzarzuela\nzastruga\nzastrugas\nzauberflöte\nzax\nzaxes\nzayin\nzazen\nzaïrean\nzaïreans\nzeal\nzealand\nzealander\nzealanders\nzealot\nzealotries\nzealotry\nzealots\nzealous\nzealously\nzealousness\nzeatin\nzeatins\nzebec\nzebeck\nzebecks\nzebecs\nzebedee\nzebra\nzebras\nzebrawood\nzebrawoods\nzebrine\nzebroid\nzebroids\nzebu\nzebulon\nzebulun\nzebus\nzecchin\nzecchini\nzecchino\nzecchinos\nzecchins\nzechariah\nzechin\nzechins\nzed\nzedoaries\nzedoary\nzedonk\nzedonks\nzeds\nzee\nzeebrugge\nzeeland\nzeeman\nzees\nzeffirelli\nzein\nzeins\nzeitgeber\nzeitgebers\nzeitgeist\nzeitgeists\nzek\nzeks\nzelkova\nzelkovas\nzemindar\nzemindaries\nzemindars\nzemindary\nzemlya\nzemstvo\nzemstvos\nzen\nzenana\nzenanas\nzend\nzener\nzenist\nzenists\nzenith\nzenithal\nzeniths\nzeno\nzeolite\nzeolites\nzeolitic\nzephaniah\nzephyr\nzephyrs\nzephyrus\nzeppelin\nzeppelins\nzerk\nzerks\nzermatt\nzero\nzeroed\nzeroes\nzeroing\nzeros\nzeroth\nzest\nzested\nzester\nzesters\nzestful\nzestfully\nzestfulness\nzestier\nzestiest\nzesting\nzestless\nzests\nzesty\nzeta\nzethos\nzethus\nzeugma\nzeugmas\nzeus\nzeuxis\nzhejiang\nzibeline\nzibelines\nzibelline\nzibellines\nzibet\nzibeth\nzibeths\nzibets\nzidovudine\nzidovudines\nziegfeld\nzig\nzigged\nzigging\nziggurat\nziggurats\nzigs\nzigzag\nzigzagged\nzigzagger\nzigzaggers\nzigzagging\nzigzags\nzilch\nzilches\nzill\nzillion\nzillionaire\nzillionaires\nzillions\nzillionth\nzillionths\nzills\nzimbabwe\nzimbabwean\nzimbabweans\nzimmermann\nzinc\nzincate\nzincates\nzinced\nzincing\nzincite\nzincites\nzincked\nzinckenite\nzinckenites\nzincking\nzincks\nzincograph\nzincographer\nzincographers\nzincographic\nzincographical\nzincographs\nzincography\nzincs\nzineb\nzinebs\nzinfandel\nzinfandels\nzing\nzingari\nzingaro\nzinged\nzinger\nzingers\nzingier\nzingiest\nzinging\nzings\nzingy\nzinkenite\nzinkenites\nzinnia\nzinnias\nzion\nzionism\nzionist\nzionistic\nzionists\nzip\nzipless\nzipped\nzipper\nzippered\nzippering\nzippers\nzippier\nzippiest\nzipping\nzippy\nzips\nziram\nzirams\nzircaloy\nzircaloys\nzircon\nzirconia\nzirconias\nzirconium\nzircons\nzit\nzither\nzitherist\nzitherists\nzithern\nzitherns\nzithers\nziti\nzits\nzizith\nzloty\nzlotys\nzoa\nzoantharian\nzoantharians\nzoaria\nzoarial\nzoarium\nzoariums\nzocalo\nzocalos\nzodiac\nzodiacal\nzodiacs\nzoea\nzoeae\nzoeas\nzoecia\nzoecium\nzoffany\nzoftig\nzoisite\nzoisites\nzola\nzombi\nzombie\nzombielike\nzombies\nzombification\nzombifications\nzombified\nzombifies\nzombify\nzombifying\nzombiism\nzombis\nzona\nzonae\nzonal\nzonally\nzonary\nzonate\nzonated\nzonation\nzone\nzoned\nzoner\nzoners\nzones\nzonetime\nzonetimes\nzonian\nzonians\nzoning\nzonk\nzonked\nzonking\nzonks\nzontian\nzontians\nzonule\nzonules\nzoo\nzoochlorella\nzoochlorellae\nzoochlorellas\nzoochore\nzoochores\nzooecia\nzooecium\nzooflagellate\nzooflagellates\nzoogenic\nzoogenous\nzoogeographer\nzoogeographers\nzoogeographic\nzoogeographical\nzoogeographically\nzoogeography\nzooglea\nzoogleae\nzoogleal\nzoogleas\nzoogloea\nzoogloeae\nzoogloeas\nzoographic\nzoographical\nzoography\nzooid\nzooidal\nzooids\nzookeeper\nzookeepers\nzooks\nzoolater\nzoolaters\nzoolatrous\nzoolatry\nzoologic\nzoological\nzoologically\nzoologies\nzoologist\nzoologists\nzoology\nzoom\nzoomed\nzoometric\nzoometrical\nzoometrically\nzoometries\nzoometry\nzooming\nzoomorph\nzoomorphic\nzoomorphism\nzoomorphs\nzooms\nzoon\nzoonoses\nzoonosis\nzoonotic\nzoons\nzooparasite\nzooparasites\nzooparasitic\nzoophagous\nzoophile\nzoophiles\nzoophilia\nzoophilic\nzoophilism\nzoophilous\nzoophily\nzoophobe\nzoophobes\nzoophobia\nzoophyte\nzoophytes\nzoophytic\nzoophytical\nzooplankter\nzooplankters\nzooplankton\nzooplanktonic\nzooplastic\nzooplasties\nzooplasty\nzoos\nzoosperm\nzoosperms\nzoosporangia\nzoosporangium\nzoospore\nzoospores\nzoosporic\nzoosporous\nzoosterol\nzoosterols\nzoot\nzootechnical\nzootechnician\nzootechnicians\nzootechnics\nzootechny\nzootomic\nzootomical\nzootomies\nzootomist\nzootomists\nzootomy\nzootoxin\nzootoxins\nzooty\nzooxanthella\nzooxanthellae\nzori\nzoril\nzorilla\nzorillas\nzorille\nzorilles\nzorils\nzoris\nzorn\nzoroaster\nzoroastrian\nzoroastrianism\nzoroastrians\nzoster\nzosters\nzouave\nzouaves\nzounds\nzowie\nzoysia\nzucchetto\nzucchettos\nzucchini\nzucchinis\nzugspitze\nzugunruhe\nzugzwang\nzugzwangs\nzulu\nzululand\nzulus\nzuni\nzunian\nzunis\nzuppa\nzurich\nzutphen\nzuñi\nzuñian\nzuñis\nzwieback\nzwiebacks\nzwingli\nzwinglian\nzwinglianism\nzwinglians\nzwitterion\nzwitterionic\nzwitterions\nzydeco\nzygapophyseal\nzygapophyses\nzygapophysial\nzygapophysis\nzygodactyl\nzygodactylous\nzygodactyls\nzygogeneses\nzygogenesis\nzygogenetic\nzygoma\nzygomas\nzygomata\nzygomatic\nzygomorphic\nzygomorphism\nzygomorphous\nzygomorphy\nzygoses\nzygosis\nzygosity\nzygospore\nzygospores\nzygote\nzygotene\nzygotenes\nzygotes\nzygotic\nzygotically\nzymase\nzymases\nzymogen\nzymogenic\nzymogenous\nzymogens\nzymogram\nzymograms\nzymologic\nzymological\nzymologist\nzymologists\nzymology\nzymolysis\nzymolytic\nzymometer\nzymometers\nzymosan\nzymosans\nzymoscope\nzymoscopes\nzymoses\nzymosis\nzymotic\nzymotically\nzymurgy\nzyzzyva\nzyzzyvas\nzákros\nzöllner\nzöllner's\nzürich\nà\nâge\nåland\nångstrom\nångstroms\néclair\néclaircissement\néclairs\néclat\néclats\nécole\nécoles\nécorché\nécrasez\nécu\nécus\nélan\nélans\nélite\nélites\nélitism\nélitist\nélitists\némigré\némigrés\néminence\néminences\népoque\népée\népéeist\népéeists\népées\nétagère\nétagères\nétat\nétienne\nétoile\nétoiles\nétouffée\nétouffées\nétui\nétuis\névian\névêque\nêtre\nöland\nöre\nøresund\nœil\nœuvre"
  },
  {
    "path": "Trie/Trie/Trie.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\tEB798DFE1DFEF79900F0628D /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB798DFD1DFEF79900F0628D /* AppDelegate.swift */; };\n\t\tEB798E001DFEF79900F0628D /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB798DFF1DFEF79900F0628D /* ViewController.swift */; };\n\t\tEB798E021DFEF79900F0628D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = EB798E011DFEF79900F0628D /* Assets.xcassets */; };\n\t\tEB798E051DFEF79900F0628D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = EB798E031DFEF79900F0628D /* Main.storyboard */; };\n\t\tEB798E101DFEF79900F0628D /* TrieTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB798E0F1DFEF79900F0628D /* TrieTests.swift */; };\n\t\tEB798E1B1DFEF79900F0628D /* TrieUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB798E1A1DFEF79900F0628D /* TrieUITests.swift */; };\n\t\tEB798E291DFEF81400F0628D /* Trie.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB798E281DFEF81400F0628D /* Trie.swift */; };\n\t\tEB798E2A1DFEF81400F0628D /* Trie.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB798E281DFEF81400F0628D /* Trie.swift */; };\n\t\tEB798E2C1DFEF90B00F0628D /* dictionary.txt in Resources */ = {isa = PBXBuildFile; fileRef = EB798E2B1DFEF90B00F0628D /* dictionary.txt */; };\n\t\tEB798E2D1DFEF90B00F0628D /* dictionary.txt in Resources */ = {isa = PBXBuildFile; fileRef = EB798E2B1DFEF90B00F0628D /* dictionary.txt */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\tEB798E0C1DFEF79900F0628D /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = EB798DF21DFEF79900F0628D /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = EB798DF91DFEF79900F0628D;\n\t\t\tremoteInfo = Trie;\n\t\t};\n\t\tEB798E171DFEF79900F0628D /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = EB798DF21DFEF79900F0628D /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = EB798DF91DFEF79900F0628D;\n\t\t\tremoteInfo = Trie;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\tEB798DFA1DFEF79900F0628D /* Trie.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Trie.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tEB798DFD1DFEF79900F0628D /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\tEB798DFF1DFEF79900F0628D /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = \"<group>\"; };\n\t\tEB798E011DFEF79900F0628D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\tEB798E041DFEF79900F0628D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\tEB798E061DFEF79900F0628D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tEB798E0B1DFEF79900F0628D /* TrieTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TrieTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tEB798E0F1DFEF79900F0628D /* TrieTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrieTests.swift; sourceTree = \"<group>\"; };\n\t\tEB798E111DFEF79900F0628D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tEB798E161DFEF79900F0628D /* TrieUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TrieUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tEB798E1A1DFEF79900F0628D /* TrieUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrieUITests.swift; sourceTree = \"<group>\"; };\n\t\tEB798E1C1DFEF79900F0628D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tEB798E281DFEF81400F0628D /* Trie.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Trie.swift; sourceTree = \"<group>\"; };\n\t\tEB798E2B1DFEF90B00F0628D /* dictionary.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = dictionary.txt; sourceTree = \"<group>\"; };\n\t\tEB8369AC1E15C5710003A7F8 /* ReadMe.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = ReadMe.md; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\tEB798DF71DFEF79900F0628D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tEB798E081DFEF79900F0628D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tEB798E131DFEF79900F0628D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\tEB798DF11DFEF79900F0628D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tEB798DFC1DFEF79900F0628D /* Trie */,\n\t\t\t\tEB798E0E1DFEF79900F0628D /* TrieTests */,\n\t\t\t\tEB798E191DFEF79900F0628D /* TrieUITests */,\n\t\t\t\tEB798DFB1DFEF79900F0628D /* Products */,\n\t\t\t);\n\t\t\tindentWidth = 2;\n\t\t\tsourceTree = \"<group>\";\n\t\t\ttabWidth = 2;\n\t\t};\n\t\tEB798DFB1DFEF79900F0628D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tEB798DFA1DFEF79900F0628D /* Trie.app */,\n\t\t\t\tEB798E0B1DFEF79900F0628D /* TrieTests.xctest */,\n\t\t\t\tEB798E161DFEF79900F0628D /* TrieUITests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tEB798DFC1DFEF79900F0628D /* Trie */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tEB8369AC1E15C5710003A7F8 /* ReadMe.md */,\n\t\t\t\tEB798DFD1DFEF79900F0628D /* AppDelegate.swift */,\n\t\t\t\tEB798DFF1DFEF79900F0628D /* ViewController.swift */,\n\t\t\t\tEB798E011DFEF79900F0628D /* Assets.xcassets */,\n\t\t\t\tEB798E031DFEF79900F0628D /* Main.storyboard */,\n\t\t\t\tEB798E061DFEF79900F0628D /* Info.plist */,\n\t\t\t\tEB798E281DFEF81400F0628D /* Trie.swift */,\n\t\t\t\tEB798E2B1DFEF90B00F0628D /* dictionary.txt */,\n\t\t\t);\n\t\t\tpath = Trie;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tEB798E0E1DFEF79900F0628D /* TrieTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tEB798E0F1DFEF79900F0628D /* TrieTests.swift */,\n\t\t\t\tEB798E111DFEF79900F0628D /* Info.plist */,\n\t\t\t);\n\t\t\tpath = TrieTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tEB798E191DFEF79900F0628D /* TrieUITests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tEB798E1A1DFEF79900F0628D /* TrieUITests.swift */,\n\t\t\t\tEB798E1C1DFEF79900F0628D /* Info.plist */,\n\t\t\t);\n\t\t\tpath = TrieUITests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\tEB798DF91DFEF79900F0628D /* Trie */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = EB798E1F1DFEF79900F0628D /* Build configuration list for PBXNativeTarget \"Trie\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tEB798DF61DFEF79900F0628D /* Sources */,\n\t\t\t\tEB798DF71DFEF79900F0628D /* Frameworks */,\n\t\t\t\tEB798DF81DFEF79900F0628D /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = Trie;\n\t\t\tproductName = Trie;\n\t\t\tproductReference = EB798DFA1DFEF79900F0628D /* Trie.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\tEB798E0A1DFEF79900F0628D /* TrieTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = EB798E221DFEF79900F0628D /* Build configuration list for PBXNativeTarget \"TrieTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tEB798E071DFEF79900F0628D /* Sources */,\n\t\t\t\tEB798E081DFEF79900F0628D /* Frameworks */,\n\t\t\t\tEB798E091DFEF79900F0628D /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\tEB798E0D1DFEF79900F0628D /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = TrieTests;\n\t\t\tproductName = TrieTests;\n\t\t\tproductReference = EB798E0B1DFEF79900F0628D /* TrieTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n\t\tEB798E151DFEF79900F0628D /* TrieUITests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = EB798E251DFEF79900F0628D /* Build configuration list for PBXNativeTarget \"TrieUITests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tEB798E121DFEF79900F0628D /* Sources */,\n\t\t\t\tEB798E131DFEF79900F0628D /* Frameworks */,\n\t\t\t\tEB798E141DFEF79900F0628D /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\tEB798E181DFEF79900F0628D /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = TrieUITests;\n\t\t\tproductName = TrieUITests;\n\t\t\tproductReference = EB798E161DFEF79900F0628D /* TrieUITests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.ui-testing\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\tEB798DF21DFEF79900F0628D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0810;\n\t\t\t\tLastUpgradeCheck = 1000;\n\t\t\t\tORGANIZATIONNAME = \"Rick Zaccone\";\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\tEB798DF91DFEF79900F0628D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.1;\n\t\t\t\t\t\tLastSwiftMigration = 1000;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t};\n\t\t\t\t\tEB798E0A1DFEF79900F0628D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.1;\n\t\t\t\t\t\tLastSwiftMigration = 1000;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t\tTestTargetID = EB798DF91DFEF79900F0628D;\n\t\t\t\t\t};\n\t\t\t\t\tEB798E151DFEF79900F0628D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 8.1;\n\t\t\t\t\t\tLastSwiftMigration = 1000;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t\tTestTargetID = EB798DF91DFEF79900F0628D;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = EB798DF51DFEF79900F0628D /* Build configuration list for PBXProject \"Trie\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = English;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = EB798DF11DFEF79900F0628D;\n\t\t\tproductRefGroup = EB798DFB1DFEF79900F0628D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\tEB798DF91DFEF79900F0628D /* Trie */,\n\t\t\t\tEB798E0A1DFEF79900F0628D /* TrieTests */,\n\t\t\t\tEB798E151DFEF79900F0628D /* TrieUITests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\tEB798DF81DFEF79900F0628D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tEB798E2C1DFEF90B00F0628D /* dictionary.txt in Resources */,\n\t\t\t\tEB798E021DFEF79900F0628D /* Assets.xcassets in Resources */,\n\t\t\t\tEB798E051DFEF79900F0628D /* Main.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tEB798E091DFEF79900F0628D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tEB798E2D1DFEF90B00F0628D /* dictionary.txt in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tEB798E141DFEF79900F0628D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\tEB798DF61DFEF79900F0628D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tEB798E291DFEF81400F0628D /* Trie.swift in Sources */,\n\t\t\t\tEB798E001DFEF79900F0628D /* ViewController.swift in Sources */,\n\t\t\t\tEB798DFE1DFEF79900F0628D /* AppDelegate.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tEB798E071DFEF79900F0628D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tEB798E101DFEF79900F0628D /* TrieTests.swift in Sources */,\n\t\t\t\tEB798E2A1DFEF81400F0628D /* Trie.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tEB798E121DFEF79900F0628D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tEB798E1B1DFEF79900F0628D /* TrieUITests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\tEB798E0D1DFEF79900F0628D /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = EB798DF91DFEF79900F0628D /* Trie */;\n\t\t\ttargetProxy = EB798E0C1DFEF79900F0628D /* PBXContainerItemProxy */;\n\t\t};\n\t\tEB798E181DFEF79900F0628D /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = EB798DF91DFEF79900F0628D /* Trie */;\n\t\t\ttargetProxy = EB798E171DFEF79900F0628D /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\tEB798E031DFEF79900F0628D /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\tEB798E041DFEF79900F0628D /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\tEB798E1D1DFEF79900F0628D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVES = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tEB798E1E1DFEF79900F0628D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVES = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.12;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Owholemodule\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tEB798E201DFEF79900F0628D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Trie/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = edu.bucknell.zaccone.Trie;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tEB798E211DFEF79900F0628D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = Trie/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = edu.bucknell.zaccone.Trie;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tEB798E231DFEF79900F0628D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = TrieTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = edu.bucknell.zaccone.TrieTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/Trie.app/Contents/MacOS/Trie\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tEB798E241DFEF79900F0628D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = TrieTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = edu.bucknell.zaccone.TrieTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/Trie.app/Contents/MacOS/Trie\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tEB798E261DFEF79900F0628D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = TrieUITests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = edu.bucknell.zaccone.TrieUITests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t\tTEST_TARGET_NAME = Trie;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tEB798E271DFEF79900F0628D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tINFOPLIST_FILE = TrieUITests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = edu.bucknell.zaccone.TrieUITests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t\tTEST_TARGET_NAME = Trie;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\tEB798DF51DFEF79900F0628D /* Build configuration list for PBXProject \"Trie\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tEB798E1D1DFEF79900F0628D /* Debug */,\n\t\t\t\tEB798E1E1DFEF79900F0628D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tEB798E1F1DFEF79900F0628D /* Build configuration list for PBXNativeTarget \"Trie\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tEB798E201DFEF79900F0628D /* Debug */,\n\t\t\t\tEB798E211DFEF79900F0628D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tEB798E221DFEF79900F0628D /* Build configuration list for PBXNativeTarget \"TrieTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tEB798E231DFEF79900F0628D /* Debug */,\n\t\t\t\tEB798E241DFEF79900F0628D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tEB798E251DFEF79900F0628D /* Build configuration list for PBXNativeTarget \"TrieUITests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tEB798E261DFEF79900F0628D /* Debug */,\n\t\t\t\tEB798E271DFEF79900F0628D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = EB798DF21DFEF79900F0628D /* Project object */;\n}\n"
  },
  {
    "path": "Trie/Trie/Trie.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:Trie.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Trie/Trie/Trie.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Trie/Trie/Trie.xcodeproj/xcshareddata/xcbaselines/EB798E0A1DFEF79900F0628D.xcbaseline/6ABF2F62-9363-4450-8DE1-D20F57026950.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>classNames</key>\n\t<dict>\n\t\t<key>TrieTests</key>\n\t\t<dict>\n\t\t\t<key>testInsertPerformance()</key>\n\t\t\t<dict>\n\t\t\t\t<key>com.apple.XCTPerformanceMetric_WallClockTime</key>\n\t\t\t\t<dict>\n\t\t\t\t\t<key>baselineAverage</key>\n\t\t\t\t\t<real>3.407</real>\n\t\t\t\t\t<key>baselineIntegrationDisplayName</key>\n\t\t\t\t\t<string>Local Baseline</string>\n\t\t\t\t</dict>\n\t\t\t</dict>\n\t\t</dict>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "Trie/Trie/Trie.xcodeproj/xcshareddata/xcbaselines/EB798E0A1DFEF79900F0628D.xcbaseline/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>runDestinationsByUUID</key>\n\t<dict>\n\t\t<key>6ABF2F62-9363-4450-8DE1-D20F57026950</key>\n\t\t<dict>\n\t\t\t<key>localComputer</key>\n\t\t\t<dict>\n\t\t\t\t<key>busSpeedInMHz</key>\n\t\t\t\t<integer>100</integer>\n\t\t\t\t<key>cpuCount</key>\n\t\t\t\t<integer>1</integer>\n\t\t\t\t<key>cpuKind</key>\n\t\t\t\t<string>Intel Core i7</string>\n\t\t\t\t<key>cpuSpeedInMHz</key>\n\t\t\t\t<integer>3300</integer>\n\t\t\t\t<key>logicalCPUCoresPerPackage</key>\n\t\t\t\t<integer>4</integer>\n\t\t\t\t<key>modelCode</key>\n\t\t\t\t<string>MacBookPro13,2</string>\n\t\t\t\t<key>physicalCPUCoresPerPackage</key>\n\t\t\t\t<integer>2</integer>\n\t\t\t\t<key>platformIdentifier</key>\n\t\t\t\t<string>com.apple.platform.macosx</string>\n\t\t\t</dict>\n\t\t\t<key>targetArchitecture</key>\n\t\t\t<string>x86_64</string>\n\t\t</dict>\n\t</dict>\n</dict>\n</plist>\n"
  },
  {
    "path": "Trie/Trie/TrieTests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Trie/Trie/TrieTests/TrieTests.swift",
    "content": "//\n//  TrieTests.swift\n//  TrieTests\n//\n//  Created by Rick Zaccone on 2016-12-12.\n//  Copyright © 2016 Rick Zaccone. All rights reserved.\n//\n\nimport XCTest\n@testable import Trie\n\nclass TrieTests: XCTestCase {\n  var wordArray: [String]?\n  var trie = Trie()\n\n  /// Makes sure that the wordArray and trie are initialized before each test.\n  override func setUp() {\n    super.setUp()\n    createWordArray()\n    insertWordsIntoTrie()\n  }\n\n  /// Don't need to do anything here because the wordArray and trie should\n  /// stay around.\n  override func tearDown() {\n    super.tearDown()\n  }\n\n  /// Reads words from the dictionary file and inserts them into an array.  If\n  /// the word array already has words, do nothing.  This allows running all\n  /// tests without repeatedly filling the array with the same values.\n  func createWordArray() {\n    guard wordArray == nil else {\n      return\n    }\n    let resourcePath = Bundle.main.resourcePath! as NSString\n    let fileName = \"dictionary.txt\"\n    let filePath = resourcePath.appendingPathComponent(fileName)\n\n    var data: String?\n    do {\n      data = try String(contentsOfFile: filePath, encoding: String.Encoding.utf8)\n    } catch let error as NSError {\n      XCTAssertNil(error)\n    }\n    XCTAssertNotNil(data)\n    let dictionarySize = 162825\n    wordArray = data!.components(separatedBy: \"\\n\")\n    XCTAssertEqual(wordArray!.count, dictionarySize)\n  }\n\n  /// Inserts words into a trie.  If the trie is non-empty, don't do anything.\n  func insertWordsIntoTrie() {\n    guard let wordArray = wordArray, trie.count == 0 else { return }\n    for word in wordArray {\n      trie.insert(word: word)\n    }\n  }\n\n  /// Tests that a newly created trie has zero words.\n  func testCreate() {\n    let trie = Trie()\n    XCTAssertEqual(trie.count, 0)\n  }\n\n  /// Tests the insert method\n  func testInsert() {\n    let trie = Trie()\n    trie.insert(word: \"cute\")\n    trie.insert(word: \"cutie\")\n    trie.insert(word: \"fred\")\n    XCTAssertTrue(trie.contains(word: \"cute\"))\n    XCTAssertFalse(trie.contains(word: \"cut\"))\n    trie.insert(word: \"cut\")\n    XCTAssertTrue(trie.contains(word: \"cut\"))\n    XCTAssertEqual(trie.count, 4)\n  }\n\n  /// Tests the remove method\n  func testRemove() {\n    let trie = Trie()\n    trie.insert(word: \"cute\")\n    trie.insert(word: \"cut\")\n    XCTAssertEqual(trie.count, 2)\n    trie.remove(word: \"cute\")\n    XCTAssertTrue(trie.contains(word: \"cut\"))\n    XCTAssertFalse(trie.contains(word: \"cute\"))\n    XCTAssertEqual(trie.count, 1)\n  }\n\n  /// Tests the words property\n  func testWords() {\n    let trie = Trie()\n    var words = trie.words\n    XCTAssertEqual(words.count, 0)\n    trie.insert(word: \"foobar\")\n    words = trie.words\n    XCTAssertEqual(words[0], \"foobar\")\n    XCTAssertEqual(words.count, 1)\n  }\n\n  /// Tests the performance of the insert method.\n  func testInsertPerformance() {\n    self.measure {\n      let trie = Trie()\n      for word in self.wordArray! {\n        trie.insert(word: word)\n      }\n    }\n    XCTAssertGreaterThan(trie.count, 0)\n    XCTAssertEqual(trie.count, wordArray?.count)\n  }\n\n  /// Tests the performance of the insert method when the words are already\n  /// present.\n  func testInsertAgainPerformance() {\n    self.measure {\n      for word in self.wordArray! {\n        self.trie.insert(word: word)\n      }\n    }\n  }\n\n  /// Tests the performance of the contains method.\n  func testContainsPerformance() {\n    self.measure {\n      for word in self.wordArray! {\n        XCTAssertTrue(self.trie.contains(word: word))\n      }\n    }\n  }\n\n  /// Tests the performance of the remove method.  Since setup has already put\n  /// words into the trie, remove them before measuring performance.\n  func testRemovePerformance() {\n    for word in self.wordArray! {\n      self.trie.remove(word: word)\n    }\n    self.measure {\n      self.insertWordsIntoTrie()\n      for word in self.wordArray! {\n        self.trie.remove(word: word)\n      }\n    }\n    XCTAssertEqual(trie.count, 0)\n  }\n\n  /// Tests the performance of the words computed property.  Also tests to see\n  /// if it worked properly.\n  func testWordsPerformance() {\n    var words: [String]?\n    self.measure {\n      words = self.trie.words\n    }\n    XCTAssertEqual(words?.count, trie.count)\n    for word in words! {\n      XCTAssertTrue(self.trie.contains(word: word))\n    }\n  }\n\n  /// Tests the archiving and unarchiving of the trie.\n  func testArchiveAndUnarchive() {\n    let resourcePath = Bundle.main.resourcePath! as NSString\n    let fileName = \"dictionary-archive\"\n    let filePath = resourcePath.appendingPathComponent(fileName)\n    NSKeyedArchiver.archiveRootObject(trie, toFile: filePath)\n    let trieCopy = NSKeyedUnarchiver.unarchiveObject(withFile: filePath) as? Trie\n    XCTAssertEqual(trieCopy?.count, trie.count)\n  }\n  \n  /// Tests whether word prefixes are properly found and returned.\n  func testFindWordsWithPrefix() {\n    let trie = Trie()\n    trie.insert(word: \"test\")\n    trie.insert(word: \"another\")\n    trie.insert(word: \"exam\")\n    let wordsAll = trie.findWordsWithPrefix(prefix: \"\")\n    XCTAssertEqual(wordsAll.sorted(), [\"another\", \"exam\", \"test\"])\n    let words = trie.findWordsWithPrefix(prefix: \"ex\")\n    XCTAssertEqual(words, [\"exam\"])\n    trie.insert(word: \"examination\")\n    let words2 = trie.findWordsWithPrefix(prefix: \"exam\")\n    XCTAssertEqual(words2, [\"exam\", \"examination\"])\n    let noWords = trie.findWordsWithPrefix(prefix: \"tee\")\n    XCTAssertEqual(noWords, [])\n    let unicodeWord = \"😬😎\"\n    trie.insert(word: unicodeWord)\n    let wordsUnicode = trie.findWordsWithPrefix(prefix: \"😬\")\n    XCTAssertEqual(wordsUnicode, [unicodeWord])\n    trie.insert(word: \"Team\")\n    let wordsUpperCase = trie.findWordsWithPrefix(prefix: \"Te\")\n    XCTAssertEqual(wordsUpperCase.sorted(), [\"team\", \"test\"])\n  }\n\n  /// Tests whether word prefixes are properly detected on a boolean contains() check.\n  func testContainsWordMatchPrefix() {\n    let trie = Trie()\n    trie.insert(word: \"test\")\n    trie.insert(word: \"another\")\n    trie.insert(word: \"exam\")\n    let wordsAll = trie.contains(word: \"\", matchPrefix: true)\n    XCTAssertEqual(wordsAll, true)\n    let words = trie.contains(word: \"ex\", matchPrefix: true)\n    XCTAssertEqual(words, true)\n    trie.insert(word: \"examination\")\n    let words2 = trie.contains(word: \"exam\", matchPrefix: true)\n    XCTAssertEqual(words2, true)\n    let noWords = trie.contains(word: \"tee\", matchPrefix: true)\n    XCTAssertEqual(noWords, false)\n    let unicodeWord = \"😬😎\"\n    trie.insert(word: unicodeWord)\n    let wordsUnicode = trie.contains(word: \"😬\", matchPrefix: true)\n    XCTAssertEqual(wordsUnicode, true)\n    trie.insert(word: \"Team\")\n    let wordsUpperCase = trie.contains(word: \"Te\", matchPrefix: true)\n    XCTAssertEqual(wordsUpperCase, true)\n  }\n}\n"
  },
  {
    "path": "Trie/Trie/TrieUITests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Trie/Trie/TrieUITests/TrieUITests.swift",
    "content": "//\n//  TrieUITests.swift\n//  TrieUITests\n//\n//  Created by Rick Zaccone on 2016-12-12.\n//  Copyright © 2016 Rick Zaccone. All rights reserved.\n//\n\nimport XCTest\n\nclass TrieUITests: XCTestCase {\n\n  override func setUp() {\n    super.setUp()\n\n    // Put setup code here. This method is called before the invocation of each test method in the class.\n\n    // In UI tests it is usually best to stop immediately when a failure occurs.\n    continueAfterFailure = false\n    // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method.\n    XCUIApplication().launch()\n\n    // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.\n  }\n\n  override func tearDown() {\n    // Put teardown code here. This method is called after the invocation of each test method in the class.\n    super.tearDown()\n  }\n\n  func testExample() {\n    // Use recording to get started writing UI tests.\n    // Use XCTAssert and related functions to verify your tests produce the correct results.\n  }\n\n}\n"
  },
  {
    "path": "Two-Sum Problem/README.markdown",
    "content": "# Two-Sum Problem\n\nGiven an array of integers and an integer target, return the indices of two numbers that add up to the target.\n\nThere are a variety of solutions to this problem (some better than others). The following solutions both run in **O(n)** time.\n\n# Solution 1\n\nThis solution looks at one number at a time, storing each number in the dictionary. It uses the number as the key and the number's index in the array as the value.\n\nFor each number n, we know the complementing number to sum up to the target is `target - n`. By looking up the complement in the dictionary, we'd know whether we've seen the complement before and what its index is.\n\n```swift\nfunc twoSum(_ nums: [Int], target: Int) -> (Int, Int)? {\n    var dict = [Int: Int]()\n    \n    // For every number n,\n    for (currentIndex, n) in nums.enumerated() {\n        // Find the complement to n that would sum up to the target.\n        let complement = target - n\n        \n        // Check if the complement is in the dictionary.\n        if let complementIndex = dict[complement] {\n            return (complementIndex, currentIndex)\n        }\n        \n        // Store n and its index into the dictionary.\n        dict[n] = currentIndex\n    }\n    \n    return nil\n}\n```\n\nThe `twoSum` function takes two parameters: the `numbers` array and the target sum. It returns the two indicies of the pair of elements that sums up to the target, or `nil` if they can't be found.\n\nLet's run through the algorithm to see how it works. Given the array:\n\n```swift\n[3, 2, 9, 8]\n```\n\nLet's find out if there exist two entries whose sum is 10.\n\nInitially, our dictionary is empty. We begin looping through each element:\n\n- **currentIndex = 0** | n = nums[0] = 3 | complement = 10 - 3 = 7\n\nIs the complement `7` in the dictionary? No, so we add `3` and its index `0` to the dictionary.\n\n```swift\n[3: 0]\n```\n\n- **currentIndex = 1** | n = 2 | complement = 10 - 2 = 8\n\nIs the complement `8` in the dictionary? No, so we add `2` and its index `1` to the dictionary.\n\n```swift\n[3: 0, 2: 1]\n```\n\n- **currentIndex = 2** | n = 9 | complement = 10 - 9 = 1\n\nIs the complement `1` in the dictionary? No, so we add `9` and its index `2` to the dictionary.:\n\n```swift\n[3: 0, 2: 1, 9: 2]\n```\n\n- **currentIndex = 3** | n = 8 | complement = 10 - 8 = 2\n\nIs the complement `2` in the dictionary? Yes! That means that we have found a pair of entries that sum to the target!\n\nTherefore, the `complementIndex = dict[2] = 1` and the `currentIndex = 3`. The tuple we return is `(1, 3)`.\n\nIf the given array has multiple solutions, only the first solution is returned.\n\nThe running time of this algorithm is **O(n)** because it may look at every element in the array. It also requires **O(n)** additional storage space for the dictionary.\n\n# Solution 2\n\n**Note**: This particular algorithm requires that the array is sorted, so if the array isn't sorted yet (usually it won't be), you need to sort it first. The time complexity of the algorithm itself is **O(n)** and, unlike the previous solution, it does not require extra storage. Of course, if you have to sort first, the total time complexity becomes **O(n log n)**. Slightly worse but still quite acceptable.\n\nHere is the code in Swift:\n\n```swift\nfunc twoSumProblem(_ a: [Int], k: Int) -> ((Int, Int))? {\n  var i = 0\n  var j = a.count - 1\n\n  while i < j {\n    let sum = a[i] + a[j]\n    if sum == k {\n      return (i, j)\n    } else if sum < k {\n      i += 1\n    } else {\n      j -= 1\n    }\n  }\n  return nil\n}\n```\n\nAs in the first solution, the `twoSumProblem()` function takes as parameters the array `a` with the numbers and `k`, the sum we're looking for. If there are two numbers that add up to `k`, the function returns a tuple containing their array indices. If not, it returns `nil`. The main difference is that `a` is assumed to be sorted.\n\nTo test it, copy the code into a playground and add the following:\n\n```swift\nlet a = [2, 3, 4, 4, 7, 8, 9, 10, 12, 14, 21, 22, 100]\nif let (i, j) = twoSumProblem(a, k: 33) {\n  a[i] + a[j]  // 33\n}\n```\n\nThis returns the tuple `(8, 10)` because `a[8] = 12` and `a[10] = 21`, and together they add up to `33`.\n\nSo how does this algorithm work? It takes advantage of the array being sorted. That's true for many algorithms, by the way. If you first sort the data, it's often easier to perform your calculations.\n\nIn the example, the sorted array is:\n\n\t[ 2, 3, 4, 4, 7, 8, 9, 10, 12, 14, 21, 22, 100 ]\n\nThe algorithm uses the two variables `i` and `j` to point to the beginning and end of the array, respectively. Then it increments `i` and decrements `j` until the two meet. While it's doing this, it checks whether `a[i]` and `a[j]` add up to `k`.\n\nLet's step through this. Initially, we have:\n\n\t[ 2, 3, 4, 4, 7, 8, 9, 10, 12, 14, 21, 22, 100 ]\n      i                                        j\n\nThe sum of these two is `2 + 100 = 102`. That's obviously too much, since `k = 33` in this example. There is no way that `100` will ever be part of the answer, so decrement `j`.\n\nWe have:\n\n\t[ 2, 3, 4, 4, 7, 8, 9, 10, 12, 14, 21, 22, 100 ]\n      i                                    j\n\nThe sum is `2 + 22 = 24`. Now the sum is too small. We can safely conclude at this point that the number `2` will never be part of the answer. The largest number on the right is `22`, so we at least need `11` on the left to make `33`. Anything less than `11` is not going to cut it. (This is why we sorted the array!)\n\nSo, `2` is out and we increment `i` to look at the next small number.\n\n\t[ 2, 3, 4, 4, 7, 8, 9, 10, 12, 14, 21, 22, 100 ]\n         i                                 j\n\nThe sum is `3 + 22 = 25`. Still too small, so increment `i` again.\n\n\t[ 2, 3, 4, 4, 7, 8, 9, 10, 12, 14, 21, 22, 100 ]\n            i                              j\n\nIn fact, we have to increment `i` a few more times, until we get to `12`:\n\n\t[ 2, 3, 4, 4, 7, 8, 9, 10, 12, 14, 21, 22, 100 ]\n                               i           j\n\nNow the sum is `12 + 22 = 34`. It's too high, which means we need to decrement `j`. This gives:\n\n\t[ 2, 3, 4, 4, 7, 8, 9, 10, 12, 14, 21, 22, 100 ]\n                               i       j\n\nAnd finally, we have the answer: `12 + 21 = 33`. Yay!\n\nIt's possible, of course, that there are no values for `a[i] + a[j]` that sum to `k`. In that case, eventually `i` and `j` will point at the same number. Then we can conclude that no answer exists and we return `nil`.\n\nI'm quite enamored by this little algorithm. It shows that with some basic preprocessing on the input data -- sorting it from low to high -- you can turn a tricky problem into a very simple and beautiful algorithm.\n\n## Additional Reading\n\n* [3Sum / 4Sum](https://github.com/raywenderlich/swift-algorithm-club/tree/master/3Sum%20and%204Sum)\n\n*Written for Swift Algorithm Club by Matthijs Hollemans and Daniel Speiser updated to swift 4.2 by Farrukh Askari*\n"
  },
  {
    "path": "Two-Sum Problem/Solution 1/2Sum.playground/Contents.swift",
    "content": "//: Two Sum\n// Last checked with: Version 10.0 (10A255)\n\nfunc twoSum(_ nums: [Int], target: Int) -> (Int, Int)? {\n    var dict = [Int: Int]()\n    \n    for (currentIndex, n) in nums.enumerated() {\n        let complement = target - n\n        \n        if let complementIndex = dict[complement] {\n            return (complementIndex, currentIndex)\n        }\n        \n        dict[n] = currentIndex\n    }\n    \n    return nil\n}\n\ntwoSum([3, 2, 9, 8], target: 10) // expected output: indices 1 and 3\n"
  },
  {
    "path": "Two-Sum Problem/Solution 1/2Sum.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx' display-mode='rendered'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Two-Sum Problem/Solution 1/2Sum.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Two-Sum Problem/Solution 1/2Sum.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Two-Sum Problem/Solution 2/2Sum.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n// Last checked with: Version 10.0 (10A255)\n\nfunc twoSumProblem(_ a: [Int], k: Int) -> ((Int, Int))? {\n  var i = 0\n  var j = a.count - 1\n\n  while i < j {\n    let sum = a[i] + a[j]\n    if sum == k {\n      return (i, j)\n    } else if sum < k {\n      i += 1\n    } else {\n      j -= 1\n    }\n  }\n  return nil\n}\n\nlet a = [2, 3, 4, 4, 7, 8, 9, 10, 12, 14, 21, 22, 100]\nif let (i, j) = twoSumProblem(a, k: 33) {\n  i            // 8\n  a[i]         // 12\n  j            // 10\n  a[j]         // 21\n  a[i] + a[j]  // 33\n}\n\ntwoSumProblem(a, k: 37)  // nil\n"
  },
  {
    "path": "Two-Sum Problem/Solution 2/2Sum.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Two-Sum Problem/Solution 2/2Sum.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Two-Sum Problem/Solution 2/2Sum.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Under Construction.markdown",
    "content": "# Under Construction :construction:\n\nHere you'll find algorithms that are currently under construction. Suggestions and feedback is welcome!\n\n### Sorting\n\nSpecial-purpose sorts:\n - [Radix Sort](Radix%20Sort/)\n\n### Special-purpose sorts:\n\n- [Bucket Sort](Bucket%20Sort/)\n\n### Queues\n\n- [Bounded Priority Queue](Bounded%20Priority%20Queue). A queue that is bounded to have a limited number of elements.\n\n### Trees\n\n- [AVL Tree](AVL%20Tree/). A binary search tree that balances itself using rotations.\n- [Red-Black Tree](Red-Black%20Tree/)\n- [Threaded Binary Tree](Threaded%20Binary%20Tree/)\n- [Ternary Search Tree](Ternary%20Search%20Tree/)\n- [Trie](Trie/)\n- [Radix Tree](Radix%20Tree/)\n\n### Miscellaneous\n\n- [Minimum Edit Distance](Minimum%20Edit%20Distance/). Measure the similarity of two strings by counting the number of operations required to transform one string into the other.\n- [Treap](Treap/)\n- [Set Cover (Unweighted)](Set%20Cover%20(Unweighted)/)\n"
  },
  {
    "path": "Union-Find/README.markdown",
    "content": "# Union-Find\n\nUnion-Find is a data structure that can keep track of a set of elements partitioned into a number of disjoint (non-overlapping) subsets. It is also known as disjoint-set data structure.\n\nWhat do we mean by this? For example, the Union-Find data structure could be keeping track of the following sets:\n\n\t[ a, b, f, k ]\n\t[ e ]\n\t[ g, d, c ]\n\t[ i, j ]\n\nThese sets are **disjoint** because they have no members in common.\n\nUnion-Find supports three basic operations:\n\n1. **Find(A)**: Determine which subset an element **A** is in. For example, `find(d)` would return the subset `[ g, d, c ]`.\n\n2. **Union(A, B)**: Join two subsets that contain **A** and **B** into a single subset. For example, `union(d, j)` would combine `[ g, d, c ]` and `[ i, j ]` into the larger set `[ g, d, c, i, j ]`.\n\n3. **AddSet(A)**: Add a new subset containing just that element **A**. For example, `addSet(h)` would add a new set `[ h ]`.\n\nThe most common application of this data structure is keeping track of the connected components of an undirected [graph](../Graph/). It is also used for implementing an efficient version of Kruskal's algorithm to find the minimum spanning tree of a graph.\n\n## Implementation\n\nUnion-Find can be implemented in many ways but we'll look at an efficient and easy to understand implementation: Weighted Quick Union.\n> __PS: Multiple implementations of Union-Find has been included in playground.__\n\n```swift\npublic struct UnionFind<T: Hashable> {\n  private var index = [T: Int]()\n  private var parent = [Int]()\n  private var size = [Int]()\n}\n```\n\nOur Union-Find data structure is actually a forest where each subset is represented by a [tree](../Tree/).\n\nFor our purposes we only need to keep track of the parent of each tree node, not the node's children. To do this we use the array `parent` so that `parent[i]` is the index of node `i`'s parent.\n\nExample: If `parent` looks like this,\n\n\tparent [ 1, 1, 1, 0, 2, 0, 6, 6, 6 ]\n\t     i   0  1  2  3  4  5  6  7  8\n\nthen the tree structure looks like:\n\n\t      1              6\n\t    /   \\           / \\\n\t  0       2        7   8\n\t / \\     /\n\t3   5   4\n\nThere are two trees in this forest, each of which corresponds to one set of elements. (Note: due to the limitations of ASCII art the trees are shown here as binary trees but that is not necessarily the case.)\n\nWe give each subset a unique number to identify it. That number is the index of  the root node of that subset's tree. In the example, node `1` is the root of the first tree and `6` is the root of the second tree.\n\nSo in this example we have two subsets, the first with the label `1` and the second with the label `6`. The **Find** operation actually returns the set's label, not its contents.\n\nNote that the `parent[]` of a root node points to itself. So `parent[1] = 1` and `parent[6] = 6`. That's how we can tell something is a root node.\n\n## Add set\n\nLet's look at the implementation of these basic operations, starting with adding a new set.\n\n```swift\npublic mutating func addSetWith(_ element: T) {\n  index[element] = parent.count  // 1\n  parent.append(parent.count)    // 2\n  size.append(1)                 // 3\n}\n```\n\nWhen you add a new element, this actually adds a new subset containing just that element.\n\n1. We save the index of the new element in the `index` dictionary. That lets us look up the element quickly later on.\n\n2. Then we add that index to the `parent` array to build a new tree for this  set. Here, `parent[i]` is pointing to itself because the tree that represents the new set contains only one node, which of course is the root of that tree.\n\n3. `size[i]` is the count of nodes in the tree whose root is at index `i`. For the new set this is 1 because it only contains the one element. We'll be using the `size` array in the Union operation.\n\n## Find\n\nOften we want to determine whether we already have a set that contains a given element. That's what the **Find** operation does. In our `UnionFind` data structure it is called `setOf()`:\n\n```swift\npublic mutating func setOf(_ element: T) -> Int? {\n  if let indexOfElement = index[element] {\n    return setByIndex(indexOfElement)\n  } else {\n    return nil\n  }\n}\n```\n\nThis looks up the element's index in the `index` dictionary and then uses a helper method to find the set that this element belongs to:\n\n```swift\nprivate mutating func setByIndex(_ index: Int) -> Int {\n  if parent[index] == index {  // 1\n    return index\n  } else {\n    parent[index] = setByIndex(parent[index])  // 2\n    return parent[index]       // 3\n  }\n}\n```\n\nBecause we're dealing with a tree structure, this is a recursive method.\n\nRecall that each set is represented by a tree and that the index of the root node serves as the number that identifies the set. We're going to find the root node of the tree that the element we're searching for belongs to, and return its index.\n\n1. First, we check if the given index represents a root node (i.e. a node whose `parent` points back to the node itself). If so, we're done.\n\n2. Otherwise we recursively call this method on the parent of the current node. And then we do a **very important thing**: we overwrite the parent of the current node with the index of root node, in effect reconnecting the node directly to the root of the tree. The next time we call this method, it will execute faster because the path to the root of the tree is now much shorter. Without that optimization, this method's complexity is **O(n)** but now in combination with the size optimization (covered in the Union section) it is almost **O(1)**.\n\n3. We return the index of the root node as the result.\n\nHere's illustration of what I mean. Let's say the tree looks like this:\n\n![BeforeFind](Images/BeforeFind.png)\n\nWe call `setOf(4)`. To find the root node we have to first go to node `2` and then to node `7`. (The indices of the elements are marked in red.)\n\nDuring the call to `setOf(4)`, the tree is reorganized to look like this:\n\n![AfterFind](Images/AfterFind.png)\n\nNow if we need to call `setOf(4)` again, we no longer have to go through node `2` to get to the root. So as you use the Union-Find data structure, it optimizes itself. Pretty cool!\n\nThere is also a helper method to check that two elements are in the same set:\n\n```swift\npublic mutating func inSameSet(_ firstElement: T, and secondElement: T) -> Bool {\n  if let firstSet = setOf(firstElement), let secondSet = setOf(secondElement) {\n    return firstSet == secondSet\n  } else {\n    return false\n  }\n}\n```\n\nSince this calls `setOf()` it also optimizes the tree.\n\n## Union (Weighted)\n\nThe final operation is **Union**, which combines two sets into one larger set.\n\n```swift\n    public mutating func unionSetsContaining(_ firstElement: T, and secondElement: T) {\n        if let firstSet = setOf(firstElement), let secondSet = setOf(secondElement) { // 1\n            if firstSet != secondSet {                // 2\n                if size[firstSet] < size[secondSet] { // 3\n                    parent[firstSet] = secondSet      // 4\n                    size[secondSet] += size[firstSet] // 5\n                } else {\n                    parent[secondSet] = firstSet\n                    size[firstSet] += size[secondSet]\n                }\n            }\n        }\n    }\n```\n\nHere is how it works:\n\n1. We find the sets that each element belongs to. Remember that this gives us two integers: the indices of the root nodes in the `parent` array.\n\n2. Check that the sets are not equal because if they are it makes no sense to union them.\n\n3. This is where the size optimization comes in (Weighting). We want to keep the trees as shallow as possible so we always attach the smaller tree to the root of the larger tree. To determine which is the smaller tree we compare trees by their sizes.\n\n4. Here we attach the smaller tree to the root of the larger tree.\n\n5. Update the size of larger tree because it just had a bunch of nodes added to it.\n\nAn illustration may help to better understand this. Let's say we have these two sets, each with its own tree:\n\n![BeforeUnion](Images/BeforeUnion.png)\n\nNow we call `unionSetsContaining(4, and: 3)`. The smaller tree is attached to the larger one:\n\n![AfterUnion](Images/AfterUnion.png)\n\nNote that, because we call `setOf()` at the start of the method, the larger tree was also optimized in the process -- node `3` now hangs directly off the root.\n\nUnion with optimizations also takes almost **O(1)** time.\n\n## Path Compression\n```swift\nprivate mutating func setByIndex(_ index: Int) -> Int {\n    if index != parent[index] {\n        // Updating parent index while looking up the index of parent.\n        parent[index] = setByIndex(parent[index])\n    }\n    return parent[index]\n}\n```\nPath Compression helps keep trees very flat, thus find operation could take __ALMOST__ in __O(1)__\n\n## Complexity Summary\n\n##### To process N objects\n| Data Structure | Union | Find |\n|---|---|---|\n|Quick Find|N|1|\n|Quick Union|Tree height|Tree height|\n|Weighted Quick Union|lgN|lgN|\n|Weighted Quick Union + Path Compression| very close, but not O(1)| very close, but not O(1) |\n\n##### To process M union commands on N objects\n| Algorithm | Worst-case time|\n|---|---|\n|Quick Find| M N |\n|Quick Union| M N |\n|Weighted Quick Union| N + M lgN |\n|Weighted Quick Union + Path Compression| (M + N) lgN |\n\n## See also\n\nSee the playground for more examples of how to use this handy data structure.\n\n[Union-Find at Wikipedia](https://en.wikipedia.org/wiki/Disjoint-set_data_structure)\n\n*Written for Swift Algorithm Club by [Artur Antonov](https://github.com/goingreen)*, *modified by [Yi Ding](https://github.com/antonio081014).*"
  },
  {
    "path": "Union-Find/UnionFind.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\nvar dsu = UnionFindQuickUnion<Int>()\n\nfor i in 1...10 {\n  dsu.addSetWith(i)\n}\n// now our dsu contains 10 independent sets\n\n// let's divide our numbers into two sets by divisibility by 2\nfor i in 3...10 {\n  if i % 2 == 0 {\n    dsu.unionSetsContaining(2, and: i)\n  } else {\n    dsu.unionSetsContaining(1, and: i)\n  }\n}\n\n// check our division\nprint(dsu.inSameSet(2, and: 4))\nprint(dsu.inSameSet(4, and: 6))\nprint(dsu.inSameSet(6, and: 8))\nprint(dsu.inSameSet(8, and: 10))\n\nprint(dsu.inSameSet(1, and: 3))\nprint(dsu.inSameSet(3, and: 5))\nprint(dsu.inSameSet(5, and: 7))\nprint(dsu.inSameSet(7, and: 9))\n\nprint(dsu.inSameSet(7, and: 4))\nprint(dsu.inSameSet(3, and: 6))\n\nvar dsuForStrings = UnionFindQuickUnion<String>()\nlet words = [\"all\", \"border\", \"boy\", \"afternoon\", \"amazing\", \"awesome\", \"best\"]\n\ndsuForStrings.addSetWith(\"a\")\ndsuForStrings.addSetWith(\"b\")\n\n// In that example we divide strings by its first letter\nfor word in words {\n  dsuForStrings.addSetWith(word)\n  if word.hasPrefix(\"a\") {\n    dsuForStrings.unionSetsContaining(\"a\", and: word)\n  } else if word.hasPrefix(\"b\") {\n    dsuForStrings.unionSetsContaining(\"b\", and: word)\n  }\n}\n\nprint(dsuForStrings.inSameSet(\"a\", and: \"all\"))\nprint(dsuForStrings.inSameSet(\"all\", and: \"awesome\"))\nprint(dsuForStrings.inSameSet(\"amazing\", and: \"afternoon\"))\n\nprint(dsuForStrings.inSameSet(\"b\", and: \"boy\"))\nprint(dsuForStrings.inSameSet(\"best\", and: \"boy\"))\nprint(dsuForStrings.inSameSet(\"border\", and: \"best\"))\n\nprint(dsuForStrings.inSameSet(\"amazing\", and: \"boy\"))\nprint(dsuForStrings.inSameSet(\"all\", and: \"border\"))\n"
  },
  {
    "path": "Union-Find/UnionFind.playground/Sources/UnionFindQuickFind.swift",
    "content": "import Foundation\n\n/// Quick-find algorithm may take ~MN steps\n/// to process M union commands on N objects\npublic struct UnionFindQuickFind<T: Hashable> {\n  private var index = [T: Int]()\n  private var parent = [Int]()\n  private var size = [Int]()\n\n  public init() {}\n\n  public mutating func addSetWith(_ element: T) {\n    index[element] = parent.count\n    parent.append(parent.count)\n    size.append(1)\n  }\n\n  private mutating func setByIndex(_ index: Int) -> Int {\n    return parent[index]\n  }\n\n  public mutating func setOf(_ element: T) -> Int? {\n    if let indexOfElement = index[element] {\n      return setByIndex(indexOfElement)\n    } else {\n      return nil\n    }\n  }\n\n  public mutating func unionSetsContaining(_ firstElement: T, and secondElement: T) {\n    if let firstSet = setOf(firstElement), let secondSet = setOf(secondElement) {\n      if firstSet != secondSet {\n        for index in 0..<parent.count {\n          if parent[index] == firstSet {\n            parent[index] = secondSet\n          }\n        }\n        size[secondSet] += size[firstSet]\n      }\n    }\n  }\n\n  public mutating func inSameSet(_ firstElement: T, and secondElement: T) -> Bool {\n    if let firstSet = setOf(firstElement), let secondSet = setOf(secondElement) {\n      return firstSet == secondSet\n    } else {\n      return false\n    }\n  }\n}\n"
  },
  {
    "path": "Union-Find/UnionFind.playground/Sources/UnionFindQuickUnion.swift",
    "content": "import Foundation\n\n/// Quick-Union algorithm may take ~MN steps\n/// to process M union commands on N objects\npublic struct UnionFindQuickUnion<T: Hashable> {\n  private var index = [T: Int]()\n  private var parent = [Int]()\n  private var size = [Int]()\n\n  public init() {}\n\n  public mutating func addSetWith(_ element: T) {\n    index[element] = parent.count\n    parent.append(parent.count)\n    size.append(1)\n  }\n\n  private mutating func setByIndex(_ index: Int) -> Int {\n    if parent[index] == index {\n      return index\n    } else {\n      parent[index] = setByIndex(parent[index])\n      return parent[index]\n    }\n  }\n\n  public mutating func setOf(_ element: T) -> Int? {\n    if let indexOfElement = index[element] {\n      return setByIndex(indexOfElement)\n    } else {\n      return nil\n    }\n  }\n\n  public mutating func unionSetsContaining(_ firstElement: T, and secondElement: T) {\n    if let firstSet = setOf(firstElement), let secondSet = setOf(secondElement) {\n      if firstSet != secondSet {\n        parent[firstSet] = secondSet\n        size[secondSet] += size[firstSet]\n      }\n    }\n  }\n\n  public mutating func inSameSet(_ firstElement: T, and secondElement: T) -> Bool {\n    if let firstSet = setOf(firstElement), let secondSet = setOf(secondElement) {\n      return firstSet == secondSet\n    } else {\n      return false\n    }\n  }\n}\n"
  },
  {
    "path": "Union-Find/UnionFind.playground/Sources/UnionFindWeightedQuickFind.swift",
    "content": "import Foundation\n\n/// Quick-find algorithm may take ~MN steps\n/// to process M union commands on N objects\npublic struct UnionFindWeightedQuickFind<T: Hashable> {\n  private var index = [T: Int]()\n  private var parent = [Int]()\n  private var size = [Int]()\n\n  public init() {}\n\n  public mutating func addSetWith(_ element: T) {\n    index[element] = parent.count\n    parent.append(parent.count)\n    size.append(1)\n  }\n\n  private mutating func setByIndex(_ index: Int) -> Int {\n    return parent[index]\n  }\n\n  public mutating func setOf(_ element: T) -> Int? {\n    if let indexOfElement = index[element] {\n      return setByIndex(indexOfElement)\n    } else {\n      return nil\n    }\n  }\n\n  public mutating func unionSetsContaining(_ firstElement: T, and secondElement: T) {\n    if let firstSet = setOf(firstElement), let secondSet = setOf(secondElement) {\n      if firstSet != secondSet {\n        if size[firstSet] < size[secondSet] {\n          for index in 0..<parent.count {\n            if parent[index] == firstSet {\n              parent[index] = secondSet\n            }\n          }\n          size[secondSet] += size[firstSet]\n        } else {\n          for index in 0..<parent.count {\n            if parent[index] == secondSet {\n              parent[index] = firstSet\n            }\n          }\n          size[firstSet] += size[secondSet]\n        }\n      }\n    }\n  }\n\n  public mutating func inSameSet(_ firstElement: T, and secondElement: T) -> Bool {\n    if let firstSet = setOf(firstElement), let secondSet = setOf(secondElement) {\n      return firstSet == secondSet\n    } else {\n      return false\n    }\n  }\n}\n"
  },
  {
    "path": "Union-Find/UnionFind.playground/Sources/UnionFindWeightedQuickUnion.swift",
    "content": "import Foundation\n\npublic struct UnionFindWeightedQuickUnion<T: Hashable> {\n  private var index = [T: Int]()\n  private var parent = [Int]()\n  private var size = [Int]()\n\n  public init() {}\n\n  public mutating func addSetWith(_ element: T) {\n    index[element] = parent.count\n    parent.append(parent.count)\n    size.append(1)\n  }\n\n  private mutating func setByIndex(_ index: Int) -> Int {\n    if parent[index] == index {\n      return index\n    } else {\n      parent[index] = setByIndex(parent[index])\n      return parent[index]\n    }\n  }\n\n  public mutating func setOf(_ element: T) -> Int? {\n    if let indexOfElement = index[element] {\n      return setByIndex(indexOfElement)\n    } else {\n      return nil\n    }\n  }\n\n  /// Weighted, by comparing set size.\n  /// Merge small set into the large one.\n  public mutating func unionSetsContaining(_ firstElement: T, and secondElement: T) {\n    if let firstSet = setOf(firstElement), let secondSet = setOf(secondElement) {\n      if firstSet != secondSet {\n        if size[firstSet] < size[secondSet] {\n          parent[firstSet] = secondSet\n          size[secondSet] += size[firstSet]\n        } else {\n          parent[secondSet] = firstSet\n          size[firstSet] += size[secondSet]\n        }\n      }\n    }\n  }\n\n  public mutating func inSameSet(_ firstElement: T, and secondElement: T) -> Bool {\n    if let firstSet = setOf(firstElement), let secondSet = setOf(secondElement) {\n      return firstSet == secondSet\n    } else {\n      return false\n    }\n  }\n}\n"
  },
  {
    "path": "Union-Find/UnionFind.playground/Sources/UnionFindWeightedQuickUnionPathCompression.swift",
    "content": "import Foundation\n\npublic struct UnionFindWeightedQuickUnionPathCompression<T: Hashable> {\n  private var index = [T: Int]()\n  private var parent = [Int]()\n  private var size = [Int]()\n\n  public init() {}\n\n  public mutating func addSetWith(_ element: T) {\n    index[element] = parent.count\n    parent.append(parent.count)\n    size.append(1)\n  }\n\n  /// Path Compression.\n  private mutating func setByIndex(_ index: Int) -> Int {\n    if index != parent[index] {\n      parent[index] = setByIndex(parent[index])\n    }\n    return parent[index]\n  }\n\n  public mutating func setOf(_ element: T) -> Int? {\n    if let indexOfElement = index[element] {\n      return setByIndex(indexOfElement)\n    } else {\n      return nil\n    }\n  }\n\n  public mutating func unionSetsContaining(_ firstElement: T, and secondElement: T) {\n    if let firstSet = setOf(firstElement), let secondSet = setOf(secondElement) {\n      if firstSet != secondSet {\n        if size[firstSet] < size[secondSet] {\n          parent[firstSet] = secondSet\n          size[secondSet] += size[firstSet]\n        } else {\n          parent[secondSet] = firstSet\n          size[firstSet] += size[secondSet]\n        }\n      }\n    }\n  }\n\n  public mutating func inSameSet(_ firstElement: T, and secondElement: T) -> Bool {\n    if let firstSet = setOf(firstElement), let secondSet = setOf(secondElement) {\n      return firstSet == secondSet\n    } else {\n      return false\n    }\n  }\n}\n"
  },
  {
    "path": "Union-Find/UnionFind.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Union-Find/UnionFind.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Union-Find/UnionFind.playground/playground.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "What are Algorithms.markdown",
    "content": "# What are algorithms and data structures?\n\nAn algorithm is a recipe for making the computer do something. If you know how to cook, you understand algorithms!\n\nHere's a [recipe for pancakes](http://allrecipes.com/recipe/21014/good-old-fashioned-pancakes/):\n\n1. In a large bowl, sift together flour, baking powder, salt and sugar.\n2. Pour in the milk, egg, and melted butter.\n3. Mix until smooth.\n4. Heat a frying pan over medium heat.\n5. Scoop the batter into the pan, using approximately 1/4 cup for each pancake.\n6. Brown the pancake on both sides.\n\nThe recipe consists of a series of steps that you perform one after the other. An algorithm is just like that, except that it contains instructions for a computer to perform, not for a cook.\n\nThe ingredients -- flour, milk, eggs, butter -- are the data that the algorithm works on. The data goes into the algorithm in one form (raw, separate ingredients) and comes out in another (delicious pancakes!).\n\nSo what are the data structures? They are the containers that hold the data while the algorithm works on it. In the pancake recipe, the data structures are the bag that holds the flour, the mixing bowl where you combine everything, the frying pan that browns the pancake, and finally the plate used to serve the finished pancake.\n"
  },
  {
    "path": "Why Algorithms.markdown",
    "content": "# Why learn algorithms and data structures?\n\nIf you've been coding for while you may wonder what the point is of learning about algorithms and data structures, especially if you don't have a formal computer science or engineering background.\n\nAfter all, how often do you actually have to use a linked list or write your own sort routine when you're making apps? The answer is: almost never.\n\n#### **However...**\n\nKnowing a little bit about the strategies used by algorithms to solve tricky problems gives you ideas for improvements you can make to your own code.\n\nKnowing more data structures than just the standard array and dictionary gives you a bigger collection of tools you can use to build your own apps.\n\nIt will make you a better developer! (And better developers make more $$$.)\n\n#### Algorithms lets you build software you couldn't otherwise build\n\nThere have been apps that I've been unable to create in the past because I got stuck on fundamental issues.\n\nOften it was a matter of speed: I just couldn't make the program go fast enough. Thinking back on this now, I had chosen the wrong algorithms for these problems. If I had known more about the difference between **O(n)** and **O(n^2)**, then maybe I would have had better luck.\n\nNaive brute-force solutions work fine for small amounts of data, but sometimes you need to deal with lots of data. And then you need smarter algorithms.\n\nThere were also times I wasn't able to solve my programming problems at all, not even slowly. I simply didn't know where to begin. Understanding a bit of algorithm theory gives you various tactics you can try.\n\n#### Don't spend any time memorizing algorithms\n\nThat's not the point. Instead, try to understand how different algorithms approach different problems.\n\nLearn about techniques such as divide-and-conquer, dynamic programming, greedy algorithms. See what makes one approach slow and another fast, and learn what the tradeoffs are.\n\nThe key thing here is to get insight in how we can make computers do things.\n\n#### It's not as scary as it sounds\n\nA lot of algorithm textbooks start with a bunch of math. Truth is, the math is useful but most of the time you won't need it. So don't let that scare you. If you can write code, you can also understand all these fancy algorithms and data structures.\n\nTrust me, algorithms are fun. :-)\n"
  },
  {
    "path": "Z-Algorithm/README.markdown",
    "content": "# Z-Algorithm String Search\n\nGoal: Write a simple linear-time string matching algorithm in Swift that returns the indexes of all the occurrencies of a given pattern. \n \nIn other words, we want to implement an `indexesOf(pattern: String)` extension on `String` that returns an array `[Int]` of integers, representing all occurrences' indexes of the search pattern, or `nil` if the pattern could not be found inside the string.\n \nFor example:\n\n```swift\nlet str = \"Hello, playground!\"\nstr.indexesOf(pattern: \"ground\")   // Output: [11]\n\nlet traffic = \"🚗🚙🚌🚕🚑🚐🚗🚒🚚🚎🚛🚐🏎🚜🚗🏍🚒🚲🚕🚓🚌🚑\"\ntraffic.indexesOf(pattern: \"🚑\") // Output: [4, 21]\n```\n\nMany string search algorithms use a pre-processing function to compute a table that will be used in successive stage. This table can save some time during the pattern search stage because it allows to avoid un-needed characters comparisons. The [Z-Algorithm]() is one of these functions. It borns as a pattern pre-processing function (this is its role in the [Knuth-Morris-Pratt algorithm](../Knuth-Morris-Pratt/) and others) but, just like we will show here, it can be used also as a single string search algorithm.\n\n### Z-Algorithm as pattern pre-processor\n\nAs we said, the Z-Algorithm is foremost an algorithm that process a pattern in order to calculate a skip-comparisons-table.\nThe computation of the Z-Algorithm over a pattern `P` produces an array (called `Z` in the literature) of integers in which each element, call it `Z[i]`, represents the length of the longest substring of `P` that starts at `i` and matches a prefix of `P`. In simpler words, `Z[i]` records the longest prefix of `P[i...|P|]` that matches a prefix of `P`. As an example, let's consider `P = \"ffgtrhghhffgtggfredg\"`. We have that `Z[5] = 0 (f...h...)`, `Z[9] = 4 (ffgtr...ffgtg...)` and `Z[15] = 1 (ff...fr...)`.\n\nBut how do we compute `Z`? Before we describe the algorithm we must indroduce the concept of Z-box. A Z-box is a pair `(left, right)` used during the computation that records the substring of maximal length that occurs also as a prefix of `P`. The two indices `left` and `right` represent, respectively, the left-end index and the right-end index of this substring. \nThe definition of the Z-Algorithm is inductive and it computes the elements of the array for every position `k` in the pattern, starting from `k = 1`. The following values (`Z[k + 1]`, `Z[k + 2]`, ...) are computed after `Z[k]`. The idea behind the algorithm is that previously computed values can speed up the calculus of `Z[k + 1]`, avoiding some character comparisons that were already done before. Consider this example: suppose we are at iteration `k = 100`, so we are analyzing position `100` of the pattern. All the values between `Z[1]` and `Z[99]` were correctly computed and `left = 70` and `right = 120`. This means that there is a substring of length `51` starting at position `70` and ending at position `120` that matches the prefix of the pattern/string we are considering. Reasoning on it a little bit we can say that the substring of length `21` starting at position `100` matches the substring of length `21` starting at position `30` of the pattern (because we are inside a substring that matches a prefix of the pattern). So we can use `Z[30]` to compute `Z[100]` without additional character comparisons.\nThis a simple description of the idea that is behind this algorithm. There are a few cases to manage when the use of pre-computed values cannot be directly applied and some comparisons are to be made.\n\nHere is the code of the function that computes the Z-array:\n```swift\nfunc ZetaAlgorithm(ptrn: String) -> [Int]? {\n    let pattern = Array(ptrn)\n    let patternLength: Int = pattern.count\n\n    guard patternLength > 0 else {\n        return nil\n    }\n\n    var zeta: [Int] = [Int](repeating: 0, count: patternLength)\n\n    var left: Int = 0\n    var right: Int = 0\n    var k_1: Int = 0\n    var betaLength: Int = 0\n    var textIndex: Int = 0\n    var patternIndex: Int = 0\n\n    for k in 1 ..< patternLength {\n        if k > right {  // Outside a Z-box: compare the characters until mismatch\n            patternIndex = 0\n\n            while k + patternIndex < patternLength  &&\n                pattern[k + patternIndex] == pattern[patternIndex] {\n                patternIndex = patternIndex + 1\n            }\n\n            zeta[k] = patternIndex\n\n            if zeta[k] > 0 {\n                left = k\n                right = k + zeta[k] - 1\n            }\n        } else {  // Inside a Z-box\n            k_1 = k - left + 1\n            betaLength = right - k + 1\n\n            if zeta[k_1 - 1] < betaLength { // Entirely inside a Z-box: we can use the values computed before\n                zeta[k] = zeta[k_1 - 1]\n            } else if zeta[k_1 - 1] >= betaLength { // Not entirely inside a Z-box: we must proceed with comparisons too\n                textIndex = betaLength\n                patternIndex = right + 1\n\n                while patternIndex < patternLength && pattern[textIndex] == pattern[patternIndex] {\n                    textIndex = textIndex + 1\n                    patternIndex = patternIndex + 1\n                }\n\n                zeta[k] = patternIndex - k\n                left = k\n                right = patternIndex - 1\n            }\n        }\n    }\n    return zeta\n}\n```\n\nLet's make an example reasoning with the code above. Let's consider the string `P = “abababbb\"`. The algorithm begins with `k = 1`, `left = right = 0`. So, no Z-box is \"active\" and thus, because `k > right` we start with the character comparisons beetwen `P[1]` and `P[0]`.\n  \n    \n       01234567\n    k:  x\n       abababbb\n       x\n    Z: 00000000\n    left:  0\n    right: 0\n\nWe have a mismatch at the first comparison and so the substring starting at `P[1]` does not match a prefix of `P`. So, we put `Z[1] = 0` and let `left` and `right` untouched. We begin another iteration with `k = 2`, we have `2 > 0` and again we start comparing characters `P[2]` with `P[0]`. This time the characters match and so we continue the comparisons until a mismatch occurs. It happens at position `6`. The characters matched are `4`, so we put `Z[2] = 4` and set `left = k = 2` and `right = k + Z[k] - 1 = 5`. We have our first Z-box that is the substring `\"abab\"` (notice that it matches a prefix of `P`) starting at position `left = 2`.\n\n       01234567\n    k:   x\n       abababbb\n       x\n    Z: 00400000\n    left:  2\n    right: 5\n\nWe then proceed with `k = 3`. We have `3 <= 5`. We are inside the Z-box previously found and inside a prefix of `P`. So we can look for a position that has a previously computed value. We calculate `k_1 = k - left = 1` that is the index of the prefix's character equal to `P[k]`. We check `Z[1] = 0` and `0 < (right - k + 1 = 3)` and we find that we are exactly inside the Z-box. We can use the previously computed value, so we put `Z[3] = Z[1] = 0`, `left` and `right` remain unchanged.\nAt iteration `k = 4` we initially execute the `else` branch of the outer `if`. Then in the inner `if` we have that `k_1 = 2` and `(Z[2] = 4) >= 5 - 4 + 1`. So, the substring `P[k...r]` matches for `right - k + 1 = 2` chars the prefix of `P` but it could not for the following characters. We must then compare the characters starting at `r + 1 = 6` with those starting at `right - k + 1 = 2`. We have `P[6] != P[2]` and so we have to set `Z[k] = 6 - 4 = 2`, `left = 4` and `right = 5`.\n\n       01234567\n    k:     x\n       abababbb\n       x\n    Z: 00402000\n    left:  4\n    right: 5\n\nWith iteration `k = 5` we have `k <= right` and then `(Z[k_1] = 0) < (right - k + 1 = 1)` and so we set `z[k] = 0`. In iteration `6` and `7` we execute the first branch of the outer `if` but we only have mismatches, so the algorithms terminates returning the Z-array as `Z = [0, 0, 4, 0, 2, 0, 0, 0]`.\n\nThe Z-Algorithm runs in linear time. More specifically, the Z-Algorithm for a string `P` of size `n` has a running time of `O(n)`.\n\nThe implementation of Z-Algorithm as string pre-processor is contained in the [ZAlgorithm.swift](./ZAlgorithm.swift) file.\n\n### Z-Algorithm as string search algorithm \n\nThe Z-Algorithm discussed above leads to the simplest linear-time string matching algorithm. To obtain it, we have to simply concatenate the pattern `P` and text `T` in a string `S = P$T` where `$` is a character that does not appear neither in `P` nor `T`. Then we run the algorithm on `S` obtaining the Z-array. All we have to do now is scan the Z-array looking for elements equal to `n` (which is the pattern length). When we find such value we can report an occurrence.\n\n```swift\nextension String {\n\n    func indexesOf(pattern: String) -> [Int]? {\n        let patternLength: Int = pattern.count\n        /* Let's calculate the Z-Algorithm on the concatenation of pattern and text */\n        let zeta = ZetaAlgorithm(ptrn: pattern + \"💲\" + self)\n\n        guard zeta != nil else {\n            return nil\n        }\n\n        var indexes: [Int] = [Int]()\n\n        /* Scan the zeta array to find matched patterns */\n        for i in 0 ..< zeta!.count {\n            if zeta![i] == patternLength {\n                indexes.append(i - patternLength - 1)\n            }\n        }\n\n        guard !indexes.isEmpty else {\n            return nil\n        }\n\n        return indexes\n    }\n}\n```\n\nLet's make an example. Let `P = “CATA“` and `T = \"GAGAACATACATGACCAT\"` be the pattern and the text. Let's concatenate them with the character `$`. We have the string `S = \"CATA$GAGAACATACATGACCAT\"`. After computing the Z-Algorithm on `S` we obtain:\n\n                1         2\n      01234567890123456789012\n      CATA$GAGAACATACATGACCAT\n    Z 00000000004000300001300\n                ^\n\nWe scan the Z-array and at position `10` we find `Z[10] = 4 = n`. So we can report a match occuring at text position `10 - n - 1 = 5`.\n\nAs said before, the complexity of this algorithm is linear. Defining `n` and `m` as pattern and text lengths, the final complexity we obtain is `O(n + m + 1) = O(n + m)`.\n\n\nCredits: This code is based on the handbook [\"Algorithm on String, Trees and Sequences: Computer Science and Computational Biology\"](https://books.google.it/books/about/Algorithms_on_Strings_Trees_and_Sequence.html?id=Ofw5w1yuD8kC&redir_esc=y) by Dan Gusfield, Cambridge University Press, 1997. \n\n*Written for Swift Algorithm Club by Matteo Dunnhofer*\n"
  },
  {
    "path": "Z-Algorithm/ZAlgorithm.swift",
    "content": "/*  Z-Algorithm for pattern/string pre-processing\n \n The code is based on the book:\n \"Algorithms on String, Trees and Sequences: Computer Science and Computational Biology\"\n by Dan Gusfield\n Cambridge University Press, 1997\n */\n\nimport Foundation\n\nfunc ZetaAlgorithm(ptrn: String) -> [Int]? {\n  let pattern = Array(ptrn)\n  let patternLength = pattern.count\n\n  guard patternLength > 0 else {\n    return nil\n  }\n\n  var zeta = [Int](repeating: 0, count: patternLength)\n\n  var left = 0\n  var right = 0\n  var k_1 = 0\n  var betaLength = 0\n  var textIndex = 0\n  var patternIndex = 0\n\n  for k in 1 ..< patternLength {\n    if k > right {\n      patternIndex = 0\n\n      while k + patternIndex < patternLength  &&\n        pattern[k + patternIndex] == pattern[patternIndex] {\n          patternIndex = patternIndex + 1\n      }\n\n      zeta[k] = patternIndex\n\n      if zeta[k] > 0 {\n        left = k\n        right = k + zeta[k] - 1\n      }\n    } else {\n      k_1 = k - left + 1\n      betaLength = right - k + 1\n\n      if zeta[k_1 - 1] < betaLength {\n        zeta[k] = zeta[k_1 - 1]\n      } else if zeta[k_1 - 1] >= betaLength {\n        textIndex = betaLength\n        patternIndex = right + 1\n\n        while patternIndex < patternLength && pattern[textIndex] == pattern[patternIndex] {\n          textIndex = textIndex + 1\n          patternIndex = patternIndex + 1\n        }\n\n        zeta[k] = patternIndex - k\n        left = k\n        right = patternIndex - 1\n      }\n    }\n  }\n  return zeta\n}\n"
  },
  {
    "path": "Z-Algorithm/ZetaAlgorithm.playground/Contents.swift",
    "content": "//: Playground - noun: a place where people can play\n\nfunc ZetaAlgorithm(ptrn: String) -> [Int]? {\n  let pattern = Array(ptrn)\n  let patternLength = pattern.count\n\n  guard patternLength > 0 else {\n    return nil\n  }\n\n  var zeta = [Int](repeating: 0, count: patternLength)\n\n  var left = 0\n  var right = 0\n  var k_1 = 0\n  var betaLength = 0\n  var textIndex = 0\n  var patternIndex = 0\n\n  for k in 1 ..< patternLength {\n    if k > right {\n      patternIndex = 0\n\n      while k + patternIndex < patternLength  &&\n        pattern[k + patternIndex] == pattern[patternIndex] {\n          patternIndex = patternIndex + 1\n      }\n\n      zeta[k] = patternIndex\n\n      if zeta[k] > 0 {\n        left = k\n        right = k + zeta[k] - 1\n      }\n    } else {\n      k_1 = k - left + 1\n      betaLength = right - k + 1\n\n      if zeta[k_1 - 1] < betaLength {\n        zeta[k] = zeta[k_1 - 1]\n      } else if zeta[k_1 - 1] >= betaLength {\n        textIndex = betaLength\n        patternIndex = right + 1\n\n        while patternIndex < patternLength && pattern[textIndex] == pattern[patternIndex] {\n          textIndex = textIndex + 1\n          patternIndex = patternIndex + 1\n        }\n\n        zeta[k] = patternIndex - k\n        left = k\n        right = patternIndex - 1\n      }\n    }\n  }\n  return zeta\n}\n\nextension String {\n\n  func indexesOf(pattern: String) -> [Int]? {\n    let patternLength = pattern.count\n    let zeta = ZetaAlgorithm(ptrn: pattern + \"💲\" + self)\n\n    guard zeta != nil else {\n      return nil\n    }\n\n    var indexes: [Int] = []\n\n    /* Scan the zeta array to find matched patterns */\n    for i in 0 ..< zeta!.count {\n      if zeta![i] == patternLength {\n        indexes.append(i - patternLength - 1)\n      }\n    }\n\n    guard !indexes.isEmpty else {\n      return nil\n    }\n\n    return indexes\n  }\n}\n\n/* Examples */\n\nlet str = \"Hello, playground!\"\nstr.indexesOf(pattern: \"ground\")   // [11]\n\nlet traffic = \"🚗🚙🚌🚕🚑🚐🚗🚒🚚🚎🚛🚐🏎🚜🚗🏍🚒🚲🚕🚓🚌🚑\"\ntraffic.indexesOf(pattern: \"🚑\") // [4, 21]\n"
  },
  {
    "path": "Z-Algorithm/ZetaAlgorithm.playground/contents.xcplayground",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<playground version='5.0' target-platform='osx'>\n    <timeline fileName='timeline.xctimeline'/>\n</playground>"
  },
  {
    "path": "Z-Algorithm/ZetaAlgorithm.playground/playground.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Z-Algorithm/ZetaAlgorithm.swift",
    "content": "/*  Z-Algorithm based algorithm for pattern/string matching\n \n The code is based on the book:\n \"Algorithms on String, Trees and Sequences: Computer Science and Computational Biology\"\n by Dan Gusfield\n Cambridge University Press, 1997\n */\n\nimport Foundation\n\nextension String {\n\n  func indexesOf(pattern: String) -> [Int]? {\n    let patternLength = pattern.count\n    let zeta = ZetaAlgorithm(ptrn: pattern + \"💲\" + self)\n\n    guard zeta != nil else {\n      return nil\n    }\n\n    var indexes: [Int] = [Int]()\n\n    /* Scan the zeta array to find matched patterns */\n    for i in 0 ..< zeta!.count {\n      if zeta![i] == patternLength {\n        indexes.append(i - patternLength - 1)\n      }\n    }\n\n    guard !indexes.isEmpty else {\n      return nil\n    }\n\n    return indexes\n  }\n}\n"
  },
  {
    "path": "gfm-render.sh",
    "content": "#!/usr/bin/env bash\n\nset -e\n\n# $1 - readme file name\nfunction render_markdown_to_html {\n  # escape escaping characters on Darwin only\n  content=$(\n    cat \"$1\"                                          \\\n      | sed 's/\\\\/\\\\\\\\/g'                             \\\n      | sed 's/\"/\\\\\"/g'                               \\\n      | sed $'s/\\t/\\\\\\\\t/g'                           \\\n      | sed -e ':a' -e 'N' -e '$!ba' -e 's/\\n/\\\\\\n/g' \\\n  )\n\n  # network call to GitHub API\n  json=\"{\\\"text\\\":\\\"$content\\\",\\\"mode\\\":\\\"gfm\\\",\\\"context\\\":\\\"$USERNAME/swift-algorithm-club\\\"}\"\n  echo -e \"$(curl -s --data \"$json\" -u $USERNAME:$TOKEN https://api.github.com/markdown)\"\n}\n\n# download github systax highlight stylesheet\necho \"> Downloading github-light.css...\"\ncurl -s -O https://raw.githubusercontent.com/primer/github-syntax-light/master/lib/github-light.css\n\n# slightly modify the main stylesheet\necho \"> Modifying github-light.css...\"\ncat >> github-light.css << EOF\n#container {\n  margin: 0 auto;\n  width: 75%;\n  min-width: 768px;\n  max-width: 896px;\n  position: relative;\n}\n\nbody {\n  font-size: 18px;\n}\n\ncode {\n    padding: 0.2em;\n    margin: 0;\n    font-size: 85%;\n    background-color: #f6f8fa;\n    line-height: 1.45;\n    border-radius: 3px\n}\n\npre code {\n    padding: 0px;\n    background-color: transparent;\n}\n\n.highlight {\n  margin: 0px;\n  padding: 0px 16px;\n  font-size: 85%;\n  line-height: 1.45;\n  overflow: auto;\n  background-color: #f6f8fa;\n  border-radius: 3px;\n}\n\n@media (max-width: 768px) {\n  #container {\n    position: absolute;\n    margin: 0;\n    width: 100%;\n    height: 100%;\n    min-width: 100%;\n  }\n}\nEOF\n\n# other markdown articles\nfor title in \"What are Algorithms\" \"Big-O Notation\" \"Algorithm Design\" \"Why Algorithms\"; do\n  echo \"> Generating $title.html...\"\n\n  cat > \"$title.html\" << EOF\n<!DOCTYPE html>\n<head>\n  <title>$title</title>\n  <link rel=\"stylesheet\" type=\"text/css\" href=\"github-light.css\">\n</head>\n<body>\n  <div id=\"container\">$(render_markdown_to_html \"$title.markdown\")</div>\n</body>\n</html>\nEOF\ndone\n\n# if index.html does not exist, create one;\n# otherwise, empty its content.\necho \"> Generating index.html...\"\ncat > index.html << EOF\n<!DOCTYPE html>\n<head>\n  <title>Swift Algorithm Club</title>\n  <link rel=\"stylesheet\" type=\"text/css\" href=\"github-light.css\">\n</head>\n<body>\n  <div id=\"container\">$(render_markdown_to_html README.markdown | sed 's/.markdown/.html/g')</div>\n</body>\n</html>\nEOF\n\n# iterate immediate directories\nfind . -maxdepth 1 -type d | while read folder; do\n  readme=''\n\n  # get the right extension for the README file if there is one\n  if [[ -f $folder/README.md ]]; then readme=\"$folder/README.md\"; fi\n  if [[ -f $folder/README.markdown ]]; then readme=\"$folder/README.markdown\"; fi\n\n  # skip if there is no README or it it the README of the repository\n  if [[ (-z $readme) || $readme == \"./README.markdown\" ]]; then continue; fi\n\n  # render README to HTML\n  name=$(basename \"$folder\")\n  echo \"> Generating $name/index.html...\"\n\n  cat > \"$folder/index.html\" << EOF\n<!DOCTYPE html>\n<head>\n  <title>$name</title>\n  <link rel=\"stylesheet\" type=\"text/css\" href=\"../github-light.css\">\n</head>\n<body>\n  <div id=\"container\">$(render_markdown_to_html \"$readme\")</div>\n</body>\n</html>\nEOF\ndone\n\n# push to gh-pages\nif [[ $CI = true ]]; then\n  git checkout -b gh-pages\n  git add .\n  git commit -m \"$Generated by TravisCI on $(date +%D)\"\n  git push -f https://$TOKEN@github.com/$USERNAME/swift-algorithm-club.git gh-pages\nfi\n"
  },
  {
    "path": "install_swiftlint.sh",
    "content": "#!/bin/bash\n\n# Installs the SwiftLint package.\n# Tries to get the precompiled .pkg file from Github, but if that\n# fails just recompiles from source.\n\nset -e\n\nSWIFTLINT_PKG_PATH=\"/tmp/SwiftLint.pkg\"\nSWIFTLINT_PKG_URL=\"https://github.com/realm/SwiftLint/releases/download/0.10.0/SwiftLint.pkg\"\n\nwget --output-document=$SWIFTLINT_PKG_PATH $SWIFTLINT_PKG_URL\n\nif [ -f $SWIFTLINT_PKG_PATH ]; then\n  echo \"SwiftLint package exists! Installing it...\"\n  sudo installer -pkg $SWIFTLINT_PKG_PATH -target /\nelse\n  echo \"SwiftLint package doesn't exist. Compiling from source...\" &&\n  git clone https://github.com/realm/SwiftLint.git /tmp/SwiftLint &&\n  cd /tmp/SwiftLint &&\n  git submodule update --init --recursive &&\n  sudo make install\nfi\n"
  }
]