// Copyright 2026 International Digital Economy Academy
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

///|
/// Generated from refs/harfbuzz/src/hb-ot-shaper-indic-table.cc.
///
let indic_table : Array[UInt] = [
  3584U, 3584U, 3584U, 3584U, 3584U, 1034U, 3584U, 3584U, 1034U, 1034U, 1034U, 1034U,
  1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U,
  3584U, 3584U, 3385U, 3385U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U,
  3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U,
  3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U,
  3584U, 3584U, 3584U, 1034U, 3336U, 3336U, 3336U, 3336U, 1026U, 1026U, 1026U, 1026U,
  1026U, 1026U, 1026U, 1026U, 1026U, 1026U, 1026U, 1026U, 1026U, 1026U, 1026U, 1026U,
  1026U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U,
  1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U,
  1025U, 1025U, 1025U, 1025U, 1039U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U,
  1025U, 1025U, 2311U, 2311U, 3587U, 3345U, 2311U, 519U, 2311U, 2311U, 2311U, 2311U,
  2311U, 2311U, 2311U, 2311U, 2311U, 2311U, 2311U, 2311U, 2311U, 2052U, 519U, 2311U,
  3584U, 3337U, 3337U, 3336U, 3336U, 2311U, 2311U, 2311U, 1025U, 1025U, 1025U, 1025U,
  1025U, 1025U, 1025U, 1025U, 1026U, 1026U, 2311U, 2311U, 3584U, 3584U, 1034U, 1034U,
  1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 3584U, 3584U, 1026U, 1026U,
  1026U, 1026U, 1026U, 1026U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U,
  1034U, 3336U, 3336U, 3336U, 3584U, 1026U, 1026U, 1026U, 1026U, 1026U, 1026U, 1026U,
  1026U, 3584U, 3584U, 1026U, 1026U, 3584U, 3584U, 1026U, 1026U, 1025U, 1025U, 1025U,
  1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U,
  1025U, 1025U, 1025U, 1025U, 1025U, 3584U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U,
  1039U, 3584U, 1025U, 3584U, 3584U, 3584U, 1025U, 1025U, 1025U, 1025U, 3584U, 3584U,
  3587U, 3345U, 3079U, 519U, 3079U, 2311U, 2311U, 2311U, 2311U, 3584U, 3584U, 519U,
  519U, 3584U, 3584U, 3079U, 3079U, 2052U, 1025U, 3584U, 3584U, 3584U, 3584U, 3584U,
  3584U, 3584U, 3584U, 3079U, 3584U, 3584U, 3584U, 3584U, 1025U, 1025U, 3584U, 1025U,
  1026U, 1026U, 2311U, 2311U, 3584U, 3584U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U,
  1034U, 1034U, 1034U, 1034U, 1039U, 1025U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U,
  3584U, 3584U, 3584U, 3584U, 1034U, 3584U, 3336U, 3584U, 3584U, 3336U, 3336U, 3336U,
  3584U, 1026U, 1026U, 1026U, 1026U, 1026U, 1026U, 3584U, 3584U, 3584U, 3584U, 1026U,
  1026U, 3584U, 3584U, 1026U, 1026U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U,
  1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U,
  1025U, 3584U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1039U, 3584U, 1025U, 1025U,
  3584U, 1025U, 1025U, 3584U, 1025U, 1025U, 3584U, 3584U, 3587U, 3584U, 3079U, 519U,
  3085U, 3079U, 3079U, 3584U, 3584U, 3584U, 3584U, 3079U, 3079U, 3584U, 3584U, 3079U,
  3079U, 2052U, 3584U, 3584U, 3584U, 2055U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U,
  3584U, 1025U, 1025U, 1025U, 1025U, 3584U, 1025U, 3584U, 3584U, 3584U, 3584U, 3584U,
  3584U, 3584U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U,
  3336U, 3336U, 1025U, 1025U, 3584U, 1040U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U,
  3584U, 3584U, 3584U, 3584U, 3584U, 3336U, 3336U, 3336U, 3584U, 1026U, 1026U, 1026U,
  1026U, 1026U, 1026U, 1026U, 1026U, 1026U, 3584U, 1026U, 1026U, 1026U, 3584U, 1026U,
  1026U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U,
  1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 3584U, 1025U, 1025U,
  1025U, 1025U, 1025U, 1025U, 1039U, 3584U, 1025U, 1025U, 3584U, 1025U, 1025U, 1025U,
  1025U, 1025U, 3584U, 3584U, 3587U, 3345U, 3079U, 519U, 3079U, 3079U, 3079U, 3079U,
  3079U, 2311U, 3584U, 2311U, 2311U, 3079U, 3584U, 3079U, 3079U, 2052U, 3584U, 3584U,
  3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U,
  3584U, 3584U, 3584U, 3584U, 1026U, 1026U, 3079U, 3079U, 3584U, 3584U, 1034U, 1034U,
  1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 3584U, 3584U, 3584U, 3584U,
  3584U, 3584U, 3584U, 3584U, 3584U, 1025U, 3337U, 3587U, 3337U, 3587U, 3587U, 3587U,
  3584U, 1800U, 3336U, 3336U, 3584U, 1026U, 1026U, 1026U, 1026U, 1026U, 1026U, 1026U,
  1026U, 3584U, 3584U, 1026U, 1026U, 3584U, 3584U, 1026U, 1026U, 1025U, 1025U, 1025U,
  1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U,
  1025U, 1025U, 1025U, 1025U, 1025U, 3584U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U,
  1039U, 3584U, 1025U, 1025U, 3584U, 1025U, 1025U, 1025U, 1025U, 1025U, 3584U, 3584U,
  3587U, 3345U, 3079U, 1287U, 3079U, 2311U, 2311U, 2311U, 2311U, 3584U, 3584U, 519U,
  1287U, 3584U, 3584U, 3079U, 3079U, 2052U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U,
  3584U, 3587U, 1287U, 3079U, 3584U, 3584U, 3584U, 3584U, 1025U, 1025U, 3584U, 1025U,
  1026U, 1026U, 2311U, 2311U, 3584U, 3584U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U,
  1034U, 1034U, 1034U, 1034U, 3584U, 1025U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U,
  3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3336U, 3584U,
  3584U, 1026U, 1026U, 1026U, 1026U, 1026U, 1026U, 3584U, 3584U, 3584U, 1026U, 1026U,
  1026U, 3584U, 1026U, 1026U, 1026U, 1025U, 3584U, 3584U, 3584U, 1025U, 1025U, 3584U,
  1025U, 3584U, 1025U, 1025U, 3584U, 3584U, 3584U, 1025U, 1025U, 3584U, 3584U, 3584U,
  1025U, 1025U, 1025U, 3584U, 3584U, 3584U, 1025U, 1025U, 1039U, 1025U, 1025U, 1025U,
  1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 3584U, 3584U, 3584U, 3584U, 3079U, 3079U,
  2311U, 3079U, 3079U, 3584U, 3584U, 3584U, 519U, 519U, 519U, 3584U, 3079U, 3079U,
  3079U, 1540U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3079U,
  3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U,
  3584U, 3584U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U,
  3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U,
  3584U, 3584U, 3584U, 3584U, 3336U, 3336U, 3336U, 3336U, 3336U, 1026U, 1026U, 1026U,
  1026U, 1026U, 1026U, 1026U, 1026U, 3584U, 1026U, 1026U, 1026U, 3584U, 1026U, 1026U,
  1026U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U,
  1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 3584U, 1025U, 1025U,
  1025U, 1025U, 1025U, 1025U, 1039U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U,
  1025U, 1025U, 3584U, 3584U, 3587U, 3345U, 1799U, 1799U, 1799U, 1799U, 1799U, 2311U,
  2311U, 3584U, 1799U, 1799U, 1799U, 3584U, 1799U, 1799U, 1799U, 1540U, 3584U, 3584U,
  3584U, 3584U, 3584U, 3584U, 3584U, 1799U, 1799U, 3584U, 1025U, 1025U, 1025U, 3584U,
  3584U, 1025U, 3584U, 3584U, 1026U, 1026U, 1799U, 1799U, 3584U, 3584U, 1034U, 1034U,
  1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 3584U, 3584U, 3584U, 3584U,
  3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U,
  1034U, 3336U, 3336U, 3336U, 3584U, 1026U, 1026U, 1026U, 1026U, 1026U, 1026U, 1026U,
  1026U, 3584U, 1026U, 1026U, 1026U, 3584U, 1026U, 1026U, 1026U, 1025U, 1025U, 1025U,
  1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U,
  1025U, 1025U, 1025U, 1025U, 1025U, 3584U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U,
  1039U, 1025U, 1025U, 1025U, 3584U, 1025U, 1025U, 1025U, 1025U, 1025U, 3584U, 3584U,
  3587U, 3345U, 1799U, 1799U, 1799U, 1799U, 1799U, 2311U, 2311U, 3584U, 1799U, 2311U,
  2311U, 3584U, 2311U, 2311U, 1799U, 1540U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U,
  3584U, 2311U, 2311U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 1025U, 1025U, 3584U,
  1026U, 1026U, 1799U, 1799U, 3584U, 3584U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U,
  1034U, 1034U, 1034U, 1034U, 3584U, 1042U, 1042U, 3336U, 3584U, 3584U, 3584U, 3584U,
  3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3336U, 3336U, 3336U, 3336U,
  1034U, 1026U, 1026U, 1026U, 1026U, 1026U, 1026U, 1026U, 1026U, 3584U, 1026U, 1026U,
  1026U, 3584U, 1026U, 1026U, 1026U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U,
  1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U,
  1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1039U, 1025U, 1025U, 1025U,
  1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 2311U, 2311U, 3345U, 3079U, 3079U,
  3079U, 3079U, 3079U, 3079U, 3079U, 3584U, 519U, 519U, 519U, 3584U, 3079U, 3079U,
  3079U, 1540U, 3598U, 3584U, 3584U, 3584U, 3584U, 3584U, 1025U, 1025U, 1025U, 3079U,
  3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 1026U, 1026U, 1026U, 3079U, 3079U,
  3584U, 3584U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U,
  3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 1025U, 1025U,
  1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1039U, 1025U, 1025U, 1025U,
  1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U,
  1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1039U, 1025U, 1025U, 1025U, 1025U,
  1025U, 1026U, 1026U, 1026U, 1026U, 1026U, 1026U, 1026U, 1026U, 1026U, 1026U, 2839U,
  2839U, 1556U, 1556U, 2069U, 2069U, 790U, 3337U, 1556U, 1556U, 1556U, 3337U, 3587U,
  3336U, 3588U, 3616U, 3622U, 3620U, 3621U, 3619U, 1025U, 1034U, 1034U, 1034U, 1034U,
  1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 3584U, 3584U, 1025U, 3584U,
  1025U, 1025U, 1026U, 1026U, 1026U, 1026U, 2839U, 2839U, 2069U, 2069U, 1039U, 1025U,
  1025U, 1025U, 3622U, 3622U, 3625U, 1025U, 2839U, 3623U, 3623U, 1025U, 1025U, 2839U,
  2839U, 3623U, 3623U, 3623U, 3623U, 3623U, 1025U, 1025U, 1025U, 1556U, 1556U, 1556U,
  1556U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U,
  1025U, 1025U, 3621U, 2839U, 790U, 1556U, 1556U, 3336U, 3336U, 3336U, 3336U, 3336U,
  3336U, 3336U, 1025U, 3336U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U,
  1034U, 1034U, 3336U, 3336U, 3336U, 1556U, 3584U, 3584U, 1025U, 1025U, 1025U, 1025U,
  1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U,
  1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1039U, 1025U,
  1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1026U, 1026U, 1026U, 1026U, 1026U,
  1026U, 1026U, 1026U, 1026U, 1026U, 1026U, 1026U, 1026U, 1026U, 1026U, 1026U, 1026U,
  3584U, 3584U, 2839U, 1556U, 1556U, 1556U, 1556U, 2069U, 2069U, 2069U, 1556U, 2839U,
  2839U, 790U, 790U, 790U, 2839U, 2839U, 3610U, 3611U, 3611U, 3609U, 3609U, 3610U,
  3609U, 3610U, 3610U, 3610U, 3610U, 3610U, 3588U, 3611U, 3584U, 3584U, 3584U, 3584U,
  3584U, 1034U, 3584U, 3584U, 3345U, 3611U, 3584U, 3584U, 1034U, 1034U, 1034U, 1034U,
  1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U,
  3337U, 3337U, 3337U, 3584U, 3337U, 3337U, 3337U, 3337U, 3337U, 3337U, 3337U, 3337U,
  3337U, 3337U, 3337U, 3337U, 3337U, 3337U, 3337U, 3337U, 3337U, 3337U, 3337U, 3337U,
  3337U, 3345U, 3345U, 3345U, 3345U, 3337U, 3345U, 3345U, 3345U, 3345U, 1025U, 1025U,
  3337U, 1025U, 1025U, 3337U, 3337U, 3337U, 1034U, 3584U, 3584U, 3584U, 3584U, 3584U,
  3584U, 3584U, 3584U, 3584U, 3589U, 3590U, 3584U, 3584U, 1034U, 1034U, 1034U, 1034U,
  1034U, 1034U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U,
  3584U, 3584U, 1034U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U,
  3385U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U,
  3584U, 3584U, 3385U, 3385U, 3385U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 1034U,
  1034U, 1034U, 1034U, 3584U, 3337U, 3337U, 3337U, 3337U, 3337U, 3337U, 3337U, 3337U,
  3337U, 3337U, 3337U, 3337U, 3337U, 3337U, 3337U, 3337U, 3337U, 3337U, 3345U, 3345U,
  3345U, 3345U, 3345U, 3345U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 1026U, 2311U,
  1025U, 1025U, 1025U, 1025U, 1025U, 1556U, 3584U, 1025U, 1025U, 1025U, 1025U, 1025U,
  1025U, 1025U, 1025U, 1025U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U,
  1034U, 1034U, 1025U, 1025U, 1025U, 1025U, 1025U, 3584U, 1025U, 1025U, 1025U, 1025U,
  1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U, 1025U,
  3584U, 1025U, 1025U, 1025U, 1034U, 1034U, 1034U, 3584U, 3584U, 3584U, 1025U, 3623U,
  3587U, 3587U, 1025U, 1025U, 3624U, 3624U, 3624U, 3624U, 3624U, 3624U, 3624U, 3624U,
  3624U, 3624U, 3624U, 3624U, 3624U, 3624U, 3624U, 3624U, 3584U, 3336U, 3336U, 3336U,
  3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3584U, 3587U, 3587U, 3584U, 3584U, 3584U,
  1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U,
  1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 1034U, 3584U, 3584U, 3584U, 3584U,
]

