Skip to content

Commit

Permalink
partially complete proj3: TODO pass more tests for test 2
Browse files Browse the repository at this point in the history
  • Loading branch information
Haoyang Chen committed Apr 22, 2019
1 parent ee877ef commit 4311a3c
Show file tree
Hide file tree
Showing 16 changed files with 772 additions and 0 deletions.
Binary file not shown.
Binary file added materials/slides/Lecture_11b_Decision_Theory.pdf
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file added materials/slides/Lecture_14b_Neural_Networks.pdf
Binary file not shown.
Binary file not shown.
234 changes: 234 additions & 0 deletions proj3/dev_cases/diff2.html

Large diffs are not rendered by default.

234 changes: 234 additions & 0 deletions proj3/dev_cases/diff3.html

Large diffs are not rendered by default.

4 changes: 4 additions & 0 deletions proj3/other/output0.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
>.<o
^^<<
^^^<
^o^o
4 changes: 4 additions & 0 deletions proj3/other/output1.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
ovvo
vv<<
>.<o
>^<<
50 changes: 50 additions & 0 deletions proj3/other/output2.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
<<<<<o>>>^<>>>>>^<<<<>>^<<<<>>>^<<<<<<o>>^<>>>>>>>
^<^^vvvvv^^^^>>^^^^^^^^^^^^^^^^^<<<<ov>>^^^o>>^^^^
v<o>vvvv<<^^>>>^^^^^^^^^^<^^^>^^^<<<<vovvov>>^^^^^
vvvvvvvv<<<o>>>^^^^^^^^^^<<o>>^^^^^<<<<>vvv<ovvo>^
vvvvv>><<vvvvv>^^^^<o>^^^^vvvv^^^^^^v<o>vv<<>vv<>^
vvvv<<^^vvvvvv<^^^^vvv^^^>>vvv<<ovo>vv<>>vvo>vv<<^
vv<<<<^>>vvvvv<<<o>>>vv<o>>>vvvvvvvvv<<>>vvvvvvvov
<<<<<<^>>>vvvv<<<v>>>><<v>>>>vvvvv>>vv<o>>>>>vvvvv
^<<<<<o>>>>vvv<<<<<^>^^<<>>>>>vv<<<>vv<<>^>>>vvvvv
^^<<<<v>>>>vvv<<<<<o>^^^<^^>>>vv<<^>>v<<<^o>>vvvvv
^^^<<<vv>>>>v<<<<<<vv^^^^<o>>>vvv<o>vv<<ov>>>vvvvv
^^^^<<>>>>>>^<<<<<vvv<o>vvv>>>vvvvvvv<<<vvo>>vvvvv
^^^^^^>>>>^^^^^<<<vvv<<>>v>>>>>vvvvvv<<ovv>>>vvvvv
^^^^^^^^>^^^^^^^<<<<<<<>>>>^>>>>>vvvv<<>v<>>>vvvvv
o^^^^^^>>^^^^^^^^<<<<<<o>v^^^^>>>>vvvvovvvo>>v>>vv
>v^o^^o>>^^^^^^>^^<<<<vvvvv<o^^>>>>vvvv>vvv>>v>>>v
>>vvvvvvv^^^^^>>>^^<<<vvvvvvvvo>>>>>>v>>>vvovvv>>v
o>>>vvvvv<<<o>>>>^^<<>>>>vvvvvv>>>>>>>v^>>vvvvvovv
v>>>>vvv<<<<>>>>>^^^^^>>>>vvvvv>^^^^>>vvo>vvvvv>vv
vo>>>vv<<<<<>>^^^^^^<^^>>>>vvvv<^^^vo>>vv>vvvvv>vv
vvv>vv<<<<<o>^^^>>^^<<o>>>>>>vvvvovvv>>>>>>>vvvovv
vvvvvv<<<<<vvv<o>>vv<<v>>>>>>>vvvv>vvvo>>>>>>vvvvv
vvvvv<<^^^vvvvvvv>vv<<<>>^>>>>>>>>>>>>>>>>v>>>vvvv
vvvv<<<<^>>>vvvvvvv<<<<^^^^^^>>>>>^>>>>>>>vvo>vvvv
vvv<<<<<o>>>vvvvvvv<<<<o^^o^^^^^>vvovo>v>>>vv>vvvv
v<<<<<<<v>>>>vvvv>v<<<<vvvvv^ovvo>vvvvvvvo>>>>>vvv
<<<<<<<vv>>>>>>>>>^<<<vvvvvvv>>v>>>>>>>>v>>>>>>>vv
^^^^^^<<vv^^^^^^^^^^<<vvvvvv<<>>>>>>>>>>>>>>>>>>>v
^^^^^^^<<<<^^^^^^^^^^<vvvv<<<<o>^^o>>>>>>>>>>>>>>.
^^^^^^^^<<<^^^^^^^^^^>>><<<<vv>>^>>>>>>>>>>>>>>>>^
^^<^^^^^^<<o>^^^^^^^^^>^^<<>>>>^^o>>>>^^^o^>>>^^o^
^^<<o>>^^<<vv^^^^o>^^^>^^^^^^^^^>>>>>>^^^>^o>^^^>^
^^^<v>>^^<<vvv<ovvv^^>>^^<<^^vvo^^o>>>>>>>>>>^^o>^
^^^v>>>^^^>>vvvvvvv<o>>vv<<o>vvvv>>>^^>>>>>>>^^>>^
vo>v>>^^^^>>>v<<>vvvvvvvv<<>>vvvvo>>^^o>>>>>^^^>^^
vvvvv^^^<o>>vv<<<>vvvvvv<<<>>>vvv>>>^<>>>>>^^^^o^^
vvvv<<^^vvvvv<<<^>>>vvvvv<<>>>>>>>>^^^vo>>^^^^^>>^
vvvv<<o>vvvvv<<<o>>>>>vvvv<o>>>>>>>^^>v>>>^^^^^^o^
vvvv<vvvvvvvv<<<v>>>>>>vvvvv>>>>>>^^^>>>>>^^^^^>>^
vvvvvvvvvvvvv<<vv>>>>>>>vvv>>>>>^^^^^o>>>^^^^o^>>^
v<<<vvvvvvvvv<<<v>^^^>>>>>>>>^^^^^^^<>>>>^^^^>>>^^
v<<<vvvvvvvv<<<<<<^^^>>>>>>>^^^^^^^<o>>>>^^^^>>^^^
v<<<<vvvv<<<<<<<^^<<o>>>>>^^^^^^^^<<>>>>^^^^^>^^^^
v<<<<<<<<<<^<<<^^^<vv>>>>^^^^<o>^^^>>>>>^^^^^^^^^o
<<<<<<<<<^^^<<<<^^>vv>>>^^^^<<>>^^<o>>^^^^^^^^^^<<
^<<<<<<^^^^^<<<<o>>v>>>>^^^<<o>>^^<<>^^^^^^^^^^^<<
^<<<<<<^^^^^^<<vv>>>>>>^^^<<<vvo>^vvvo^^^^^^^^^^^<
^<<<<<<^^^^^^vvvv>>>>>>^^^<<<<<>>vvvvvvo^o^^^^^^^^
^<<<<<<<^^^>>>vvv>>>>>>^^^<<<<<>>>vvvvv<<>>>^^^^^^
^<<<<<<<<o>>>>>>>>>>>>>^^^<<<<o>>>>v<<<<<o>>^^^^^^
50 changes: 50 additions & 0 deletions proj3/other/output3.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
^<<<<<<<^<<>>>>>>^<<<<>>>>>^<<>^<<<<<<>^<>>^<<<<<<
^<^^^^^^^^<o>^^^^^^<<<^>>>^^^^^^^^^^<^^^^^>^^<^^^o
^<^^^^<o>vvvv^^>>^^^<<o>>>^^^^^^^^^^<o^^vo>vv<ovvv
^<<o>vvv>>vvv<o>>^^^<<<>>>^^^^^^^^^^<>>vvvvvvvvv<<
^<<<>vv<<>>vvvvvv^^^^v<>>^^<<o^^^ov^<>>>vvvvvvv<<<
v<<<>>v<<^>>><>vv<<ovvvo>^^<<<>vvvvv<o>>>>>vvv<<<o
v<<o>>v<<o>^^>>>vvvvvvvvv^^^<>>>vvvvvv>>>>>>vv<<<v
v<vvvvv<<<>^^^>>>vvvvvvv<<^^^o>>vvvvvvv^^>>>>v<<<v
vvvvvvv<<<<^^o>>>vvvv<<<<<o^vv>>vvvvv<<<^>>>>^<<<<
v<<vv<<<<<ovv>>>>><<<<^<<<<>>>>>>>vvvv<<o>>>>^<<<^
<<<<<<<<<<vv<>>>>^^^^^^^<<>^>>>>>>>vvvv<v>>>>^<<<^
^^^^^^^^<vvv<o>^^^^^^^^^<ovvo>>^>>>>vvvv<<>>^^<<<o
^^^^^^^^>vv<<<>^^^^^<o>vvvvvv>>^^>>>vvv<<<^>>^<<<v
^^^^^<o>>vv<<<ovo>^^<>>>vvvvvv^^^>>>>vvv<<o>>^^<<v
^<o>vvvvvv<<<<>vvvvv<o>>vvvv<<<^o>>>>vvvvvv>>>^^<<
^<>>>vvvvv<<<o>vvvv<<>>>>vv<<<<>>>>>>vvvvv<<^^^^^<
^<>>>>vvvv<<<vvvvv<<<>>>>><<<<o>>>>>>vvvvvv<o>^^^^
v<o>>>>>>v<<vv>>vv<<<o>>>^^<<<v>>>>>>>vvvvvvvv^^^^
v<<>>>>>>^<<<<>>><<<<>>>>^^^<<>>>^>>>vvvvvv<<<<o^^
v<<o>>^^^^^<<<^^^^<<<>>>^^^^^^>>^^^>>vvvvvv<<<<<vo
v<<>>>^^^^^^^^^^^^<<o>>^^^^^^o>vv<o>vvvvvvv<<<^vvv
v<<o>^^^^^^^^<o>>vvvvvvv<<o^^>>vvvvvvvvvvvvv<ovvvv
<<vvvv<o>^^^^vvv>vvvvvvv<<<vo>>vvvvvvv>>vvvvvvv<<<
^<vvvvvvvv<o>vvvvvvvvvv<<<<>>>>>vvvvv<>>>vvvvv<<<^
^>>>vvvvvvvvvvvvvv<<<<<<<<o>>>>>>>vv<<>>>vvvvv<<o^
^>>>vv<<<<vvvvvvv<<<^^^<<<>>>>>>>>>v<<^>>vvvvv<<<v
o>>>v<<<^>>>vvvv<<<^^^^<<o>>>>>^>>>vv<o>>vvvv<<<<>
vv>>^<<<^>>>>>v<<<<<^^^<<<>>>>^^^>>vv<<>>vvvvv<<ov
vvv>^<<<o>>>>>v<<<<<o>^^<<o>>>vvvovvv<ovvvvvvv<vvv
vv<<^^<<v>>>>>v<<<<<<>>^<<<>>>>>vvvvvvvvvvvvvv<<vv
v<<<^^^<>>>>>>^<<<<<o>>^<<<ov^^>>>vvv<vvvvvvv<<<<v
v<<<^^^>>>>>>^^<<<<<<>>^<<>>vv<o>vvv<<vv<>vvv<<<<v
v<<<o^^^>>>>^^^^^<<<<>^^vo>>v<<>>vvv<>vv<>vv<<<<vv
v<<<vv^o>>>>^^^^^^^vo^^>v<>>v<>>>vvvvovvovvv<<<>vv
v<<<<<<>>>>^^^^^^^>vvvovvvo>vvo>>vvvvvvvvvvv<<ovvv
v<<<<<<>>^^^^^<^^o>vvvvvvv>>>vv>vvvvvvvvvvvvvvvvvv
v<<<<<o>^^^^^v<ovvvvvvvvvv<>>>vvvvvvvvvvvvvvvvvvvv
v<<<<<vvv<o>vvvvvvvvvvvvvvvo>>>>>vvvvvvvvvvv<<<vvv
v<<<<vvv<<v>>vvvv>>>>>>vvvvv>>>>>>vvv>vvvvv<<<<<<v
<<<<<<<<<>>>>>v>>>>>>>>>>v>>>>>>>>>vv>vvvv<<<<<<<v
^<<<<<<<^>>>>>>>>>>>>>>>>>>>>>>>>>>vvovvvv<<<<<<<v
^<<<<<<<o^^^>>>>>>>>>>>>>>>>>>>>>>>>vvvvv<<<<vv<<v
^<<<<<<<vvvo>>>>>>>>>>>>>>>vv>>>vvo>vvvvv<<ovvv<<v
^<^^<<<<<<vv>>^^>>>>>>>>>>>vvvo>>>>>>vvvv<<<vv<<<<
^^^^^^<<<>>>>>^^^>>>>^^>>>>>vv>vvo>>>>vv<<<<<<<<<<
^<^^^^^^^>>>>vv<o>>>vvvo>>>>>>>>>>>>>>.<<<<<<<<<<<
^<<^^^^o^o>>>vvvv>>>>vv>>>>>>>>>>>>>>>^^<<<<<<<<<<
^<<<o^vvv<>>>>vv>>>>>>>>>>>>>>>>>>^>>^^^^<<<^^^^^^
^<<<<>>vv<o>>>>>>>>>>>>>>>>^^>>>^^^o^^^^^^^o^^o^^^
^<<<o>>v<<>>>>>>>>>>>>>>>>^^^o>>>^>>>^^^o^^<^<<^^^
50 changes: 50 additions & 0 deletions proj3/output.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
^<<<<<<<^<<>>>>>>^<<<<>>>>>^<<>^<<<<<<>^<>>^<<<<<<
^<^^^^^^^^<o>^^^>^^<<<^>>>^^^^^^^^^^<^^^^^>^^<^^^o
^<^^^^<o>vvvv^^>>^^^<<o>>>^^^^^^^^^^<o^^vo>vv<ovvv
^<<o>vvv>>vvv<o>>^^^<<<>>>^^^^^^^^^^<>>vvvvvvvvv<<
^<<<>vv<<>>vvvvvv^^^^v<>>^^<<o^^^ov^<>>>vvvvvvv<<<
v<<<>>v<<^>>><>vv<<ovvvo>^^<<<>vvvvv<o>>>>>vvv<<<o
v<<o>>v<<o>^^>>>vvvvvvvvv^^^<>>>vvvvvv>>>>>>vv<<<v
v<vvvvv<<<>^^^>>>vvvvvvv<<^^^o>>vvvvvvv^^>>>>v<<<v
vvvvvvv<<<<^^o>>>vvvv<<<<<o^vv>>vvvv<<<<^>>>>^<<<<
v<<vv<<<<<ovv>>>>><<<<^<<<<>>>>>>>vv<<<<o>>>>^<<<^
<<<<<<<<<<vv<>>>>^^^^^^^<<>^>>>>>>><<<<<v>>>>^<<<^
^^^^^^^^<vvv<o>^^^^^^^^^<ovvo>>^^^^^vv<<<<>>^^<<<o
^^^^^^^^>vv<<<>^^^^^<o>vvvvvv>>^^^>>>v<<<<^>>^<<<v
^^^^^<o>>vv<<<ovo>^^<>>>vvvvvv^^^>>>>v<<<<o>>^^<<v
^<o>vvvvvv<<<<>vvvvv<o>>vvvv<<<^o>>>>vv<<<v>>>^^<<
^<>>>vvvvv<<<o>vvvv<<>>>>vv<<<<>>>>>>vv<<<<<^^^^^<
^<>>>>vvvv<<<vvvvv<<<>>>>><<<<o>>>>>>>v<<<<<o>^^^^
v<o>>>>>>v<<vv>>vv<<<o>>>^^<<<v>>>>>>>^<<<<<vv^^^^
v<<>>>>>>^<<<<>>><<<<>>>>^^^<<>>>^^^>>^v<<<<<<<o^^
v<<o>>^^^^^<<<^^^^<<<>>>^^^^^^>>^^^>>>>^<<<<<<<<vo
v<<>>>^^^^^^^^^^^^<<o>>^^^^^^o>vv<o>>>>^^<<<<^^vvv
v<<o>^^^^^^^^<o>>vvvvvvv<<o^^>>vvvv>>>>^^<<<<ovvvv
<<vvvv<o>^^^^vvv>vvvvvvv<<<vo>>vvvv>>>>^^<<<<vv<>>
^<vvvvvvvv<o>vvvvvvvvvv<<<<v>>>vvvv>>^^^^^<<vv<<<^
^>>>vvvvvvvvvvvvvv<<<<<<<<o>>>>><<<<^^^^^^vv<<<<o^
^>>>vv<<<<vvvvvvv<<<^^^<<<>>>>>^^^^^^^^^>>>v<<<<<v
o>>>v<<<^>>>vvvv<<<^^^^<<o>>>>^^^^^^<<o>>>>v<<<<<>
v>>>^<<<^>>>>>v<<<<<^^^<<<>>>^^^^^^^<<>>>>>v<<<<ov
vvv>^<<<o>>>>>v<<<<<o>^^<<o>>^^<<o>^v<o>>>>vv<<<vv
vv<<^^<<v>>>>>v<<<<<<>>^<<<>>^^<<vvvv<v>>>>v<<<vvv
v<<<^^^<>>>>>>^<<<<<o>>^<<<o>^^^>>vv<<>>>>>v<<<<vv
v<<<^^^>>>>>>^^<<<<<<>>^<<<>>^^o>>v<<<>^^>>v<<^>>>
v<<<o^^^>>>>^^^^^<<<<>^^<o>>>^<>>vv<<^^^^>>v<<^^>^
v<<<vv^o>>>>^^^^^^^<o^^^v<>>^^>>>vv<<ovvo>vv<<^>>v
v<<<<<<>>>>^^^^^^^^vvvovvvo>^vo>>vvvvvvvvvvv<<o>>v
v<<<<<<>>^^^^^^^^o>vvvvvvv<>vvv>>vvvvvvvvvvv<vvvvv
v<<<<<o>^^^^^^<ovvvvvvvvv<<>>>v>>>>>>>vvvvvv<vvvvv
v<<<<<vvv<o>vvvvvvvvvvvvv<<o>>>>>>>>>>>vvvv<<<<vvv
v<<<<vvv<<v>>vvvvvvvvvvvv<vv>>>>>^^^^>>>vv<<<<<<<<
v<<<<<<<<<>>>>vvvvvvvv<<<<vv>>>>^^^^^^>>vv<<<<<<<v
<<<<<<<<^^>>>>>>>>>>><<<<<<vv^^^^^^^vovvv<<<^^vvvv
^<<<<<<<o^^^>>>>>>>^^^^^^<<<<<^^^^^>vvvvv<<^^>vvvv
^<<<<<<<vvvo>>^^^^^^^^^^^^^<<<^^^<o>vvvvv<<o>vvvvv
^^^^<<<<<<vv>>^^^^^^^^^^^^^<<<o^^<>>>vvvv<<vvvvv<<
^^^^^^<<<>>>>v^^^^>^^<^^^^^<<<vvvo>>>>vv<<<<vv<<<<
^<^^^^^^^^>>>v<<o>>^^<<o>>^v<<vvv>>>>>.<<<<<<<<<<<
^<<^^^^o^o>>>vvvvv>vv<vvvvv^<>>>>>>>>^^^<<<<^^^^^^
^<<<o^vvv<>>>>vvvvvvvvvvvvv<^^>>>^^^>^^^^^^^^^^^^^
^<<<<>>vv<o>>>vvvvvvvvvvvv<<<^^^^^^o>^^^^^^o^^o>^^
^<<<o>>v<<>>>>>>>>>v<<<<<<<<<o>>^<<>>^^<o^v>>v>>>^
146 changes: 146 additions & 0 deletions proj3/project3cs360s2019.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
import os

