Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
N
news
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Sartika Aritonang
news
Commits
dcc16d4e
Commit
dcc16d4e
authored
May 29, 2020
by
Sartika Aritonang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Upload New File
parent
94ef2a1a
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
233 additions
and
0 deletions
+233
-0
jpcntx.py
stbi/Lib/site-packages/pip/_vendor/chardet/jpcntx.py
+233
-0
No files found.
stbi/Lib/site-packages/pip/_vendor/chardet/jpcntx.py
0 → 100644
View file @
dcc16d4e
######################## BEGIN LICENSE BLOCK ########################
# The Original Code is Mozilla Communicator client code.
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 1998
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
# Mark Pilgrim - port to Python
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301 USA
######################### END LICENSE BLOCK #########################
# This is hiragana 2-char sequence table, the number in each cell represents its frequency category
jp2CharContext
=
(
(
0
,
0
,
0
,
2
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
),
(
2
,
4
,
0
,
4
,
0
,
3
,
0
,
4
,
0
,
3
,
4
,
4
,
4
,
2
,
4
,
3
,
3
,
4
,
3
,
2
,
3
,
3
,
4
,
2
,
3
,
3
,
3
,
2
,
4
,
1
,
4
,
3
,
3
,
1
,
5
,
4
,
3
,
4
,
3
,
4
,
3
,
5
,
3
,
0
,
3
,
5
,
4
,
2
,
0
,
3
,
1
,
0
,
3
,
3
,
0
,
3
,
3
,
0
,
1
,
1
,
0
,
4
,
3
,
0
,
3
,
3
,
0
,
4
,
0
,
2
,
0
,
3
,
5
,
5
,
5
,
5
,
4
,
0
,
4
,
1
,
0
,
3
,
4
),
(
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
2
),
(
0
,
4
,
0
,
5
,
0
,
5
,
0
,
4
,
0
,
4
,
5
,
4
,
4
,
3
,
5
,
3
,
5
,
1
,
5
,
3
,
4
,
3
,
4
,
4
,
3
,
4
,
3
,
3
,
4
,
3
,
5
,
4
,
4
,
3
,
5
,
5
,
3
,
5
,
5
,
5
,
3
,
5
,
5
,
3
,
4
,
5
,
5
,
3
,
1
,
3
,
2
,
0
,
3
,
4
,
0
,
4
,
2
,
0
,
4
,
2
,
1
,
5
,
3
,
2
,
3
,
5
,
0
,
4
,
0
,
2
,
0
,
5
,
4
,
4
,
5
,
4
,
5
,
0
,
4
,
0
,
0
,
4
,
4
),
(
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
),
(
0
,
3
,
0
,
4
,
0
,
3
,
0
,
3
,
0
,
4
,
5
,
4
,
3
,
3
,
3
,
3
,
4
,
3
,
5
,
4
,
4
,
3
,
5
,
4
,
4
,
3
,
4
,
3
,
4
,
4
,
4
,
4
,
5
,
3
,
4
,
4
,
3
,
4
,
5
,
5
,
4
,
5
,
5
,
1
,
4
,
5
,
4
,
3
,
0
,
3
,
3
,
1
,
3
,
3
,
0
,
4
,
4
,
0
,
3
,
3
,
1
,
5
,
3
,
3
,
3
,
5
,
0
,
4
,
0
,
3
,
0
,
4
,
4
,
3
,
4
,
3
,
3
,
0
,
4
,
1
,
1
,
3
,
4
),
(
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
),
(
0
,
4
,
0
,
3
,
0
,
3
,
0
,
4
,
0
,
3
,
4
,
4
,
3
,
2
,
2
,
1
,
2
,
1
,
3
,
1
,
3
,
3
,
3
,
3
,
3
,
4
,
3
,
1
,
3
,
3
,
5
,
3
,
3
,
0
,
4
,
3
,
0
,
5
,
4
,
3
,
3
,
5
,
4
,
4
,
3
,
4
,
4
,
5
,
0
,
1
,
2
,
0
,
1
,
2
,
0
,
2
,
2
,
0
,
1
,
0
,
0
,
5
,
2
,
2
,
1
,
4
,
0
,
3
,
0
,
1
,
0
,
4
,
4
,
3
,
5
,
4
,
3
,
0
,
2
,
1
,
0
,
4
,
3
),
(
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
),
(
0
,
3
,
0
,
5
,
0
,
4
,
0
,
2
,
1
,
4
,
4
,
2
,
4
,
1
,
4
,
2
,
4
,
2
,
4
,
3
,
3
,
3
,
4
,
3
,
3
,
3
,
3
,
1
,
4
,
2
,
3
,
3
,
3
,
1
,
4
,
4
,
1
,
1
,
1
,
4
,
3
,
3
,
2
,
0
,
2
,
4
,
3
,
2
,
0
,
3
,
3
,
0
,
3
,
1
,
1
,
0
,
0
,
0
,
3
,
3
,
0
,
4
,
2
,
2
,
3
,
4
,
0
,
4
,
0
,
3
,
0
,
4
,
4
,
5
,
3
,
4
,
4
,
0
,
3
,
0
,
0
,
1
,
4
),
(
1
,
4
,
0
,
4
,
0
,
4
,
0
,
4
,
0
,
3
,
5
,
4
,
4
,
3
,
4
,
3
,
5
,
4
,
3
,
3
,
4
,
3
,
5
,
4
,
4
,
4
,
4
,
3
,
4
,
2
,
4
,
3
,
3
,
1
,
5
,
4
,
3
,
2
,
4
,
5
,
4
,
5
,
5
,
4
,
4
,
5
,
4
,
4
,
0
,
3
,
2
,
2
,
3
,
3
,
0
,
4
,
3
,
1
,
3
,
2
,
1
,
4
,
3
,
3
,
4
,
5
,
0
,
3
,
0
,
2
,
0
,
4
,
5
,
5
,
4
,
5
,
4
,
0
,
4
,
0
,
0
,
5
,
4
),
(
0
,
5
,
0
,
5
,
0
,
4
,
0
,
3
,
0
,
4
,
4
,
3
,
4
,
3
,
3
,
3
,
4
,
0
,
4
,
4
,
4
,
3
,
4
,
3
,
4
,
3
,
3
,
1
,
4
,
2
,
4
,
3
,
4
,
0
,
5
,
4
,
1
,
4
,
5
,
4
,
4
,
5
,
3
,
2
,
4
,
3
,
4
,
3
,
2
,
4
,
1
,
3
,
3
,
3
,
2
,
3
,
2
,
0
,
4
,
3
,
3
,
4
,
3
,
3
,
3
,
4
,
0
,
4
,
0
,
3
,
0
,
4
,
5
,
4
,
4
,
4
,
3
,
0
,
4
,
1
,
0
,
1
,
3
),
(
0
,
3
,
1
,
4
,
0
,
3
,
0
,
2
,
0
,
3
,
4
,
4
,
3
,
1
,
4
,
2
,
3
,
3
,
4
,
3
,
4
,
3
,
4
,
3
,
4
,
4
,
3
,
2
,
3
,
1
,
5
,
4
,
4
,
1
,
4
,
4
,
3
,
5
,
4
,
4
,
3
,
5
,
5
,
4
,
3
,
4
,
4
,
3
,
1
,
2
,
3
,
1
,
2
,
2
,
0
,
3
,
2
,
0
,
3
,
1
,
0
,
5
,
3
,
3
,
3
,
4
,
3
,
3
,
3
,
3
,
4
,
4
,
4
,
4
,
5
,
4
,
2
,
0
,
3
,
3
,
2
,
4
,
3
),
(
0
,
2
,
0
,
3
,
0
,
1
,
0
,
1
,
0
,
0
,
3
,
2
,
0
,
0
,
2
,
0
,
1
,
0
,
2
,
1
,
3
,
3
,
3
,
1
,
2
,
3
,
1
,
0
,
1
,
0
,
4
,
2
,
1
,
1
,
3
,
3
,
0
,
4
,
3
,
3
,
1
,
4
,
3
,
3
,
0
,
3
,
3
,
2
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
2
,
0
,
0
,
0
,
0
,
0
,
4
,
1
,
0
,
2
,
3
,
2
,
2
,
2
,
1
,
3
,
3
,
3
,
4
,
4
,
3
,
2
,
0
,
3
,
1
,
0
,
3
,
3
),
(
0
,
4
,
0
,
4
,
0
,
3
,
0
,
3
,
0
,
4
,
4
,
4
,
3
,
3
,
3
,
3
,
3
,
3
,
4
,
3
,
4
,
2
,
4
,
3
,
4
,
3
,
3
,
2
,
4
,
3
,
4
,
5
,
4
,
1
,
4
,
5
,
3
,
5
,
4
,
5
,
3
,
5
,
4
,
0
,
3
,
5
,
5
,
3
,
1
,
3
,
3
,
2
,
2
,
3
,
0
,
3
,
4
,
1
,
3
,
3
,
2
,
4
,
3
,
3
,
3
,
4
,
0
,
4
,
0
,
3
,
0
,
4
,
5
,
4
,
4
,
5
,
3
,
0
,
4
,
1
,
0
,
3
,
4
),
(
0
,
2
,
0
,
3
,
0
,
3
,
0
,
0
,
0
,
2
,
2
,
2
,
1
,
0
,
1
,
0
,
0
,
0
,
3
,
0
,
3
,
0
,
3
,
0
,
1
,
3
,
1
,
0
,
3
,
1
,
3
,
3
,
3
,
1
,
3
,
3
,
3
,
0
,
1
,
3
,
1
,
3
,
4
,
0
,
0
,
3
,
1
,
1
,
0
,
3
,
2
,
0
,
0
,
0
,
0
,
1
,
3
,
0
,
1
,
0
,
0
,
3
,
3
,
2
,
0
,
3
,
0
,
0
,
0
,
0
,
0
,
3
,
4
,
3
,
4
,
3
,
3
,
0
,
3
,
0
,
0
,
2
,
3
),
(
2
,
3
,
0
,
3
,
0
,
2
,
0
,
1
,
0
,
3
,
3
,
4
,
3
,
1
,
3
,
1
,
1
,
1
,
3
,
1
,
4
,
3
,
4
,
3
,
3
,
3
,
0
,
0
,
3
,
1
,
5
,
4
,
3
,
1
,
4
,
3
,
2
,
5
,
5
,
4
,
4
,
4
,
4
,
3
,
3
,
4
,
4
,
4
,
0
,
2
,
1
,
1
,
3
,
2
,
0
,
1
,
2
,
0
,
0
,
1
,
0
,
4
,
1
,
3
,
3
,
3
,
0
,
3
,
0
,
1
,
0
,
4
,
4
,
4
,
5
,
5
,
3
,
0
,
2
,
0
,
0
,
4
,
4
),
(
0
,
2
,
0
,
1
,
0
,
3
,
1
,
3
,
0
,
2
,
3
,
3
,
3
,
0
,
3
,
1
,
0
,
0
,
3
,
0
,
3
,
2
,
3
,
1
,
3
,
2
,
1
,
1
,
0
,
0
,
4
,
2
,
1
,
0
,
2
,
3
,
1
,
4
,
3
,
2
,
0
,
4
,
4
,
3
,
1
,
3
,
1
,
3
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
4
,
1
,
1
,
1
,
2
,
0
,
3
,
0
,
0
,
0
,
3
,
4
,
2
,
4
,
3
,
2
,
0
,
1
,
0
,
0
,
3
,
3
),
(
0
,
1
,
0
,
4
,
0
,
5
,
0
,
4
,
0
,
2
,
4
,
4
,
2
,
3
,
3
,
2
,
3
,
3
,
5
,
3
,
3
,
3
,
4
,
3
,
4
,
2
,
3
,
0
,
4
,
3
,
3
,
3
,
4
,
1
,
4
,
3
,
2
,
1
,
5
,
5
,
3
,
4
,
5
,
1
,
3
,
5
,
4
,
2
,
0
,
3
,
3
,
0
,
1
,
3
,
0
,
4
,
2
,
0
,
1
,
3
,
1
,
4
,
3
,
3
,
3
,
3
,
0
,
3
,
0
,
1
,
0
,
3
,
4
,
4
,
4
,
5
,
5
,
0
,
3
,
0
,
1
,
4
,
5
),
(
0
,
2
,
0
,
3
,
0
,
3
,
0
,
0
,
0
,
2
,
3
,
1
,
3
,
0
,
4
,
0
,
1
,
1
,
3
,
0
,
3
,
4
,
3
,
2
,
3
,
1
,
0
,
3
,
3
,
2
,
3
,
1
,
3
,
0
,
2
,
3
,
0
,
2
,
1
,
4
,
1
,
2
,
2
,
0
,
0
,
3
,
3
,
0
,
0
,
2
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
2
,
2
,
0
,
3
,
2
,
1
,
3
,
3
,
0
,
2
,
0
,
2
,
0
,
0
,
3
,
3
,
1
,
2
,
4
,
0
,
3
,
0
,
2
,
2
,
3
),
(
2
,
4
,
0
,
5
,
0
,
4
,
0
,
4
,
0
,
2
,
4
,
4
,
4
,
3
,
4
,
3
,
3
,
3
,
1
,
2
,
4
,
3
,
4
,
3
,
4
,
4
,
5
,
0
,
3
,
3
,
3
,
3
,
2
,
0
,
4
,
3
,
1
,
4
,
3
,
4
,
1
,
4
,
4
,
3
,
3
,
4
,
4
,
3
,
1
,
2
,
3
,
0
,
4
,
2
,
0
,
4
,
1
,
0
,
3
,
3
,
0
,
4
,
3
,
3
,
3
,
4
,
0
,
4
,
0
,
2
,
0
,
3
,
5
,
3
,
4
,
5
,
2
,
0
,
3
,
0
,
0
,
4
,
5
),
(
0
,
3
,
0
,
4
,
0
,
1
,
0
,
1
,
0
,
1
,
3
,
2
,
2
,
1
,
3
,
0
,
3
,
0
,
2
,
0
,
2
,
0
,
3
,
0
,
2
,
0
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
0
,
3
,
1
,
0
,
0
,
0
,
4
,
0
,
3
,
1
,
0
,
2
,
1
,
3
,
0
,
0
,
0
,
0
,
0
,
0
,
3
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
4
,
2
,
2
,
3
,
1
,
0
,
3
,
0
,
0
,
0
,
1
,
4
,
4
,
4
,
3
,
0
,
0
,
4
,
0
,
0
,
1
,
4
),
(
1
,
4
,
1
,
5
,
0
,
3
,
0
,
3
,
0
,
4
,
5
,
4
,
4
,
3
,
5
,
3
,
3
,
4
,
4
,
3
,
4
,
1
,
3
,
3
,
3
,
3
,
2
,
1
,
4
,
1
,
5
,
4
,
3
,
1
,
4
,
4
,
3
,
5
,
4
,
4
,
3
,
5
,
4
,
3
,
3
,
4
,
4
,
4
,
0
,
3
,
3
,
1
,
2
,
3
,
0
,
3
,
1
,
0
,
3
,
3
,
0
,
5
,
4
,
4
,
4
,
4
,
4
,
4
,
3
,
3
,
5
,
4
,
4
,
3
,
3
,
5
,
4
,
0
,
3
,
2
,
0
,
4
,
4
),
(
0
,
2
,
0
,
3
,
0
,
1
,
0
,
0
,
0
,
1
,
3
,
3
,
3
,
2
,
4
,
1
,
3
,
0
,
3
,
1
,
3
,
0
,
2
,
2
,
1
,
1
,
0
,
0
,
2
,
0
,
4
,
3
,
1
,
0
,
4
,
3
,
0
,
4
,
4
,
4
,
1
,
4
,
3
,
1
,
1
,
3
,
3
,
1
,
0
,
2
,
0
,
0
,
1
,
3
,
0
,
0
,
0
,
0
,
2
,
0
,
0
,
4
,
3
,
2
,
4
,
3
,
5
,
4
,
3
,
3
,
3
,
4
,
3
,
3
,
4
,
3
,
3
,
0
,
2
,
1
,
0
,
3
,
3
),
(
0
,
2
,
0
,
4
,
0
,
3
,
0
,
2
,
0
,
2
,
5
,
5
,
3
,
4
,
4
,
4
,
4
,
1
,
4
,
3
,
3
,
0
,
4
,
3
,
4
,
3
,
1
,
3
,
3
,
2
,
4
,
3
,
0
,
3
,
4
,
3
,
0
,
3
,
4
,
4
,
2
,
4
,
4
,
0
,
4
,
5
,
3
,
3
,
2
,
2
,
1
,
1
,
1
,
2
,
0
,
1
,
5
,
0
,
3
,
3
,
2
,
4
,
3
,
3
,
3
,
4
,
0
,
3
,
0
,
2
,
0
,
4
,
4
,
3
,
5
,
5
,
0
,
0
,
3
,
0
,
2
,
3
,
3
),
(
0
,
3
,
0
,
4
,
0
,
3
,
0
,
1
,
0
,
3
,
4
,
3
,
3
,
1
,
3
,
3
,
3
,
0
,
3
,
1
,
3
,
0
,
4
,
3
,
3
,
1
,
1
,
0
,
3
,
0
,
3
,
3
,
0
,
0
,
4
,
4
,
0
,
1
,
5
,
4
,
3
,
3
,
5
,
0
,
3
,
3
,
4
,
3
,
0
,
2
,
0
,
1
,
1
,
1
,
0
,
1
,
3
,
0
,
1
,
2
,
1
,
3
,
3
,
2
,
3
,
3
,
0
,
3
,
0
,
1
,
0
,
1
,
3
,
3
,
4
,
4
,
1
,
0
,
1
,
2
,
2
,
1
,
3
),
(
0
,
1
,
0
,
4
,
0
,
4
,
0
,
3
,
0
,
1
,
3
,
3
,
3
,
2
,
3
,
1
,
1
,
0
,
3
,
0
,
3
,
3
,
4
,
3
,
2
,
4
,
2
,
0
,
1
,
0
,
4
,
3
,
2
,
0
,
4
,
3
,
0
,
5
,
3
,
3
,
2
,
4
,
4
,
4
,
3
,
3
,
3
,
4
,
0
,
1
,
3
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
4
,
2
,
3
,
3
,
3
,
0
,
3
,
0
,
0
,
0
,
4
,
4
,
4
,
5
,
3
,
2
,
0
,
3
,
3
,
0
,
3
,
5
),
(
0
,
2
,
0
,
3
,
0
,
0
,
0
,
3
,
0
,
1
,
3
,
0
,
2
,
0
,
0
,
0
,
1
,
0
,
3
,
1
,
1
,
3
,
3
,
0
,
0
,
3
,
0
,
0
,
3
,
0
,
2
,
3
,
1
,
0
,
3
,
1
,
0
,
3
,
3
,
2
,
0
,
4
,
2
,
2
,
0
,
2
,
0
,
0
,
0
,
4
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
2
,
1
,
2
,
0
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
3
,
1
,
2
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
4
),
(
0
,
3
,
0
,
3
,
0
,
5
,
0
,
1
,
0
,
2
,
4
,
3
,
1
,
3
,
3
,
2
,
1
,
1
,
5
,
2
,
1
,
0
,
5
,
1
,
2
,
0
,
0
,
0
,
3
,
3
,
2
,
2
,
3
,
2
,
4
,
3
,
0
,
0
,
3
,
3
,
1
,
3
,
3
,
0
,
2
,
5
,
3
,
4
,
0
,
3
,
3
,
0
,
1
,
2
,
0
,
2
,
2
,
0
,
3
,
2
,
0
,
2
,
2
,
3
,
3
,
3
,
0
,
2
,
0
,
1
,
0
,
3
,
4
,
4
,
2
,
5
,
4
,
0
,
3
,
0
,
0
,
3
,
5
),
(
0
,
3
,
0
,
3
,
0
,
3
,
0
,
1
,
0
,
3
,
3
,
3
,
3
,
0
,
3
,
0
,
2
,
0
,
2
,
1
,
1
,
0
,
2
,
0
,
1
,
0
,
0
,
0
,
2
,
1
,
0
,
0
,
1
,
0
,
3
,
2
,
0
,
0
,
3
,
3
,
1
,
2
,
3
,
1
,
0
,
3
,
3
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
2
,
0
,
0
,
0
,
0
,
0
,
2
,
3
,
1
,
2
,
3
,
0
,
3
,
0
,
1
,
0
,
3
,
2
,
1
,
0
,
4
,
3
,
0
,
1
,
1
,
0
,
3
,
3
),
(
0
,
4
,
0
,
5
,
0
,
3
,
0
,
3
,
0
,
4
,
5
,
5
,
4
,
3
,
5
,
3
,
4
,
3
,
5
,
3
,
3
,
2
,
5
,
3
,
4
,
4
,
4
,
3
,
4
,
3
,
4
,
5
,
5
,
3
,
4
,
4
,
3
,
4
,
4
,
5
,
4
,
4
,
4
,
3
,
4
,
5
,
5
,
4
,
2
,
3
,
4
,
2
,
3
,
4
,
0
,
3
,
3
,
1
,
4
,
3
,
2
,
4
,
3
,
3
,
5
,
5
,
0
,
3
,
0
,
3
,
0
,
5
,
5
,
5
,
5
,
4
,
4
,
0
,
4
,
0
,
1
,
4
,
4
),
(
0
,
4
,
0
,
4
,
0
,
3
,
0
,
3
,
0
,
3
,
5
,
4
,
4
,
2
,
3
,
2
,
5
,
1
,
3
,
2
,
5
,
1
,
4
,
2
,
3
,
2
,
3
,
3
,
4
,
3
,
3
,
3
,
3
,
2
,
5
,
4
,
1
,
3
,
3
,
5
,
3
,
4
,
4
,
0
,
4
,
4
,
3
,
1
,
1
,
3
,
1
,
0
,
2
,
3
,
0
,
2
,
3
,
0
,
3
,
0
,
0
,
4
,
3
,
1
,
3
,
4
,
0
,
3
,
0
,
2
,
0
,
4
,
4
,
4
,
3
,
4
,
5
,
0
,
4
,
0
,
0
,
3
,
4
),
(
0
,
3
,
0
,
3
,
0
,
3
,
1
,
2
,
0
,
3
,
4
,
4
,
3
,
3
,
3
,
0
,
2
,
2
,
4
,
3
,
3
,
1
,
3
,
3
,
3
,
1
,
1
,
0
,
3
,
1
,
4
,
3
,
2
,
3
,
4
,
4
,
2
,
4
,
4
,
4
,
3
,
4
,
4
,
3
,
2
,
4
,
4
,
3
,
1
,
3
,
3
,
1
,
3
,
3
,
0
,
4
,
1
,
0
,
2
,
2
,
1
,
4
,
3
,
2
,
3
,
3
,
5
,
4
,
3
,
3
,
5
,
4
,
4
,
3
,
3
,
0
,
4
,
0
,
3
,
2
,
2
,
4
,
4
),
(
0
,
2
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
2
,
1
,
3
,
0
,
0
,
0
,
0
,
0
,
2
,
0
,
1
,
2
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
3
,
0
,
0
,
1
,
0
,
1
,
1
,
3
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
2
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
2
,
2
,
0
,
3
,
4
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
),
(
0
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
4
,
0
,
4
,
1
,
4
,
0
,
3
,
0
,
4
,
0
,
3
,
0
,
4
,
0
,
3
,
0
,
3
,
0
,
4
,
1
,
5
,
1
,
4
,
0
,
0
,
3
,
0
,
5
,
0
,
5
,
2
,
0
,
1
,
0
,
0
,
0
,
2
,
1
,
4
,
0
,
1
,
3
,
0
,
0
,
3
,
0
,
0
,
3
,
1
,
1
,
4
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
),
(
1
,
4
,
0
,
5
,
0
,
3
,
0
,
2
,
0
,
3
,
5
,
4
,
4
,
3
,
4
,
3
,
5
,
3
,
4
,
3
,
3
,
0
,
4
,
3
,
3
,
3
,
3
,
3
,
3
,
2
,
4
,
4
,
3
,
1
,
3
,
4
,
4
,
5
,
4
,
4
,
3
,
4
,
4
,
1
,
3
,
5
,
4
,
3
,
3
,
3
,
1
,
2
,
2
,
3
,
3
,
1
,
3
,
1
,
3
,
3
,
3
,
5
,
3
,
3
,
4
,
5
,
0
,
3
,
0
,
3
,
0
,
3
,
4
,
3
,
4
,
4
,
3
,
0
,
3
,
0
,
2
,
4
,
3
),
(
0
,
1
,
0
,
4
,
0
,
0
,
0
,
0
,
0
,
1
,
4
,
0
,
4
,
1
,
4
,
2
,
4
,
0
,
3
,
0
,
1
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
2
,
0
,
3
,
1
,
1
,
1
,
0
,
3
,
0
,
0
,
0
,
1
,
2
,
1
,
0
,
0
,
1
,
1
,
1
,
1
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
3
,
0
,
0
,
0
,
0
,
3
,
2
,
0
,
2
,
2
,
0
,
1
,
0
,
0
,
0
,
2
,
3
,
2
,
3
,
3
,
0
,
0
,
0
,
0
,
2
,
1
,
0
),
(
0
,
5
,
1
,
5
,
0
,
3
,
0
,
3
,
0
,
5
,
4
,
4
,
5
,
1
,
5
,
3
,
3
,
0
,
4
,
3
,
4
,
3
,
5
,
3
,
4
,
3
,
3
,
2
,
4
,
3
,
4
,
3
,
3
,
0
,
3
,
3
,
1
,
4
,
4
,
3
,
4
,
4
,
4
,
3
,
4
,
5
,
5
,
3
,
2
,
3
,
1
,
1
,
3
,
3
,
1
,
3
,
1
,
1
,
3
,
3
,
2
,
4
,
5
,
3
,
3
,
5
,
0
,
4
,
0
,
3
,
0
,
4
,
4
,
3
,
5
,
3
,
3
,
0
,
3
,
4
,
0
,
4
,
3
),
(
0
,
5
,
0
,
5
,
0
,
3
,
0
,
2
,
0
,
4
,
4
,
3
,
5
,
2
,
4
,
3
,
3
,
3
,
4
,
4
,
4
,
3
,
5
,
3
,
5
,
3
,
3
,
1
,
4
,
0
,
4
,
3
,
3
,
0
,
3
,
3
,
0
,
4
,
4
,
4
,
4
,
5
,
4
,
3
,
3
,
5
,
5
,
3
,
2
,
3
,
1
,
2
,
3
,
2
,
0
,
1
,
0
,
0
,
3
,
2
,
2
,
4
,
4
,
3
,
1
,
5
,
0
,
4
,
0
,
3
,
0
,
4
,
3
,
1
,
3
,
2
,
1
,
0
,
3
,
3
,
0
,
3
,
3
),
(
0
,
4
,
0
,
5
,
0
,
5
,
0
,
4
,
0
,
4
,
5
,
5
,
5
,
3
,
4
,
3
,
3
,
2
,
5
,
4
,
4
,
3
,
5
,
3
,
5
,
3
,
4
,
0
,
4
,
3
,
4
,
4
,
3
,
2
,
4
,
4
,
3
,
4
,
5
,
4
,
4
,
5
,
5
,
0
,
3
,
5
,
5
,
4
,
1
,
3
,
3
,
2
,
3
,
3
,
1
,
3
,
1
,
0
,
4
,
3
,
1
,
4
,
4
,
3
,
4
,
5
,
0
,
4
,
0
,
2
,
0
,
4
,
3
,
4
,
4
,
3
,
3
,
0
,
4
,
0
,
0
,
5
,
5
),
(
0
,
4
,
0
,
4
,
0
,
5
,
0
,
1
,
1
,
3
,
3
,
4
,
4
,
3
,
4
,
1
,
3
,
0
,
5
,
1
,
3
,
0
,
3
,
1
,
3
,
1
,
1
,
0
,
3
,
0
,
3
,
3
,
4
,
0
,
4
,
3
,
0
,
4
,
4
,
4
,
3
,
4
,
4
,
0
,
3
,
5
,
4
,
1
,
0
,
3
,
0
,
0
,
2
,
3
,
0
,
3
,
1
,
0
,
3
,
1
,
0
,
3
,
2
,
1
,
3
,
5
,
0
,
3
,
0
,
1
,
0
,
3
,
2
,
3
,
3
,
4
,
4
,
0
,
2
,
2
,
0
,
4
,
4
),
(
2
,
4
,
0
,
5
,
0
,
4
,
0
,
3
,
0
,
4
,
5
,
5
,
4
,
3
,
5
,
3
,
5
,
3
,
5
,
3
,
5
,
2
,
5
,
3
,
4
,
3
,
3
,
4
,
3
,
4
,
5
,
3
,
2
,
1
,
5
,
4
,
3
,
2
,
3
,
4
,
5
,
3
,
4
,
1
,
2
,
5
,
4
,
3
,
0
,
3
,
3
,
0
,
3
,
2
,
0
,
2
,
3
,
0
,
4
,
1
,
0
,
3
,
4
,
3
,
3
,
5
,
0
,
3
,
0
,
1
,
0
,
4
,
5
,
5
,
5
,
4
,
3
,
0
,
4
,
2
,
0
,
3
,
5
),
(
0
,
5
,
0
,
4
,
0
,
4
,
0
,
2
,
0
,
5
,
4
,
3
,
4
,
3
,
4
,
3
,
3
,
3
,
4
,
3
,
4
,
2
,
5
,
3
,
5
,
3
,
4
,
1
,
4
,
3
,
4
,
4
,
4
,
0
,
3
,
5
,
0
,
4
,
4
,
4
,
4
,
5
,
3
,
1
,
3
,
4
,
5
,
3
,
3
,
3
,
3
,
3
,
3
,
3
,
0
,
2
,
2
,
0
,
3
,
3
,
2
,
4
,
3
,
3
,
3
,
5
,
3
,
4
,
1
,
3
,
3
,
5
,
3
,
2
,
0
,
0
,
0
,
0
,
4
,
3
,
1
,
3
,
3
),
(
0
,
1
,
0
,
3
,
0
,
3
,
0
,
1
,
0
,
1
,
3
,
3
,
3
,
2
,
3
,
3
,
3
,
0
,
3
,
0
,
0
,
0
,
3
,
1
,
3
,
0
,
0
,
0
,
2
,
2
,
2
,
3
,
0
,
0
,
3
,
2
,
0
,
1
,
2
,
4
,
1
,
3
,
3
,
0
,
0
,
3
,
3
,
3
,
0
,
1
,
0
,
0
,
2
,
1
,
0
,
0
,
3
,
0
,
3
,
1
,
0
,
3
,
0
,
0
,
1
,
3
,
0
,
2
,
0
,
1
,
0
,
3
,
3
,
1
,
3
,
3
,
0
,
0
,
1
,
1
,
0
,
3
,
3
),
(
0
,
2
,
0
,
3
,
0
,
2
,
1
,
4
,
0
,
2
,
2
,
3
,
1
,
1
,
3
,
1
,
1
,
0
,
2
,
0
,
3
,
1
,
2
,
3
,
1
,
3
,
0
,
0
,
1
,
0
,
4
,
3
,
2
,
3
,
3
,
3
,
1
,
4
,
2
,
3
,
3
,
3
,
3
,
1
,
0
,
3
,
1
,
4
,
0
,
1
,
1
,
0
,
1
,
2
,
0
,
1
,
1
,
0
,
1
,
1
,
0
,
3
,
1
,
3
,
2
,
2
,
0
,
1
,
0
,
0
,
0
,
2
,
3
,
3
,
3
,
1
,
0
,
0
,
0
,
0
,
0
,
2
,
3
),
(
0
,
5
,
0
,
4
,
0
,
5
,
0
,
2
,
0
,
4
,
5
,
5
,
3
,
3
,
4
,
3
,
3
,
1
,
5
,
4
,
4
,
2
,
4
,
4
,
4
,
3
,
4
,
2
,
4
,
3
,
5
,
5
,
4
,
3
,
3
,
4
,
3
,
3
,
5
,
5
,
4
,
5
,
5
,
1
,
3
,
4
,
5
,
3
,
1
,
4
,
3
,
1
,
3
,
3
,
0
,
3
,
3
,
1
,
4
,
3
,
1
,
4
,
5
,
3
,
3
,
5
,
0
,
4
,
0
,
3
,
0
,
5
,
3
,
3
,
1
,
4
,
3
,
0
,
4
,
0
,
1
,
5
,
3
),
(
0
,
5
,
0
,
5
,
0
,
4
,
0
,
2
,
0
,
4
,
4
,
3
,
4
,
3
,
3
,
3
,
3
,
3
,
5
,
4
,
4
,
4
,
4
,
4
,
4
,
5
,
3
,
3
,
5
,
2
,
4
,
4
,
4
,
3
,
4
,
4
,
3
,
3
,
4
,
4
,
5
,
5
,
3
,
3
,
4
,
3
,
4
,
3
,
3
,
4
,
3
,
3
,
3
,
3
,
1
,
2
,
2
,
1
,
4
,
3
,
3
,
5
,
4
,
4
,
3
,
4
,
0
,
4
,
0
,
3
,
0
,
4
,
4
,
4
,
4
,
4
,
1
,
0
,
4
,
2
,
0
,
2
,
4
),
(
0
,
4
,
0
,
4
,
0
,
3
,
0
,
1
,
0
,
3
,
5
,
2
,
3
,
0
,
3
,
0
,
2
,
1
,
4
,
2
,
3
,
3
,
4
,
1
,
4
,
3
,
3
,
2
,
4
,
1
,
3
,
3
,
3
,
0
,
3
,
3
,
0
,
0
,
3
,
3
,
3
,
5
,
3
,
3
,
3
,
3
,
3
,
2
,
0
,
2
,
0
,
0
,
2
,
0
,
0
,
2
,
0
,
0
,
1
,
0
,
0
,
3
,
1
,
2
,
2
,
3
,
0
,
3
,
0
,
2
,
0
,
4
,
4
,
3
,
3
,
4
,
1
,
0
,
3
,
0
,
0
,
2
,
4
),
(
0
,
0
,
0
,
4
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
1
,
0
,
2
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
2
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
3
,
1
,
3
,
0
,
3
,
2
,
0
,
0
,
0
,
1
,
0
,
3
,
2
,
0
,
0
,
2
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
3
,
4
,
0
,
2
,
0
,
0
,
0
,
0
,
0
,
0
,
2
),
(
0
,
2
,
1
,
3
,
0
,
2
,
0
,
2
,
0
,
3
,
3
,
3
,
3
,
1
,
3
,
1
,
3
,
3
,
3
,
3
,
3
,
3
,
4
,
2
,
2
,
1
,
2
,
1
,
4
,
0
,
4
,
3
,
1
,
3
,
3
,
3
,
2
,
4
,
3
,
5
,
4
,
3
,
3
,
3
,
3
,
3
,
3
,
3
,
0
,
1
,
3
,
0
,
2
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
4
,
2
,
0
,
2
,
3
,
0
,
3
,
3
,
0
,
3
,
3
,
4
,
2
,
3
,
1
,
4
,
0
,
1
,
2
,
0
,
2
,
3
),
(
0
,
3
,
0
,
3
,
0
,
1
,
0
,
3
,
0
,
2
,
3
,
3
,
3
,
0
,
3
,
1
,
2
,
0
,
3
,
3
,
2
,
3
,
3
,
2
,
3
,
2
,
3
,
1
,
3
,
0
,
4
,
3
,
2
,
0
,
3
,
3
,
1
,
4
,
3
,
3
,
2
,
3
,
4
,
3
,
1
,
3
,
3
,
1
,
1
,
0
,
1
,
1
,
0
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
0
,
4
,
1
,
1
,
0
,
3
,
0
,
3
,
1
,
0
,
2
,
3
,
3
,
3
,
3
,
3
,
1
,
0
,
0
,
2
,
0
,
3
,
3
),
(
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
3
,
0
,
2
,
0
,
3
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
3
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
3
,
0
,
3
,
0
,
3
,
1
,
0
,
1
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
3
,
0
,
2
,
0
,
2
,
3
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
3
),
(
0
,
2
,
0
,
3
,
1
,
3
,
0
,
3
,
0
,
2
,
3
,
3
,
3
,
1
,
3
,
1
,
3
,
1
,
3
,
1
,
3
,
3
,
3
,
1
,
3
,
0
,
2
,
3
,
1
,
1
,
4
,
3
,
3
,
2
,
3
,
3
,
1
,
2
,
2
,
4
,
1
,
3
,
3
,
0
,
1
,
4
,
2
,
3
,
0
,
1
,
3
,
0
,
3
,
0
,
0
,
1
,
3
,
0
,
2
,
0
,
0
,
3
,
3
,
2
,
1
,
3
,
0
,
3
,
0
,
2
,
0
,
3
,
4
,
4
,
4
,
3
,
1
,
0
,
3
,
0
,
0
,
3
,
3
),
(
0
,
2
,
0
,
1
,
0
,
2
,
0
,
0
,
0
,
1
,
3
,
2
,
2
,
1
,
3
,
0
,
1
,
1
,
3
,
0
,
3
,
2
,
3
,
1
,
2
,
0
,
2
,
0
,
1
,
1
,
3
,
3
,
3
,
0
,
3
,
3
,
1
,
1
,
2
,
3
,
2
,
3
,
3
,
1
,
2
,
3
,
2
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
3
,
0
,
1
,
0
,
0
,
2
,
1
,
2
,
1
,
3
,
0
,
3
,
0
,
0
,
0
,
3
,
4
,
4
,
4
,
3
,
2
,
0
,
2
,
0
,
0
,
2
,
4
),
(
0
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
2
,
2
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
1
,
3
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
3
),
(
0
,
3
,
0
,
3
,
0
,
2
,
0
,
3
,
0
,
3
,
3
,
3
,
2
,
3
,
2
,
2
,
2
,
0
,
3
,
1
,
3
,
3
,
3
,
2
,
3
,
3
,
0
,
0
,
3
,
0
,
3
,
2
,
2
,
0
,
2
,
3
,
1
,
4
,
3
,
4
,
3
,
3
,
2
,
3
,
1
,
5
,
4
,
4
,
0
,
3
,
1
,
2
,
1
,
3
,
0
,
3
,
1
,
1
,
2
,
0
,
2
,
3
,
1
,
3
,
1
,
3
,
0
,
3
,
0
,
1
,
0
,
3
,
3
,
4
,
4
,
2
,
1
,
0
,
2
,
1
,
0
,
2
,
4
),
(
0
,
1
,
0
,
3
,
0
,
1
,
0
,
2
,
0
,
1
,
4
,
2
,
5
,
1
,
4
,
0
,
2
,
0
,
2
,
1
,
3
,
1
,
4
,
0
,
2
,
1
,
0
,
0
,
2
,
1
,
4
,
1
,
1
,
0
,
3
,
3
,
0
,
5
,
1
,
3
,
2
,
3
,
3
,
1
,
0
,
3
,
2
,
3
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
4
,
0
,
1
,
0
,
3
,
0
,
2
,
0
,
1
,
0
,
3
,
3
,
3
,
4
,
3
,
3
,
0
,
0
,
0
,
0
,
2
,
3
),
(
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
2
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
3
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
2
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
3
),
(
0
,
1
,
0
,
3
,
0
,
4
,
0
,
3
,
0
,
2
,
4
,
3
,
1
,
0
,
3
,
2
,
2
,
1
,
3
,
1
,
2
,
2
,
3
,
1
,
1
,
1
,
2
,
1
,
3
,
0
,
1
,
2
,
0
,
1
,
3
,
2
,
1
,
3
,
0
,
5
,
5
,
1
,
0
,
0
,
1
,
3
,
2
,
1
,
0
,
3
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
3
,
4
,
0
,
1
,
1
,
1
,
3
,
2
,
0
,
2
,
0
,
1
,
0
,
2
,
3
,
3
,
1
,
2
,
3
,
0
,
1
,
0
,
1
,
0
,
4
),
(
0
,
0
,
0
,
1
,
0
,
3
,
0
,
3
,
0
,
2
,
2
,
1
,
0
,
0
,
4
,
0
,
3
,
0
,
3
,
1
,
3
,
0
,
3
,
0
,
3
,
0
,
1
,
0
,
3
,
0
,
3
,
1
,
3
,
0
,
3
,
3
,
0
,
0
,
1
,
2
,
1
,
1
,
1
,
0
,
1
,
2
,
0
,
0
,
0
,
1
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
2
,
2
,
1
,
2
,
0
,
0
,
2
,
0
,
0
,
0
,
0
,
2
,
3
,
3
,
3
,
3
,
0
,
0
,
0
,
0
,
1
,
4
),
(
0
,
0
,
0
,
3
,
0
,
3
,
0
,
0
,
0
,
0
,
3
,
1
,
1
,
0
,
3
,
0
,
1
,
0
,
2
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
3
,
0
,
2
,
0
,
2
,
3
,
0
,
0
,
2
,
2
,
3
,
1
,
2
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
3
,
0
,
0
,
2
,
0
,
0
,
0
,
0
,
2
,
3
),
(
2
,
4
,
0
,
5
,
0
,
5
,
0
,
4
,
0
,
3
,
4
,
3
,
3
,
3
,
4
,
3
,
3
,
3
,
4
,
3
,
4
,
4
,
5
,
4
,
5
,
5
,
5
,
2
,
3
,
0
,
5
,
5
,
4
,
1
,
5
,
4
,
3
,
1
,
5
,
4
,
3
,
4
,
4
,
3
,
3
,
4
,
3
,
3
,
0
,
3
,
2
,
0
,
2
,
3
,
0
,
3
,
0
,
0
,
3
,
3
,
0
,
5
,
3
,
2
,
3
,
3
,
0
,
3
,
0
,
3
,
0
,
3
,
4
,
5
,
4
,
5
,
3
,
0
,
4
,
3
,
0
,
3
,
4
),
(
0
,
3
,
0
,
3
,
0
,
3
,
0
,
3
,
0
,
3
,
3
,
4
,
3
,
2
,
3
,
2
,
3
,
0
,
4
,
3
,
3
,
3
,
3
,
3
,
3
,
3
,
3
,
0
,
3
,
2
,
4
,
3
,
3
,
1
,
3
,
4
,
3
,
4
,
4
,
4
,
3
,
4
,
4
,
3
,
2
,
4
,
4
,
1
,
0
,
2
,
0
,
0
,
1
,
1
,
0
,
2
,
0
,
0
,
3
,
1
,
0
,
5
,
3
,
2
,
1
,
3
,
0
,
3
,
0
,
1
,
2
,
4
,
3
,
2
,
4
,
3
,
3
,
0
,
3
,
2
,
0
,
4
,
4
),
(
0
,
3
,
0
,
3
,
0
,
1
,
0
,
0
,
0
,
1
,
4
,
3
,
3
,
2
,
3
,
1
,
3
,
1
,
4
,
2
,
3
,
2
,
4
,
2
,
3
,
4
,
3
,
0
,
2
,
2
,
3
,
3
,
3
,
0
,
3
,
3
,
3
,
0
,
3
,
4
,
1
,
3
,
3
,
0
,
3
,
4
,
3
,
3
,
0
,
1
,
1
,
0
,
1
,
0
,
0
,
0
,
4
,
0
,
3
,
0
,
0
,
3
,
1
,
2
,
1
,
3
,
0
,
4
,
0
,
1
,
0
,
4
,
3
,
3
,
4
,
3
,
3
,
0
,
2
,
0
,
0
,
3
,
3
),
(
0
,
3
,
0
,
4
,
0
,
1
,
0
,
3
,
0
,
3
,
4
,
3
,
3
,
0
,
3
,
3
,
3
,
1
,
3
,
1
,
3
,
3
,
4
,
3
,
3
,
3
,
0
,
0
,
3
,
1
,
5
,
3
,
3
,
1
,
3
,
3
,
2
,
5
,
4
,
3
,
3
,
4
,
5
,
3
,
2
,
5
,
3
,
4
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
2
,
0
,
0
,
1
,
1
,
0
,
4
,
2
,
2
,
1
,
3
,
0
,
3
,
0
,
2
,
0
,
4
,
4
,
3
,
5
,
3
,
2
,
0
,
1
,
1
,
0
,
3
,
4
),
(
0
,
5
,
0
,
4
,
0
,
5
,
0
,
2
,
0
,
4
,
4
,
3
,
3
,
2
,
3
,
3
,
3
,
1
,
4
,
3
,
4
,
1
,
5
,
3
,
4
,
3
,
4
,
0
,
4
,
2
,
4
,
3
,
4
,
1
,
5
,
4
,
0
,
4
,
4
,
4
,
4
,
5
,
4
,
1
,
3
,
5
,
4
,
2
,
1
,
4
,
1
,
1
,
3
,
2
,
0
,
3
,
1
,
0
,
3
,
2
,
1
,
4
,
3
,
3
,
3
,
4
,
0
,
4
,
0
,
3
,
0
,
4
,
4
,
4
,
3
,
3
,
3
,
0
,
4
,
2
,
0
,
3
,
4
),
(
1
,
4
,
0
,
4
,
0
,
3
,
0
,
1
,
0
,
3
,
3
,
3
,
1
,
1
,
3
,
3
,
2
,
2
,
3
,
3
,
1
,
0
,
3
,
2
,
2
,
1
,
2
,
0
,
3
,
1
,
2
,
1
,
2
,
0
,
3
,
2
,
0
,
2
,
2
,
3
,
3
,
4
,
3
,
0
,
3
,
3
,
1
,
2
,
0
,
1
,
1
,
3
,
1
,
2
,
0
,
0
,
3
,
0
,
1
,
1
,
0
,
3
,
2
,
2
,
3
,
3
,
0
,
3
,
0
,
0
,
0
,
2
,
3
,
3
,
4
,
3
,
3
,
0
,
1
,
0
,
0
,
1
,
4
),
(
0
,
4
,
0
,
4
,
0
,
4
,
0
,
0
,
0
,
3
,
4
,
4
,
3
,
1
,
4
,
2
,
3
,
2
,
3
,
3
,
3
,
1
,
4
,
3
,
4
,
0
,
3
,
0
,
4
,
2
,
3
,
3
,
2
,
2
,
5
,
4
,
2
,
1
,
3
,
4
,
3
,
4
,
3
,
1
,
3
,
3
,
4
,
2
,
0
,
2
,
1
,
0
,
3
,
3
,
0
,
0
,
2
,
0
,
3
,
1
,
0
,
4
,
4
,
3
,
4
,
3
,
0
,
4
,
0
,
1
,
0
,
2
,
4
,
4
,
4
,
4
,
4
,
0
,
3
,
2
,
0
,
3
,
3
),
(
0
,
0
,
0
,
1
,
0
,
4
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
3
,
2
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
2
),
(
0
,
2
,
0
,
3
,
0
,
4
,
0
,
4
,
0
,
1
,
3
,
3
,
3
,
0
,
4
,
0
,
2
,
1
,
2
,
1
,
1
,
1
,
2
,
0
,
3
,
1
,
1
,
0
,
1
,
0
,
3
,
1
,
0
,
0
,
3
,
3
,
2
,
0
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
2
,
0
,
2
,
2
,
0
,
3
,
1
,
0
,
0
,
1
,
0
,
1
,
1
,
0
,
1
,
2
,
0
,
3
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
3
,
3
,
4
,
3
,
1
,
0
,
1
,
0
,
3
,
0
,
2
),
(
0
,
0
,
0
,
3
,
0
,
5
,
0
,
0
,
0
,
0
,
1
,
0
,
2
,
0
,
3
,
1
,
0
,
1
,
3
,
0
,
0
,
0
,
2
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
1
,
1
,
0
,
0
,
4
,
0
,
0
,
0
,
2
,
3
,
0
,
1
,
4
,
1
,
0
,
2
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
3
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
2
,
0
,
0
,
3
,
0
,
0
,
0
,
0
,
0
,
3
),
(
0
,
2
,
0
,
5
,
0
,
5
,
0
,
1
,
0
,
2
,
4
,
3
,
3
,
2
,
5
,
1
,
3
,
2
,
3
,
3
,
3
,
0
,
4
,
1
,
2
,
0
,
3
,
0
,
4
,
0
,
2
,
2
,
1
,
1
,
5
,
3
,
0
,
0
,
1
,
4
,
2
,
3
,
2
,
0
,
3
,
3
,
3
,
2
,
0
,
2
,
4
,
1
,
1
,
2
,
0
,
1
,
1
,
0
,
3
,
1
,
0
,
1
,
3
,
1
,
2
,
3
,
0
,
2
,
0
,
0
,
0
,
1
,
3
,
5
,
4
,
4
,
4
,
0
,
3
,
0
,
0
,
1
,
3
),
(
0
,
4
,
0
,
5
,
0
,
4
,
0
,
4
,
0
,
4
,
5
,
4
,
3
,
3
,
4
,
3
,
3
,
3
,
4
,
3
,
4
,
4
,
5
,
3
,
4
,
5
,
4
,
2
,
4
,
2
,
3
,
4
,
3
,
1
,
4
,
4
,
1
,
3
,
5
,
4
,
4
,
5
,
5
,
4
,
4
,
5
,
5
,
5
,
2
,
3
,
3
,
1
,
4
,
3
,
1
,
3
,
3
,
0
,
3
,
3
,
1
,
4
,
3
,
4
,
4
,
4
,
0
,
3
,
0
,
4
,
0
,
3
,
3
,
4
,
4
,
5
,
0
,
0
,
4
,
3
,
0
,
4
,
5
),
(
0
,
4
,
0
,
4
,
0
,
3
,
0
,
3
,
0
,
3
,
4
,
4
,
4
,
3
,
3
,
2
,
4
,
3
,
4
,
3
,
4
,
3
,
5
,
3
,
4
,
3
,
2
,
1
,
4
,
2
,
4
,
4
,
3
,
1
,
3
,
4
,
2
,
4
,
5
,
5
,
3
,
4
,
5
,
4
,
1
,
5
,
4
,
3
,
0
,
3
,
2
,
2
,
3
,
2
,
1
,
3
,
1
,
0
,
3
,
3
,
3
,
5
,
3
,
3
,
3
,
5
,
4
,
4
,
2
,
3
,
3
,
4
,
3
,
3
,
3
,
2
,
1
,
0
,
3
,
2
,
1
,
4
,
3
),
(
0
,
4
,
0
,
5
,
0
,
4
,
0
,
3
,
0
,
3
,
5
,
5
,
3
,
2
,
4
,
3
,
4
,
0
,
5
,
4
,
4
,
1
,
4
,
4
,
4
,
3
,
3
,
3
,
4
,
3
,
5
,
5
,
2
,
3
,
3
,
4
,
1
,
2
,
5
,
5
,
3
,
5
,
5
,
2
,
3
,
5
,
5
,
4
,
0
,
3
,
2
,
0
,
3
,
3
,
1
,
1
,
5
,
1
,
4
,
1
,
0
,
4
,
3
,
2
,
3
,
5
,
0
,
4
,
0
,
3
,
0
,
5
,
4
,
3
,
4
,
3
,
0
,
0
,
4
,
1
,
0
,
4
,
4
),
(
1
,
3
,
0
,
4
,
0
,
2
,
0
,
2
,
0
,
2
,
5
,
5
,
3
,
3
,
3
,
3
,
3
,
0
,
4
,
2
,
3
,
4
,
4
,
4
,
3
,
4
,
0
,
0
,
3
,
4
,
5
,
4
,
3
,
3
,
3
,
3
,
2
,
5
,
5
,
4
,
5
,
5
,
5
,
4
,
3
,
5
,
5
,
5
,
1
,
3
,
1
,
0
,
1
,
0
,
0
,
3
,
2
,
0
,
4
,
2
,
0
,
5
,
2
,
3
,
2
,
4
,
1
,
3
,
0
,
3
,
0
,
4
,
5
,
4
,
5
,
4
,
3
,
0
,
4
,
2
,
0
,
5
,
4
),
(
0
,
3
,
0
,
4
,
0
,
5
,
0
,
3
,
0
,
3
,
4
,
4
,
3
,
2
,
3
,
2
,
3
,
3
,
3
,
3
,
3
,
2
,
4
,
3
,
3
,
2
,
2
,
0
,
3
,
3
,
3
,
3
,
3
,
1
,
3
,
3
,
3
,
0
,
4
,
4
,
3
,
4
,
4
,
1
,
1
,
4
,
4
,
2
,
0
,
3
,
1
,
0
,
1
,
1
,
0
,
4
,
1
,
0
,
2
,
3
,
1
,
3
,
3
,
1
,
3
,
4
,
0
,
3
,
0
,
1
,
0
,
3
,
1
,
3
,
0
,
0
,
1
,
0
,
2
,
0
,
0
,
4
,
4
),
(
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
),
(
0
,
3
,
0
,
3
,
0
,
2
,
0
,
3
,
0
,
1
,
5
,
4
,
3
,
3
,
3
,
1
,
4
,
2
,
1
,
2
,
3
,
4
,
4
,
2
,
4
,
4
,
5
,
0
,
3
,
1
,
4
,
3
,
4
,
0
,
4
,
3
,
3
,
3
,
2
,
3
,
2
,
5
,
3
,
4
,
3
,
2
,
2
,
3
,
0
,
0
,
3
,
0
,
2
,
1
,
0
,
1
,
2
,
0
,
0
,
0
,
0
,
2
,
1
,
1
,
3
,
1
,
0
,
2
,
0
,
4
,
0
,
3
,
4
,
4
,
4
,
5
,
2
,
0
,
2
,
0
,
0
,
1
,
3
),
(
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
0
,
0
,
1
,
1
,
0
,
0
,
0
,
4
,
2
,
1
,
1
,
0
,
1
,
0
,
3
,
2
,
0
,
0
,
3
,
1
,
1
,
1
,
2
,
2
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
3
,
0
,
1
,
0
,
0
,
0
,
2
,
0
,
0
,
0
,
1
,
4
,
0
,
4
,
2
,
1
,
0
,
0
,
0
,
0
,
0
,
1
),
(
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
1
,
0
,
0
,
0
,
0
,
3
,
1
,
0
,
0
,
0
,
2
,
0
,
2
,
1
,
0
,
0
,
1
,
2
,
1
,
0
,
1
,
1
,
0
,
0
,
3
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
3
,
1
,
0
,
0
,
0
,
0
,
0
,
1
,
0
,
0
,
2
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
2
),
(
0
,
4
,
0
,
4
,
0
,
4
,
0
,
3
,
0
,
4
,
4
,
3
,
4
,
2
,
4
,
3
,
2
,
0
,
4
,
4
,
4
,
3
,
5
,
3
,
5
,
3
,
3
,
2
,
4
,
2
,
4
,
3
,
4
,
3
,
1
,
4
,
0
,
2
,
3
,
4
,
4
,
4
,
3
,
3
,
3
,
4
,
4
,
4
,
3
,
4
,
1
,
3
,
4
,
3
,
2
,
1
,
2
,
1
,
3
,
3
,
3
,
4
,
4
,
3
,
3
,
5
,
0
,
4
,
0
,
3
,
0
,
4
,
3
,
3
,
3
,
2
,
1
,
0
,
3
,
0
,
0
,
3
,
3
),
(
0
,
4
,
0
,
3
,
0
,
3
,
0
,
3
,
0
,
3
,
5
,
5
,
3
,
3
,
3
,
3
,
4
,
3
,
4
,
3
,
3
,
3
,
4
,
4
,
4
,
3
,
3
,
3
,
3
,
4
,
3
,
5
,
3
,
3
,
1
,
3
,
2
,
4
,
5
,
5
,
5
,
5
,
4
,
3
,
4
,
5
,
5
,
3
,
2
,
2
,
3
,
3
,
3
,
3
,
2
,
3
,
3
,
1
,
2
,
3
,
2
,
4
,
3
,
3
,
3
,
4
,
0
,
4
,
0
,
2
,
0
,
4
,
3
,
2
,
2
,
1
,
2
,
0
,
3
,
0
,
0
,
4
,
1
),
)
class
JapaneseContextAnalysis
(
object
):
NUM_OF_CATEGORY
=
6
DONT_KNOW
=
-
1
ENOUGH_REL_THRESHOLD
=
100
MAX_REL_THRESHOLD
=
1000
MINIMUM_DATA_THRESHOLD
=
4
def
__init__
(
self
):
self
.
_total_rel
=
None
self
.
_rel_sample
=
None
self
.
_need_to_skip_char_num
=
None
self
.
_last_char_order
=
None
self
.
_done
=
None
self
.
reset
()
def
reset
(
self
):
self
.
_total_rel
=
0
# total sequence received
# category counters, each integer counts sequence in its category
self
.
_rel_sample
=
[
0
]
*
self
.
NUM_OF_CATEGORY
# if last byte in current buffer is not the last byte of a character,
# we need to know how many bytes to skip in next buffer
self
.
_need_to_skip_char_num
=
0
self
.
_last_char_order
=
-
1
# The order of previous char
# If this flag is set to True, detection is done and conclusion has
# been made
self
.
_done
=
False
def
feed
(
self
,
byte_str
,
num_bytes
):
if
self
.
_done
:
return
# The buffer we got is byte oriented, and a character may span in more than one
# buffers. In case the last one or two byte in last buffer is not
# complete, we record how many byte needed to complete that character
# and skip these bytes here. We can choose to record those bytes as
# well and analyse the character once it is complete, but since a
# character will not make much difference, by simply skipping
# this character will simply our logic and improve performance.
i
=
self
.
_need_to_skip_char_num
while
i
<
num_bytes
:
order
,
char_len
=
self
.
get_order
(
byte_str
[
i
:
i
+
2
])
i
+=
char_len
if
i
>
num_bytes
:
self
.
_need_to_skip_char_num
=
i
-
num_bytes
self
.
_last_char_order
=
-
1
else
:
if
(
order
!=
-
1
)
and
(
self
.
_last_char_order
!=
-
1
):
self
.
_total_rel
+=
1
if
self
.
_total_rel
>
self
.
MAX_REL_THRESHOLD
:
self
.
_done
=
True
break
self
.
_rel_sample
[
jp2CharContext
[
self
.
_last_char_order
][
order
]]
+=
1
self
.
_last_char_order
=
order
def
got_enough_data
(
self
):
return
self
.
_total_rel
>
self
.
ENOUGH_REL_THRESHOLD
def
get_confidence
(
self
):
# This is just one way to calculate confidence. It works well for me.
if
self
.
_total_rel
>
self
.
MINIMUM_DATA_THRESHOLD
:
return
(
self
.
_total_rel
-
self
.
_rel_sample
[
0
])
/
self
.
_total_rel
else
:
return
self
.
DONT_KNOW
def
get_order
(
self
,
byte_str
):
return
-
1
,
1
class
SJISContextAnalysis
(
JapaneseContextAnalysis
):
def
__init__
(
self
):
super
(
SJISContextAnalysis
,
self
)
.
__init__
()
self
.
_charset_name
=
"SHIFT_JIS"
@property
def
charset_name
(
self
):
return
self
.
_charset_name
def
get_order
(
self
,
byte_str
):
if
not
byte_str
:
return
-
1
,
1
# find out current char's byte length
first_char
=
byte_str
[
0
]
if
(
0x81
<=
first_char
<=
0x9F
)
or
(
0xE0
<=
first_char
<=
0xFC
):
char_len
=
2
if
(
first_char
==
0x87
)
or
(
0xFA
<=
first_char
<=
0xFC
):
self
.
_charset_name
=
"CP932"
else
:
char_len
=
1
# return its order if it is hiragana
if
len
(
byte_str
)
>
1
:
second_char
=
byte_str
[
1
]
if
(
first_char
==
202
)
and
(
0x9F
<=
second_char
<=
0xF1
):
return
second_char
-
0x9F
,
char_len
return
-
1
,
char_len
class
EUCJPContextAnalysis
(
JapaneseContextAnalysis
):
def
get_order
(
self
,
byte_str
):
if
not
byte_str
:
return
-
1
,
1
# find out current char's byte length
first_char
=
byte_str
[
0
]
if
(
first_char
==
0x8E
)
or
(
0xA1
<=
first_char
<=
0xFE
):
char_len
=
2
elif
first_char
==
0x8F
:
char_len
=
3
else
:
char_len
=
1
# return its order if it is hiragana
if
len
(
byte_str
)
>
1
:
second_char
=
byte_str
[
1
]
if
(
first_char
==
0xA4
)
and
(
0xA1
<=
second_char
<=
0xF3
):
return
second_char
-
0xA1
,
char_len
return
-
1
,
char_len
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment