1*e7b1675dSTing-Kang Changload("@rules_python//python:defs.bzl", "py_library", "py_test") 2*e7b1675dSTing-Kang Changload("@tink_py_pip_deps//:requirements.bzl", "requirement") 3*e7b1675dSTing-Kang Chang 4*e7b1675dSTing-Kang Changpackage(default_visibility = ["//:__subpackages__"]) 5*e7b1675dSTing-Kang Chang 6*e7b1675dSTing-Kang Changlicenses(["notice"]) 7*e7b1675dSTing-Kang Chang 8*e7b1675dSTing-Kang Changpy_library( 9*e7b1675dSTing-Kang Chang name = "jwt", 10*e7b1675dSTing-Kang Chang srcs = ["__init__.py"], 11*e7b1675dSTing-Kang Chang srcs_version = "PY3", 12*e7b1675dSTing-Kang Chang visibility = ["//visibility:public"], 13*e7b1675dSTing-Kang Chang deps = [ 14*e7b1675dSTing-Kang Chang ":_jwk_set_converter", 15*e7b1675dSTing-Kang Chang ":_jwt_error", 16*e7b1675dSTing-Kang Chang ":_jwt_hmac_key_manager", 17*e7b1675dSTing-Kang Chang ":_jwt_key_templates", 18*e7b1675dSTing-Kang Chang ":_jwt_mac", 19*e7b1675dSTing-Kang Chang ":_jwt_mac_wrapper", 20*e7b1675dSTing-Kang Chang ":_jwt_public_key_sign", 21*e7b1675dSTing-Kang Chang ":_jwt_public_key_verify", 22*e7b1675dSTing-Kang Chang ":_jwt_signature_key_manager", 23*e7b1675dSTing-Kang Chang ":_jwt_signature_wrappers", 24*e7b1675dSTing-Kang Chang ":_jwt_validator", 25*e7b1675dSTing-Kang Chang ":_raw_jwt", 26*e7b1675dSTing-Kang Chang ":_verified_jwt", 27*e7b1675dSTing-Kang Chang ], 28*e7b1675dSTing-Kang Chang) 29*e7b1675dSTing-Kang Chang 30*e7b1675dSTing-Kang Changpy_library( 31*e7b1675dSTing-Kang Chang name = "_raw_jwt", 32*e7b1675dSTing-Kang Chang srcs = ["_raw_jwt.py"], 33*e7b1675dSTing-Kang Chang srcs_version = "PY3", 34*e7b1675dSTing-Kang Chang deps = [ 35*e7b1675dSTing-Kang Chang ":_json_util", 36*e7b1675dSTing-Kang Chang ":_jwt_error", 37*e7b1675dSTing-Kang Chang ], 38*e7b1675dSTing-Kang Chang) 39*e7b1675dSTing-Kang Chang 40*e7b1675dSTing-Kang Changpy_test( 41*e7b1675dSTing-Kang Chang name = "_raw_jwt_test", 42*e7b1675dSTing-Kang Chang srcs = ["_raw_jwt_test.py"], 43*e7b1675dSTing-Kang Chang srcs_version = "PY3", 44*e7b1675dSTing-Kang Chang deps = [ 45*e7b1675dSTing-Kang Chang ":jwt", 46*e7b1675dSTing-Kang Chang requirement("absl-py"), 47*e7b1675dSTing-Kang Chang ], 48*e7b1675dSTing-Kang Chang) 49*e7b1675dSTing-Kang Chang 50*e7b1675dSTing-Kang Changpy_library( 51*e7b1675dSTing-Kang Chang name = "_verified_jwt", 52*e7b1675dSTing-Kang Chang srcs = ["_verified_jwt.py"], 53*e7b1675dSTing-Kang Chang srcs_version = "PY3", 54*e7b1675dSTing-Kang Chang deps = [ 55*e7b1675dSTing-Kang Chang ":_raw_jwt", 56*e7b1675dSTing-Kang Chang "//tink/core", 57*e7b1675dSTing-Kang Chang ], 58*e7b1675dSTing-Kang Chang) 59*e7b1675dSTing-Kang Chang 60*e7b1675dSTing-Kang Changpy_test( 61*e7b1675dSTing-Kang Chang name = "_verified_jwt_test", 62*e7b1675dSTing-Kang Chang srcs = ["_verified_jwt_test.py"], 63*e7b1675dSTing-Kang Chang srcs_version = "PY3", 64*e7b1675dSTing-Kang Chang deps = [ 65*e7b1675dSTing-Kang Chang ":jwt", 66*e7b1675dSTing-Kang Chang requirement("absl-py"), 67*e7b1675dSTing-Kang Chang ], 68*e7b1675dSTing-Kang Chang) 69*e7b1675dSTing-Kang Chang 70*e7b1675dSTing-Kang Changpy_library( 71*e7b1675dSTing-Kang Chang name = "_jwt_validator", 72*e7b1675dSTing-Kang Chang srcs = ["_jwt_validator.py"], 73*e7b1675dSTing-Kang Chang srcs_version = "PY3", 74*e7b1675dSTing-Kang Chang deps = [ 75*e7b1675dSTing-Kang Chang ":_jwt_error", 76*e7b1675dSTing-Kang Chang ":_raw_jwt", 77*e7b1675dSTing-Kang Chang ], 78*e7b1675dSTing-Kang Chang) 79*e7b1675dSTing-Kang Chang 80*e7b1675dSTing-Kang Changpy_test( 81*e7b1675dSTing-Kang Chang name = "_jwt_validator_test", 82*e7b1675dSTing-Kang Chang srcs = ["_jwt_validator_test.py"], 83*e7b1675dSTing-Kang Chang srcs_version = "PY3", 84*e7b1675dSTing-Kang Chang deps = [ 85*e7b1675dSTing-Kang Chang ":_jwt_validator", 86*e7b1675dSTing-Kang Chang ":jwt", 87*e7b1675dSTing-Kang Chang requirement("absl-py"), 88*e7b1675dSTing-Kang Chang ], 89*e7b1675dSTing-Kang Chang) 90*e7b1675dSTing-Kang Chang 91*e7b1675dSTing-Kang Changpy_library( 92*e7b1675dSTing-Kang Chang name = "_jwt_key_templates", 93*e7b1675dSTing-Kang Chang srcs = ["_jwt_key_templates.py"], 94*e7b1675dSTing-Kang Chang srcs_version = "PY3", 95*e7b1675dSTing-Kang Chang deps = [ 96*e7b1675dSTing-Kang Chang "//tink:tink_python", 97*e7b1675dSTing-Kang Chang "//tink/internal:big_integer_util", 98*e7b1675dSTing-Kang Chang "//tink/proto:jwt_ecdsa_py_pb2", 99*e7b1675dSTing-Kang Chang "//tink/proto:jwt_hmac_py_pb2", 100*e7b1675dSTing-Kang Chang "//tink/proto:jwt_rsa_ssa_pkcs1_py_pb2", 101*e7b1675dSTing-Kang Chang "//tink/proto:jwt_rsa_ssa_pss_py_pb2", 102*e7b1675dSTing-Kang Chang "//tink/proto:tink_py_pb2", 103*e7b1675dSTing-Kang Chang ], 104*e7b1675dSTing-Kang Chang) 105*e7b1675dSTing-Kang Chang 106*e7b1675dSTing-Kang Changpy_test( 107*e7b1675dSTing-Kang Chang name = "_jwt_key_templates_test", 108*e7b1675dSTing-Kang Chang srcs = ["_jwt_key_templates_test.py"], 109*e7b1675dSTing-Kang Chang srcs_version = "PY3", 110*e7b1675dSTing-Kang Chang deps = [ 111*e7b1675dSTing-Kang Chang ":jwt", 112*e7b1675dSTing-Kang Chang requirement("absl-py"), 113*e7b1675dSTing-Kang Chang ], 114*e7b1675dSTing-Kang Chang) 115*e7b1675dSTing-Kang Chang 116*e7b1675dSTing-Kang Changpy_library( 117*e7b1675dSTing-Kang Chang name = "_jwt_error", 118*e7b1675dSTing-Kang Chang srcs = ["_jwt_error.py"], 119*e7b1675dSTing-Kang Chang srcs_version = "PY3", 120*e7b1675dSTing-Kang Chang deps = [ 121*e7b1675dSTing-Kang Chang "//tink/core", 122*e7b1675dSTing-Kang Chang ], 123*e7b1675dSTing-Kang Chang) 124*e7b1675dSTing-Kang Chang 125*e7b1675dSTing-Kang Changpy_library( 126*e7b1675dSTing-Kang Chang name = "_json_util", 127*e7b1675dSTing-Kang Chang srcs = ["_json_util.py"], 128*e7b1675dSTing-Kang Chang srcs_version = "PY3", 129*e7b1675dSTing-Kang Chang deps = [":_jwt_error"], 130*e7b1675dSTing-Kang Chang) 131*e7b1675dSTing-Kang Chang 132*e7b1675dSTing-Kang Changpy_test( 133*e7b1675dSTing-Kang Chang name = "_json_util_test", 134*e7b1675dSTing-Kang Chang srcs = ["_json_util_test.py"], 135*e7b1675dSTing-Kang Chang python_version = "PY3", 136*e7b1675dSTing-Kang Chang deps = [ 137*e7b1675dSTing-Kang Chang ":_json_util", 138*e7b1675dSTing-Kang Chang ":_jwt_error", 139*e7b1675dSTing-Kang Chang requirement("absl-py"), 140*e7b1675dSTing-Kang Chang ], 141*e7b1675dSTing-Kang Chang) 142*e7b1675dSTing-Kang Chang 143*e7b1675dSTing-Kang Changpy_library( 144*e7b1675dSTing-Kang Chang name = "_jwt_format", 145*e7b1675dSTing-Kang Chang srcs = ["_jwt_format.py"], 146*e7b1675dSTing-Kang Chang srcs_version = "PY3", 147*e7b1675dSTing-Kang Chang deps = [ 148*e7b1675dSTing-Kang Chang ":_json_util", 149*e7b1675dSTing-Kang Chang ":_jwt_error", 150*e7b1675dSTing-Kang Chang ":_raw_jwt", 151*e7b1675dSTing-Kang Chang "//tink/proto:tink_py_pb2", 152*e7b1675dSTing-Kang Chang ], 153*e7b1675dSTing-Kang Chang) 154*e7b1675dSTing-Kang Chang 155*e7b1675dSTing-Kang Changpy_test( 156*e7b1675dSTing-Kang Chang name = "_jwt_format_test", 157*e7b1675dSTing-Kang Chang srcs = ["_jwt_format_test.py"], 158*e7b1675dSTing-Kang Chang python_version = "PY3", 159*e7b1675dSTing-Kang Chang deps = [ 160*e7b1675dSTing-Kang Chang ":_json_util", 161*e7b1675dSTing-Kang Chang ":_jwt_error", 162*e7b1675dSTing-Kang Chang ":_jwt_format", 163*e7b1675dSTing-Kang Chang ":_raw_jwt", 164*e7b1675dSTing-Kang Chang "//tink/proto:tink_py_pb2", 165*e7b1675dSTing-Kang Chang requirement("absl-py"), 166*e7b1675dSTing-Kang Chang ], 167*e7b1675dSTing-Kang Chang) 168*e7b1675dSTing-Kang Chang 169*e7b1675dSTing-Kang Changpy_library( 170*e7b1675dSTing-Kang Chang name = "_jwt_mac", 171*e7b1675dSTing-Kang Chang srcs = ["_jwt_mac.py"], 172*e7b1675dSTing-Kang Chang srcs_version = "PY3", 173*e7b1675dSTing-Kang Chang deps = [ 174*e7b1675dSTing-Kang Chang ":_jwt_validator", 175*e7b1675dSTing-Kang Chang ":_raw_jwt", 176*e7b1675dSTing-Kang Chang ":_verified_jwt", 177*e7b1675dSTing-Kang Chang ], 178*e7b1675dSTing-Kang Chang) 179*e7b1675dSTing-Kang Chang 180*e7b1675dSTing-Kang Changpy_library( 181*e7b1675dSTing-Kang Chang name = "_jwt_public_key_sign", 182*e7b1675dSTing-Kang Chang srcs = ["_jwt_public_key_sign.py"], 183*e7b1675dSTing-Kang Chang srcs_version = "PY3", 184*e7b1675dSTing-Kang Chang deps = [":_raw_jwt"], 185*e7b1675dSTing-Kang Chang) 186*e7b1675dSTing-Kang Chang 187*e7b1675dSTing-Kang Changpy_library( 188*e7b1675dSTing-Kang Chang name = "_jwt_public_key_verify", 189*e7b1675dSTing-Kang Chang srcs = ["_jwt_public_key_verify.py"], 190*e7b1675dSTing-Kang Chang srcs_version = "PY3", 191*e7b1675dSTing-Kang Chang deps = [ 192*e7b1675dSTing-Kang Chang ":_jwt_validator", 193*e7b1675dSTing-Kang Chang ":_verified_jwt", 194*e7b1675dSTing-Kang Chang ], 195*e7b1675dSTing-Kang Chang) 196*e7b1675dSTing-Kang Chang 197*e7b1675dSTing-Kang Changpy_library( 198*e7b1675dSTing-Kang Chang name = "_jwt_hmac_key_manager", 199*e7b1675dSTing-Kang Chang srcs = ["_jwt_hmac_key_manager.py"], 200*e7b1675dSTing-Kang Chang srcs_version = "PY3", 201*e7b1675dSTing-Kang Chang deps = [ 202*e7b1675dSTing-Kang Chang ":_json_util", 203*e7b1675dSTing-Kang Chang ":_jwt_error", 204*e7b1675dSTing-Kang Chang ":_jwt_format", 205*e7b1675dSTing-Kang Chang ":_jwt_mac", 206*e7b1675dSTing-Kang Chang ":_jwt_validator", 207*e7b1675dSTing-Kang Chang ":_raw_jwt", 208*e7b1675dSTing-Kang Chang ":_verified_jwt", 209*e7b1675dSTing-Kang Chang "//tink/cc/pybind:tink_bindings", 210*e7b1675dSTing-Kang Chang "//tink/core", 211*e7b1675dSTing-Kang Chang "//tink/proto:common_py_pb2", 212*e7b1675dSTing-Kang Chang "//tink/proto:jwt_hmac_py_pb2", 213*e7b1675dSTing-Kang Chang "//tink/proto:tink_py_pb2", 214*e7b1675dSTing-Kang Chang ], 215*e7b1675dSTing-Kang Chang) 216*e7b1675dSTing-Kang Chang 217*e7b1675dSTing-Kang Changpy_test( 218*e7b1675dSTing-Kang Chang name = "_jwt_hmac_key_manager_test", 219*e7b1675dSTing-Kang Chang srcs = ["_jwt_hmac_key_manager_test.py"], 220*e7b1675dSTing-Kang Chang python_version = "PY3", 221*e7b1675dSTing-Kang Chang deps = [ 222*e7b1675dSTing-Kang Chang ":_jwt_format", 223*e7b1675dSTing-Kang Chang ":_jwt_hmac_key_manager", 224*e7b1675dSTing-Kang Chang ":_jwt_mac", 225*e7b1675dSTing-Kang Chang ":jwt", 226*e7b1675dSTing-Kang Chang requirement("absl-py"), 227*e7b1675dSTing-Kang Chang "//tink:tink_python", 228*e7b1675dSTing-Kang Chang "//tink/proto:jwt_hmac_py_pb2", 229*e7b1675dSTing-Kang Chang ], 230*e7b1675dSTing-Kang Chang) 231*e7b1675dSTing-Kang Chang 232*e7b1675dSTing-Kang Changpy_library( 233*e7b1675dSTing-Kang Chang name = "_jwt_mac_wrapper", 234*e7b1675dSTing-Kang Chang srcs = ["_jwt_mac_wrapper.py"], 235*e7b1675dSTing-Kang Chang srcs_version = "PY3", 236*e7b1675dSTing-Kang Chang deps = [ 237*e7b1675dSTing-Kang Chang ":_jwt_error", 238*e7b1675dSTing-Kang Chang ":_jwt_format", 239*e7b1675dSTing-Kang Chang ":_jwt_mac", 240*e7b1675dSTing-Kang Chang ":_jwt_validator", 241*e7b1675dSTing-Kang Chang ":_raw_jwt", 242*e7b1675dSTing-Kang Chang ":_verified_jwt", 243*e7b1675dSTing-Kang Chang "//tink/core", 244*e7b1675dSTing-Kang Chang "//tink/proto:tink_py_pb2", 245*e7b1675dSTing-Kang Chang ], 246*e7b1675dSTing-Kang Chang) 247*e7b1675dSTing-Kang Chang 248*e7b1675dSTing-Kang Changpy_test( 249*e7b1675dSTing-Kang Chang name = "_jwt_mac_wrapper_test", 250*e7b1675dSTing-Kang Chang srcs = ["_jwt_mac_wrapper_test.py"], 251*e7b1675dSTing-Kang Chang python_version = "PY3", 252*e7b1675dSTing-Kang Chang deps = [ 253*e7b1675dSTing-Kang Chang ":_json_util", 254*e7b1675dSTing-Kang Chang ":_jwt_format", 255*e7b1675dSTing-Kang Chang ":jwt", 256*e7b1675dSTing-Kang Chang "//tink/proto:jwt_hmac_py_pb2", 257*e7b1675dSTing-Kang Chang "//tink/proto:tink_py_pb2", 258*e7b1675dSTing-Kang Chang requirement("absl-py"), 259*e7b1675dSTing-Kang Chang "//tink:cleartext_keyset_handle", 260*e7b1675dSTing-Kang Chang "//tink:tink_python", 261*e7b1675dSTing-Kang Chang "//tink/testing:keyset_builder", 262*e7b1675dSTing-Kang Chang ], 263*e7b1675dSTing-Kang Chang) 264*e7b1675dSTing-Kang Chang 265*e7b1675dSTing-Kang Changpy_library( 266*e7b1675dSTing-Kang Chang name = "_jwt_signature_key_manager", 267*e7b1675dSTing-Kang Chang srcs = ["_jwt_signature_key_manager.py"], 268*e7b1675dSTing-Kang Chang srcs_version = "PY3", 269*e7b1675dSTing-Kang Chang deps = [ 270*e7b1675dSTing-Kang Chang ":_json_util", 271*e7b1675dSTing-Kang Chang ":_jwt_error", 272*e7b1675dSTing-Kang Chang ":_jwt_format", 273*e7b1675dSTing-Kang Chang ":_jwt_public_key_sign", 274*e7b1675dSTing-Kang Chang ":_jwt_public_key_verify", 275*e7b1675dSTing-Kang Chang ":_jwt_validator", 276*e7b1675dSTing-Kang Chang ":_raw_jwt", 277*e7b1675dSTing-Kang Chang ":_verified_jwt", 278*e7b1675dSTing-Kang Chang "//tink/cc/pybind:tink_bindings", 279*e7b1675dSTing-Kang Chang "//tink/core", 280*e7b1675dSTing-Kang Chang "//tink/proto:jwt_ecdsa_py_pb2", 281*e7b1675dSTing-Kang Chang "//tink/proto:tink_py_pb2", 282*e7b1675dSTing-Kang Chang ], 283*e7b1675dSTing-Kang Chang) 284*e7b1675dSTing-Kang Chang 285*e7b1675dSTing-Kang Changpy_test( 286*e7b1675dSTing-Kang Chang name = "_jwt_signature_key_manager_test", 287*e7b1675dSTing-Kang Chang srcs = ["_jwt_signature_key_manager_test.py"], 288*e7b1675dSTing-Kang Chang deps = [ 289*e7b1675dSTing-Kang Chang ":_jwt_format", 290*e7b1675dSTing-Kang Chang ":_jwt_signature_key_manager", 291*e7b1675dSTing-Kang Chang ":_jwt_signature_wrappers", 292*e7b1675dSTing-Kang Chang ":jwt", 293*e7b1675dSTing-Kang Chang "//tink/proto:jwt_ecdsa_py_pb2", 294*e7b1675dSTing-Kang Chang "//tink/proto:tink_py_pb2", 295*e7b1675dSTing-Kang Chang requirement("absl-py"), 296*e7b1675dSTing-Kang Chang "//tink:tink_python", 297*e7b1675dSTing-Kang Chang ], 298*e7b1675dSTing-Kang Chang) 299*e7b1675dSTing-Kang Chang 300*e7b1675dSTing-Kang Changpy_library( 301*e7b1675dSTing-Kang Chang name = "_jwt_signature_wrappers", 302*e7b1675dSTing-Kang Chang srcs = ["_jwt_signature_wrappers.py"], 303*e7b1675dSTing-Kang Chang srcs_version = "PY3", 304*e7b1675dSTing-Kang Chang deps = [ 305*e7b1675dSTing-Kang Chang ":_jwt_error", 306*e7b1675dSTing-Kang Chang ":_jwt_format", 307*e7b1675dSTing-Kang Chang ":_jwt_public_key_sign", 308*e7b1675dSTing-Kang Chang ":_jwt_public_key_verify", 309*e7b1675dSTing-Kang Chang ":_jwt_validator", 310*e7b1675dSTing-Kang Chang ":_raw_jwt", 311*e7b1675dSTing-Kang Chang ":_verified_jwt", 312*e7b1675dSTing-Kang Chang "//tink/core", 313*e7b1675dSTing-Kang Chang "//tink/proto:tink_py_pb2", 314*e7b1675dSTing-Kang Chang ], 315*e7b1675dSTing-Kang Chang) 316*e7b1675dSTing-Kang Chang 317*e7b1675dSTing-Kang Changpy_test( 318*e7b1675dSTing-Kang Chang name = "_jwt_signature_wrappers_test", 319*e7b1675dSTing-Kang Chang srcs = ["_jwt_signature_wrappers_test.py"], 320*e7b1675dSTing-Kang Chang python_version = "PY3", 321*e7b1675dSTing-Kang Chang srcs_version = "PY3", 322*e7b1675dSTing-Kang Chang deps = [ 323*e7b1675dSTing-Kang Chang ":_json_util", 324*e7b1675dSTing-Kang Chang ":_jwt_format", 325*e7b1675dSTing-Kang Chang ":jwt", 326*e7b1675dSTing-Kang Chang "//tink/proto:jwt_ecdsa_py_pb2", 327*e7b1675dSTing-Kang Chang "//tink/proto:jwt_rsa_ssa_pkcs1_py_pb2", 328*e7b1675dSTing-Kang Chang "//tink/proto:jwt_rsa_ssa_pss_py_pb2", 329*e7b1675dSTing-Kang Chang "//tink/proto:tink_py_pb2", 330*e7b1675dSTing-Kang Chang requirement("absl-py"), 331*e7b1675dSTing-Kang Chang "//tink:cleartext_keyset_handle", 332*e7b1675dSTing-Kang Chang "//tink:tink_python", 333*e7b1675dSTing-Kang Chang "//tink/testing:keyset_builder", 334*e7b1675dSTing-Kang Chang ], 335*e7b1675dSTing-Kang Chang) 336*e7b1675dSTing-Kang Chang 337*e7b1675dSTing-Kang Changpy_library( 338*e7b1675dSTing-Kang Chang name = "_jwk_set_converter", 339*e7b1675dSTing-Kang Chang srcs = ["_jwk_set_converter.py"], 340*e7b1675dSTing-Kang Chang srcs_version = "PY3", 341*e7b1675dSTing-Kang Chang deps = [ 342*e7b1675dSTing-Kang Chang "//tink:cleartext_keyset_handle", 343*e7b1675dSTing-Kang Chang "//tink:tink_python", 344*e7b1675dSTing-Kang Chang "//tink/proto:jwt_ecdsa_py_pb2", 345*e7b1675dSTing-Kang Chang "//tink/proto:jwt_rsa_ssa_pkcs1_py_pb2", 346*e7b1675dSTing-Kang Chang "//tink/proto:jwt_rsa_ssa_pss_py_pb2", 347*e7b1675dSTing-Kang Chang "//tink/proto:tink_py_pb2", 348*e7b1675dSTing-Kang Chang ], 349*e7b1675dSTing-Kang Chang) 350*e7b1675dSTing-Kang Chang 351*e7b1675dSTing-Kang Changpy_test( 352*e7b1675dSTing-Kang Chang name = "_jwk_set_converter_test", 353*e7b1675dSTing-Kang Chang srcs = ["_jwk_set_converter_test.py"], 354*e7b1675dSTing-Kang Chang python_version = "PY3", 355*e7b1675dSTing-Kang Chang srcs_version = "PY3", 356*e7b1675dSTing-Kang Chang deps = [ 357*e7b1675dSTing-Kang Chang ":jwt", 358*e7b1675dSTing-Kang Chang requirement("absl-py"), 359*e7b1675dSTing-Kang Chang "//tink:cleartext_keyset_handle", 360*e7b1675dSTing-Kang Chang "//tink:tink_python", 361*e7b1675dSTing-Kang Chang ], 362*e7b1675dSTing-Kang Chang) 363