__location__ = os.path.realpath(
os.path.join(os.getcwd(), os.path.dirname(__file__)))

test_path = "dev_cases/"
# right, down, left, up
orientation = [(1, 0), (0, 1), (-1, 0), (0, -1)]

class Solver(object):
def __init__(self, grid_size, obstacles, dest):
self.row, self.col = grid_size, grid_size
self.dest = dest
self.reward = dict()
self.states = set()
self.obstacles = obstacles
for x in range(grid_size):
for y in range(grid_size):
self.states.add((x, y))
if (x, y) == dest:
self.reward[x, y] = 99
elif (x, y) in obstacles:
self.reward[x, y] = -101
else:
self.reward[x, y] = -1

def prettyPrint(self, U):
to_print = ""
for i in range(self.row):
for j in range(self.col):
if (i, j) == self.dest:
to_print += "101 "
else:
to_print += str(U[i, j]) + " "
to_print += "\n"
print(to_print)
print('------')

def solve(self):
U = self.cal_util()
# self.prettyPrint(U)
pi = dict()
for s in self.states:
up_util = sum([p * U[_s] for (p, _s) in self.T(s, orientation[3])])
down_util = sum([p * U[_s] for (p, _s) in self.T(s, orientation[1])])
left_util = sum([p * U[_s] for (p, _s) in self.T(s, orientation[2])])
right_util = sum([p * U[_s] for (p, _s) in self.T(s, orientation[0])])
curr_max = max(up_util, down_util, left_util, right_util)
if curr_max == up_util:
pi[s] = orientation[3]
elif curr_max == right_util:
pi[s] = orientation[0]
elif curr_max == down_util:
pi[s] = orientation[1]
elif curr_max == left_util:
pi[s] = orientation[2]
return self.to_grid(pi)

def to_grid(self, pi):
grid = [[None for _ in range(self.row)] for _ in range(self.col)]
for x in (range(self.row)):
for y in (range(self.col)):
if (x, y) in self.obstacles:
grid[y][x] = 'o'
elif (x, y) == self.dest:
grid[y][x] = '.'
else:
mapping = {(1, 0): '>', (0, 1): 'v', (-1, 0): '<', (0, -1): '^'}
grid[y][x] = mapping[pi[(x, y)]]
with open(os.path.join(__location__, 'output.txt'), 'w') as outfile:
for row in grid:
for e in row:
outfile.write(e)
outfile.write('\n')

def cal_util(self):
_U = dict([(s, 0) for s in self.states])
T, gamma, epsilon = self.T, 0.9, 0.1
while True:
U = _U.copy()
delta = 0
for s in self.states:
if s == self.dest: continue
reward = self.reward[s[0], s[1]]
_U[s] = reward + gamma * max([sum([p * U[s1] for (p, s1) in T(s, a)])
for a in orientation])
delta = max(delta, abs(_U[s] - U[s]))
if delta < epsilon * (1 - gamma) / gamma:
return U

def T(self, state, action):
def go(state, direction):
curr = (state[0] + direction[0], state[1] + direction[1])
return curr if curr in self.states else state
if action == None:
return [(0, 0, state)]
else:
# right, down, left, up
# left 2 -> back -> right 0
# left 2 -> right -> up 3
# left 2 -> left -> down 1

