We’rehiring!!

Efficient Online Timed
Pattern Matching by
Automata-Based Skipping
Masaki Waga1, Ichiro Hasuo2, and Kohei Suenaga3
University of Tokyo1, National Institute of Informatics2,
and Kyoto University3
Based on [Waga, Hasuo & Suenaga, FORMATS’17]
IFIP WG 1.3 Meeting, July 6 2018
The authors are supported by ERATO HASUO Metamathematics for Systems Design Project (No. JPMJER1603), JST,
Grants-in-Aid No. 15KT0012, JSPS, and JST PRESTO Grant Number JPMJPR15E5, Japan.

Many slides contributed by Masaki Waga

Hasuo (NII, JP)Monitoring
Logw

Spec. of bad
behaviors,Ae.g. After a gear changed from high tolow, it goes back to high again in 2 sec.

The set of intervals (t, t’)such that w|(t,t0 )
L(A)
2

2

Hasuo (NII, JP)Timed Pattern Matching
Input
timed word w (target, log)0high low highlow

0.9 1.5 2.1

2.8 t

Output0(t, t ) w|(t,t0 ) 2 L(A)timed automaton A (pattern, spec)
start

s0

a, 1 < x/x := 0w=
w|(t,t’ ) =3$, 1 < xs1s2high low high0t

low

0.9 1.5 2.1 t0 2.8 thigh low high $

0 0.9

1.5
t

t
2.1

t0
t

t

Hasuo (NII, JP)t

Online Monitoring•

Monitoring before the entire log is given•

Applications in embedded systems•

System monitoring during operation•

Log prefixes can be thrown away•

Faster monitoring➜ denser logs, cheaper hardware•

Serious real-world problem•

GBs of log per second•

Cost sensitive (processors & memory)
4??

Hasuo (NII, JP)Previous Work: an Offline Algorithm for
Timed
PattenMatching• KMP Algorithm
THIS_IS_A_STRONG_STRING[Waga,
Akazaki,and Hasuo,[Knuth,Morris, and Pratt,
SIAM
J. Comput.
’77] FORMATS ’16]

Quick
Search [Sunday, Commun. ACM ’90]
✗STRING• FJS✗ STRING
Algorithm(~
Quick
Search+
KMP):• Enhanced by skipping from string matching✗ STRING•[Franek, Jennings, and Smyth, J. Discrete Algorithms ’07]✗

STRING⁝TheThe BM
BM Algorithm
Algorithm(String(String Matching)
Matching)• [Boyer
Moore,[Boyer &&Moore,

Commun.
’77]’77]
Commun.ACM
ACM⁝~ 2x faster thannaive algorithm
Adaptation
toBM
Pattern
Pattern Matching
Matching• [Watson
Watson, Sci.
[Watson & &Watson,Sci.
Comput.
Program.’03]’03]
Comput.
Program.

Adaptation to
Timed
BM
Pattern
Matching
Timed Pattern(timedMatching
BM Alg.)[Waga, Akazaki,
and and
Hasuo,• [Waga,
Akazaki,
FORMATSFORMATS’16]
Hasuo,’16](offline)

5

Hasuo (NII, JP)Contribution: An Efficient Algorithm
for Online Timed Pattern Matching
The BM Algorithm(String Matching)[Boyer & Moore,
Commun. ACM ’77]