priv struct IndicRange {
  start : UInt
  end : UInt
  offset : Int
}

let indic_ranges : Array[IndicRange] = [
  IndicRange::{ start: 0x0028U, end: 0x003FU, offset: 0 },
  IndicRange::{ start: 0x00B0U, end: 0x00D7U, offset: 24 },
  IndicRange::{ start: 0x0900U, end: 0x0D7FU, offset: 64 },
  IndicRange::{ start: 0x1000U, end: 0x109FU, offset: 1216 },
  IndicRange::{ start: 0x1780U, end: 0x17EFU, offset: 1376 },
  IndicRange::{ start: 0x1CD0U, end: 0x1CFFU, offset: 1488 },
  IndicRange::{ start: 0x2008U, end: 0x2027U, offset: 1536 },
  IndicRange::{ start: 0x2070U, end: 0x2087U, offset: 1568 },
  IndicRange::{ start: 0x25F8U, end: 0x25FFU, offset: 1592 },
  IndicRange::{ start: 0xA8E0U, end: 0xA8FFU, offset: 1600 },
  IndicRange::{ start: 0xA9E0U, end: 0xA9FFU, offset: 1632 },
  IndicRange::{ start: 0xAA60U, end: 0xAA7FU, offset: 1664 },
  IndicRange::{ start: 0xFE00U, end: 0xFE0FU, offset: 1696 },
  IndicRange::{ start: 0x11300U, end: 0x11307U, offset: 1712 },
  IndicRange::{ start: 0x11338U, end: 0x1133FU, offset: 1720 },
  IndicRange::{ start: 0x116D0U, end: 0x116E7U, offset: 1728 },
]

let indic_special_00a0 : UInt = 1034U
let indic_special_25cc : UInt = 1035U

let indic_default : UInt = 3584U

fn indic_get_categories(u : UInt) -> UInt {
  if u == 0x00A0U {
    return indic_special_00a0
  }
  if u == 0x25CCU {
    return indic_special_25cc
  }
  for range in indic_ranges {
    if u >= range.start && u <= range.end {
      let index = (u - range.start).reinterpret_as_int() + range.offset
      return indic_table[index]
    }
  }
  indic_default
}

fn indic_category(value : UInt) -> UInt {
  value & 0xffU
}

fn indic_position(value : UInt) -> Int {
  (value >> 8).reinterpret_as_int()
}