# right 0 -> back -> left 2
# right 0 -> right -> down 1
# right 0 -> left -> up 3

# up 3 -> back -> down 1
# up 3 -> right -> right 0
# up 3 -> left -> left 2

# down 1 -> back -> up 3
# down 1 -> right -> left 2
# down 1 -> left -> right 0
right = orientation[(orientation.index(action) + 1) % len(orientation)]
left = orientation[orientation.index(action) - 1] # -1 = 3
back = orientation[(orientation.index(action) + 2) % len(orientation)]
return [(0.7, go(state, action)),
(0.1, go(state, right)),
(0.1, go(state, left)),
(0.1, go(state, back))]

def main():
with open(os.path.join(__location__, test_path + 'input-3.txt'), 'r') as infile:
grid_size = int(infile.readline())
num_obstacles = int(infile.readline())
obstacles = list()
dest = None
for i, line in enumerate(infile):
coords = line.strip().split(",")
x, y = int(coords[0]), int(coords[1])
if i == num_obstacles:
dest = (x, y)
else:
obstacles.append((x, y))
# print('grid size is: {}\n'
# 'num of obstacles is: {}\n'
# 'obstacles are:\n {}\n'
# 'dest is: {}'.format(
# grid_size,
# num_obstacles,
# obstacles,
# dest))
solver = Solver(grid_size, obstacles, dest)
solver.solve()
main()

0 comments on commit 4311a3c

Please sign in to comment.