The FJS Algorithm
The
FJSMatching)
Algorithm(String(String
Matching)[Franek, Jennings,
and[Franek, Jennings, and Smyth,
Smyth,
J. Discrete
J. Discrete Algorithms ’07]

BM
Pattern Matching[Watson & Watson,
Sci. Comput. Program. ’03]

FJS
Adaptation toPattern
Pattern Matching
Matching[Current work]• Contribution

Algorithms ’07]

BM
Timed Pattern
Matching[Waga, Akazaki, and Hasuo,
FORMATS ’16]

Adaptation to
FJS
Timed Pattern
Timed
Pattern
Matching
Matching(timedFJS Alg.)[Current work]• Contribution (online)

6

Hasuo (NII, JP)target: signals(“state-based”)ba

Related Work:
Timed Pattern Matching•

Dogan Ulus, Thomas Ferrère, Eugene Asarin, and Oded Maler, “Timed Pattern
Matching”. FORMATS ’14•

Thomas Ferrère, Oded Maler, Dejan Nickovic, and Dogan Ulus, “Measuring with
Timed Patterns”. CAV ’15•

Dogan Ulus, Thomas Ferrère, Eugene Asarin, and Oded Maler, “Online Timed
Pattern Matching Using Derivatives”. TACAS ’16•

Dogan Ulus, “Montre: A Tool for Monitoring Timed Regular Expressions”. CAV ’17•

Eugene Asarin, Oded Maler, Dejan Nickovic and Dogan Ulus, “Combining the
Temporal and Epistemic Dimensions for MTL Monitoring”. FORMATS ’17•

M. Waga, Takumi Akazaki, and Ichiro Hasuo, “A Boyer-Moore Type Algorithm forTimed Pattern Matching”. FORMATS ‘16

automata-based

7

target: timed words(“event-based”)

0high low highlow

0.9 1.5 2.1

2.8 t

Outline
1. Original FJS Algorithm (for String Matching)
2. Our FJS Algorithm for Timed Pattern Matching
3. Experiments

8

Hasuo (NII, JP)

String MatchingInput

nm matching trials, naively

THIS_IS_A_STRONG_STRING
target string
w : THIS_IS_A_STRONG_STRING✗STRINGpattern string pat : STRING✗ STRING✗ STRING✗STRING⁝

Output{(i, j) | w(i, j) = pat} = {(18, 23)}

12345678901234567890123
THIS_IS_A_STRONG_STRING
STRING
9

Hasuo (NII, JP)ここ，「まず最初に前処理で index のString Matching
Enhanced by Skipping

表を準備します」をちゃんと言ってください．
あと，LUT ってなに？

THIS_IS_A_STRONG_STRING✗STRINGSTRINGSTRING…
STRING

1.
2.
3.

4.

Pre-compute a look-up table(LUT) of skipping values
Try matching. Say it fails
Shift the pattern bymore than one,based on the LUT
Try matching again•(Potential) constant speedup, by skipping matching trials•

Skipping values pre-computed➜ minimal computational overhead
10

Hasuo (NII, JP)

The FJS Algorithm[Franek, Jennings, and Smyth, J. Discrete Algorithms ’07]

Quick Search•

KMP

Interleaves two skipping mechanisms•

KMP Algorithm•

Quick Search [Sunday, Commun. ACM ’90]

[Knuth, Morris, and Pratt, SIAM J. Comput. ’77]

Hasuo (NII, JP)

The FJS Algorithm[Franek, Jennings, and Smyth, J. Discrete Algorithms ’07]

Quick Search

KMPtarget ABCDABBA…
pattern DADBQS skip value table:

ABCDABBA…
✗ DADB
DADB
DADB
DADB

skip: Σ → N
shift by 3

depends on pattern but
not on target
for the pattern DADB:
A→3, B→1, C→5,
D→2
Hasuo (NII, JP)

The FJS Algorithm[Franek, Jennings, and Smyth, J. Discrete Algorithms ’07]

Quick Searchtarget ABCDABBA…
pattern DADB

ia
t
r
a
p

ch
t
a
lm

DADB
DADB

{

2 34 1

partial match{partial match

ABCDABBA…
✗ DADB
DADB
DADB
DADB
✗

KMP

DA DB

DAD B

✗

* D A D✗* D A D✔

* * D A✔

* * D AKMP skip value table:

shift
by 2

skip: [0, |pat|+1] → N .
The arg. is the length of partial match
match pattern w/ shifted pattern,
and detect inconsistency
depends on pattern but not on target
for the pattern DADB:
Hasuo
0→1, 1→1, 2→2, 3→2,
4→2(NII, JP)Contribution: An Efficient Algorithm
for Online Timed Pattern Matching
The BM Algorithm(String Matching)[Boyer & Moore,
Commun. ACM ’77]

The FJS Algorithm
The
FJSMatching)
Algorithm(String(String
Matching)[Franek, Jennings,
and[Franek, Jennings, and Smyth,
Smyth,
J. Discrete
J. Discrete Algorithms ’07]

BM
Pattern Matching[Watson & Watson,
Sci. Comput. Program. ’03]

FJS
Adaptation toPattern
Pattern Matching
Matching[Current work]• Contribution

Algorithms ’07]

BM
Timed Pattern
Matching[Waga, Akazaki, and Hasuo,
FORMATS ’16]

Adaptation to
FJS
Timed Pattern
Timed
Pattern
Matching
Matching(timedFJS Alg.)[Current work]• Contribution (online)

14

Hasuo (NII, JP)Outline
1. Original FJS Algorithm (for String Matching)
2. Our FJS Algorithm for Timed Pattern Matching(We focus on the KMP-type skipping)partial match{

3. Experiments

DA DB

15

✗

* D A D✔

* * D A

Hasuo (NII, JP)KMP-Type Skipping for(Timed) Pattern Matchingpattern/spec is
an automaton

String MatchingCompare pattern w/
shifted pattern, anddetect inconsistency(Timed) Pattern Matchingskip: [0, |pat|+1] → N“Length of partial match”
doesn’t say much??

partial match{(many different “partial
matches” for an automaton!)

DA DB

✗

* D A D✔

* * D A

What is “inconsistency”?
16

Hasuo (NII, JP)KMP-Type Skipping for(Timed) Pattern Matching(Timed) Pattern Matching“Length of partial match”
doesn’t say much➜ Use
“to which automaton
state the partial match
has led”

String MatchingCompare pattern w/
shifted pattern, anddetect inconsistency
skip: [0, |pat|+1] → N
partial match{

The words leading to s = Ls

DA DB

7

*

✗

* D A D

7

*

*

✔

* * D A

3

*

*

17

L(A)
L(A)
*

L(A)

Hasuo (NII, JP)KMP-Type Skipping for(Timed) Pattern Matching(Timed) Pattern Matching

String MatchingCompare pattern w/
shifted pattern, anddetect inconsistency

The words leading to s = Ls

skip: [0, |pat|+1] → N

7

*

7

*

*

3

*

*

L(A)
L(A)
*

L(A)

What is “consistency”?
➜
Is there any word

partial match

{
DA DB

that leads to state s, and✗* D A D

whose suffix survives in A?

✔

* * D A
18

Hasuo (NII, JP)Reachability Checking
by Zone Construction
Labelled by “zones,” i.e.
sets of “similar” clock valuations

timed autom.

NFA

s1$, x > 1

a, x < 1

$

s1
0<x<1

s3
x>1

a

start

s0

s3

start

s0
x=0
b

b,
x = 1/x := 0

s2

$,
x<1

s2
x=0

$

s3
0<x<1

Thm. (soundness and completeness)
Zone automaton construction maintains state reachability.
19

Hasuo (NII, JP)KMP-Type Skipping for(Timed) Pattern Matching(Timed) Pattern Matching

String MatchingCompare pattern w/
shifted pattern, anddetect inconsistency

The words leading to s = Ls

skip:
Solved[0,by:|pat|+1] → N

7

*

7

*

*

3

*

*

L(A)
L(A)
*

L(A)

What is “inconsistency”?
➜
Is there any word{

makingpartial
copies
A1, A2 of A
match
(changing initial/final states),
D A DA
B1 ×A2taking product* D A D and(for intersection),✗that leads to state s, andwhose suffix survives in A?

* *check
D A by zone✔
reachability
construction
20

Hasuo (NII, JP)KMP-Type Skipping for(Timed) Pattern Matching

In other words…

s
s
s
···
String↵s Matching↵↵↵Compare pattern w/
shifted pattern, andReachability checking of this segment
detectinconsistency→ intersection
and zone construction
0

1

2

n

0

1

2

n

s00
↵00

s01
↵10

s0m 1
0
↵m
1

···

(Timed) Pattern Matching

s0m
0
↵m

skip: [0, |pat|+1] → N

The words leading to s = Ls
7

*

7

*

*

3

*

*

L(A)
L(A)
*

L(A)

What is “inconsistency”?
➜
Is there any word

partial match

{
DA DB

that leads to state s, and✗* D A D

whose suffix survives in A?

✔

* * D A
21

Hasuo (NII, JP)KMP-Type Skipping for(Timed) Pattern Matching:
Summary(Timed) Pattern Matching

String MatchingCompare pattern w/
shifted pattern, anddetect inconsistency

The words leading to s = Ls

skip: [0, |pat|+1] → N{
DA DB* D A D✔

* * D A

*

7

*

*

3

*

*

L(A)
L(A)
*

L(A)

“Length of partial match”➜ “to which state the match
has led”

partial match✗

7“Inconsistency”?
➜ reachability check in A1 ×A2
skip: S → N
22

Hasuo (NII, JP)Outline
1. Original FJS Algorithm (for String Matching)
2. Our FJS Algorithm for Timed Pattern Matching
3. Experiments

23

Hasuo (NII, JP)Settings•

Implementation in C++,run on MacBook Pro, 2.6 GHz Intel Core i5, 8 GB RAM(except the comparison w/ Montre)•

Problem:Monitoring of a Simulink model of an automatic transmission model••

The model and specs are from [Hoxha et al., ARCH ’15]•

Logs are generated by simulation of the Simulink model

Events: gears: g1,g2,g3,g4
velocity: v >v̅ , v ≤ v̅RPM: ω > ω̅, ω ≤ ω̅24

Hasuo (NII, JP)

Specification: Example
Gear changes from g1 to g4 in 10 sec. and RPMchanges to high enough, but velocity is still low.
g1

g2 , trueg2

g3 , trueg3

g4 , x  10
/x := 0g4

3

g1 , true
start
!

?

!

!, true!, true?

!

g1 , true!, true

g1!

g2 , true25!, trueg2!

g3 , true$, x > 1!, trueg3

g4 , x  10
/x := 0g4

Hasuo (NII, JP)Comparison with Our
Previous Algorithms
70

brute-forceBM
FJS

Execution Time [ms]

60
50
40

Our previous
BM algorithm

brute-force[Waga+, FORMATS ’16]

30
20

Our FJS-type
Algorithm

10
0

0

20

40

60
80
100
120
Number of Events [⇥10000]
26

140

160

180

Hasuo (NII, JP)

120

14
brute-force
BM
FJS

100

brute-force
BM
FJS

12

Execution Time [ms]Execution Time [ms]

10
80

60

40

8
6
4

20

0

2

0

20

40
60
80
Number of Events [×10000]

100

0

120

Fig. 15. S IMPLE : exec. time

0

5

10

15
20
Number of Events [×1000]

25

30

35

Fig. 16. L ARGE C ONSTRAINTS: exec. time

250

1400
brute-force
BM
FJS

brute-force
BM
FJS

1200

200
Execution Time [ms]Execution Time [ms]

1000
150

100

800
600
400

50
200
0

0

50

100

150

200
250
300
350
Number of Events [×10000]

400

450

0

500

Fig. 17. T ORQUE : exec. time
60

500

1000

1500 2000 2500 3000 3500
Number of Events [×10000]

4000

4500

5000

Fig. 18. S ETTLING: exec. time

70

70
brute-force
BM
FJS

0

27
60

brute-force
Hasuo
(NII,
JP)
BM
FJS

BM
FJS

BM
FJS

1200

200
Execution Time [ms]Execution Time [ms]

1000
150

100

800
600
400

50
200
0

0

50

100

150

200
250
300
350
Number of Events [×10000]

400

450

0

500

Fig. 17. T ORQUE : exec. time

1000

1500 2000 2500 3000 3500
Number of Events [×10000]

4000

4500

5000

70
brute-force
BM
FJS

60

brute-force
BM
FJS

60
50
Execution Time [ms]50
Execution Time [ms]500

Fig. 18. S ETTLING: exec. time

70

40
30

40
30

20

20

10

10

0

0

0

20

40
60
80
Number of Events [×10000]

100

0

120

Fig. 19. G EAR: exec. time

0

20

40

60
80
100
120
Number of Events [×10000]

140

160

180

Fig. 20. ACCEL : exec. time

Table 2. S IMPLE (sec.) Table 3. S ETTLING (sec.) Table 4. G EAR (sec.) Table 6. Memory
FJS
Montre Montre
FJS
Montre Montre consumption of FJS
FJSMontre Montre
|w|
|w|
|w|
(online) (offline) (online)(online) (offline) (online)(online) (offline) (online)(online) and BM
1,000
0.00
0.01
0.04
32,000
0.01
0.05
3.00
300
0.00
0.01
0.01
64,000

0.02

0.10

6.06

30,0000.01

0.01

0.012886,400

0.04

0.15

11.63

Hasuo (NII, JP)|w|

BM (MB) FJS (MB)

80
100
120
of Events [×10000]

140

160

Online vs. Offline
180

Ourtimecurrent FJS algo.
CEL : exec.

vs. Our prev. BM algo. m.) Table 6. Memory
re consumption of FJS
ne)(online) and BM
4

3
8
1
0
9
6
9
6

c.)

re
ne)

5
out
out
out
out
out
out
out

|w|

13

BM (MB) FJS (MB)

300
1.16
30,0002.61
300,000
15.55
3,000,000 145.21
6,000,000 289.25
9,000,000 433.31
12,000,000 577.32
15,000,000 721.37
18,000,000 865.42
21,000,000 1,009.46
24,000,000 1,153.50
27,000,000 1,297.57
30,000,000 1,441.61

1.16
1.16
1.16
1.16
1.16
1.16
1.19
1.18
1.19
1.16
1.16
1.16
1.16

BM

FJS

w

w
!
!
!

⎡

⎢
n = |w| − m + 2 ⎢
⎣

!
!
!
!

⎡

⎢
n = |w| − m + 1 ⎢
⎣
⎡

!
!
!

⎢
n = 1⎢
⎣

!

!

$

..
.

unnec.

$..
.

unnec.

..
.

$

..
.

unnec.

⎡⎢
n = 1⎢⎣⎡⎢
n = 2⎢
⎣

!
!
!
!

$

..
.
!
!
!
!

unnec.

$..
.

unnec.

..
.
⎡

!
!
!

⎢
n = |w| − m + 2 ⎢
⎣

!

$

..
.

unnec.

Fig. 8. How matching trials proceed: our previous BM-type algorithm (on the left) and our current
FJS-type algorithm (on the right).
start

s0

a, trues1b, trues2$, trues3

Fig. 9. S IMPLE from [32]. The set W consistsof alternations of a and b whose length is from
20 to 1,024,000. Timing is random.
%& &

'∗

&

'∗ '

(

start

normal/x := 0

nml

unsettled

unstl$, x > 100✓

Fig. 12. S ETTLING. The set W (length 472–
47,200,000) is generated by the Simulink powertrain model in [17]. The pattern (Requirement
Hasuo (NII, JP)(32) in [17]) is for an event in which the system

Comparison with Montre
D. Ulus. Montre: A tool for monitoring timed regular expressions. CAV 2017.

|w|

FJS (online)(sec.)

Montre (o✏ine)(sec.)

Montre (online)(sec.)

653
214,142428,428
642,922854,456
1,066,815
1,279,713
1,499,021
1,706,614

0.00
0.06
0.13
0.20
0.26
0.33
0.40
0.46
0.53

0.01
0.63
1.25
1.88
2.50
3.12
3.75
4.38
4.99

69.05
Timeout
Timeout
Timeout
Timeout
Timeout
Timeout
Timeout
Timeout

30 min.

Amazon EC2 c4.xlarge instance (April 2017, 4 vCPUs and 7.5 GB RAM), Ubuntu 14.04 LTS (64 bit)

Performance gap may be due to impl. details(e.g. Montre is in Pure, a functional language based on rewriting)30

Hasuo (NII, JP)Comparison with Montre

Pattern

Target String0This WorkMontre [Ulus, CAV ’17]

Timed Automaton

Timed Regular Expression

Timed Word

Signalhigh low highlowb

0.9 1.5 2.1

2.8 t

a

31

Hasuo (NII, JP)We’rehiring!!

Conclusions•••

Efficient timed pattern matching with skipping•

Skipping in string matching,adapted to (timed) automata•

From BM (offline) to FJS (online)•

Satisfactory online/offline performance(twice faster than brute-force, constant memory usage)

Future work•

Sophisiticated tool, frontend•

Evaluation in real embedded applications•

Event-based vs. signal-based"Anything you can do, I can do better with automata” [Vardi?]
32

Hasuo (NII, JP)Appendix

33

M. Waga (UTokyo)

Pattern Matching
Input

Target String●

String w : dbadcdc●

Regular Language L : dc*{ba|dc}

OutputPattern{(i, j) | w(i, j) 2 L} = {(1, 3), (4, 7)}w(1, 3) = dba 2 L, w(4, 7) = dcdc 2 L
34

Hasuo (NII, JP)Quick Search Type Pruning in
Pattern Matching
The last char. matches
The last char. does
not match
Quick Search
KMP
1. Check the last char.
2. Skip based on thesubsequent char.

1. Matching trial. left → right
2. Skip based on the # ofchar. we checked.

1. What is the “last” char? 😟
2. How can we treat multiple strings? 😟
35

Hasuo (NII, JP)Quick Search Type Pruning in
Pattern Matching
The last char. matches
The last char. does
not match
Quick Search
KMP
1. Check the last char.
2. Skip based on thesubsequent char.

1. Matching trial. left → right
2. Skip based on the # ofchar. we checked.

ABCDABB✗✗ DADBDADB

The discussion is
independent of theposition of the char. 🙂
36

Hasuo (NII, JP)Quick Search Type Pruning in
Pattern Matching•

L = L({ab | cd}c+d)

L’ : the prefixes of L as long as the shortest elem. of L
8
9 Over approximation!
abcd,
cdcd
>
>
>
>
>
⇢
< abccd , cdccd >=abcd, cdcd⇤
L(A) =⌃
abcccd,cdcccd
abcc,
cdcc
>
>
>
>
>
>
.
:
;
..
•

The position of the “last” char. :the length of the shortest elem. of L
37

Hasuo (NII, JP)Quick Search Type Pruning in
Pattern Matching
The “last” char. matches
The “last” char. does
not match
Quick Search
KMP
ABCDABB

1. Check (min|L|)-th char. The
1. Matchingrightmosttrial. left✗→ right
✗
DADB
2.
Skip
based
on
the
# of
2. Skip based on theoccurrence of A
✗
DDDC
char.
we
checked.
subsequent char.
in the pattern!
✗ DDDBAll elements of L’ havethe same length!! 🙂

Skip 3 trials!!
38

DADB
DDDC
DDDB

Hasuo (NII, JP)KMP Type Skipping in
Pattern Matching
The “last” char. matches
The “last” char. does
not match
Quick Search
KMP
1. Check (min|L|)-th char.
2. Skip based on thesubsequent char.

1. Matching trial. left → right
2. Skip based on the # ofchar. we checked.

1. No problem! 🙂
2. # of char. in L in unbounded… 😟
39

Hasuo (NII, JP)KMP Type Skipping in
Pattern Matching
String Matching

Pattern Matching

For a position n (≤ |pat|),w(i, j) = pat(1, n)pat(1, 2) = w(i, j)

For a state s ∈ S, w(i, j) ∈ Ls
Ls : the words leading to s

The words leading to s = Ls

DA

✗
✔

Including w(i, j)

Infinite words !

7
7
3

D A
D A

*
*
*

L
*
*

L
*

L

A shifted pattern L

A shifted pattern pat
40

Hasuo (NII, JP)KMP Type Skipping in
Pattern Matching•

L = L(low (high・low)+)•

L’ : the prefixes of L as long as the shortest elem. of L

8
9 Over approximation!
abcd,
cdcd
>
>
>
>
>
⇢
< abccd , cdccd >=abcd, cdcd⇤
L(A) =⌃
abcccd,cdcccd
abcc,
cdcc
>
>
>
>
>
>
.
:
;
..

Such suffix is unnecessary whencalculating skip value.
41

Hasuo (NII, JP)KMP Type Skipping in
Pattern Matching
String Matching

Pattern Matching

For a position n (≤ |pat|),w(i, j) = pat(1, n)•

Including a prefix of w(i, j)pat(1, 2) = w(i, j){low high}

DA

✗
✔

L = L(low (high・low)+)

✗

D A

✔

D A

low

=

L’s

high low
low high low

Some prefixes of L

A shifted pattern pat
42

Hasuo (NII, JP)KMP Type Skipping in
Pattern Matching
The “last” char. matches
The “last” char. does
not match
Quick Search
KMP
1. Check (min|L|)-th char.
2. Skip based on thesubsequent char.

1. Matching trial. left → right
2. Skip based on the stateof the NFA we checked.

1. No problem! 🙂
2. State space of NFA is finite ! 🙂
43Hasuo (NII, JP)Quick Search Type Skippingin Timed Pattern Matching
The “last” char. matches
The “last” char. does
not match
Quick Search
KMP
1. Check (min|L|)-th char. 1. Matching trial. left → right
2. Skip
basedononevents!!
the state
2. Skip based on theWeonly focusof the TA we checked.
subsequent char.

44

Hasuo (NII, JP)