/* Generated by Cython 0.24 */

/* BEGIN: Cython Metadata
{
    "distutils": {}
}
END: Cython Metadata */

#define PY_SSIZE_T_CLEAN
#include "Python.h"
#ifndef Py_PYTHON_H
    #error Python headers needed to compile C extensions, please install development version of Python.
#elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03020000)
    #error Cython requires Python 2.6+ or Python 3.2+.
#else
#define CYTHON_ABI "0_24"
#include <stddef.h>
#ifndef offsetof
  #define offsetof(type, member) ( (size_t) & ((type*)0) -> member )
#endif
#if !defined(WIN32) && !defined(MS_WINDOWS)
  #ifndef __stdcall
    #define __stdcall
  #endif
  #ifndef __cdecl
    #define __cdecl
  #endif
  #ifndef __fastcall
    #define __fastcall
  #endif
#endif
#ifndef DL_IMPORT
  #define DL_IMPORT(t) t
#endif
#ifndef DL_EXPORT
  #define DL_EXPORT(t) t
#endif
#ifndef PY_LONG_LONG
  #define PY_LONG_LONG LONG_LONG
#endif
#ifndef Py_HUGE_VAL
  #define Py_HUGE_VAL HUGE_VAL
#endif
#ifdef PYPY_VERSION
  #define CYTHON_COMPILING_IN_PYPY 1
  #define CYTHON_COMPILING_IN_CPYTHON 0
#else
  #define CYTHON_COMPILING_IN_PYPY 0
  #define CYTHON_COMPILING_IN_CPYTHON 1
#endif
#if !defined(CYTHON_USE_PYLONG_INTERNALS) && CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x02070000
  #define CYTHON_USE_PYLONG_INTERNALS 1
#endif
#if CYTHON_USE_PYLONG_INTERNALS
  #include "longintrepr.h"
  #undef SHIFT
  #undef BASE
  #undef MASK
#endif
#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag)
  #define Py_OptimizeFlag 0
#endif
#define __PYX_BUILD_PY_SSIZE_T "n"
#define CYTHON_FORMAT_SSIZE_T "z"
#if PY_MAJOR_VERSION < 3
  #define __Pyx_BUILTIN_MODULE_NAME "__builtin__"
  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\
          PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
  #define __Pyx_DefaultClassType PyClass_Type
#else
  #define __Pyx_BUILTIN_MODULE_NAME "builtins"
  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\
          PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
  #define __Pyx_DefaultClassType PyType_Type
#endif
#ifndef Py_TPFLAGS_CHECKTYPES
  #define Py_TPFLAGS_CHECKTYPES 0
#endif
#ifndef Py_TPFLAGS_HAVE_INDEX
  #define Py_TPFLAGS_HAVE_INDEX 0
#endif
#ifndef Py_TPFLAGS_HAVE_NEWBUFFER
  #define Py_TPFLAGS_HAVE_NEWBUFFER 0
#endif
#ifndef Py_TPFLAGS_HAVE_FINALIZE
  #define Py_TPFLAGS_HAVE_FINALIZE 0
#endif
#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND)
  #define CYTHON_PEP393_ENABLED 1
  #define __Pyx_PyUnicode_READY(op)       (likely(PyUnicode_IS_READY(op)) ?\
                                              0 : _PyUnicode_Ready((PyObject *)(op)))
  #define __Pyx_PyUnicode_GET_LENGTH(u)   PyUnicode_GET_LENGTH(u)
  #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i)
  #define __Pyx_PyUnicode_KIND(u)         PyUnicode_KIND(u)
  #define __Pyx_PyUnicode_DATA(u)         PyUnicode_DATA(u)
  #define __Pyx_PyUnicode_READ(k, d, i)   PyUnicode_READ(k, d, i)
  #define __Pyx_PyUnicode_IS_TRUE(u)      (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u)))
#else
  #define CYTHON_PEP393_ENABLED 0
  #define __Pyx_PyUnicode_READY(op)       (0)
  #define __Pyx_PyUnicode_GET_LENGTH(u)   PyUnicode_GET_SIZE(u)
  #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i]))
  #define __Pyx_PyUnicode_KIND(u)         (sizeof(Py_UNICODE))
  #define __Pyx_PyUnicode_DATA(u)         ((void*)PyUnicode_AS_UNICODE(u))
  #define __Pyx_PyUnicode_READ(k, d, i)   ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i]))
  #define __Pyx_PyUnicode_IS_TRUE(u)      (0 != PyUnicode_GET_SIZE(u))
#endif
#if CYTHON_COMPILING_IN_PYPY
  #define __Pyx_PyUnicode_Concat(a, b)      PyNumber_Add(a, b)
  #define __Pyx_PyUnicode_ConcatSafe(a, b)  PyNumber_Add(a, b)
#else
  #define __Pyx_PyUnicode_Concat(a, b)      PyUnicode_Concat(a, b)
  #define __Pyx_PyUnicode_ConcatSafe(a, b)  ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\
      PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b))
#endif
#if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains)
  #define PyUnicode_Contains(u, s)  PySequence_Contains(u, s)
#endif
#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Format)
  #define PyObject_Format(obj, fmt)  PyObject_CallMethod(obj, "__format__", "O", fmt)
#endif
#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc)
  #define PyObject_Malloc(s)   PyMem_Malloc(s)
  #define PyObject_Free(p)     PyMem_Free(p)
  #define PyObject_Realloc(p)  PyMem_Realloc(p)
#endif
#define __Pyx_PyString_FormatSafe(a, b)   ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b))
#define __Pyx_PyUnicode_FormatSafe(a, b)  ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b))
#if PY_MAJOR_VERSION >= 3
  #define __Pyx_PyString_Format(a, b)  PyUnicode_Format(a, b)
#else
  #define __Pyx_PyString_Format(a, b)  PyString_Format(a, b)
#endif
#if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII)
  #define PyObject_ASCII(o)            PyObject_Repr(o)
#endif
#if PY_MAJOR_VERSION >= 3
  #define PyBaseString_Type            PyUnicode_Type
  #define PyStringObject               PyUnicodeObject
  #define PyString_Type                PyUnicode_Type
  #define PyString_Check               PyUnicode_Check
  #define PyString_CheckExact          PyUnicode_CheckExact
#endif
#if PY_MAJOR_VERSION >= 3
  #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj)
  #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj)
#else
  #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj))
  #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj))
#endif
#ifndef PySet_CheckExact
  #define PySet_CheckExact(obj)        (Py_TYPE(obj) == &PySet_Type)
#endif
#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type)
#if PY_MAJOR_VERSION >= 3
  #define PyIntObject                  PyLongObject
  #define PyInt_Type                   PyLong_Type
  #define PyInt_Check(op)              PyLong_Check(op)
  #define PyInt_CheckExact(op)         PyLong_CheckExact(op)
  #define PyInt_FromString             PyLong_FromString
  #define PyInt_FromUnicode            PyLong_FromUnicode
  #define PyInt_FromLong               PyLong_FromLong
  #define PyInt_FromSize_t             PyLong_FromSize_t
  #define PyInt_FromSsize_t            PyLong_FromSsize_t
  #define PyInt_AsLong                 PyLong_AsLong
  #define PyInt_AS_LONG                PyLong_AS_LONG
  #define PyInt_AsSsize_t              PyLong_AsSsize_t
  #define PyInt_AsUnsignedLongMask     PyLong_AsUnsignedLongMask
  #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask
  #define PyNumber_Int                 PyNumber_Long
#endif
#if PY_MAJOR_VERSION >= 3
  #define PyBoolObject                 PyLongObject
#endif
#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY
  #ifndef PyUnicode_InternFromString
    #define PyUnicode_InternFromString(s) PyUnicode_FromString(s)
  #endif
#endif
#if PY_VERSION_HEX < 0x030200A4
  typedef long Py_hash_t;
  #define __Pyx_PyInt_FromHash_t PyInt_FromLong
  #define __Pyx_PyInt_AsHash_t   PyInt_AsLong
#else
  #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t
  #define __Pyx_PyInt_AsHash_t   PyInt_AsSsize_t
#endif
#if PY_MAJOR_VERSION >= 3
  #define __Pyx_PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func))
#else
  #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass)
#endif
#if PY_VERSION_HEX >= 0x030500B1
#define __Pyx_PyAsyncMethodsStruct PyAsyncMethods
#define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async)
#elif CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
typedef struct {
    unaryfunc am_await;
    unaryfunc am_aiter;
    unaryfunc am_anext;
} __Pyx_PyAsyncMethodsStruct;
#define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved))
#else
#define __Pyx_PyType_AsAsync(obj) NULL
#endif
#ifndef CYTHON_RESTRICT
  #if defined(__GNUC__)
    #define CYTHON_RESTRICT __restrict__
  #elif defined(_MSC_VER) && _MSC_VER >= 1400
    #define CYTHON_RESTRICT __restrict
  #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
    #define CYTHON_RESTRICT restrict
  #else
    #define CYTHON_RESTRICT
  #endif
#endif
#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None)

#ifndef CYTHON_INLINE
  #if defined(__GNUC__)
    #define CYTHON_INLINE __inline__
  #elif defined(_MSC_VER)
    #define CYTHON_INLINE __inline
  #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
    #define CYTHON_INLINE inline
  #else
    #define CYTHON_INLINE
  #endif
#endif

#if defined(WIN32) || defined(MS_WINDOWS)
  #define _USE_MATH_DEFINES
#endif
#include <math.h>
#ifdef NAN
#define __PYX_NAN() ((float) NAN)
#else
static CYTHON_INLINE float __PYX_NAN() {
  float value;
  memset(&value, 0xFF, sizeof(value));
  return value;
}
#endif


#define __PYX_ERR(f_index, lineno, Ln_error) \
{ \
  __pyx_filename = __pyx_f[f_index]; __pyx_lineno = lineno; __pyx_clineno = __LINE__; goto Ln_error; \
}

#if PY_MAJOR_VERSION >= 3
  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_TrueDivide(x,y)
  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceTrueDivide(x,y)
#else
  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_Divide(x,y)
  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceDivide(x,y)
#endif

#ifndef __PYX_EXTERN_C
  #ifdef __cplusplus
    #define __PYX_EXTERN_C extern "C"
  #else
    #define __PYX_EXTERN_C extern
  #endif
#endif

#define __PYX_HAVE__asynq__decorators
#define __PYX_HAVE_API__asynq__decorators
#include "string.h"
#include "stdio.h"
#include "pythread.h"
#ifdef _OPENMP
#include <omp.h>
#endif /* _OPENMP */

#ifdef PYREX_WITHOUT_ASSERTIONS
#define CYTHON_WITHOUT_ASSERTIONS
#endif

#ifndef CYTHON_UNUSED
# if defined(__GNUC__)
#   if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
#     define CYTHON_UNUSED __attribute__ ((__unused__))
#   else
#     define CYTHON_UNUSED
#   endif
# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER))
#   define CYTHON_UNUSED __attribute__ ((__unused__))
# else
#   define CYTHON_UNUSED
# endif
#endif
#ifndef CYTHON_NCP_UNUSED
# if CYTHON_COMPILING_IN_CPYTHON
#  define CYTHON_NCP_UNUSED
# else
#  define CYTHON_NCP_UNUSED CYTHON_UNUSED
# endif
#endif
typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding;
                const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry;

#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0
#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT 0
#define __PYX_DEFAULT_STRING_ENCODING ""
#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString
#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize
#define __Pyx_uchar_cast(c) ((unsigned char)c)
#define __Pyx_long_cast(x) ((long)x)
#define __Pyx_fits_Py_ssize_t(v, type, is_signed)  (\
    (sizeof(type) < sizeof(Py_ssize_t))  ||\
    (sizeof(type) > sizeof(Py_ssize_t) &&\
          likely(v < (type)PY_SSIZE_T_MAX ||\
                 v == (type)PY_SSIZE_T_MAX)  &&\
          (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\
                                v == (type)PY_SSIZE_T_MIN)))  ||\
    (sizeof(type) == sizeof(Py_ssize_t) &&\
          (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\
                               v == (type)PY_SSIZE_T_MAX)))  )
#if defined (__cplusplus) && __cplusplus >= 201103L
    #include <cstdlib>
    #define __Pyx_sst_abs(value) std::abs(value)
#elif SIZEOF_INT >= SIZEOF_SIZE_T
    #define __Pyx_sst_abs(value) abs(value)
#elif SIZEOF_LONG >= SIZEOF_SIZE_T
    #define __Pyx_sst_abs(value) labs(value)
#elif defined (_MSC_VER) && defined (_M_X64)
    #define __Pyx_sst_abs(value) _abs64(value)
#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
    #define __Pyx_sst_abs(value) llabs(value)
#elif defined (__GNUC__)
    #define __Pyx_sst_abs(value) __builtin_llabs(value)
#else
    #define __Pyx_sst_abs(value) ((value<0) ? -value : value)
#endif
static CYTHON_INLINE char* __Pyx_PyObject_AsString(PyObject*);
static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length);
#define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s))
#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l)
#define __Pyx_PyBytes_FromString        PyBytes_FromString
#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize
static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*);
#if PY_MAJOR_VERSION < 3
    #define __Pyx_PyStr_FromString        __Pyx_PyBytes_FromString
    #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize
#else
    #define __Pyx_PyStr_FromString        __Pyx_PyUnicode_FromString
    #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize
#endif
#define __Pyx_PyObject_AsSString(s)    ((signed char*) __Pyx_PyObject_AsString(s))
#define __Pyx_PyObject_AsUString(s)    ((unsigned char*) __Pyx_PyObject_AsString(s))
#define __Pyx_PyObject_FromCString(s)  __Pyx_PyObject_FromString((const char*)s)
#define __Pyx_PyBytes_FromCString(s)   __Pyx_PyBytes_FromString((const char*)s)
#define __Pyx_PyByteArray_FromCString(s)   __Pyx_PyByteArray_FromString((const char*)s)
#define __Pyx_PyStr_FromCString(s)     __Pyx_PyStr_FromString((const char*)s)
#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s)
#if PY_MAJOR_VERSION < 3
static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u)
{
    const Py_UNICODE *u_end = u;
    while (*u_end++) ;
    return (size_t)(u_end - u - 1);
}
#else
#define __Pyx_Py_UNICODE_strlen Py_UNICODE_strlen
#endif
#define __Pyx_PyUnicode_FromUnicode(u)       PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u))
#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode
#define __Pyx_PyUnicode_AsUnicode            PyUnicode_AsUnicode
#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj)
#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None)
#define __Pyx_PyBool_FromLong(b) ((b) ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False))
static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*);
static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x);
static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*);
static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t);
#if CYTHON_COMPILING_IN_CPYTHON
#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x))
#else
#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x)
#endif
#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x))
#if PY_MAJOR_VERSION >= 3
#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x))
#else
#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x))
#endif
#define __Pyx_PyNumber_Float(x) (PyFloat_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Float(x))
#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII
static int __Pyx_sys_getdefaultencoding_not_ascii;
static int __Pyx_init_sys_getdefaultencoding_params(void) {
    PyObject* sys;
    PyObject* default_encoding = NULL;
    PyObject* ascii_chars_u = NULL;
    PyObject* ascii_chars_b = NULL;
    const char* default_encoding_c;
    sys = PyImport_ImportModule("sys");
    if (!sys) goto bad;
    default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL);
    Py_DECREF(sys);
    if (!default_encoding) goto bad;
    default_encoding_c = PyBytes_AsString(default_encoding);
    if (!default_encoding_c) goto bad;
    if (strcmp(default_encoding_c, "ascii") == 0) {
        __Pyx_sys_getdefaultencoding_not_ascii = 0;
    } else {
        char ascii_chars[128];
        int c;
        for (c = 0; c < 128; c++) {
            ascii_chars[c] = c;
        }
        __Pyx_sys_getdefaultencoding_not_ascii = 1;
        ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL);
        if (!ascii_chars_u) goto bad;
        ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL);
        if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) {
            PyErr_Format(
                PyExc_ValueError,
                "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.",
                default_encoding_c);
            goto bad;
        }
        Py_DECREF(ascii_chars_u);
        Py_DECREF(ascii_chars_b);
    }
    Py_DECREF(default_encoding);
    return 0;
bad:
    Py_XDECREF(default_encoding);
    Py_XDECREF(ascii_chars_u);
    Py_XDECREF(ascii_chars_b);
    return -1;
}
#endif
#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3
#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL)
#else
#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL)
#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT
static char* __PYX_DEFAULT_STRING_ENCODING;
static int __Pyx_init_sys_getdefaultencoding_params(void) {
    PyObject* sys;
    PyObject* default_encoding = NULL;
    char* default_encoding_c;
    sys = PyImport_ImportModule("sys");
    if (!sys) goto bad;
    default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL);
    Py_DECREF(sys);
    if (!default_encoding) goto bad;
    default_encoding_c = PyBytes_AsString(default_encoding);
    if (!default_encoding_c) goto bad;
    __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c));
    if (!__PYX_DEFAULT_STRING_ENCODING) goto bad;
    strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c);
    Py_DECREF(default_encoding);
    return 0;
bad:
    Py_XDECREF(default_encoding);
    return -1;
}
#endif
#endif


/* Test for GCC > 2.95 */
#if defined(__GNUC__)     && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))
  #define likely(x)   __builtin_expect(!!(x), 1)
  #define unlikely(x) __builtin_expect(!!(x), 0)
#else /* !__GNUC__ or GCC < 2.95 */
  #define likely(x)   (x)
  #define unlikely(x) (x)
#endif /* __GNUC__ */

static PyObject *__pyx_m;
static PyObject *__pyx_d;
static PyObject *__pyx_b;
static PyObject *__pyx_empty_tuple;
static PyObject *__pyx_empty_bytes;
static PyObject *__pyx_empty_unicode;
static int __pyx_lineno;
static int __pyx_clineno = 0;
static const char * __pyx_cfilenm= __FILE__;
static const char *__pyx_filename;


static const char *__pyx_f[] = {
  "asynq/decorators.py",
  "asynq/decorators.pxd",
  "type.pxd",
  "bool.pxd",
  "complex.pxd",
  "helpers.pxd",
  "events.pxd",
  "asynq/_debug.pxd",
  "asynq/futures.pxd",
  "asynq/batching.pxd",
  "asynq/scheduler.pxd",
  "asynq/async_task.pxd",
};

/*--- Type declarations ---*/
struct __pyx_obj_5qcore_7helpers_MarkerObject;
struct __pyx_obj_5qcore_7helpers_EmptyContext;
struct __pyx_obj_5qcore_7helpers_CythonCachedHashWrapper;
struct __pyx_obj_5qcore_7helpers_ScopedValue;
struct __pyx_obj_5qcore_7helpers__ScopedValueOverrideContext;
struct __pyx_obj_5qcore_7helpers__PropertyOverrideContext;
struct __pyx_obj_5qcore_10decorators_DecoratorBase;
struct __pyx_obj_5qcore_10decorators_DecoratorBinder;
struct __pyx_obj_5qcore_6events_EventHook;
struct __pyx_obj_5qcore_6events_SinkingEventHook;
struct __pyx_obj_5qcore_6events_EventInterceptor;
struct __pyx_obj_5asynq_6_debug_DebugOptions;
struct __pyx_obj_5asynq_7futures_FutureBase;
struct __pyx_obj_5asynq_7futures_Future;
struct __pyx_obj_5asynq_7futures_ConstFuture;
struct __pyx_obj_5asynq_7futures_ErrorFuture;
struct __pyx_obj_5asynq_8batching_BatchBase;
struct __pyx_obj_5asynq_8batching_BatchItemBase;
struct __pyx_obj_5asynq_8batching_DebugBatchItem;
struct __pyx_obj_5asynq_8batching_DebugBatch;
struct __pyx_obj_5asynq_9scheduler_TaskScheduler;
struct __pyx_obj_5asynq_9scheduler_TaskSchedulerActivator;
struct __pyx_obj_5asynq_10async_task_AsyncTask;
struct __pyx_obj_5asynq_10decorators_PureAsyncDecoratorBinder;
struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator;
struct __pyx_obj_5asynq_10decorators_AsyncDecoratorBinder;
struct __pyx_obj_5asynq_10decorators_AsyncDecorator;
struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairDecorator;
struct __pyx_obj_5asynq_10decorators_AsyncProxyDecorator;
struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairProxyDecorator;
struct __pyx_obj_5asynq_10decorators___pyx_scope_struct__lazy;
struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_1_new_fn;
struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_2_get_async_fn;
struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper;
struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_4_async;
struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_5_async_proxy;
struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_6_cached;
struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_7_decorate;
struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_8__cached_impl;
struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl;
struct __pyx_opt_args_5qcore_7helpers_safe_str;
struct __pyx_opt_args_5qcore_7helpers_safe_repr;

/* "qcore/helpers.pxd":75
 * 
 * cpdef object ellipsis(object source, int max_length)
 * cpdef object safe_str(object source, int max_length=?)             # <<<<<<<<<<<<<<
 * cpdef object safe_repr(object source, int max_length=?)
 * 
 */
struct __pyx_opt_args_5qcore_7helpers_safe_str {
  int __pyx_n;
  int max_length;
};

/* "qcore/helpers.pxd":76
 * cpdef object ellipsis(object source, int max_length)
 * cpdef object safe_str(object source, int max_length=?)
 * cpdef object safe_repr(object source, int max_length=?)             # <<<<<<<<<<<<<<
 * 
 * 
 */
struct __pyx_opt_args_5qcore_7helpers_safe_repr {
  int __pyx_n;
  int max_length;
};
struct __pyx_opt_args_5qcore_10inspection_wraps;

/* "qcore/inspection.pxd":38
 * cpdef bint is_classmethod(object fn) except -1
 * 
 * cpdef wraps(object wrapped, object assigned=?, object updated=?)             # <<<<<<<<<<<<<<
 */
struct __pyx_opt_args_5qcore_10inspection_wraps {
  int __pyx_n;
  PyObject *assigned;
  PyObject *updated;
};
struct __pyx_opt_args_5asynq_6_debug_12DebugOptions_DUMP_ALL;

/* "_debug.pxd":44
 *     cdef public object ENABLE_COMPLEX_ASSERTIONS
 * 
 *     cpdef DUMP_ALL(self, value=?)             # <<<<<<<<<<<<<<
 * 
 * cdef public DebugOptions options
 */
struct __pyx_opt_args_5asynq_6_debug_12DebugOptions_DUMP_ALL {
  int __pyx_n;
  PyObject *value;
};
struct __pyx_opt_args_5asynq_7futures_10FutureBase_dump;

/* "futures.pxd":46
 *     cdef inline raise_if_error(self)
 * 
 *     cpdef dump(self, int indent=?)             # <<<<<<<<<<<<<<
 * 
 * 
 */
struct __pyx_opt_args_5asynq_7futures_10FutureBase_dump {
  int __pyx_n;
  int indent;
};
struct __pyx_opt_args_5asynq_8batching_9BatchBase_cancel;
struct __pyx_opt_args_5asynq_8batching_9BatchBase_dump;
struct __pyx_opt_args_5asynq_8batching_sync;

/* "batching.pxd":35
 * 
 *     cpdef flush(self)
 *     cpdef cancel(self, object error=?)             # <<<<<<<<<<<<<<
 * 
 *     cpdef _compute(self)
 */
struct __pyx_opt_args_5asynq_8batching_9BatchBase_cancel {
  int __pyx_n;
  PyObject *error;
};

/* "batching.pxd":43
 *     cpdef _try_switch_active_batch(self)
 * 
 *     cpdef dump(self, int indent=?)             # <<<<<<<<<<<<<<
 * 
 * cdef class BatchItemBase(futures.FutureBase):
 */
struct __pyx_opt_args_5asynq_8batching_9BatchBase_dump {
  int __pyx_n;
  int indent;
};

/* "batching.pxd":66
 * cdef object _debug_batch_state
 * 
 * cpdef sync(tag=?)             # <<<<<<<<<<<<<<
 */
struct __pyx_opt_args_5asynq_8batching_sync {
  int __pyx_n;
  PyObject *tag;
};
struct __pyx_opt_args_5asynq_9scheduler_13TaskScheduler_start;
struct __pyx_opt_args_5asynq_9scheduler_13TaskScheduler_flush_batches;
struct __pyx_opt_args_5asynq_9scheduler_13TaskScheduler__continue_with_batch;
struct __pyx_opt_args_5asynq_9scheduler_13TaskScheduler_dump;
struct __pyx_opt_args_5asynq_9scheduler_13TaskScheduler_try_time_based_dump;

/* "scheduler.pxd":45
 *     cpdef reset(self)
 * 
 *     cpdef async_task.AsyncTask start(self, async_task.AsyncTask task,             # <<<<<<<<<<<<<<
 *             bint run_immediately=?)
 *     cpdef async_task.AsyncTask continue_with(self, futures.FutureBase future, async_task.AsyncTask task)
 */
struct __pyx_opt_args_5asynq_9scheduler_13TaskScheduler_start {
  int __pyx_n;
  int run_immediately;
};

/* "scheduler.pxd":48
 *             bint run_immediately=?)
 *     cpdef async_task.AsyncTask continue_with(self, futures.FutureBase future, async_task.AsyncTask task)
 *     cpdef int flush_batches(self, bint must_await=?) except -1             # <<<<<<<<<<<<<<
 * 
 *     cpdef add_dependencies(self, async_task.AsyncTask task, object yield_result)
 */
struct __pyx_opt_args_5asynq_9scheduler_13TaskScheduler_flush_batches {
  int __pyx_n;
  int must_await;
};

/* "scheduler.pxd":76
 *     @cython.locals(dump_continue_task=bint, task=async_task.AsyncTask)
 *     cdef async_task.AsyncTask _continue_with_task(self)
 *     cdef batching.BatchBase _continue_with_batch(self, bint assert_no_batch=?)             # <<<<<<<<<<<<<<
 * 
 *     cpdef batching.BatchBase _select_batch_to_flush(self)
 */
struct __pyx_opt_args_5asynq_9scheduler_13TaskScheduler__continue_with_batch {
  int __pyx_n;
  int assert_no_batch;
};

/* "scheduler.pxd":84
 *     cpdef _accept_changes(self, TaskScheduler clone)
 * 
 *     cpdef dump(self, int indent=?)             # <<<<<<<<<<<<<<
 *     @cython.locals(current_time=float)
 *     cpdef try_time_based_dump(self, object last_task=?)
 */
struct __pyx_opt_args_5asynq_9scheduler_13TaskScheduler_dump {
  int __pyx_n;
  int indent;
};

/* "scheduler.pxd":86
 *     cpdef dump(self, int indent=?)
 *     @cython.locals(current_time=float)
 *     cpdef try_time_based_dump(self, object last_task=?)             # <<<<<<<<<<<<<<
 * 
 * cdef class TaskSchedulerActivator(object):
 */
struct __pyx_opt_args_5asynq_9scheduler_13TaskScheduler_try_time_based_dump {
  int __pyx_n;
  PyObject *last_task;
};
struct __pyx_opt_args_5asynq_10async_task_9AsyncTask_start;
struct __pyx_opt_args_5asynq_10async_task_9AsyncTask_dump;

/* "async_task.pxd":53
 * 
 *     @cython.locals(s=scheduler.TaskScheduler)
 *     cpdef AsyncTask start(self, bint run_immediately=?)             # <<<<<<<<<<<<<<
 *     @cython.locals(s=scheduler.TaskScheduler)
 *     cpdef AsyncTask after(self, futures.FutureBase future)
 */
struct __pyx_opt_args_5asynq_10async_task_9AsyncTask_start {
  int __pyx_n;
  int run_immediately;
};

/* "async_task.pxd":84
 *     cpdef list traceback(self)
 * 
 *     cpdef dump(self, int indent=?)             # <<<<<<<<<<<<<<
 * 
 *     # Contexts support
 */
struct __pyx_opt_args_5asynq_10async_task_9AsyncTask_dump {
  int __pyx_n;
  int indent;
};
struct __pyx_opt_args_5asynq_10decorators__assert_apply_without_invocation;
struct __pyx_defaults;
typedef struct __pyx_defaults __pyx_defaults;

/* "asynq/decorators.pxd":69
 * # Private part
 * 
 * cdef object _assert_apply_without_invocation(object decorator, tuple task_args, dict task_kwargs=*)             # <<<<<<<<<<<<<<
 * 
 * cdef object _cached
 */
struct __pyx_opt_args_5asynq_10decorators__assert_apply_without_invocation {
  int __pyx_n;
  PyObject *task_kwargs;
};
struct __pyx_defaults {
  PyObject *__pyx_arg_cls;
};

/* "qcore/helpers.pxd":24
 * 
 * 
 * cdef class MarkerObject(object):             # <<<<<<<<<<<<<<
 *     cpdef unicode name
 * 
 */
struct __pyx_obj_5qcore_7helpers_MarkerObject {
  PyObject_HEAD
  PyObject *name;
};


/* "qcore/helpers.pxd":33
 * 
 * 
 * cdef class EmptyContext(object):             # <<<<<<<<<<<<<<
 *     cpdef __enter__(self)
 *     cpdef __exit__(self, exc_type, exc_val, exc_tb)
 */
struct __pyx_obj_5qcore_7helpers_EmptyContext {
  PyObject_HEAD
  struct __pyx_vtabstruct_5qcore_7helpers_EmptyContext *__pyx_vtab;
};


/* "qcore/helpers.pxd":40
 * 
 * 
 * cdef class CythonCachedHashWrapper(object):             # <<<<<<<<<<<<<<
 *     cdef object _value
 *     cdef int _hash
 */
struct __pyx_obj_5qcore_7helpers_CythonCachedHashWrapper {
  PyObject_HEAD
  struct __pyx_vtabstruct_5qcore_7helpers_CythonCachedHashWrapper *__pyx_vtab;
  PyObject *_value;
  int _hash;
};


/* "qcore/helpers.pxd":52
 * cdef class _ScopedValueOverrideContext(object)  # Forward declaration
 * 
 * cdef class ScopedValue(object):             # <<<<<<<<<<<<<<
 *     cdef object _value
 * 
 */
struct __pyx_obj_5qcore_7helpers_ScopedValue {
  PyObject_HEAD
  struct __pyx_vtabstruct_5qcore_7helpers_ScopedValue *__pyx_vtab;
  PyObject *_value;
};


/* "qcore/helpers.pxd":50
 * 
 * 
 * cdef class _ScopedValueOverrideContext(object)  # Forward declaration             # <<<<<<<<<<<<<<
 * 
 * cdef class ScopedValue(object):
 */
struct __pyx_obj_5qcore_7helpers__ScopedValueOverrideContext {
  PyObject_HEAD
  struct __pyx_obj_5qcore_7helpers_ScopedValue *_target;
  PyObject *_value;
  PyObject *_old_value;
};


/* "qcore/helpers.pxd":65
 * 
 * 
 * cdef class _PropertyOverrideContext(object):             # <<<<<<<<<<<<<<
 *     cdef object _target
 *     cdef object _property_name
 */
struct __pyx_obj_5qcore_7helpers__PropertyOverrideContext {
  PyObject_HEAD
  PyObject *_target;
  PyObject *_property_name;
  PyObject *_value;
  PyObject *_old_value;
};


/* "qcore/decorators.pxd":18
 * 
 * 
 * cdef class DecoratorBase(object):             # <<<<<<<<<<<<<<
 *     cdef public object fn
 *     cdef public object type
 */
struct __pyx_obj_5qcore_10decorators_DecoratorBase {
  PyObject_HEAD
  struct __pyx_vtabstruct_5qcore_10decorators_DecoratorBase *__pyx_vtab;
  PyObject *fn;
  PyObject *type;
};


/* "qcore/decorators.pxd":25
 *     cpdef bint is_decorator(self) except -1
 * 
 * cdef class DecoratorBinder(object):             # <<<<<<<<<<<<<<
 *     cdef public DecoratorBase decorator
 *     cdef public object instance
 */
struct __pyx_obj_5qcore_10decorators_DecoratorBinder {
  PyObject_HEAD
  struct __pyx_vtabstruct_5qcore_10decorators_DecoratorBinder *__pyx_vtab;
  struct __pyx_obj_5qcore_10decorators_DecoratorBase *decorator;
  PyObject *instance;
};


/* "qcore/events.pxd":15
 * # limitations under the License.
 * 
 * cdef class EventHook(object):             # <<<<<<<<<<<<<<
 *     cdef list handlers
 * 
 */
struct __pyx_obj_5qcore_6events_EventHook {
  PyObject_HEAD
  PyObject *handlers;
};


/* "qcore/events.pxd":19
 * 
 * 
 * cdef class SinkingEventHook(EventHook):             # <<<<<<<<<<<<<<
 *     pass
 * 
 */
struct __pyx_obj_5qcore_6events_SinkingEventHook {
  struct __pyx_obj_5qcore_6events_EventHook __pyx_base;
};


/* "qcore/events.pxd":25
 * 
 * 
 * cdef class EventInterceptor(object):             # <<<<<<<<<<<<<<
 *     cdef object source
 *     cdef dict events
 */
struct __pyx_obj_5qcore_6events_EventInterceptor {
  PyObject_HEAD
  PyObject *source;
  PyObject *events;
};


/* "_debug.pxd":18
 * 
 * 
 * cdef class DebugOptions(object):             # <<<<<<<<<<<<<<
 *     cdef public bint DUMP_PRE_ERROR_STATE
 *     cdef public bint DUMP_EXCEPTIONS
 */
struct __pyx_obj_5asynq_6_debug_DebugOptions {
  PyObject_HEAD
  struct __pyx_vtabstruct_5asynq_6_debug_DebugOptions *__pyx_vtab;
  int DUMP_PRE_ERROR_STATE;
  int DUMP_EXCEPTIONS;
  int DUMP_AWAIT_RECURSION;
  int DUMP_SCHEDULE_TASK;
  int DUMP_CONTINUE_TASK;
  int DUMP_SCHEDULE_BATCH;
  int DUMP_FLUSH_BATCH;
  int DUMP_DEPENDENCIES;
  int DUMP_COMPUTED;
  int DUMP_NEW_TASKS;
  int DUMP_YIELD_RESULTS;
  int DUMP_QUEUED_RESULTS;
  int DUMP_CONTEXTS;
  int DUMP_SCHEDULER_CHANGE;
  int DUMP_SYNC;
  int DUMP_PRIMER;
  int DUMP_STACK;
  int DUMP_SCHEDULER_STATE;
  float SCHEDULER_STATE_DUMP_INTERVAL;
  int DEBUG_STR_REPR_MAX_LENGTH;
  PyObject *STACK_DUMP_LIMIT;
  PyObject *ENABLE_COMPLEX_ASSERTIONS;
};


/* "futures.pxd":26
 * 
 * 
 * cdef class FutureBase(object):             # <<<<<<<<<<<<<<
 *     cdef public object _value
 *     cdef public object _error
 */
struct __pyx_obj_5asynq_7futures_FutureBase {
  PyObject_HEAD
  struct __pyx_vtabstruct_5asynq_7futures_FutureBase *__pyx_vtab;
  PyObject *_value;
  PyObject *_error;
  int _in_repr;
  struct __pyx_obj_5qcore_6events_EventHook *on_computed;
};


/* "futures.pxd":49
 * 
 * 
 * cdef class Future(FutureBase):             # <<<<<<<<<<<<<<
 *     cdef public object _value_provider
 *     cpdef _compute(self)
 */
struct __pyx_obj_5asynq_7futures_Future {
  struct __pyx_obj_5asynq_7futures_FutureBase __pyx_base;
  PyObject *_value_provider;
};


/* "futures.pxd":54
 * 
 * 
 * cdef class ConstFuture(FutureBase):             # <<<<<<<<<<<<<<
 *     pass
 * 
 */
struct __pyx_obj_5asynq_7futures_ConstFuture {
  struct __pyx_obj_5asynq_7futures_FutureBase __pyx_base;
};


/* "futures.pxd":57
 *     pass
 * 
 * cdef class ErrorFuture(FutureBase):             # <<<<<<<<<<<<<<
 *     pass
 */
struct __pyx_obj_5asynq_7futures_ErrorFuture {
  struct __pyx_obj_5asynq_7futures_FutureBase __pyx_base;
};


/* "batching.pxd":26
 * 
 * 
 * cdef class BatchBase(futures.FutureBase):             # <<<<<<<<<<<<<<
 *     cdef public list items
 * 
 */
struct __pyx_obj_5asynq_8batching_BatchBase {
  struct __pyx_obj_5asynq_7futures_FutureBase __pyx_base;
  PyObject *items;
};


/* "batching.pxd":45
 *     cpdef dump(self, int indent=?)
 * 
 * cdef class BatchItemBase(futures.FutureBase):             # <<<<<<<<<<<<<<
 *     cdef public BatchBase batch
 *     cdef public long index
 */
struct __pyx_obj_5asynq_8batching_BatchItemBase {
  struct __pyx_obj_5asynq_7futures_FutureBase __pyx_base;
  struct __pyx_obj_5asynq_8batching_BatchBase *batch;
  long index;
};


/* "batching.pxd":53
 * 
 * 
 * cdef class DebugBatchItem(BatchItemBase):             # <<<<<<<<<<<<<<
 *     cdef public object _result
 * 
 */
struct __pyx_obj_5asynq_8batching_DebugBatchItem {
  struct __pyx_obj_5asynq_8batching_BatchItemBase __pyx_base;
  PyObject *_result;
};


/* "batching.pxd":56
 *     cdef public object _result
 * 
 * cdef class DebugBatch(BatchBase):             # <<<<<<<<<<<<<<
 *     cdef public str name
 *     cdef public long index
 */
struct __pyx_obj_5asynq_8batching_DebugBatch {
  struct __pyx_obj_5asynq_8batching_BatchBase __pyx_base;
  PyObject *name;
  long index;
};


/* "scheduler.pxd":29
 * 
 * 
 * cdef class TaskScheduler(object):             # <<<<<<<<<<<<<<
 *     cdef public set _empty_set
 *     cdef public float _last_dump_time
 */
struct __pyx_obj_5asynq_9scheduler_TaskScheduler {
  PyObject_HEAD
  struct __pyx_vtabstruct_5asynq_9scheduler_TaskScheduler *__pyx_vtab;
  PyObject *_empty_set;
  float _last_dump_time;
  PyObject *_new_tasks;
  PyObject *_tasks;
  PyObject *_batches;
  int await_recursion_depth;
  int max_await_recursion_depth;
  struct __pyx_obj_5qcore_6events_EventHook *on_before_batch_flush;
  struct __pyx_obj_5qcore_6events_EventHook *on_after_batch_flush;
  struct __pyx_obj_5asynq_10async_task_AsyncTask *active_task;
  PyObject *name;
};


/* "scheduler.pxd":88
 *     cpdef try_time_based_dump(self, object last_task=?)
 * 
 * cdef class TaskSchedulerActivator(object):             # <<<<<<<<<<<<<<
 *     cdef TaskScheduler _scheduler
 *     cdef TaskScheduler _old_scheduler
 */
struct __pyx_obj_5asynq_9scheduler_TaskSchedulerActivator {
  PyObject_HEAD
  struct __pyx_obj_5asynq_9scheduler_TaskScheduler *_scheduler;
  struct __pyx_obj_5asynq_9scheduler_TaskScheduler *_old_scheduler;
  int _must_await_on_exit;
  int _must_flush_batches_on_exit;
};


/* "async_task.pxd":31
 * 
 * 
 * cdef class AsyncTask(futures.FutureBase):             # <<<<<<<<<<<<<<
 *     cdef public bint is_scheduled
 *     cdef public long iteration_index
 */
struct __pyx_obj_5asynq_10async_task_AsyncTask {
  struct __pyx_obj_5asynq_7futures_FutureBase __pyx_base;
  int is_scheduled;
  long iteration_index;
  int group_cancel;
  PyObject *fn;
  PyObject *args;
  PyObject *kwargs;
  struct __pyx_obj_5asynq_10async_task_AsyncTask *caller;
  int depth;
  int max_depth;
  struct __pyx_obj_5asynq_9scheduler_TaskScheduler *scheduler;
  struct __pyx_obj_5asynq_10async_task_AsyncTask *creator;
  PyObject *_generator;
  PyObject *_last_value;
  PyObject *_frame_info;
  PyObject *_dependencies;
  PyObject *_contexts;
};


/* "asynq/decorators.pxd":33
 * 
 * 
 * cdef class PureAsyncDecoratorBinder(qcore.decorators.DecoratorBinder):             # <<<<<<<<<<<<<<
 *     cpdef bint is_pure_async_fn(self) except -1
 * 
 */
struct __pyx_obj_5asynq_10decorators_PureAsyncDecoratorBinder {
  struct __pyx_obj_5qcore_10decorators_DecoratorBinder __pyx_base;
};


/* "asynq/decorators.pxd":37
 * 
 * 
 * cdef class PureAsyncDecorator(qcore.decorators.DecoratorBase):             # <<<<<<<<<<<<<<
 *     cdef public type task_cls
 *     cdef public dict kwargs
 */
struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator {
  struct __pyx_obj_5qcore_10decorators_DecoratorBase __pyx_base;
  PyTypeObject *task_cls;
  PyObject *kwargs;
  int needs_wrapper;
};


/* "asynq/decorators.pxd":47
 * 
 * 
 * cdef class AsyncDecoratorBinder(qcore.decorators.DecoratorBinder):             # <<<<<<<<<<<<<<
 *     pass
 * 
 */
struct __pyx_obj_5asynq_10decorators_AsyncDecoratorBinder {
  struct __pyx_obj_5qcore_10decorators_DecoratorBinder __pyx_base;
};


/* "asynq/decorators.pxd":51
 * 
 * 
 * cdef class AsyncDecorator(PureAsyncDecorator):             # <<<<<<<<<<<<<<
 *     pass
 * 
 */
struct __pyx_obj_5asynq_10decorators_AsyncDecorator {
  struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator __pyx_base;
};


/* "asynq/decorators.pxd":55
 * 
 * 
 * cdef class AsyncAndSyncPairDecorator(AsyncDecorator):             # <<<<<<<<<<<<<<
 *     cdef public object sync_fn
 * 
 */
struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairDecorator {
  struct __pyx_obj_5asynq_10decorators_AsyncDecorator __pyx_base;
  PyObject *sync_fn;
};


/* "asynq/decorators.pxd":59
 * 
 * 
 * cdef class AsyncProxyDecorator(AsyncDecorator):             # <<<<<<<<<<<<<<
 *     pass
 * 
 */
struct __pyx_obj_5asynq_10decorators_AsyncProxyDecorator {
  struct __pyx_obj_5asynq_10decorators_AsyncDecorator __pyx_base;
};


/* "asynq/decorators.pxd":63
 * 
 * 
 * cdef class AsyncAndSyncPairProxyDecorator(AsyncProxyDecorator):             # <<<<<<<<<<<<<<
 *     pass
 * 
 */
struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairProxyDecorator {
  struct __pyx_obj_5asynq_10decorators_AsyncProxyDecorator __pyx_base;
};


/* "asynq/decorators.py":31
 * 
 * 
 * def lazy(fn):             # <<<<<<<<<<<<<<
 *     """Converts a function into a lazy one - i.e. its call
 *     returns a Future bound to a function call with passed
 */
struct __pyx_obj_5asynq_10decorators___pyx_scope_struct__lazy {
  PyObject_HEAD
  PyObject *__pyx_v_fn;
};


/* "asynq/decorators.py":38
 *     """
 *     @core_inspection.wraps(fn)
 *     def new_fn(*args, **kwargs):             # <<<<<<<<<<<<<<
 *         value_provider = lambda: fn(*args, **kwargs)
 *         return futures.Future(value_provider)
 */
struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_1_new_fn {
  PyObject_HEAD
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct__lazy *__pyx_outer_scope;
  PyObject *__pyx_v_args;
  PyObject *__pyx_v_kwargs;
};


/* "asynq/decorators.py":75
 * 
 * 
 * def get_async_fn(fn, wrap_if_none=False):             # <<<<<<<<<<<<<<
 *     """Returns an async function for the specified source function."""
 *     if hasattr(fn, 'async'):
 */
struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_2_get_async_fn {
  PyObject_HEAD
  PyObject *__pyx_v_fn;
};


/* "asynq/decorators.py":117
 *         return True
 * 
 *     def _fn_wrapper(self, args, kwargs):             # <<<<<<<<<<<<<<
 *         raise async_task.AsyncTaskResult(self.fn(*args, **kwargs)); return
 *         yield
 */
struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper {
  PyObject_HEAD
  PyObject *__pyx_v_args;
  PyObject *__pyx_v_kwargs;
  struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *__pyx_v_self;
};


/* "asynq/decorators.py":208
 * 
 * 
 * def async(pure=False, sync_fn=None, cls=async_task.AsyncTask, **kwargs):             # <<<<<<<<<<<<<<
 *     """Async task decorator.
 *     Converts a method returning generator object to
 */
struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_4_async {
  PyObject_HEAD
  PyObject *__pyx_v_cls;
  PyObject *__pyx_v_kwargs;
  PyObject *__pyx_v_pure;
  PyObject *__pyx_v_sync_fn;
};


/* "asynq/decorators.py":232
 * 
 * 
 * def async_proxy(pure=False, sync_fn=None):             # <<<<<<<<<<<<<<
 *     if sync_fn is not None:
 *         assert pure is False, "sync_fn=? cannot be used together with pure=True"
 */
struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_5_async_proxy {
  PyObject_HEAD
  PyObject *__pyx_v_pure;
  PyObject *__pyx_v_sync_fn;
};


/* "asynq/decorators.py":247
 * 
 * 
 * def cached(cache):             # <<<<<<<<<<<<<<
 *     """Caching decorator. Caches method execution result
 *     based on its name an arguments.
 */
struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_6_cached {
  PyObject_HEAD
  PyObject *__pyx_v_cache;
};


/* "asynq/decorators.py":257
 *     _assert_apply_without_invocation("async", (cache,))
 * 
 *     def decorate(fn):             # <<<<<<<<<<<<<<
 *         original_fn = core_inspection.get_original_fn(fn)
 * 
 */
struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_7_decorate {
  PyObject_HEAD
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_6_cached *__pyx_outer_scope;
  PyObject *__pyx_v_fn;
  PyObject *__pyx_v_original_fn;
};


/* "asynq/decorators.py":340
 * 
 * 
 * def _cached_impl(cache, original_fn, fn, args, kwargs):             # <<<<<<<<<<<<<<
 *     """Internal async method used by @cached decorator.
 *     Implements cache check/update in async fashion.
 */
struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_8__cached_impl {
  PyObject_HEAD
  PyObject *__pyx_v_args;
  PyObject *__pyx_v_cache;
  PyObject *__pyx_v_cached;
  PyObject *__pyx_v_fn;
  PyObject *__pyx_v_key;
  PyObject *__pyx_v_kwargs;
  PyObject *__pyx_v_original_fn;
  PyObject *__pyx_v_result;
};


/* "asynq/decorators.py":361
 * 
 * 
 * def _cache_set_impl(cache, key, value):             # <<<<<<<<<<<<<<
 *     yield cache.set(key, value)
 *     raise StopIteration()
 */
struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl {
  PyObject_HEAD
  PyObject *__pyx_v_cache;
  PyObject *__pyx_v_key;
  PyObject *__pyx_v_value;
};



/* "qcore/helpers.pxd":33
 * 
 * 
 * cdef class EmptyContext(object):             # <<<<<<<<<<<<<<
 *     cpdef __enter__(self)
 *     cpdef __exit__(self, exc_type, exc_val, exc_tb)
 */

struct __pyx_vtabstruct_5qcore_7helpers_EmptyContext {
  PyObject *(*__pyx___enter__)(struct __pyx_obj_5qcore_7helpers_EmptyContext *, int __pyx_skip_dispatch);
  PyObject *(*__pyx___exit__)(struct __pyx_obj_5qcore_7helpers_EmptyContext *, PyObject *, PyObject *, PyObject *, int __pyx_skip_dispatch);
};
static struct __pyx_vtabstruct_5qcore_7helpers_EmptyContext *__pyx_vtabptr_5qcore_7helpers_EmptyContext;


/* "qcore/helpers.pxd":40
 * 
 * 
 * cdef class CythonCachedHashWrapper(object):             # <<<<<<<<<<<<<<
 *     cdef object _value
 *     cdef int _hash
 */

struct __pyx_vtabstruct_5qcore_7helpers_CythonCachedHashWrapper {
  PyObject *(*value)(struct __pyx_obj_5qcore_7helpers_CythonCachedHashWrapper *, int __pyx_skip_dispatch);
  PyObject *(*hash)(struct __pyx_obj_5qcore_7helpers_CythonCachedHashWrapper *, int __pyx_skip_dispatch);
};
static struct __pyx_vtabstruct_5qcore_7helpers_CythonCachedHashWrapper *__pyx_vtabptr_5qcore_7helpers_CythonCachedHashWrapper;


/* "qcore/helpers.pxd":52
 * cdef class _ScopedValueOverrideContext(object)  # Forward declaration
 * 
 * cdef class ScopedValue(object):             # <<<<<<<<<<<<<<
 *     cdef object _value
 * 
 */

struct __pyx_vtabstruct_5qcore_7helpers_ScopedValue {
  PyObject *(*get)(struct __pyx_obj_5qcore_7helpers_ScopedValue *, int __pyx_skip_dispatch);
  PyObject *(*set)(struct __pyx_obj_5qcore_7helpers_ScopedValue *, PyObject *, int __pyx_skip_dispatch);
  PyObject *(*override)(struct __pyx_obj_5qcore_7helpers_ScopedValue *, PyObject *, int __pyx_skip_dispatch);
};
static struct __pyx_vtabstruct_5qcore_7helpers_ScopedValue *__pyx_vtabptr_5qcore_7helpers_ScopedValue;


/* "qcore/decorators.pxd":18
 * 
 * 
 * cdef class DecoratorBase(object):             # <<<<<<<<<<<<<<
 *     cdef public object fn
 *     cdef public object type
 */

struct __pyx_vtabstruct_5qcore_10decorators_DecoratorBase {
  PyObject *(*name)(struct __pyx_obj_5qcore_10decorators_DecoratorBase *, int __pyx_skip_dispatch);
  int (*is_decorator)(struct __pyx_obj_5qcore_10decorators_DecoratorBase *, int __pyx_skip_dispatch);
};
static struct __pyx_vtabstruct_5qcore_10decorators_DecoratorBase *__pyx_vtabptr_5qcore_10decorators_DecoratorBase;


/* "qcore/decorators.pxd":25
 *     cpdef bint is_decorator(self) except -1
 * 
 * cdef class DecoratorBinder(object):             # <<<<<<<<<<<<<<
 *     cdef public DecoratorBase decorator
 *     cdef public object instance
 */

struct __pyx_vtabstruct_5qcore_10decorators_DecoratorBinder {
  PyObject *(*name)(struct __pyx_obj_5qcore_10decorators_DecoratorBinder *, int __pyx_skip_dispatch);
  int (*is_decorator)(struct __pyx_obj_5qcore_10decorators_DecoratorBinder *, int __pyx_skip_dispatch);
};
static struct __pyx_vtabstruct_5qcore_10decorators_DecoratorBinder *__pyx_vtabptr_5qcore_10decorators_DecoratorBinder;


/* "_debug.pxd":18
 * 
 * 
 * cdef class DebugOptions(object):             # <<<<<<<<<<<<<<
 *     cdef public bint DUMP_PRE_ERROR_STATE
 *     cdef public bint DUMP_EXCEPTIONS
 */

struct __pyx_vtabstruct_5asynq_6_debug_DebugOptions {
  PyObject *(*DUMP_ALL)(struct __pyx_obj_5asynq_6_debug_DebugOptions *, int __pyx_skip_dispatch, struct __pyx_opt_args_5asynq_6_debug_12DebugOptions_DUMP_ALL *__pyx_optional_args);
};
static struct __pyx_vtabstruct_5asynq_6_debug_DebugOptions *__pyx_vtabptr_5asynq_6_debug_DebugOptions;


/* "futures.pxd":26
 * 
 * 
 * cdef class FutureBase(object):             # <<<<<<<<<<<<<<
 *     cdef public object _value
 *     cdef public object _error
 */

struct __pyx_vtabstruct_5asynq_7futures_FutureBase {
  PyObject *(*value)(struct __pyx_obj_5asynq_7futures_FutureBase *, int __pyx_skip_dispatch);
  PyObject *(*set_value)(struct __pyx_obj_5asynq_7futures_FutureBase *, PyObject *, int __pyx_skip_dispatch);
  PyObject *(*reset_unsafe)(struct __pyx_obj_5asynq_7futures_FutureBase *, int __pyx_skip_dispatch);
  PyObject *(*error)(struct __pyx_obj_5asynq_7futures_FutureBase *, int __pyx_skip_dispatch);
  PyObject *(*set_error)(struct __pyx_obj_5asynq_7futures_FutureBase *, PyObject *, int __pyx_skip_dispatch);
  int (*is_computed)(struct __pyx_obj_5asynq_7futures_FutureBase *, int __pyx_skip_dispatch);
  PyObject *(*_compute)(struct __pyx_obj_5asynq_7futures_FutureBase *, int __pyx_skip_dispatch);
  PyObject *(*_computed)(struct __pyx_obj_5asynq_7futures_FutureBase *, int __pyx_skip_dispatch);
  PyObject *(*make_dependency)(struct __pyx_obj_5asynq_7futures_FutureBase *, PyObject *, PyObject *, int __pyx_skip_dispatch);
  PyObject *(*raise_if_error)(struct __pyx_obj_5asynq_7futures_FutureBase *);
  PyObject *(*dump)(struct __pyx_obj_5asynq_7futures_FutureBase *, int __pyx_skip_dispatch, struct __pyx_opt_args_5asynq_7futures_10FutureBase_dump *__pyx_optional_args);
};
static struct __pyx_vtabstruct_5asynq_7futures_FutureBase *__pyx_vtabptr_5asynq_7futures_FutureBase;


/* "futures.pxd":49
 * 
 * 
 * cdef class Future(FutureBase):             # <<<<<<<<<<<<<<
 *     cdef public object _value_provider
 *     cpdef _compute(self)
 */

struct __pyx_vtabstruct_5asynq_7futures_Future {
  struct __pyx_vtabstruct_5asynq_7futures_FutureBase __pyx_base;
};
static struct __pyx_vtabstruct_5asynq_7futures_Future *__pyx_vtabptr_5asynq_7futures_Future;


/* "futures.pxd":54
 * 
 * 
 * cdef class ConstFuture(FutureBase):             # <<<<<<<<<<<<<<
 *     pass
 * 
 */

struct __pyx_vtabstruct_5asynq_7futures_ConstFuture {
  struct __pyx_vtabstruct_5asynq_7futures_FutureBase __pyx_base;
};
static struct __pyx_vtabstruct_5asynq_7futures_ConstFuture *__pyx_vtabptr_5asynq_7futures_ConstFuture;


/* "futures.pxd":57
 *     pass
 * 
 * cdef class ErrorFuture(FutureBase):             # <<<<<<<<<<<<<<
 *     pass
 */

struct __pyx_vtabstruct_5asynq_7futures_ErrorFuture {
  struct __pyx_vtabstruct_5asynq_7futures_FutureBase __pyx_base;
};
static struct __pyx_vtabstruct_5asynq_7futures_ErrorFuture *__pyx_vtabptr_5asynq_7futures_ErrorFuture;


/* "batching.pxd":26
 * 
 * 
 * cdef class BatchBase(futures.FutureBase):             # <<<<<<<<<<<<<<
 *     cdef public list items
 * 
 */

struct __pyx_vtabstruct_5asynq_8batching_BatchBase {
  struct __pyx_vtabstruct_5asynq_7futures_FutureBase __pyx_base;
  int (*is_flushed)(struct __pyx_obj_5asynq_8batching_BatchBase *, int __pyx_skip_dispatch);
  int (*is_cancelled)(struct __pyx_obj_5asynq_8batching_BatchBase *, int __pyx_skip_dispatch);
  int (*is_empty)(struct __pyx_obj_5asynq_8batching_BatchBase *, int __pyx_skip_dispatch);
  PyObject *(*get_priority)(struct __pyx_obj_5asynq_8batching_BatchBase *, int __pyx_skip_dispatch);
  PyObject *(*flush)(struct __pyx_obj_5asynq_8batching_BatchBase *, int __pyx_skip_dispatch);
  PyObject *(*cancel)(struct __pyx_obj_5asynq_8batching_BatchBase *, int __pyx_skip_dispatch, struct __pyx_opt_args_5asynq_8batching_9BatchBase_cancel *__pyx_optional_args);
  PyObject *(*_flush)(struct __pyx_obj_5asynq_8batching_BatchBase *, int __pyx_skip_dispatch);
  PyObject *(*_cancel)(struct __pyx_obj_5asynq_8batching_BatchBase *, int __pyx_skip_dispatch);
  PyObject *(*_try_switch_active_batch)(struct __pyx_obj_5asynq_8batching_BatchBase *, int __pyx_skip_dispatch);
};
static struct __pyx_vtabstruct_5asynq_8batching_BatchBase *__pyx_vtabptr_5asynq_8batching_BatchBase;


/* "batching.pxd":45
 *     cpdef dump(self, int indent=?)
 * 
 * cdef class BatchItemBase(futures.FutureBase):             # <<<<<<<<<<<<<<
 *     cdef public BatchBase batch
 *     cdef public long index
 */

struct __pyx_vtabstruct_5asynq_8batching_BatchItemBase {
  struct __pyx_vtabstruct_5asynq_7futures_FutureBase __pyx_base;
};
static struct __pyx_vtabstruct_5asynq_8batching_BatchItemBase *__pyx_vtabptr_5asynq_8batching_BatchItemBase;


/* "batching.pxd":53
 * 
 * 
 * cdef class DebugBatchItem(BatchItemBase):             # <<<<<<<<<<<<<<
 *     cdef public object _result
 * 
 */

struct __pyx_vtabstruct_5asynq_8batching_DebugBatchItem {
  struct __pyx_vtabstruct_5asynq_8batching_BatchItemBase __pyx_base;
};
static struct __pyx_vtabstruct_5asynq_8batching_DebugBatchItem *__pyx_vtabptr_5asynq_8batching_DebugBatchItem;


/* "batching.pxd":56
 *     cdef public object _result
 * 
 * cdef class DebugBatch(BatchBase):             # <<<<<<<<<<<<<<
 *     cdef public str name
 *     cdef public long index
 */

struct __pyx_vtabstruct_5asynq_8batching_DebugBatch {
  struct __pyx_vtabstruct_5asynq_8batching_BatchBase __pyx_base;
};
static struct __pyx_vtabstruct_5asynq_8batching_DebugBatch *__pyx_vtabptr_5asynq_8batching_DebugBatch;


/* "scheduler.pxd":29
 * 
 * 
 * cdef class TaskScheduler(object):             # <<<<<<<<<<<<<<
 *     cdef public set _empty_set
 *     cdef public float _last_dump_time
 */

struct __pyx_vtabstruct_5asynq_9scheduler_TaskScheduler {
  struct __pyx_obj_5asynq_9scheduler_TaskSchedulerActivator *(*activate)(struct __pyx_obj_5asynq_9scheduler_TaskScheduler *, int, int, int __pyx_skip_dispatch);
  PyObject *(*reset)(struct __pyx_obj_5asynq_9scheduler_TaskScheduler *, int __pyx_skip_dispatch);
  struct __pyx_obj_5asynq_10async_task_AsyncTask *(*start)(struct __pyx_obj_5asynq_9scheduler_TaskScheduler *, struct __pyx_obj_5asynq_10async_task_AsyncTask *, int __pyx_skip_dispatch, struct __pyx_opt_args_5asynq_9scheduler_13TaskScheduler_start *__pyx_optional_args);
  struct __pyx_obj_5asynq_10async_task_AsyncTask *(*continue_with)(struct __pyx_obj_5asynq_9scheduler_TaskScheduler *, struct __pyx_obj_5asynq_7futures_FutureBase *, struct __pyx_obj_5asynq_10async_task_AsyncTask *, int __pyx_skip_dispatch);
  int (*flush_batches)(struct __pyx_obj_5asynq_9scheduler_TaskScheduler *, int __pyx_skip_dispatch, struct __pyx_opt_args_5asynq_9scheduler_13TaskScheduler_flush_batches *__pyx_optional_args);
  PyObject *(*add_dependencies)(struct __pyx_obj_5asynq_9scheduler_TaskScheduler *, struct __pyx_obj_5asynq_10async_task_AsyncTask *, PyObject *, int __pyx_skip_dispatch);
  PyObject *(*add_dependency)(struct __pyx_obj_5asynq_9scheduler_TaskScheduler *, struct __pyx_obj_5asynq_10async_task_AsyncTask *, struct __pyx_obj_5asynq_7futures_FutureBase *, int __pyx_skip_dispatch);
  PyObject *(*schedule)(struct __pyx_obj_5asynq_9scheduler_TaskScheduler *, struct __pyx_obj_5asynq_10async_task_AsyncTask *, int __pyx_skip_dispatch);
  PyObject *(*schedule_batch)(struct __pyx_obj_5asynq_9scheduler_TaskScheduler *, struct __pyx_obj_5asynq_8batching_BatchBase *, int __pyx_skip_dispatch);
  int (*_await)(struct __pyx_obj_5asynq_9scheduler_TaskScheduler *, PyObject *, int __pyx_skip_dispatch);
  int (*_execute)(struct __pyx_obj_5asynq_9scheduler_TaskScheduler *, int, PyObject *, int __pyx_skip_dispatch);
  PyObject *(*_try_execute_on_new_scheduler)(struct __pyx_obj_5asynq_9scheduler_TaskScheduler *, PyObject *, int __pyx_skip_dispatch);
  int (*_schedule)(struct __pyx_obj_5asynq_9scheduler_TaskScheduler *, struct __pyx_obj_5asynq_10async_task_AsyncTask *);
  int (*_schedule_without_checks)(struct __pyx_obj_5asynq_9scheduler_TaskScheduler *, struct __pyx_obj_5asynq_10async_task_AsyncTask *);
  int (*_try_schedule)(struct __pyx_obj_5asynq_9scheduler_TaskScheduler *, struct __pyx_obj_5asynq_10async_task_AsyncTask *, int);
  int (*_schedule_batch)(struct __pyx_obj_5asynq_9scheduler_TaskScheduler *, struct __pyx_obj_5asynq_8batching_BatchBase *);
  int (*_flush_batch)(struct __pyx_obj_5asynq_9scheduler_TaskScheduler *, struct __pyx_obj_5asynq_8batching_BatchBase *);
  PyObject *(*_enqueue_new_tasks)(struct __pyx_obj_5asynq_9scheduler_TaskScheduler *);
  struct __pyx_obj_5asynq_10async_task_AsyncTask *(*_continue_with_task)(struct __pyx_obj_5asynq_9scheduler_TaskScheduler *);
  struct __pyx_obj_5asynq_8batching_BatchBase *(*_continue_with_batch)(struct __pyx_obj_5asynq_9scheduler_TaskScheduler *, struct __pyx_opt_args_5asynq_9scheduler_13TaskScheduler__continue_with_batch *__pyx_optional_args);
  struct __pyx_obj_5asynq_8batching_BatchBase *(*_select_batch_to_flush)(struct __pyx_obj_5asynq_9scheduler_TaskScheduler *, int __pyx_skip_dispatch);
  PyObject *(*_clone)(struct __pyx_obj_5asynq_9scheduler_TaskScheduler *, int __pyx_skip_dispatch);
  PyObject *(*_accept_changes)(struct __pyx_obj_5asynq_9scheduler_TaskScheduler *, struct __pyx_obj_5asynq_9scheduler_TaskScheduler *, int __pyx_skip_dispatch);
  PyObject *(*dump)(struct __pyx_obj_5asynq_9scheduler_TaskScheduler *, int __pyx_skip_dispatch, struct __pyx_opt_args_5asynq_9scheduler_13TaskScheduler_dump *__pyx_optional_args);
  PyObject *(*try_time_based_dump)(struct __pyx_obj_5asynq_9scheduler_TaskScheduler *, int __pyx_skip_dispatch, struct __pyx_opt_args_5asynq_9scheduler_13TaskScheduler_try_time_based_dump *__pyx_optional_args);
};
static struct __pyx_vtabstruct_5asynq_9scheduler_TaskScheduler *__pyx_vtabptr_5asynq_9scheduler_TaskScheduler;


/* "async_task.pxd":31
 * 
 * 
 * cdef class AsyncTask(futures.FutureBase):             # <<<<<<<<<<<<<<
 *     cdef public bint is_scheduled
 *     cdef public long iteration_index
 */

struct __pyx_vtabstruct_5asynq_10async_task_AsyncTask {
  struct __pyx_vtabstruct_5asynq_7futures_FutureBase __pyx_base;
  int (*is_blocked)(struct __pyx_obj_5asynq_10async_task_AsyncTask *, int __pyx_skip_dispatch);
  int (*can_continue)(struct __pyx_obj_5asynq_10async_task_AsyncTask *, int __pyx_skip_dispatch);
  struct __pyx_obj_5asynq_10async_task_AsyncTask *(*start)(struct __pyx_obj_5asynq_10async_task_AsyncTask *, int __pyx_skip_dispatch, struct __pyx_opt_args_5asynq_10async_task_9AsyncTask_start *__pyx_optional_args);
  struct __pyx_obj_5asynq_10async_task_AsyncTask *(*after)(struct __pyx_obj_5asynq_10async_task_AsyncTask *, struct __pyx_obj_5asynq_7futures_FutureBase *, int __pyx_skip_dispatch);
  PyObject *(*cancel_dependencies)(struct __pyx_obj_5asynq_10async_task_AsyncTask *, PyObject *, int __pyx_skip_dispatch);
  PyObject *(*_continue)(struct __pyx_obj_5asynq_10async_task_AsyncTask *, int __pyx_skip_dispatch);
  PyObject *(*_continue_on_generator)(struct __pyx_obj_5asynq_10async_task_AsyncTask *, PyObject *, PyObject *);
  PyObject *(*_accept_yield_result)(struct __pyx_obj_5asynq_10async_task_AsyncTask *, PyObject *);
  PyObject *(*_accept_error)(struct __pyx_obj_5asynq_10async_task_AsyncTask *, PyObject *);
  PyObject *(*_queue_exit)(struct __pyx_obj_5asynq_10async_task_AsyncTask *, PyObject *, int __pyx_skip_dispatch);
  PyObject *(*_queue_throw_error)(struct __pyx_obj_5asynq_10async_task_AsyncTask *, PyObject *, int __pyx_skip_dispatch);
  PyObject *(*_remove_dependency_cython)(struct __pyx_obj_5asynq_10async_task_AsyncTask *, PyObject *);
  PyObject *(*_before_continue)(struct __pyx_obj_5asynq_10async_task_AsyncTask *);
  PyObject *(*_after_continue)(struct __pyx_obj_5asynq_10async_task_AsyncTask *);
  PyObject *(*traceback)(struct __pyx_obj_5asynq_10async_task_AsyncTask *, int __pyx_skip_dispatch);
  PyObject *(*_enter_context)(struct __pyx_obj_5asynq_10async_task_AsyncTask *, PyObject *);
  PyObject *(*_leave_context)(struct __pyx_obj_5asynq_10async_task_AsyncTask *, PyObject *);
  PyObject *(*_pause_contexts)(struct __pyx_obj_5asynq_10async_task_AsyncTask *);
  PyObject *(*_resume_contexts)(struct __pyx_obj_5asynq_10async_task_AsyncTask *);
};
static struct __pyx_vtabstruct_5asynq_10async_task_AsyncTask *__pyx_vtabptr_5asynq_10async_task_AsyncTask;


/* "asynq/decorators.py":97
 * 
 * 
 * class PureAsyncDecoratorBinder(qcore.decorators.DecoratorBinder):             # <<<<<<<<<<<<<<
 *     def is_pure_async_fn(self):
 *         return True
 */

struct __pyx_vtabstruct_5asynq_10decorators_PureAsyncDecoratorBinder {
  struct __pyx_vtabstruct_5qcore_10decorators_DecoratorBinder __pyx_base;
  int (*is_pure_async_fn)(struct __pyx_obj_5asynq_10decorators_PureAsyncDecoratorBinder *, int __pyx_skip_dispatch);
};
static struct __pyx_vtabstruct_5asynq_10decorators_PureAsyncDecoratorBinder *__pyx_vtabptr_5asynq_10decorators_PureAsyncDecoratorBinder;


/* "asynq/decorators.py":102
 * 
 * 
 * class PureAsyncDecorator(qcore.decorators.DecoratorBase):             # <<<<<<<<<<<<<<
 *     binder_cls = PureAsyncDecoratorBinder
 * 
 */

struct __pyx_vtabstruct_5asynq_10decorators_PureAsyncDecorator {
  struct __pyx_vtabstruct_5qcore_10decorators_DecoratorBase __pyx_base;
  int (*is_pure_async_fn)(struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *, int __pyx_skip_dispatch);
  PyObject *(*_call_pure)(struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *, PyObject *, PyObject *, int __pyx_skip_dispatch);
};
static struct __pyx_vtabstruct_5asynq_10decorators_PureAsyncDecorator *__pyx_vtabptr_5asynq_10decorators_PureAsyncDecorator;


/* "asynq/decorators.py":132
 * 
 * 
 * class AsyncDecoratorBinder(qcore.decorators.DecoratorBinder):             # <<<<<<<<<<<<<<
 *     def async(self, *args, **kwargs):
 *         if self.instance is None:
 */

struct __pyx_vtabstruct_5asynq_10decorators_AsyncDecoratorBinder {
  struct __pyx_vtabstruct_5qcore_10decorators_DecoratorBinder __pyx_base;
};
static struct __pyx_vtabstruct_5asynq_10decorators_AsyncDecoratorBinder *__pyx_vtabptr_5asynq_10decorators_AsyncDecoratorBinder;


/* "asynq/decorators.py":140
 * 
 * 
 * class AsyncDecorator(PureAsyncDecorator):             # <<<<<<<<<<<<<<
 *     binder_cls = AsyncDecoratorBinder
 * 
 */

struct __pyx_vtabstruct_5asynq_10decorators_AsyncDecorator {
  struct __pyx_vtabstruct_5asynq_10decorators_PureAsyncDecorator __pyx_base;
};
static struct __pyx_vtabstruct_5asynq_10decorators_AsyncDecorator *__pyx_vtabptr_5asynq_10decorators_AsyncDecorator;


/* "asynq/decorators.py":164
 * 
 * 
 * class AsyncAndSyncPairDecorator(AsyncDecorator):             # <<<<<<<<<<<<<<
 *     binder_cls = AsyncAndSyncPairDecoratorBinder
 * 
 */

struct __pyx_vtabstruct_5asynq_10decorators_AsyncAndSyncPairDecorator {
  struct __pyx_vtabstruct_5asynq_10decorators_AsyncDecorator __pyx_base;
};
static struct __pyx_vtabstruct_5asynq_10decorators_AsyncAndSyncPairDecorator *__pyx_vtabptr_5asynq_10decorators_AsyncAndSyncPairDecorator;


/* "asynq/decorators.py":190
 * 
 * 
 * class AsyncProxyDecorator(AsyncDecorator):             # <<<<<<<<<<<<<<
 *     def __init__(self, fn):
 *         # we don't need the task class but still need to pass it to the superclass
 */

struct __pyx_vtabstruct_5asynq_10decorators_AsyncProxyDecorator {
  struct __pyx_vtabstruct_5asynq_10decorators_AsyncDecorator __pyx_base;
};
static struct __pyx_vtabstruct_5asynq_10decorators_AsyncProxyDecorator *__pyx_vtabptr_5asynq_10decorators_AsyncProxyDecorator;


/* "asynq/decorators.py":199
 * 
 * 
 * class AsyncAndSyncPairProxyDecorator(AsyncProxyDecorator):             # <<<<<<<<<<<<<<
 *     def __init__(self, fn, sync_fn):
 *         AsyncProxyDecorator.__init__(self, fn)
 */

struct __pyx_vtabstruct_5asynq_10decorators_AsyncAndSyncPairProxyDecorator {
  struct __pyx_vtabstruct_5asynq_10decorators_AsyncProxyDecorator __pyx_base;
};
static struct __pyx_vtabstruct_5asynq_10decorators_AsyncAndSyncPairProxyDecorator *__pyx_vtabptr_5asynq_10decorators_AsyncAndSyncPairProxyDecorator;

/* --- Runtime support code (head) --- */
/* Refnanny.proto */
#ifndef CYTHON_REFNANNY
  #define CYTHON_REFNANNY 0
#endif
#if CYTHON_REFNANNY
  typedef struct {
    void (*INCREF)(void*, PyObject*, int);
    void (*DECREF)(void*, PyObject*, int);
    void (*GOTREF)(void*, PyObject*, int);
    void (*GIVEREF)(void*, PyObject*, int);
    void* (*SetupContext)(const char*, int, const char*);
    void (*FinishContext)(void**);
  } __Pyx_RefNannyAPIStruct;
  static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL;
  static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname);
  #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL;
#ifdef WITH_THREAD
  #define __Pyx_RefNannySetupContext(name, acquire_gil)\
          if (acquire_gil) {\
              PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\
              __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\
              PyGILState_Release(__pyx_gilstate_save);\
          } else {\
              __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\
          }
#else
  #define __Pyx_RefNannySetupContext(name, acquire_gil)\
          __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__)
#endif
  #define __Pyx_RefNannyFinishContext()\
          __Pyx_RefNanny->FinishContext(&__pyx_refnanny)
  #define __Pyx_INCREF(r)  __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
  #define __Pyx_DECREF(r)  __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
  #define __Pyx_GOTREF(r)  __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
  #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
  #define __Pyx_XINCREF(r)  do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0)
  #define __Pyx_XDECREF(r)  do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0)
  #define __Pyx_XGOTREF(r)  do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0)
  #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0)
#else
  #define __Pyx_RefNannyDeclarations
  #define __Pyx_RefNannySetupContext(name, acquire_gil)
  #define __Pyx_RefNannyFinishContext()
  #define __Pyx_INCREF(r) Py_INCREF(r)
  #define __Pyx_DECREF(r) Py_DECREF(r)
  #define __Pyx_GOTREF(r)
  #define __Pyx_GIVEREF(r)
  #define __Pyx_XINCREF(r) Py_XINCREF(r)
  #define __Pyx_XDECREF(r) Py_XDECREF(r)
  #define __Pyx_XGOTREF(r)
  #define __Pyx_XGIVEREF(r)
#endif
#define __Pyx_XDECREF_SET(r, v) do {\
        PyObject *tmp = (PyObject *) r;\
        r = v; __Pyx_XDECREF(tmp);\
    } while (0)
#define __Pyx_DECREF_SET(r, v) do {\
        PyObject *tmp = (PyObject *) r;\
        r = v; __Pyx_DECREF(tmp);\
    } while (0)
#define __Pyx_CLEAR(r)    do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0)
#define __Pyx_XCLEAR(r)   do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0)

/* PyObjectGetAttrStr.proto */
#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) {
    PyTypeObject* tp = Py_TYPE(obj);
    if (likely(tp->tp_getattro))
        return tp->tp_getattro(obj, attr_name);
#if PY_MAJOR_VERSION < 3
    if (likely(tp->tp_getattr))
        return tp->tp_getattr(obj, PyString_AS_STRING(attr_name));
#endif
    return PyObject_GetAttr(obj, attr_name);
}
#else
#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n)
#endif

/* GetBuiltinName.proto */
static PyObject *__Pyx_GetBuiltinName(PyObject *name);

/* KeywordStringCheck.proto */
static CYTHON_INLINE int __Pyx_CheckKeywordStrings(PyObject *kwdict, const char* function_name, int kw_allowed);

/* None.proto */
static CYTHON_INLINE void __Pyx_RaiseClosureNameError(const char *varname);

/* PyObjectCall.proto */
#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw);
#else
#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw)
#endif

/* FetchCommonType.proto */
static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type);

/* CythonFunction.proto */
#define __Pyx_CyFunction_USED 1
#include <structmember.h>
#define __Pyx_CYFUNCTION_STATICMETHOD  0x01
#define __Pyx_CYFUNCTION_CLASSMETHOD   0x02
#define __Pyx_CYFUNCTION_CCLASS        0x04
#define __Pyx_CyFunction_GetClosure(f)\
    (((__pyx_CyFunctionObject *) (f))->func_closure)
#define __Pyx_CyFunction_GetClassObj(f)\
    (((__pyx_CyFunctionObject *) (f))->func_classobj)
#define __Pyx_CyFunction_Defaults(type, f)\
    ((type *)(((__pyx_CyFunctionObject *) (f))->defaults))
#define __Pyx_CyFunction_SetDefaultsGetter(f, g)\
    ((__pyx_CyFunctionObject *) (f))->defaults_getter = (g)
typedef struct {
    PyCFunctionObject func;
#if PY_VERSION_HEX < 0x030500A0
    PyObject *func_weakreflist;
#endif
    PyObject *func_dict;
    PyObject *func_name;
    PyObject *func_qualname;
    PyObject *func_doc;
    PyObject *func_globals;
    PyObject *func_code;
    PyObject *func_closure;
    PyObject *func_classobj;
    void *defaults;
    int defaults_pyobjects;
    int flags;
    PyObject *defaults_tuple;
    PyObject *defaults_kwdict;
    PyObject *(*defaults_getter)(PyObject *);
    PyObject *func_annotations;
} __pyx_CyFunctionObject;
static PyTypeObject *__pyx_CyFunctionType = 0;
#define __Pyx_CyFunction_NewEx(ml, flags, qualname, self, module, globals, code)\
    __Pyx_CyFunction_New(__pyx_CyFunctionType, ml, flags, qualname, self, module, globals, code)
static PyObject *__Pyx_CyFunction_New(PyTypeObject *, PyMethodDef *ml,
                                      int flags, PyObject* qualname,
                                      PyObject *self,
                                      PyObject *module, PyObject *globals,
                                      PyObject* code);
static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *m,
                                                         size_t size,
                                                         int pyobjects);
static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *m,
                                                            PyObject *tuple);
static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *m,
                                                             PyObject *dict);
static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *m,
                                                              PyObject *dict);
static int __pyx_CyFunction_init(void);

/* PyObjectCallMethO.proto */
#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg);
#endif

/* PyObjectCallOneArg.proto */
static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg);

/* GetModuleGlobalName.proto */
static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name);

/* PyObjectSetAttrStr.proto */
#if CYTHON_COMPILING_IN_CPYTHON
#define __Pyx_PyObject_DelAttrStr(o,n) __Pyx_PyObject_SetAttrStr(o,n,NULL)
static CYTHON_INLINE int __Pyx_PyObject_SetAttrStr(PyObject* obj, PyObject* attr_name, PyObject* value) {
    PyTypeObject* tp = Py_TYPE(obj);
    if (likely(tp->tp_setattro))
        return tp->tp_setattro(obj, attr_name, value);
#if PY_MAJOR_VERSION < 3
    if (likely(tp->tp_setattr))
        return tp->tp_setattr(obj, PyString_AS_STRING(attr_name), value);
#endif
    return PyObject_SetAttr(obj, attr_name, value);
}
#else
#define __Pyx_PyObject_DelAttrStr(o,n)   PyObject_DelAttr(o,n)
#define __Pyx_PyObject_SetAttrStr(o,n,v) PyObject_SetAttr(o,n,v)
#endif

/* PyObjectCallNoArg.proto */
#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func);
#else
#define __Pyx_PyObject_CallNoArg(func) __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL)
#endif

/* PyThreadStateGet.proto */
#if CYTHON_COMPILING_IN_CPYTHON
#define __Pyx_PyThreadState_declare  PyThreadState *__pyx_tstate;
#define __Pyx_PyThreadState_assign  __pyx_tstate = PyThreadState_GET();
#else
#define __Pyx_PyThreadState_declare
#define __Pyx_PyThreadState_assign
#endif

/* SaveResetException.proto */
#if CYTHON_COMPILING_IN_CPYTHON
#define __Pyx_ExceptionSave(type, value, tb)  __Pyx__ExceptionSave(__pyx_tstate, type, value, tb)
static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb);
#define __Pyx_ExceptionReset(type, value, tb)  __Pyx__ExceptionReset(__pyx_tstate, type, value, tb)
static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb);
#else
#define __Pyx_ExceptionSave(type, value, tb)   PyErr_GetExcInfo(type, value, tb)
#define __Pyx_ExceptionReset(type, value, tb)  PyErr_SetExcInfo(type, value, tb)
#endif

/* PyErrExceptionMatches.proto */
#if CYTHON_COMPILING_IN_CPYTHON
#define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err)
static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err);
#else
#define __Pyx_PyErr_ExceptionMatches(err)  PyErr_ExceptionMatches(err)
#endif

/* GetException.proto */
#if CYTHON_COMPILING_IN_CPYTHON
#define __Pyx_GetException(type, value, tb)  __Pyx__GetException(__pyx_tstate, type, value, tb)
static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb);
#else
static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb);
#endif

/* PyErrFetchRestore.proto */
#if CYTHON_COMPILING_IN_CPYTHON
#define __Pyx_ErrRestoreWithState(type, value, tb)  __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb)
#define __Pyx_ErrFetchWithState(type, value, tb)    __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb)
#define __Pyx_ErrRestore(type, value, tb)  __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb)
#define __Pyx_ErrFetch(type, value, tb)    __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb)
static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb);
static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb);
#else
#define __Pyx_ErrRestoreWithState(type, value, tb)  PyErr_Restore(type, value, tb)
#define __Pyx_ErrFetchWithState(type, value, tb)  PyErr_Fetch(type, value, tb)
#define __Pyx_ErrRestore(type, value, tb)  PyErr_Restore(type, value, tb)
#define __Pyx_ErrFetch(type, value, tb)  PyErr_Fetch(type, value, tb)
#endif

/* RaiseDoubleKeywords.proto */
static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name);

/* ParseKeywords.proto */
static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\
    PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\
    const char* function_name);

/* RaiseArgTupleInvalid.proto */
static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact,
    Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found);

/* RaiseException.proto */
static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause);

/* ArgTypeTest.proto */
static CYTHON_INLINE int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,
    const char *name, int exact);

/* GetItemInt.proto */
#define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\
    (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\
    __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) :\
    (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) :\
               __Pyx_GetItemInt_Generic(o, to_py_func(i))))
#define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\
    (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\
    __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\
    (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL))
static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i,
                                                              int wraparound, int boundscheck);
#define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\
    (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\
    __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\
    (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL))
static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i,
                                                              int wraparound, int boundscheck);
static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j);
static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i,
                                                     int is_list, int wraparound, int boundscheck);

/* CallNextTpDealloc.proto */
static void __Pyx_call_next_tp_dealloc(PyObject* obj, destructor current_tp_dealloc);

/* CallNextTpTraverse.proto */
static int __Pyx_call_next_tp_traverse(PyObject* obj, visitproc v, void *a, traverseproc current_tp_traverse);

/* CallNextTpClear.proto */
static void __Pyx_call_next_tp_clear(PyObject* obj, inquiry current_tp_dealloc);

/* IncludeStringH.proto */
#include <string.h>

/* GetVTable.proto */
static void* __Pyx_GetVtable(PyObject *dict);

/* SetVTable.proto */
static int __Pyx_SetVtable(PyObject *dict, void *vtable);

/* Import.proto */
static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level);

/* PatchModuleWithCoroutine.proto */
static PyObject* __Pyx_Coroutine_patch_module(PyObject* module, const char* py_code);

/* PatchInspect.proto */
static PyObject* __Pyx_patch_inspect(PyObject* module);

/* ImportFrom.proto */
static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name);

/* CalculateMetaclass.proto */
static PyObject *__Pyx_CalculateMetaclass(PyTypeObject *metaclass, PyObject *bases);

/* Py3ClassCreate.proto */
static PyObject *__Pyx_Py3MetaclassPrepare(PyObject *metaclass, PyObject *bases, PyObject *name, PyObject *qualname,
                                           PyObject *mkw, PyObject *modname, PyObject *doc);
static PyObject *__Pyx_Py3ClassCreate(PyObject *metaclass, PyObject *name, PyObject *bases, PyObject *dict,
                                      PyObject *mkw, int calculate_metaclass, int allow_py2_metaclass);

/* GetAttr.proto */
static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *, PyObject *);

/* Globals.proto */
static PyObject* __Pyx_Globals(void);

/* CodeObjectCache.proto */
typedef struct {
    PyCodeObject* code_object;
    int code_line;
} __Pyx_CodeObjectCacheEntry;
struct __Pyx_CodeObjectCache {
    int count;
    int max_count;
    __Pyx_CodeObjectCacheEntry* entries;
};
static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL};
static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line);
static PyCodeObject *__pyx_find_code_object(int code_line);
static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object);

/* AddTraceback.proto */
static void __Pyx_AddTraceback(const char *funcname, int c_line,
                               int py_line, const char *filename);

/* CIntToPy.proto */
static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value);

/* CIntFromPy.proto */
static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *);

/* CIntFromPy.proto */
static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *);

/* SwapException.proto */
#if CYTHON_COMPILING_IN_CPYTHON
#define __Pyx_ExceptionSwap(type, value, tb)  __Pyx__ExceptionSwap(__pyx_tstate, type, value, tb)
static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb);
#else
static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb);
#endif

/* PyObjectCallMethod1.proto */
static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name, PyObject* arg);

/* CoroutineBase.proto */
typedef PyObject *(*__pyx_coroutine_body_t)(PyObject *, PyObject *);
typedef struct {
    PyObject_HEAD
    __pyx_coroutine_body_t body;
    PyObject *closure;
    PyObject *exc_type;
    PyObject *exc_value;
    PyObject *exc_traceback;
    PyObject *gi_weakreflist;
    PyObject *classobj;
    PyObject *yieldfrom;
    PyObject *gi_name;
    PyObject *gi_qualname;
    int resume_label;
    char is_running;
} __pyx_CoroutineObject;
static __pyx_CoroutineObject *__Pyx__Coroutine_New(PyTypeObject *type, __pyx_coroutine_body_t body,
                                                   PyObject *closure, PyObject *name, PyObject *qualname);
static int __Pyx_Coroutine_clear(PyObject *self);
#if 1 || PY_VERSION_HEX < 0x030300B0
static int __Pyx_PyGen_FetchStopIterationValue(PyObject **pvalue);
#else
#define __Pyx_PyGen_FetchStopIterationValue(pvalue) PyGen_FetchStopIterationValue(pvalue)
#endif

/* PatchGeneratorABC.proto */
static int __Pyx_patch_abc(void);

/* Generator.proto */
#define __Pyx_Generator_USED
static PyTypeObject *__pyx_GeneratorType = 0;
#define __Pyx_Generator_CheckExact(obj) (Py_TYPE(obj) == __pyx_GeneratorType)
#define __Pyx_Generator_New(body, closure, name, qualname)\
    __Pyx__Coroutine_New(__pyx_GeneratorType, body, closure, name, qualname)
static PyObject *__Pyx_Generator_Next(PyObject *self);
static int __pyx_Generator_init(void);

/* CheckBinaryVersion.proto */
static int __Pyx_check_binary_version(void);

/* VoidPtrExport.proto */
static int __Pyx_ExportVoidPtr(PyObject *name, void *p, const char *sig);

/* FunctionExport.proto */
static int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *sig);

/* PyIdentifierFromString.proto */
#if !defined(__Pyx_PyIdentifier_FromString)
#if PY_MAJOR_VERSION < 3
  #define __Pyx_PyIdentifier_FromString(s) PyString_FromString(s)
#else
  #define __Pyx_PyIdentifier_FromString(s) PyUnicode_FromString(s)
#endif
#endif

/* ModuleImport.proto */
static PyObject *__Pyx_ImportModule(const char *name);

/* TypeImport.proto */
static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, size_t size, int strict);

/* VoidPtrImport.proto */
static int __Pyx_ImportVoidPtr(PyObject *module, const char *name, void **p, const char *sig);

/* FunctionImport.proto */
static int __Pyx_ImportFunction(PyObject *module, const char *funcname, void (**f)(void), const char *sig);

/* InitStrings.proto */
static int __Pyx_InitStrings(__Pyx_StringTabEntry *t);

static int __pyx_f_5asynq_10decorators_24PureAsyncDecoratorBinder_is_pure_async_fn(CYTHON_UNUSED struct __pyx_obj_5asynq_10decorators_PureAsyncDecoratorBinder *__pyx_v_self, int __pyx_skip_dispatch); /* proto*/
static PyObject *__pyx_f_5asynq_10decorators_18PureAsyncDecorator_name(CYTHON_UNUSED struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *__pyx_v_self, int __pyx_skip_dispatch); /* proto*/
static int __pyx_f_5asynq_10decorators_18PureAsyncDecorator_is_pure_async_fn(CYTHON_UNUSED struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *__pyx_v_self, int __pyx_skip_dispatch); /* proto*/
static PyObject *__pyx_f_5asynq_10decorators_18PureAsyncDecorator__call_pure(struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *__pyx_v_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, int __pyx_skip_dispatch); /* proto*/
static int __pyx_f_5asynq_10decorators_14AsyncDecorator_is_pure_async_fn(CYTHON_UNUSED struct __pyx_obj_5asynq_10decorators_AsyncDecorator *__pyx_v_self, int __pyx_skip_dispatch); /* proto*/
static PyObject *__pyx_f_5asynq_10decorators_14AsyncDecorator_name(CYTHON_UNUSED struct __pyx_obj_5asynq_10decorators_AsyncDecorator *__pyx_v_self, int __pyx_skip_dispatch); /* proto*/
static PyObject *__pyx_f_5asynq_10decorators_19AsyncProxyDecorator__call_pure(struct __pyx_obj_5asynq_10decorators_AsyncProxyDecorator *__pyx_v_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, int __pyx_skip_dispatch); /* proto*/

/* Module declarations from 'cython' */

/* Module declarations from 'libc.string' */

/* Module declarations from 'libc.stdio' */

/* Module declarations from '__builtin__' */

/* Module declarations from 'cpython.type' */
static PyTypeObject *__pyx_ptype_7cpython_4type_type = 0;

/* Module declarations from 'cpython.version' */

/* Module declarations from 'cpython.exc' */

/* Module declarations from 'cpython.module' */

/* Module declarations from 'cpython.mem' */

/* Module declarations from 'cpython.tuple' */

/* Module declarations from 'cpython.list' */

/* Module declarations from 'cpython.sequence' */

/* Module declarations from 'cpython.mapping' */

/* Module declarations from 'cpython.iterator' */

/* Module declarations from 'cpython.number' */

/* Module declarations from 'cpython.int' */

/* Module declarations from '__builtin__' */

/* Module declarations from 'cpython.bool' */
static PyTypeObject *__pyx_ptype_7cpython_4bool_bool = 0;

/* Module declarations from 'cpython.long' */

/* Module declarations from 'cpython.float' */

/* Module declarations from '__builtin__' */

/* Module declarations from 'cpython.complex' */
static PyTypeObject *__pyx_ptype_7cpython_7complex_complex = 0;

/* Module declarations from 'cpython.string' */

/* Module declarations from 'cpython.unicode' */

/* Module declarations from 'cpython.dict' */

/* Module declarations from 'cpython.instance' */

/* Module declarations from 'cpython.function' */

/* Module declarations from 'cpython.method' */

/* Module declarations from 'cpython.weakref' */

/* Module declarations from 'cpython.getargs' */

/* Module declarations from 'cpython.pythread' */

/* Module declarations from 'cpython.pystate' */

/* Module declarations from 'cpython.cobject' */

/* Module declarations from 'cpython.oldbuffer' */

/* Module declarations from 'cpython.set' */

/* Module declarations from 'cpython.buffer' */

/* Module declarations from 'cpython.bytes' */

/* Module declarations from 'cpython.pycapsule' */

/* Module declarations from 'cpython' */

/* Module declarations from 'cpython.object' */

/* Module declarations from 'cpython.ref' */

/* Module declarations from 'qcore.helpers' */
static PyTypeObject *__pyx_ptype_5qcore_7helpers_MarkerObject = 0;
static PyTypeObject *__pyx_ptype_5qcore_7helpers_EmptyContext = 0;
static PyTypeObject *__pyx_ptype_5qcore_7helpers_CythonCachedHashWrapper = 0;
static PyTypeObject *__pyx_ptype_5qcore_7helpers__ScopedValueOverrideContext = 0;
static PyTypeObject *__pyx_ptype_5qcore_7helpers_ScopedValue = 0;
static PyTypeObject *__pyx_ptype_5qcore_7helpers__PropertyOverrideContext = 0;
static PyObject **__pyx_vp_5qcore_7helpers_empty_list = 0;
#define __pyx_v_5qcore_7helpers_empty_list (*__pyx_vp_5qcore_7helpers_empty_list)
static PyObject **__pyx_vp_5qcore_7helpers_empty_tuple = 0;
#define __pyx_v_5qcore_7helpers_empty_tuple (*__pyx_vp_5qcore_7helpers_empty_tuple)
static PyObject **__pyx_vp_5qcore_7helpers_empty_dict = 0;
#define __pyx_v_5qcore_7helpers_empty_dict (*__pyx_vp_5qcore_7helpers_empty_dict)
static struct __pyx_obj_5qcore_7helpers_MarkerObject **__pyx_vp_5qcore_7helpers_none = 0;
#define __pyx_v_5qcore_7helpers_none (*__pyx_vp_5qcore_7helpers_none)
static struct __pyx_obj_5qcore_7helpers_MarkerObject **__pyx_vp_5qcore_7helpers_miss = 0;
#define __pyx_v_5qcore_7helpers_miss (*__pyx_vp_5qcore_7helpers_miss)
static struct __pyx_obj_5qcore_7helpers_MarkerObject **__pyx_vp_5qcore_7helpers_same = 0;
#define __pyx_v_5qcore_7helpers_same (*__pyx_vp_5qcore_7helpers_same)
static struct __pyx_obj_5qcore_7helpers_MarkerObject **__pyx_vp_5qcore_7helpers_unspecified = 0;
#define __pyx_v_5qcore_7helpers_unspecified (*__pyx_vp_5qcore_7helpers_unspecified)
static struct __pyx_obj_5qcore_7helpers_EmptyContext **__pyx_vp_5qcore_7helpers_empty_context = 0;
#define __pyx_v_5qcore_7helpers_empty_context (*__pyx_vp_5qcore_7helpers_empty_context)
static PyObject **__pyx_vp_5qcore_7helpers_CachedHashWrapper = 0;
#define __pyx_v_5qcore_7helpers_CachedHashWrapper (*__pyx_vp_5qcore_7helpers_CachedHashWrapper)
static PyObject **__pyx_vp_5qcore_7helpers_override = 0;
#define __pyx_v_5qcore_7helpers_override (*__pyx_vp_5qcore_7helpers_override)

/* Module declarations from 'qcore.inspection' */
static PyObject *(*__pyx_f_5qcore_10inspection_get_original_fn)(PyObject *, int __pyx_skip_dispatch); /*proto*/
static PyObject *(*__pyx_f_5qcore_10inspection_get_function_call_repr)(PyObject *, PyObject *, PyObject *, int __pyx_skip_dispatch); /*proto*/
static int (*__pyx_f_5qcore_10inspection_is_cython_or_generator)(PyObject *, int __pyx_skip_dispatch); /*proto*/
static PyObject *(*__pyx_f_5qcore_10inspection_wraps)(PyObject *, int __pyx_skip_dispatch, struct __pyx_opt_args_5qcore_10inspection_wraps *__pyx_optional_args); /*proto*/

/* Module declarations from 'qcore.decorators' */
static PyTypeObject *__pyx_ptype_5qcore_10decorators_DecoratorBase = 0;
static PyTypeObject *__pyx_ptype_5qcore_10decorators_DecoratorBinder = 0;

/* Module declarations from 'qcore.events' */
static PyTypeObject *__pyx_ptype_5qcore_6events_EventHook = 0;
static PyTypeObject *__pyx_ptype_5qcore_6events_SinkingEventHook = 0;
static PyTypeObject *__pyx_ptype_5qcore_6events_EventInterceptor = 0;
static struct __pyx_obj_5qcore_6events_SinkingEventHook **__pyx_vp_5qcore_6events_sinking_event_hook = 0;
#define __pyx_v_5qcore_6events_sinking_event_hook (*__pyx_vp_5qcore_6events_sinking_event_hook)

/* Module declarations from 'qcore' */

/* Module declarations from 'asynq._debug' */
static PyTypeObject *__pyx_ptype_5asynq_6_debug_DebugOptions = 0;
static struct __pyx_obj_5asynq_6_debug_DebugOptions **__pyx_vp_5asynq_6_debug_options = 0;
#define __pyx_v_5asynq_6_debug_options (*__pyx_vp_5asynq_6_debug_options)

/* Module declarations from 'asynq.futures' */
static PyTypeObject *__pyx_ptype_5asynq_7futures_FutureBase = 0;
static PyTypeObject *__pyx_ptype_5asynq_7futures_Future = 0;
static PyTypeObject *__pyx_ptype_5asynq_7futures_ConstFuture = 0;
static PyTypeObject *__pyx_ptype_5asynq_7futures_ErrorFuture = 0;
static struct __pyx_obj_5asynq_6_debug_DebugOptions **__pyx_vp_5asynq_7futures__debug_options = 0;
#define __pyx_v_5asynq_7futures__debug_options (*__pyx_vp_5asynq_7futures__debug_options)
static struct __pyx_obj_5qcore_7helpers_MarkerObject **__pyx_vp_5asynq_7futures__none = 0;
#define __pyx_v_5asynq_7futures__none (*__pyx_vp_5asynq_7futures__none)

/* Module declarations from 'asynq.batching' */
static PyTypeObject *__pyx_ptype_5asynq_8batching_BatchBase = 0;
static PyTypeObject *__pyx_ptype_5asynq_8batching_BatchItemBase = 0;
static PyTypeObject *__pyx_ptype_5asynq_8batching_DebugBatchItem = 0;
static PyTypeObject *__pyx_ptype_5asynq_8batching_DebugBatch = 0;
static struct __pyx_obj_5asynq_6_debug_DebugOptions **__pyx_vp_5asynq_8batching__debug_options = 0;
#define __pyx_v_5asynq_8batching__debug_options (*__pyx_vp_5asynq_8batching__debug_options)
static PyObject **__pyx_vp_5asynq_8batching__debug_batch_state = 0;
#define __pyx_v_5asynq_8batching__debug_batch_state (*__pyx_vp_5asynq_8batching__debug_batch_state)

/* Module declarations from 'asynq.scheduler' */
static PyTypeObject *__pyx_ptype_5asynq_9scheduler_TaskScheduler = 0;
static PyTypeObject *__pyx_ptype_5asynq_9scheduler_TaskSchedulerActivator = 0;
static struct __pyx_obj_5asynq_6_debug_DebugOptions **__pyx_vp_5asynq_9scheduler__debug_options = 0;
#define __pyx_v_5asynq_9scheduler__debug_options (*__pyx_vp_5asynq_9scheduler__debug_options)
static PyObject **__pyx_vp_5asynq_9scheduler__futures_none = 0;
#define __pyx_v_5asynq_9scheduler__futures_none (*__pyx_vp_5asynq_9scheduler__futures_none)
static PyObject **__pyx_vp_5asynq_9scheduler__state = 0;
#define __pyx_v_5asynq_9scheduler__state (*__pyx_vp_5asynq_9scheduler__state)

/* Module declarations from 'asynq.async_task' */
static PyTypeObject *__pyx_ptype_5asynq_10async_task_AsyncTask = 0;
static struct __pyx_obj_5asynq_6_debug_DebugOptions **__pyx_vp_5asynq_10async_task__debug_options = 0;
#define __pyx_v_5asynq_10async_task__debug_options (*__pyx_vp_5asynq_10async_task__debug_options)
static PyObject **__pyx_vp_5asynq_10async_task__futures_none = 0;
#define __pyx_v_5asynq_10async_task__futures_none (*__pyx_vp_5asynq_10async_task__futures_none)
static PyObject **__pyx_vp_5asynq_10async_task__none_future = 0;
#define __pyx_v_5asynq_10async_task__none_future (*__pyx_vp_5asynq_10async_task__none_future)
static PyObject **__pyx_vp_5asynq_10async_task__empty_tuple = 0;
#define __pyx_v_5asynq_10async_task__empty_tuple (*__pyx_vp_5asynq_10async_task__empty_tuple)
static PyObject **__pyx_vp_5asynq_10async_task__empty_dictionary = 0;
#define __pyx_v_5asynq_10async_task__empty_dictionary (*__pyx_vp_5asynq_10async_task__empty_dictionary)

/* Module declarations from 'asynq.decorators' */
static PyTypeObject *__pyx_ptype_5asynq_10decorators_PureAsyncDecoratorBinder = 0;
static PyTypeObject *__pyx_ptype_5asynq_10decorators_PureAsyncDecorator = 0;
static PyTypeObject *__pyx_ptype_5asynq_10decorators_AsyncDecoratorBinder = 0;
static PyTypeObject *__pyx_ptype_5asynq_10decorators_AsyncDecorator = 0;
static PyTypeObject *__pyx_ptype_5asynq_10decorators_AsyncAndSyncPairDecorator = 0;
static PyTypeObject *__pyx_ptype_5asynq_10decorators_AsyncProxyDecorator = 0;
static PyTypeObject *__pyx_ptype_5asynq_10decorators_AsyncAndSyncPairProxyDecorator = 0;
static PyTypeObject *__pyx_ptype_5asynq_10decorators___pyx_scope_struct__lazy = 0;
static PyTypeObject *__pyx_ptype_5asynq_10decorators___pyx_scope_struct_1_new_fn = 0;
static PyTypeObject *__pyx_ptype_5asynq_10decorators___pyx_scope_struct_2_get_async_fn = 0;
static PyTypeObject *__pyx_ptype_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper = 0;
static PyTypeObject *__pyx_ptype_5asynq_10decorators___pyx_scope_struct_4_async = 0;
static PyTypeObject *__pyx_ptype_5asynq_10decorators___pyx_scope_struct_5_async_proxy = 0;
static PyTypeObject *__pyx_ptype_5asynq_10decorators___pyx_scope_struct_6_cached = 0;
static PyTypeObject *__pyx_ptype_5asynq_10decorators___pyx_scope_struct_7_decorate = 0;
static PyTypeObject *__pyx_ptype_5asynq_10decorators___pyx_scope_struct_8__cached_impl = 0;
static PyTypeObject *__pyx_ptype_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl = 0;
static struct __pyx_obj_5asynq_6_debug_DebugOptions *__pyx_v_5asynq_10decorators__debug_options = 0;
static PyObject *__pyx_v_5asynq_10decorators__cached = 0;
static PyObject *__pyx_v_5asynq_10decorators__cache_set = 0;
static int __pyx_f_5asynq_10decorators_has_async_fn(PyObject *, int __pyx_skip_dispatch); /*proto*/
static int __pyx_f_5asynq_10decorators_is_pure_async_fn(PyObject *, int __pyx_skip_dispatch); /*proto*/
static PyObject *__pyx_f_5asynq_10decorators__assert_apply_without_invocation(PyObject *, PyObject *, struct __pyx_opt_args_5asynq_10decorators__assert_apply_without_invocation *__pyx_optional_args); /*proto*/
static PyObject *__pyx_f_5asynq_10decorators__get_cache_key(PyObject *, PyObject *, PyObject *, int __pyx_skip_dispatch); /*proto*/
#define __Pyx_MODULE_NAME "asynq.decorators"
int __pyx_module_is_main_asynq__decorators = 0;

/* Implementation of 'asynq.decorators' */
static PyObject *__pyx_builtin_TypeError;
static PyObject *__pyx_builtin_AttributeError;
static PyObject *__pyx_builtin_staticmethod;
static PyObject *__pyx_builtin_classmethod;
static PyObject *__pyx_builtin_super;
static PyObject *__pyx_builtin_StopIteration;
static const char __pyx_k_s[] = "@%s()";
static const char __pyx_k_fn[] = "fn";
static const char __pyx_k__18[] = "*";
static const char __pyx_k__19[] = "";
static const char __pyx_k_cls[] = "cls";
static const char __pyx_k_doc[] = "__doc__";
static const char __pyx_k_get[] = "__get__";
static const char __pyx_k_key[] = "key";
static const char __pyx_k_set[] = "set";
static const char __pyx_k_args[] = "args";
static const char __pyx_k_call[] = "__call__";
static const char __pyx_k_init[] = "__init__";
static const char __pyx_k_lazy[] = "lazy";
static const char __pyx_k_main[] = "__main__";
static const char __pyx_k_name[] = "name";
static const char __pyx_k_pure[] = "pure";
static const char __pyx_k_self[] = "self";
static const char __pyx_k_send[] = "send";
static const char __pyx_k_test[] = "__test__";
static const char __pyx_k_async[] = "async";
static const char __pyx_k_cache[] = "cache";
static const char __pyx_k_close[] = "close";
static const char __pyx_k_debug[] = "_debug";
static const char __pyx_k_dirty[] = "dirty";
static const char __pyx_k_get_2[] = "get";
static const char __pyx_k_qcore[] = "qcore";
static const char __pyx_k_start[] = "start";
static const char __pyx_k_super[] = "super";
static const char __pyx_k_throw[] = "throw";
static const char __pyx_k_types[] = "types";
static const char __pyx_k_value[] = "value";
static const char __pyx_k_cached[] = "_cached";
static const char __pyx_k_import[] = "__import__";
static const char __pyx_k_kwargs[] = "kwargs";
static const char __pyx_k_module[] = "__module__";
static const char __pyx_k_new_fn[] = "new_fn";
static const char __pyx_k_result[] = "result";
static const char __pyx_k_async_2[] = "@async()";
static const char __pyx_k_futures[] = "futures";
static const char __pyx_k_inspect[] = "inspect";
static const char __pyx_k_prepare[] = "__prepare__";
static const char __pyx_k_sync_fn[] = "sync_fn";
static const char __pyx_k_true_fn[] = "true_fn";
static const char __pyx_k_cached_2[] = "cached";
static const char __pyx_k_decorate[] = "decorate";
static const char __pyx_k_false_fn[] = "false_fn";
static const char __pyx_k_pyx_capi[] = "__pyx_capi__";
static const char __pyx_k_qualname[] = "__qualname__";
static const char __pyx_k_task_cls[] = "task_cls";
static const char __pyx_k_TypeError[] = "TypeError";
static const char __pyx_k_cache_set[] = "_cache_set";
static const char __pyx_k_call_pure[] = "_call_pure";
static const char __pyx_k_decorator[] = "decorator";
static const char __pyx_k_metaclass[] = "__metaclass__";
static const char __pyx_k_async_call[] = "async_call";
static const char __pyx_k_async_task[] = "async_task";
static const char __pyx_k_binder_cls[] = "binder_cls";
static const char __pyx_k_call_async[] = "_call_async";
static const char __pyx_k_decorators[] = "decorators";
static const char __pyx_k_fn_wrapper[] = "_fn_wrapper";
static const char __pyx_k_pyx_vtable[] = "__pyx_vtable__";
static const char __pyx_k_wrapper_fn[] = "wrapper_fn";
static const char __pyx_k_async_proxy[] = "async_proxy";
static const char __pyx_k_cached_impl[] = "_cached_impl";
static const char __pyx_k_classmethod[] = "classmethod";
static const char __pyx_k_is_async_fn[] = "is_async_fn";
static const char __pyx_k_original_fn[] = "original_fn";
static const char __pyx_k_AsyncWrapper[] = "AsyncWrapper";
static const char __pyx_k_FunctionType[] = "FunctionType";
static const char __pyx_k_core_helpers[] = "core_helpers";
static const char __pyx_k_get_async_fn[] = "get_async_fn";
static const char __pyx_k_staticmethod[] = "staticmethod";
static const char __pyx_k_wrap_if_none[] = "wrap_if_none";
static const char __pyx_k_StopIteration[] = "StopIteration";
static const char __pyx_k_debug_options[] = "_debug_options";
static const char __pyx_k_function_name[] = "function_name";
static const char __pyx_k_qcore_helpers[] = "qcore.helpers";
static const char __pyx_k_AttributeError[] = "AttributeError";
static const char __pyx_k_cache_set_impl[] = "_cache_set_impl";
static const char __pyx_k_traceback_hide[] = "__traceback_hide__";
static const char __pyx_k_value_provider[] = "value_provider";
static const char __pyx_k_AsyncTaskResult[] = "AsyncTaskResult";
static const char __pyx_k_async_pure_True[] = "@async(pure=True)";
static const char __pyx_k_core_inspection[] = "core_inspection";
static const char __pyx_k_asynq_decorators[] = "asynq.decorators";
static const char __pyx_k_is_pure_async_fn[] = "is_pure_async_fn";
static const char __pyx_k_qcore_decorators[] = "qcore.decorators";
static const char __pyx_k_qcore_inspection[] = "qcore.inspection";
static const char __pyx_k_AsyncWrapper_name[] = "AsyncWrapper.name";
static const char __pyx_k_AsyncWrapper_async[] = "AsyncWrapper.async";
static const char __pyx_k_lazy_locals_new_fn[] = "lazy.<locals>.new_fn";
static const char __pyx_k_AsyncWrapper___call[] = "AsyncWrapper.__call__";
static const char __pyx_k_AsyncWrapper___init[] = "AsyncWrapper.__init__";
static const char __pyx_k_get_async_or_sync_fn[] = "get_async_or_sync_fn";
static const char __pyx_k_make_async_decorator[] = "make_async_decorator";
static const char __pyx_k_async_locals_decorate[] = "async.<locals>.decorate";
static const char __pyx_k_cached_locals_decorate[] = "cached.<locals>.decorate";
static const char __pyx_k_AsyncWrapper__call_async[] = "AsyncWrapper._call_async";
static const char __pyx_k_sync_to_async_fn_wrapper[] = "sync_to_async_fn_wrapper";
static const char __pyx_k_async_proxy_locals_decorate[] = "async_proxy.<locals>.decorate";
static const char __pyx_k_you_must_use_s_instead_of_s[] = "you must use @%s(...) instead of @%s";
static const char __pyx_k_AsyncWrapper_is_pure_async_fn[] = "AsyncWrapper.is_pure_async_fn";
static const char __pyx_k_PureAsyncDecorator__fn_wrapper[] = "PureAsyncDecorator._fn_wrapper";
static const char __pyx_k_async_decorator_can_be_applied[] = "@async() decorator can be applied just once";
static const char __pyx_k_AsyncAndSyncPairDecoratorBinder[] = "AsyncAndSyncPairDecoratorBinder";
static const char __pyx_k_Implements_make_async_decorator[] = "Implements make_async_decorator.";
static const char __pyx_k_home_jelle_github_asynq_asynq_d[] = "/home/jelle/github/asynq/asynq/decorators.py";
static const char __pyx_k_sync_fn_cannot_be_used_together[] = "sync_fn=? cannot be used together with pure=True";
static const char __pyx_k_cached_locals_decorate_locals_di[] = "cached.<locals>.decorate.<locals>.dirty";
static const char __pyx_k_cached_locals_decorate_locals_ne[] = "cached.<locals>.decorate.<locals>.new_fn";
static const char __pyx_k_custom_kwargs_are_only_supported[] = "custom kwargs are only supported with pure=True";
static const char __pyx_k_get_async_fn_locals_sync_to_asyn[] = "get_async_fn.<locals>.sync_to_async_fn_wrapper";
static const char __pyx_k_lazy_locals_new_fn_locals_lambda[] = "lazy.<locals>.new_fn.<locals>.<lambda>";
static const char __pyx_k_sync_fn_is_not_supported_for_pur[] = "sync_fn is not supported for pure async functions";
static const char __pyx_k_AsyncAndSyncPairDecoratorBinder_2[] = "AsyncAndSyncPairDecoratorBinder.__call__";
static PyObject *__pyx_n_s_AsyncAndSyncPairDecoratorBinder;
static PyObject *__pyx_n_s_AsyncAndSyncPairDecoratorBinder_2;
static PyObject *__pyx_n_s_AsyncTaskResult;
static PyObject *__pyx_n_s_AsyncWrapper;
static PyObject *__pyx_n_s_AsyncWrapper___call;
static PyObject *__pyx_n_s_AsyncWrapper___init;
static PyObject *__pyx_n_s_AsyncWrapper__call_async;
static PyObject *__pyx_n_s_AsyncWrapper_async;
static PyObject *__pyx_n_s_AsyncWrapper_is_pure_async_fn;
static PyObject *__pyx_n_s_AsyncWrapper_name;
static PyObject *__pyx_n_s_AttributeError;
static PyObject *__pyx_n_s_FunctionType;
static PyObject *__pyx_kp_s_Implements_make_async_decorator;
static PyObject *__pyx_n_s_PureAsyncDecorator__fn_wrapper;
static PyObject *__pyx_n_s_StopIteration;
static PyObject *__pyx_n_s_TypeError;
static PyObject *__pyx_n_s__18;
static PyObject *__pyx_n_s__19;
static PyObject *__pyx_n_s_args;
static PyObject *__pyx_n_s_async;
static PyObject *__pyx_kp_s_async_2;
static PyObject *__pyx_n_s_async_call;
static PyObject *__pyx_kp_s_async_decorator_can_be_applied;
static PyObject *__pyx_n_s_async_locals_decorate;
static PyObject *__pyx_n_s_async_proxy;
static PyObject *__pyx_n_s_async_proxy_locals_decorate;
static PyObject *__pyx_kp_s_async_pure_True;
static PyObject *__pyx_n_s_async_task;
static PyObject *__pyx_n_s_asynq_decorators;
static PyObject *__pyx_n_s_binder_cls;
static PyObject *__pyx_n_s_cache;
static PyObject *__pyx_n_s_cache_set;
static PyObject *__pyx_n_s_cache_set_impl;
static PyObject *__pyx_n_s_cached;
static PyObject *__pyx_n_s_cached_2;
static PyObject *__pyx_n_s_cached_impl;
static PyObject *__pyx_n_s_cached_locals_decorate;
static PyObject *__pyx_n_s_cached_locals_decorate_locals_di;
static PyObject *__pyx_n_s_cached_locals_decorate_locals_ne;
static PyObject *__pyx_n_s_call;
static PyObject *__pyx_n_s_call_async;
static PyObject *__pyx_n_s_call_pure;
static PyObject *__pyx_n_s_classmethod;
static PyObject *__pyx_n_s_close;
static PyObject *__pyx_n_s_cls;
static PyObject *__pyx_n_s_core_helpers;
static PyObject *__pyx_n_s_core_inspection;
static PyObject *__pyx_kp_s_custom_kwargs_are_only_supported;
static PyObject *__pyx_n_s_debug;
static PyObject *__pyx_n_s_debug_options;
static PyObject *__pyx_n_s_decorate;
static PyObject *__pyx_n_s_decorator;
static PyObject *__pyx_n_s_decorators;
static PyObject *__pyx_n_s_dirty;
static PyObject *__pyx_n_s_doc;
static PyObject *__pyx_n_s_false_fn;
static PyObject *__pyx_n_s_fn;
static PyObject *__pyx_n_s_fn_wrapper;
static PyObject *__pyx_n_s_function_name;
static PyObject *__pyx_n_s_futures;
static PyObject *__pyx_n_s_get;
static PyObject *__pyx_n_s_get_2;
static PyObject *__pyx_n_s_get_async_fn;
static PyObject *__pyx_n_s_get_async_fn_locals_sync_to_asyn;
static PyObject *__pyx_n_s_get_async_or_sync_fn;
static PyObject *__pyx_kp_s_home_jelle_github_asynq_asynq_d;
static PyObject *__pyx_n_s_import;
static PyObject *__pyx_n_s_init;
static PyObject *__pyx_n_s_inspect;
static PyObject *__pyx_n_s_is_async_fn;
static PyObject *__pyx_n_s_is_pure_async_fn;
static PyObject *__pyx_n_s_key;
static PyObject *__pyx_n_s_kwargs;
static PyObject *__pyx_n_s_lazy;
static PyObject *__pyx_n_s_lazy_locals_new_fn;
static PyObject *__pyx_n_s_lazy_locals_new_fn_locals_lambda;
static PyObject *__pyx_n_s_main;
static PyObject *__pyx_n_s_make_async_decorator;
static PyObject *__pyx_n_s_metaclass;
static PyObject *__pyx_n_s_module;
static PyObject *__pyx_n_s_name;
static PyObject *__pyx_n_s_new_fn;
static PyObject *__pyx_n_s_original_fn;
static PyObject *__pyx_n_s_prepare;
static PyObject *__pyx_n_s_pure;
static PyObject *__pyx_n_s_pyx_capi;
static PyObject *__pyx_n_s_pyx_vtable;
static PyObject *__pyx_n_s_qcore;
static PyObject *__pyx_n_s_qcore_decorators;
static PyObject *__pyx_n_s_qcore_helpers;
static PyObject *__pyx_n_s_qcore_inspection;
static PyObject *__pyx_n_s_qualname;
static PyObject *__pyx_n_s_result;
static PyObject *__pyx_kp_s_s;
static PyObject *__pyx_n_s_self;
static PyObject *__pyx_n_s_send;
static PyObject *__pyx_n_s_set;
static PyObject *__pyx_n_s_start;
static PyObject *__pyx_n_s_staticmethod;
static PyObject *__pyx_n_s_super;
static PyObject *__pyx_n_s_sync_fn;
static PyObject *__pyx_kp_s_sync_fn_cannot_be_used_together;
static PyObject *__pyx_kp_s_sync_fn_is_not_supported_for_pur;
static PyObject *__pyx_n_s_sync_to_async_fn_wrapper;
static PyObject *__pyx_n_s_task_cls;
static PyObject *__pyx_n_s_test;
static PyObject *__pyx_n_s_throw;
static PyObject *__pyx_n_s_traceback_hide;
static PyObject *__pyx_n_s_true_fn;
static PyObject *__pyx_n_s_types;
static PyObject *__pyx_n_s_value;
static PyObject *__pyx_n_s_value_provider;
static PyObject *__pyx_n_s_wrap_if_none;
static PyObject *__pyx_n_s_wrapper_fn;
static PyObject *__pyx_kp_s_you_must_use_s_instead_of_s;
static PyObject *__pyx_lambda_funcdef_lambda(PyObject *__pyx_self); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_4lazy_new_fn(PyObject *__pyx_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_lazy(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_fn); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_2has_async_fn(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_fn); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_4is_pure_async_fn(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_fn); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_6is_async_fn(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_fn); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_12get_async_fn_sync_to_async_fn_wrapper(PyObject *__pyx_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_8get_async_fn(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_fn, PyObject *__pyx_v_wrap_if_none); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_10get_async_or_sync_fn(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_fn); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_24PureAsyncDecoratorBinder_is_pure_async_fn(struct __pyx_obj_5asynq_10decorators_PureAsyncDecoratorBinder *__pyx_v_self); /* proto */
static int __pyx_pf_5asynq_10decorators_18PureAsyncDecorator___init__(struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *__pyx_v_self, PyObject *__pyx_v_fn, PyObject *__pyx_v_task_cls, PyObject *__pyx_v_kwargs); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_18PureAsyncDecorator_2name(struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_18PureAsyncDecorator_4is_pure_async_fn(struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_18PureAsyncDecorator_6_fn_wrapper(struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *__pyx_v_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_18PureAsyncDecorator_9__call__(struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *__pyx_v_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_18PureAsyncDecorator_11_call_pure(struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *__pyx_v_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_18PureAsyncDecorator_8task_cls___get__(struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *__pyx_v_self); /* proto */
static int __pyx_pf_5asynq_10decorators_18PureAsyncDecorator_8task_cls_2__set__(struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
static int __pyx_pf_5asynq_10decorators_18PureAsyncDecorator_8task_cls_4__del__(struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_18PureAsyncDecorator_6kwargs___get__(struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *__pyx_v_self); /* proto */
static int __pyx_pf_5asynq_10decorators_18PureAsyncDecorator_6kwargs_2__set__(struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
static int __pyx_pf_5asynq_10decorators_18PureAsyncDecorator_6kwargs_4__del__(struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_18PureAsyncDecorator_13needs_wrapper___get__(struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *__pyx_v_self); /* proto */
static int __pyx_pf_5asynq_10decorators_18PureAsyncDecorator_13needs_wrapper_2__set__(struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_20AsyncDecoratorBinder_async(struct __pyx_obj_5asynq_10decorators_AsyncDecoratorBinder *__pyx_v_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_14AsyncDecorator_is_pure_async_fn(struct __pyx_obj_5asynq_10decorators_AsyncDecorator *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_14AsyncDecorator_2async(struct __pyx_obj_5asynq_10decorators_AsyncDecorator *__pyx_v_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_14AsyncDecorator_4name(struct __pyx_obj_5asynq_10decorators_AsyncDecorator *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_14AsyncDecorator_6__call__(struct __pyx_obj_5asynq_10decorators_AsyncDecorator *__pyx_v_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_31AsyncAndSyncPairDecoratorBinder___call__(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs); /* proto */
static int __pyx_pf_5asynq_10decorators_25AsyncAndSyncPairDecorator___init__(struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairDecorator *__pyx_v_self, PyObject *__pyx_v_fn, PyObject *__pyx_v_cls, PyObject *__pyx_v_sync_fn, PyObject *__pyx_v_kwargs); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_25AsyncAndSyncPairDecorator_2__call__(struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairDecorator *__pyx_v_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_25AsyncAndSyncPairDecorator_4__get__(struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairDecorator *__pyx_v_self, PyObject *__pyx_v_owner, PyObject *__pyx_v_cls); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_25AsyncAndSyncPairDecorator_7sync_fn___get__(struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairDecorator *__pyx_v_self); /* proto */
static int __pyx_pf_5asynq_10decorators_25AsyncAndSyncPairDecorator_7sync_fn_2__set__(struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairDecorator *__pyx_v_self, PyObject *__pyx_v_value); /* proto */
static int __pyx_pf_5asynq_10decorators_25AsyncAndSyncPairDecorator_7sync_fn_4__del__(struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairDecorator *__pyx_v_self); /* proto */
static int __pyx_pf_5asynq_10decorators_19AsyncProxyDecorator___init__(struct __pyx_obj_5asynq_10decorators_AsyncProxyDecorator *__pyx_v_self, PyObject *__pyx_v_fn); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_19AsyncProxyDecorator_2_call_pure(struct __pyx_obj_5asynq_10decorators_AsyncProxyDecorator *__pyx_v_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs); /* proto */
static int __pyx_pf_5asynq_10decorators_30AsyncAndSyncPairProxyDecorator___init__(struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairProxyDecorator *__pyx_v_self, PyObject *__pyx_v_fn, PyObject *__pyx_v_sync_fn); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_30AsyncAndSyncPairProxyDecorator_2__call__(struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairProxyDecorator *__pyx_v_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_30__defaults__(CYTHON_UNUSED PyObject *__pyx_self); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_5async_decorate(PyObject *__pyx_self, PyObject *__pyx_v_fn); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_12async(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_pure, PyObject *__pyx_v_sync_fn, PyObject *__pyx_v_cls, PyObject *__pyx_v_kwargs); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_11async_proxy_decorate(PyObject *__pyx_self, PyObject *__pyx_v_fn); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_14async_proxy(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_pure, PyObject *__pyx_v_sync_fn); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_6cached_8decorate_new_fn(PyObject *__pyx_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_6cached_8decorate_2dirty(PyObject *__pyx_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_6cached_decorate(PyObject *__pyx_self, PyObject *__pyx_v_fn); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_16cached(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_cache); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_18async_call(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_fn, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_12AsyncWrapper___init__(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_self, PyObject *__pyx_v_fn, PyObject *__pyx_v_wrapper_fn, PyObject *__pyx_v_name); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_12AsyncWrapper_2name(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_12AsyncWrapper_4_call_async(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_12AsyncWrapper_6__call__(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_12AsyncWrapper_8async(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_12AsyncWrapper_10is_pure_async_fn(CYTHON_UNUSED PyObject *__pyx_self, CYTHON_UNUSED PyObject *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_20make_async_decorator(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_fn, PyObject *__pyx_v_wrapper_fn, PyObject *__pyx_v_name); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_22_cached_impl(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_cache, PyObject *__pyx_v_original_fn, PyObject *__pyx_v_fn, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_25_cache_set_impl(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_cache, PyObject *__pyx_v_key, PyObject *__pyx_v_value); /* proto */
static PyObject *__pyx_pf_5asynq_10decorators_28_get_cache_key(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_fn, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs); /* proto */
static PyObject *__pyx_tp_new_5asynq_10decorators_PureAsyncDecoratorBinder(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
static PyObject *__pyx_tp_new_5asynq_10decorators_PureAsyncDecorator(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
static PyObject *__pyx_tp_new_5asynq_10decorators_AsyncDecoratorBinder(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
static PyObject *__pyx_tp_new_5asynq_10decorators_AsyncDecorator(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
static PyObject *__pyx_tp_new_5asynq_10decorators_AsyncAndSyncPairDecorator(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
static PyObject *__pyx_tp_new_5asynq_10decorators_AsyncProxyDecorator(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
static PyObject *__pyx_tp_new_5asynq_10decorators_AsyncAndSyncPairProxyDecorator(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
static PyObject *__pyx_tp_new_5asynq_10decorators___pyx_scope_struct__lazy(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
static PyObject *__pyx_tp_new_5asynq_10decorators___pyx_scope_struct_1_new_fn(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
static PyObject *__pyx_tp_new_5asynq_10decorators___pyx_scope_struct_2_get_async_fn(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
static PyObject *__pyx_tp_new_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
static PyObject *__pyx_tp_new_5asynq_10decorators___pyx_scope_struct_4_async(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
static PyObject *__pyx_tp_new_5asynq_10decorators___pyx_scope_struct_5_async_proxy(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
static PyObject *__pyx_tp_new_5asynq_10decorators___pyx_scope_struct_6_cached(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
static PyObject *__pyx_tp_new_5asynq_10decorators___pyx_scope_struct_7_decorate(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
static PyObject *__pyx_tp_new_5asynq_10decorators___pyx_scope_struct_8__cached_impl(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
static PyObject *__pyx_tp_new_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
static PyObject *__pyx_k__5;
static PyObject *__pyx_k__6;
static PyObject *__pyx_k__17;
static PyObject *__pyx_tuple_;
static PyObject *__pyx_tuple__3;
static PyObject *__pyx_tuple__7;
static PyObject *__pyx_tuple__9;
static PyObject *__pyx_tuple__11;
static PyObject *__pyx_tuple__13;
static PyObject *__pyx_tuple__15;
static PyObject *__pyx_tuple__20;
static PyObject *__pyx_tuple__22;
static PyObject *__pyx_tuple__24;
static PyObject *__pyx_tuple__26;
static PyObject *__pyx_tuple__27;
static PyObject *__pyx_tuple__29;
static PyObject *__pyx_tuple__31;
static PyObject *__pyx_tuple__33;
static PyObject *__pyx_tuple__35;
static PyObject *__pyx_tuple__36;
static PyObject *__pyx_tuple__38;
static PyObject *__pyx_tuple__40;
static PyObject *__pyx_tuple__42;
static PyObject *__pyx_tuple__44;
static PyObject *__pyx_tuple__46;
static PyObject *__pyx_tuple__48;
static PyObject *__pyx_tuple__50;
static PyObject *__pyx_tuple__52;
static PyObject *__pyx_tuple__54;
static PyObject *__pyx_tuple__56;
static PyObject *__pyx_codeobj__2;
static PyObject *__pyx_codeobj__4;
static PyObject *__pyx_codeobj__8;
static PyObject *__pyx_codeobj__10;
static PyObject *__pyx_codeobj__12;
static PyObject *__pyx_codeobj__14;
static PyObject *__pyx_codeobj__16;
static PyObject *__pyx_codeobj__21;
static PyObject *__pyx_codeobj__23;
static PyObject *__pyx_codeobj__25;
static PyObject *__pyx_codeobj__28;
static PyObject *__pyx_codeobj__30;
static PyObject *__pyx_codeobj__32;
static PyObject *__pyx_codeobj__34;
static PyObject *__pyx_codeobj__37;
static PyObject *__pyx_codeobj__39;
static PyObject *__pyx_codeobj__41;
static PyObject *__pyx_codeobj__43;
static PyObject *__pyx_codeobj__45;
static PyObject *__pyx_codeobj__47;
static PyObject *__pyx_codeobj__49;
static PyObject *__pyx_codeobj__51;
static PyObject *__pyx_codeobj__53;
static PyObject *__pyx_codeobj__55;
static PyObject *__pyx_codeobj__57;

/* "asynq/decorators.py":31
 * 
 * 
 * def lazy(fn):             # <<<<<<<<<<<<<<
 *     """Converts a function into a lazy one - i.e. its call
 *     returns a Future bound to a function call with passed
 */

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_1lazy(PyObject *__pyx_self, PyObject *__pyx_v_fn); /*proto*/
static char __pyx_doc_5asynq_10decorators_lazy[] = "Converts a function into a lazy one - i.e. its call\n    returns a Future bound to a function call with passed\n    arguments, that can be evaluated on demand later\n\n    ";
static PyMethodDef __pyx_mdef_5asynq_10decorators_1lazy = {"lazy", (PyCFunction)__pyx_pw_5asynq_10decorators_1lazy, METH_O, __pyx_doc_5asynq_10decorators_lazy};
static PyObject *__pyx_pw_5asynq_10decorators_1lazy(PyObject *__pyx_self, PyObject *__pyx_v_fn) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("lazy (wrapper)", 0);
  __pyx_r = __pyx_pf_5asynq_10decorators_lazy(__pyx_self, ((PyObject *)__pyx_v_fn));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":38
 *     """
 *     @core_inspection.wraps(fn)
 *     def new_fn(*args, **kwargs):             # <<<<<<<<<<<<<<
 *         value_provider = lambda: fn(*args, **kwargs)
 *         return futures.Future(value_provider)
 */

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_4lazy_1new_fn(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_mdef_5asynq_10decorators_4lazy_1new_fn = {"new_fn", (PyCFunction)__pyx_pw_5asynq_10decorators_4lazy_1new_fn, METH_VARARGS|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_5asynq_10decorators_4lazy_1new_fn(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_args = 0;
  PyObject *__pyx_v_kwargs = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("new_fn (wrapper)", 0);
  if (unlikely(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "new_fn", 1))) return NULL;
  __pyx_v_kwargs = (__pyx_kwds) ? PyDict_Copy(__pyx_kwds) : PyDict_New(); if (unlikely(!__pyx_v_kwargs)) return NULL;
  __Pyx_GOTREF(__pyx_v_kwargs);
  __Pyx_INCREF(__pyx_args);
  __pyx_v_args = __pyx_args;
  __pyx_r = __pyx_pf_5asynq_10decorators_4lazy_new_fn(__pyx_self, __pyx_v_args, __pyx_v_kwargs);

  /* function exit code */
  __Pyx_XDECREF(__pyx_v_args);
  __Pyx_XDECREF(__pyx_v_kwargs);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":39
 *     @core_inspection.wraps(fn)
 *     def new_fn(*args, **kwargs):
 *         value_provider = lambda: fn(*args, **kwargs)             # <<<<<<<<<<<<<<
 *         return futures.Future(value_provider)
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_4lazy_6new_fn_lambda(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyMethodDef __pyx_mdef_5asynq_10decorators_4lazy_6new_fn_lambda = {"lambda", (PyCFunction)__pyx_pw_5asynq_10decorators_4lazy_6new_fn_lambda, METH_NOARGS, 0};
static PyObject *__pyx_pw_5asynq_10decorators_4lazy_6new_fn_lambda(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("lambda (wrapper)", 0);
  __pyx_r = __pyx_lambda_funcdef_lambda(__pyx_self);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_lambda_funcdef_lambda(PyObject *__pyx_self) {
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_1_new_fn *__pyx_cur_scope;
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_1_new_fn *__pyx_outer_scope;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  __Pyx_RefNannySetupContext("lambda", 0);
  __pyx_outer_scope = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_1_new_fn *) __Pyx_CyFunction_GetClosure(__pyx_self);
  __pyx_cur_scope = __pyx_outer_scope;
  __Pyx_XDECREF(__pyx_r);
  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fn)) { __Pyx_RaiseClosureNameError("fn"); __PYX_ERR(0, 39, __pyx_L1_error) }
  if (unlikely(!__pyx_cur_scope->__pyx_v_args)) { __Pyx_RaiseClosureNameError("args"); __PYX_ERR(0, 39, __pyx_L1_error) }
  if (unlikely(__pyx_cur_scope->__pyx_v_args == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 39, __pyx_L1_error)
  }
  if (unlikely(!__pyx_cur_scope->__pyx_v_kwargs)) { __Pyx_RaiseClosureNameError("kwargs"); __PYX_ERR(0, 39, __pyx_L1_error) }
  if (unlikely(__pyx_cur_scope->__pyx_v_kwargs == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "argument after ** must be a mapping, not NoneType");
    __PYX_ERR(0, 39, __pyx_L1_error)
  }
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_fn, __pyx_cur_scope->__pyx_v_args, __pyx_cur_scope->__pyx_v_kwargs); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 39, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("asynq.decorators.lazy.new_fn.lambda", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":38
 *     """
 *     @core_inspection.wraps(fn)
 *     def new_fn(*args, **kwargs):             # <<<<<<<<<<<<<<
 *         value_provider = lambda: fn(*args, **kwargs)
 *         return futures.Future(value_provider)
 */

static PyObject *__pyx_pf_5asynq_10decorators_4lazy_new_fn(PyObject *__pyx_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs) {
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_1_new_fn *__pyx_cur_scope;
  PyObject *__pyx_v_value_provider = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  __Pyx_RefNannySetupContext("new_fn", 0);
  __pyx_cur_scope = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_1_new_fn *)__pyx_tp_new_5asynq_10decorators___pyx_scope_struct_1_new_fn(__pyx_ptype_5asynq_10decorators___pyx_scope_struct_1_new_fn, __pyx_empty_tuple, NULL);
  if (unlikely(!__pyx_cur_scope)) {
    __Pyx_RefNannyFinishContext();
    return NULL;
  }
  __Pyx_GOTREF(__pyx_cur_scope);
  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct__lazy *) __Pyx_CyFunction_GetClosure(__pyx_self);
  __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_outer_scope));
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope);
  __pyx_cur_scope->__pyx_v_args = __pyx_v_args;
  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_args);
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_args);
  __pyx_cur_scope->__pyx_v_kwargs = __pyx_v_kwargs;
  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_kwargs);
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_kwargs);

  /* "asynq/decorators.py":39
 *     @core_inspection.wraps(fn)
 *     def new_fn(*args, **kwargs):
 *         value_provider = lambda: fn(*args, **kwargs)             # <<<<<<<<<<<<<<
 *         return futures.Future(value_provider)
 * 
 */
  __pyx_t_1 = __Pyx_CyFunction_NewEx(&__pyx_mdef_5asynq_10decorators_4lazy_6new_fn_lambda, 0, __pyx_n_s_lazy_locals_new_fn_locals_lambda, ((PyObject*)__pyx_cur_scope), __pyx_n_s_asynq_decorators, __pyx_d, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 39, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_value_provider = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "asynq/decorators.py":40
 *     def new_fn(*args, **kwargs):
 *         value_provider = lambda: fn(*args, **kwargs)
 *         return futures.Future(value_provider)             # <<<<<<<<<<<<<<
 * 
 *     new_fn.is_pure_async_fn = core_helpers.true_fn
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 40, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_v_value_provider);
  __Pyx_GIVEREF(__pyx_v_value_provider);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_value_provider);
  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_5asynq_7futures_Future), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 40, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* "asynq/decorators.py":38
 *     """
 *     @core_inspection.wraps(fn)
 *     def new_fn(*args, **kwargs):             # <<<<<<<<<<<<<<
 *         value_provider = lambda: fn(*args, **kwargs)
 *         return futures.Future(value_provider)
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("asynq.decorators.lazy.new_fn", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_value_provider);
  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":31
 * 
 * 
 * def lazy(fn):             # <<<<<<<<<<<<<<
 *     """Converts a function into a lazy one - i.e. its call
 *     returns a Future bound to a function call with passed
 */

static PyObject *__pyx_pf_5asynq_10decorators_lazy(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_fn) {
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct__lazy *__pyx_cur_scope;
  PyObject *__pyx_v_new_fn = 0;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  __Pyx_RefNannySetupContext("lazy", 0);
  __pyx_cur_scope = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct__lazy *)__pyx_tp_new_5asynq_10decorators___pyx_scope_struct__lazy(__pyx_ptype_5asynq_10decorators___pyx_scope_struct__lazy, __pyx_empty_tuple, NULL);
  if (unlikely(!__pyx_cur_scope)) {
    __Pyx_RefNannyFinishContext();
    return NULL;
  }
  __Pyx_GOTREF(__pyx_cur_scope);
  __pyx_cur_scope->__pyx_v_fn = __pyx_v_fn;
  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_fn);
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_fn);

  /* "asynq/decorators.py":37
 * 
 *     """
 *     @core_inspection.wraps(fn)             # <<<<<<<<<<<<<<
 *     def new_fn(*args, **kwargs):
 *         value_provider = lambda: fn(*args, **kwargs)
 */
  __pyx_t_2 = __pyx_cur_scope->__pyx_v_fn;
  __Pyx_INCREF(__pyx_t_2);
  __pyx_t_3 = __pyx_f_5qcore_10inspection_wraps(__pyx_t_2, 0, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 37, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "asynq/decorators.py":38
 *     """
 *     @core_inspection.wraps(fn)
 *     def new_fn(*args, **kwargs):             # <<<<<<<<<<<<<<
 *         value_provider = lambda: fn(*args, **kwargs)
 *         return futures.Future(value_provider)
 */
  __pyx_t_2 = __Pyx_CyFunction_NewEx(&__pyx_mdef_5asynq_10decorators_4lazy_1new_fn, 0, __pyx_n_s_lazy_locals_new_fn, ((PyObject*)__pyx_cur_scope), __pyx_n_s_asynq_decorators, __pyx_d, ((PyObject *)__pyx_codeobj__2)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 38, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_4)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
    }
  }
  if (!__pyx_t_4) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 37, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_GOTREF(__pyx_t_1);
  } else {
    __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 37, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); __pyx_t_4 = NULL;
    __Pyx_GIVEREF(__pyx_t_2);
    PyTuple_SET_ITEM(__pyx_t_5, 0+1, __pyx_t_2);
    __pyx_t_2 = 0;
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 37, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  }
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_new_fn = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "asynq/decorators.py":42
 *         return futures.Future(value_provider)
 * 
 *     new_fn.is_pure_async_fn = core_helpers.true_fn             # <<<<<<<<<<<<<<
 *     return new_fn
 * 
 */
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_core_helpers); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 42, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_true_fn); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 42, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__Pyx_PyObject_SetAttrStr(__pyx_v_new_fn, __pyx_n_s_is_pure_async_fn, __pyx_t_3) < 0) __PYX_ERR(0, 42, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;

  /* "asynq/decorators.py":43
 * 
 *     new_fn.is_pure_async_fn = core_helpers.true_fn
 *     return new_fn             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_new_fn);
  __pyx_r = __pyx_v_new_fn;
  goto __pyx_L0;

  /* "asynq/decorators.py":31
 * 
 * 
 * def lazy(fn):             # <<<<<<<<<<<<<<
 *     """Converts a function into a lazy one - i.e. its call
 *     returns a Future bound to a function call with passed
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("asynq.decorators.lazy", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_new_fn);
  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":46
 * 
 * 
 * def has_async_fn(fn):             # <<<<<<<<<<<<<<
 *     """Returns true if fn has .async member."""
 *     return hasattr(fn, 'async')
 */

static PyObject *__pyx_pw_5asynq_10decorators_3has_async_fn(PyObject *__pyx_self, PyObject *__pyx_v_fn); /*proto*/
static int __pyx_f_5asynq_10decorators_has_async_fn(PyObject *__pyx_v_fn, CYTHON_UNUSED int __pyx_skip_dispatch) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  __Pyx_RefNannySetupContext("has_async_fn", 0);

  /* "asynq/decorators.py":48
 * def has_async_fn(fn):
 *     """Returns true if fn has .async member."""
 *     return hasattr(fn, 'async')             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __pyx_t_1 = PyObject_HasAttr(__pyx_v_fn, __pyx_n_s_async); if (unlikely(__pyx_t_1 == -1)) __PYX_ERR(0, 48, __pyx_L1_error)
  __pyx_r = __pyx_t_1;
  goto __pyx_L0;

  /* "asynq/decorators.py":46
 * 
 * 
 * def has_async_fn(fn):             # <<<<<<<<<<<<<<
 *     """Returns true if fn has .async member."""
 *     return hasattr(fn, 'async')
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_AddTraceback("asynq.decorators.has_async_fn", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_3has_async_fn(PyObject *__pyx_self, PyObject *__pyx_v_fn); /*proto*/
static char __pyx_doc_5asynq_10decorators_2has_async_fn[] = "Returns true if fn has .async member.";
static PyObject *__pyx_pw_5asynq_10decorators_3has_async_fn(PyObject *__pyx_self, PyObject *__pyx_v_fn) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("has_async_fn (wrapper)", 0);
  __pyx_r = __pyx_pf_5asynq_10decorators_2has_async_fn(__pyx_self, ((PyObject *)__pyx_v_fn));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_2has_async_fn(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_fn) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  PyObject *__pyx_t_2 = NULL;
  __Pyx_RefNannySetupContext("has_async_fn", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __pyx_f_5asynq_10decorators_has_async_fn(__pyx_v_fn, 0); if (unlikely(__pyx_t_1 == -1)) __PYX_ERR(0, 46, __pyx_L1_error)
  __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 46, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("asynq.decorators.has_async_fn", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":51
 * 
 * 
 * def is_pure_async_fn(fn):             # <<<<<<<<<<<<<<
 *     """Returns true if fn is an @async(pure=True) or @async_proxy(pure=True) function."""
 *     if hasattr(fn, 'is_pure_async_fn'):
 */

static PyObject *__pyx_pw_5asynq_10decorators_5is_pure_async_fn(PyObject *__pyx_self, PyObject *__pyx_v_fn); /*proto*/
static int __pyx_f_5asynq_10decorators_is_pure_async_fn(PyObject *__pyx_v_fn, CYTHON_UNUSED int __pyx_skip_dispatch) {
  int __pyx_v_result;
  PyObject *__pyx_v_result_fn = NULL;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  PyObject *__pyx_t_7 = NULL;
  PyObject *__pyx_t_8 = NULL;
  int __pyx_t_9;
  __Pyx_RefNannySetupContext("is_pure_async_fn", 0);

  /* "asynq/decorators.py":53
 * def is_pure_async_fn(fn):
 *     """Returns true if fn is an @async(pure=True) or @async_proxy(pure=True) function."""
 *     if hasattr(fn, 'is_pure_async_fn'):             # <<<<<<<<<<<<<<
 *         try:
 *             return fn.is_pure_async_fn()
 */
  __pyx_t_1 = PyObject_HasAttr(__pyx_v_fn, __pyx_n_s_is_pure_async_fn); if (unlikely(__pyx_t_1 == -1)) __PYX_ERR(0, 53, __pyx_L1_error)
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "asynq/decorators.py":54
 *     """Returns true if fn is an @async(pure=True) or @async_proxy(pure=True) function."""
 *     if hasattr(fn, 'is_pure_async_fn'):
 *         try:             # <<<<<<<<<<<<<<
 *             return fn.is_pure_async_fn()
 *         except TypeError:
 */
    {
      __Pyx_PyThreadState_declare
      __Pyx_PyThreadState_assign
      __Pyx_ExceptionSave(&__pyx_t_3, &__pyx_t_4, &__pyx_t_5);
      __Pyx_XGOTREF(__pyx_t_3);
      __Pyx_XGOTREF(__pyx_t_4);
      __Pyx_XGOTREF(__pyx_t_5);
      /*try:*/ {

        /* "asynq/decorators.py":55
 *     if hasattr(fn, 'is_pure_async_fn'):
 *         try:
 *             return fn.is_pure_async_fn()             # <<<<<<<<<<<<<<
 *         except TypeError:
 *             # this happens when calling e.g. is_pure_async_fn(AsyncDecorator)
 */
        __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_fn, __pyx_n_s_is_pure_async_fn); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 55, __pyx_L4_error)
        __Pyx_GOTREF(__pyx_t_7);
        __pyx_t_8 = NULL;
        if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_7))) {
          __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_7);
          if (likely(__pyx_t_8)) {
            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7);
            __Pyx_INCREF(__pyx_t_8);
            __Pyx_INCREF(function);
            __Pyx_DECREF_SET(__pyx_t_7, function);
          }
        }
        if (__pyx_t_8) {
          __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_8); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 55, __pyx_L4_error)
          __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
        } else {
          __pyx_t_6 = __Pyx_PyObject_CallNoArg(__pyx_t_7); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 55, __pyx_L4_error)
        }
        __Pyx_GOTREF(__pyx_t_6);
        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
        __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 55, __pyx_L4_error)
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_r = __pyx_t_2;
        goto __pyx_L8_try_return;

        /* "asynq/decorators.py":54
 *     """Returns true if fn is an @async(pure=True) or @async_proxy(pure=True) function."""
 *     if hasattr(fn, 'is_pure_async_fn'):
 *         try:             # <<<<<<<<<<<<<<
 *             return fn.is_pure_async_fn()
 *         except TypeError:
 */
      }
      __pyx_L4_error:;
      __Pyx_PyThreadState_assign
      __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
      __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
      __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;

      /* "asynq/decorators.py":56
 *         try:
 *             return fn.is_pure_async_fn()
 *         except TypeError:             # <<<<<<<<<<<<<<
 *             # this happens when calling e.g. is_pure_async_fn(AsyncDecorator)
 *             return False
 */
      __pyx_t_9 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_TypeError);
      if (__pyx_t_9) {
        __Pyx_AddTraceback("asynq.decorators.is_pure_async_fn", __pyx_clineno, __pyx_lineno, __pyx_filename);
        if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_7, &__pyx_t_8) < 0) __PYX_ERR(0, 56, __pyx_L6_except_error)
        __Pyx_GOTREF(__pyx_t_6);
        __Pyx_GOTREF(__pyx_t_7);
        __Pyx_GOTREF(__pyx_t_8);

        /* "asynq/decorators.py":58
 *         except TypeError:
 *             # this happens when calling e.g. is_pure_async_fn(AsyncDecorator)
 *             return False             # <<<<<<<<<<<<<<
 *     if hasattr(fn, 'fn'):
 *         result = is_pure_async_fn(fn.fn)
 */
        __pyx_r = 0;
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
        __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
        goto __pyx_L7_except_return;
      }
      goto __pyx_L6_except_error;
      __pyx_L6_except_error:;

      /* "asynq/decorators.py":54
 *     """Returns true if fn is an @async(pure=True) or @async_proxy(pure=True) function."""
 *     if hasattr(fn, 'is_pure_async_fn'):
 *         try:             # <<<<<<<<<<<<<<
 *             return fn.is_pure_async_fn()
 *         except TypeError:
 */
      __Pyx_PyThreadState_assign
      __Pyx_XGIVEREF(__pyx_t_3);
      __Pyx_XGIVEREF(__pyx_t_4);
      __Pyx_XGIVEREF(__pyx_t_5);
      __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_4, __pyx_t_5);
      goto __pyx_L1_error;
      __pyx_L8_try_return:;
      __Pyx_PyThreadState_assign
      __Pyx_XGIVEREF(__pyx_t_3);
      __Pyx_XGIVEREF(__pyx_t_4);
      __Pyx_XGIVEREF(__pyx_t_5);
      __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_4, __pyx_t_5);
      goto __pyx_L0;
      __pyx_L7_except_return:;
      __Pyx_PyThreadState_assign
      __Pyx_XGIVEREF(__pyx_t_3);
      __Pyx_XGIVEREF(__pyx_t_4);
      __Pyx_XGIVEREF(__pyx_t_5);
      __Pyx_ExceptionReset(__pyx_t_3, __pyx_t_4, __pyx_t_5);
      goto __pyx_L0;
    }

    /* "asynq/decorators.py":53
 * def is_pure_async_fn(fn):
 *     """Returns true if fn is an @async(pure=True) or @async_proxy(pure=True) function."""
 *     if hasattr(fn, 'is_pure_async_fn'):             # <<<<<<<<<<<<<<
 *         try:
 *             return fn.is_pure_async_fn()
 */
  }

  /* "asynq/decorators.py":59
 *             # this happens when calling e.g. is_pure_async_fn(AsyncDecorator)
 *             return False
 *     if hasattr(fn, 'fn'):             # <<<<<<<<<<<<<<
 *         result = is_pure_async_fn(fn.fn)
 *         result_fn = core_helpers.true_fn if result else core_helpers.false_fn
 */
  __pyx_t_2 = PyObject_HasAttr(__pyx_v_fn, __pyx_n_s_fn); if (unlikely(__pyx_t_2 == -1)) __PYX_ERR(0, 59, __pyx_L1_error)
  __pyx_t_1 = (__pyx_t_2 != 0);
  if (__pyx_t_1) {

    /* "asynq/decorators.py":60
 *             return False
 *     if hasattr(fn, 'fn'):
 *         result = is_pure_async_fn(fn.fn)             # <<<<<<<<<<<<<<
 *         result_fn = core_helpers.true_fn if result else core_helpers.false_fn
 *         try:
 */
    __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_fn, __pyx_n_s_fn); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 60, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_8);
    __pyx_t_1 = __pyx_f_5asynq_10decorators_is_pure_async_fn(__pyx_t_8, 0); if (unlikely(__pyx_t_1 == -1)) __PYX_ERR(0, 60, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    __pyx_v_result = __pyx_t_1;

    /* "asynq/decorators.py":61
 *     if hasattr(fn, 'fn'):
 *         result = is_pure_async_fn(fn.fn)
 *         result_fn = core_helpers.true_fn if result else core_helpers.false_fn             # <<<<<<<<<<<<<<
 *         try:
 *             fn.is_pure_async_fn = result_fn
 */
    if ((__pyx_v_result != 0)) {
      __pyx_t_7 = __Pyx_GetModuleGlobalName(__pyx_n_s_core_helpers); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 61, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_7);
      __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_true_fn); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 61, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      __pyx_t_8 = __pyx_t_6;
      __pyx_t_6 = 0;
    } else {
      __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_core_helpers); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 61, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_false_fn); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 61, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_7);
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __pyx_t_8 = __pyx_t_7;
      __pyx_t_7 = 0;
    }
    __pyx_v_result_fn = __pyx_t_8;
    __pyx_t_8 = 0;

    /* "asynq/decorators.py":62
 *         result = is_pure_async_fn(fn.fn)
 *         result_fn = core_helpers.true_fn if result else core_helpers.false_fn
 *         try:             # <<<<<<<<<<<<<<
 *             fn.is_pure_async_fn = result_fn
 *         except (TypeError, AttributeError):
 */
    {
      __Pyx_PyThreadState_declare
      __Pyx_PyThreadState_assign
      __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_4, &__pyx_t_3);
      __Pyx_XGOTREF(__pyx_t_5);
      __Pyx_XGOTREF(__pyx_t_4);
      __Pyx_XGOTREF(__pyx_t_3);
      /*try:*/ {

        /* "asynq/decorators.py":63
 *         result_fn = core_helpers.true_fn if result else core_helpers.false_fn
 *         try:
 *             fn.is_pure_async_fn = result_fn             # <<<<<<<<<<<<<<
 *         except (TypeError, AttributeError):
 *             pass  # some callables don't let you assign attributes
 */
        if (__Pyx_PyObject_SetAttrStr(__pyx_v_fn, __pyx_n_s_is_pure_async_fn, __pyx_v_result_fn) < 0) __PYX_ERR(0, 63, __pyx_L15_error)

        /* "asynq/decorators.py":62
 *         result = is_pure_async_fn(fn.fn)
 *         result_fn = core_helpers.true_fn if result else core_helpers.false_fn
 *         try:             # <<<<<<<<<<<<<<
 *             fn.is_pure_async_fn = result_fn
 *         except (TypeError, AttributeError):
 */
      }
      __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
      __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
      goto __pyx_L22_try_end;
      __pyx_L15_error:;
      __Pyx_PyThreadState_assign
      __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
      __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;

      /* "asynq/decorators.py":64
 *         try:
 *             fn.is_pure_async_fn = result_fn
 *         except (TypeError, AttributeError):             # <<<<<<<<<<<<<<
 *             pass  # some callables don't let you assign attributes
 *         return result
 */
      __pyx_t_9 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_TypeError) || __Pyx_PyErr_ExceptionMatches(__pyx_builtin_AttributeError);
      if (__pyx_t_9) {
        __Pyx_ErrRestore(0,0,0);
        goto __pyx_L16_exception_handled;
      }
      goto __pyx_L17_except_error;
      __pyx_L17_except_error:;

      /* "asynq/decorators.py":62
 *         result = is_pure_async_fn(fn.fn)
 *         result_fn = core_helpers.true_fn if result else core_helpers.false_fn
 *         try:             # <<<<<<<<<<<<<<
 *             fn.is_pure_async_fn = result_fn
 *         except (TypeError, AttributeError):
 */
      __Pyx_PyThreadState_assign
      __Pyx_XGIVEREF(__pyx_t_5);
      __Pyx_XGIVEREF(__pyx_t_4);
      __Pyx_XGIVEREF(__pyx_t_3);
      __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_4, __pyx_t_3);
      goto __pyx_L1_error;
      __pyx_L16_exception_handled:;
      __Pyx_PyThreadState_assign
      __Pyx_XGIVEREF(__pyx_t_5);
      __Pyx_XGIVEREF(__pyx_t_4);
      __Pyx_XGIVEREF(__pyx_t_3);
      __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_4, __pyx_t_3);
      __pyx_L22_try_end:;
    }

    /* "asynq/decorators.py":66
 *         except (TypeError, AttributeError):
 *             pass  # some callables don't let you assign attributes
 *         return result             # <<<<<<<<<<<<<<
 *     return False
 * 
 */
    __pyx_r = __pyx_v_result;
    goto __pyx_L0;

    /* "asynq/decorators.py":59
 *             # this happens when calling e.g. is_pure_async_fn(AsyncDecorator)
 *             return False
 *     if hasattr(fn, 'fn'):             # <<<<<<<<<<<<<<
 *         result = is_pure_async_fn(fn.fn)
 *         result_fn = core_helpers.true_fn if result else core_helpers.false_fn
 */
  }

  /* "asynq/decorators.py":67
 *             pass  # some callables don't let you assign attributes
 *         return result
 *     return False             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __pyx_r = 0;
  goto __pyx_L0;

  /* "asynq/decorators.py":51
 * 
 * 
 * def is_pure_async_fn(fn):             # <<<<<<<<<<<<<<
 *     """Returns true if fn is an @async(pure=True) or @async_proxy(pure=True) function."""
 *     if hasattr(fn, 'is_pure_async_fn'):
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_AddTraceback("asynq.decorators.is_pure_async_fn", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_result_fn);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_5is_pure_async_fn(PyObject *__pyx_self, PyObject *__pyx_v_fn); /*proto*/
static char __pyx_doc_5asynq_10decorators_4is_pure_async_fn[] = "Returns true if fn is an @async(pure=True) or @async_proxy(pure=True) function.";
static PyObject *__pyx_pw_5asynq_10decorators_5is_pure_async_fn(PyObject *__pyx_self, PyObject *__pyx_v_fn) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("is_pure_async_fn (wrapper)", 0);
  __pyx_r = __pyx_pf_5asynq_10decorators_4is_pure_async_fn(__pyx_self, ((PyObject *)__pyx_v_fn));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_4is_pure_async_fn(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_fn) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  PyObject *__pyx_t_2 = NULL;
  __Pyx_RefNannySetupContext("is_pure_async_fn", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __pyx_f_5asynq_10decorators_is_pure_async_fn(__pyx_v_fn, 0); if (unlikely(__pyx_t_1 == -1)) __PYX_ERR(0, 51, __pyx_L1_error)
  __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 51, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("asynq.decorators.is_pure_async_fn", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":70
 * 
 * 
 * def is_async_fn(fn):             # <<<<<<<<<<<<<<
 *     """Returns true if fn is an @async([pure=True]) or @async_proxy(pure=True) function."""
 *     return hasattr(fn, 'async') or is_pure_async_fn(fn)
 */

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_7is_async_fn(PyObject *__pyx_self, PyObject *__pyx_v_fn); /*proto*/
static char __pyx_doc_5asynq_10decorators_6is_async_fn[] = "Returns true if fn is an @async([pure=True]) or @async_proxy(pure=True) function.";
static PyMethodDef __pyx_mdef_5asynq_10decorators_7is_async_fn = {"is_async_fn", (PyCFunction)__pyx_pw_5asynq_10decorators_7is_async_fn, METH_O, __pyx_doc_5asynq_10decorators_6is_async_fn};
static PyObject *__pyx_pw_5asynq_10decorators_7is_async_fn(PyObject *__pyx_self, PyObject *__pyx_v_fn) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("is_async_fn (wrapper)", 0);
  __pyx_r = __pyx_pf_5asynq_10decorators_6is_async_fn(__pyx_self, ((PyObject *)__pyx_v_fn));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_6is_async_fn(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_fn) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  int __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  __Pyx_RefNannySetupContext("is_async_fn", 0);

  /* "asynq/decorators.py":72
 * def is_async_fn(fn):
 *     """Returns true if fn is an @async([pure=True]) or @async_proxy(pure=True) function."""
 *     return hasattr(fn, 'async') or is_pure_async_fn(fn)             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = PyObject_HasAttr(__pyx_v_fn, __pyx_n_s_async); if (unlikely(__pyx_t_2 == -1)) __PYX_ERR(0, 72, __pyx_L1_error)
  if (!__pyx_t_2) {
  } else {
    __pyx_t_3 = __Pyx_PyBool_FromLong(__pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 72, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_1 = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L3_bool_binop_done;
  }
  __pyx_t_2 = __pyx_f_5asynq_10decorators_is_pure_async_fn(__pyx_v_fn, 0); if (unlikely(__pyx_t_2 == -1)) __PYX_ERR(0, 72, __pyx_L1_error)
  __pyx_t_3 = __Pyx_PyBool_FromLong(__pyx_t_2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 72, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_1 = __pyx_t_3;
  __pyx_t_3 = 0;
  __pyx_L3_bool_binop_done:;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "asynq/decorators.py":70
 * 
 * 
 * def is_async_fn(fn):             # <<<<<<<<<<<<<<
 *     """Returns true if fn is an @async([pure=True]) or @async_proxy(pure=True) function."""
 *     return hasattr(fn, 'async') or is_pure_async_fn(fn)
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("asynq.decorators.is_async_fn", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":75
 * 
 * 
 * def get_async_fn(fn, wrap_if_none=False):             # <<<<<<<<<<<<<<
 *     """Returns an async function for the specified source function."""
 *     if hasattr(fn, 'async'):
 */

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_9get_async_fn(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_5asynq_10decorators_8get_async_fn[] = "Returns an async function for the specified source function.";
static PyMethodDef __pyx_mdef_5asynq_10decorators_9get_async_fn = {"get_async_fn", (PyCFunction)__pyx_pw_5asynq_10decorators_9get_async_fn, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5asynq_10decorators_8get_async_fn};
static PyObject *__pyx_pw_5asynq_10decorators_9get_async_fn(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_fn = 0;
  PyObject *__pyx_v_wrap_if_none = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("get_async_fn (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_fn,&__pyx_n_s_wrap_if_none,0};
    PyObject* values[2] = {0,0};
    values[1] = ((PyObject *)((PyObject *)Py_False));
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_fn)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_wrap_if_none);
          if (value) { values[1] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "get_async_fn") < 0)) __PYX_ERR(0, 75, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_fn = values[0];
    __pyx_v_wrap_if_none = values[1];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("get_async_fn", 0, 1, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 75, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("asynq.decorators.get_async_fn", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5asynq_10decorators_8get_async_fn(__pyx_self, __pyx_v_fn, __pyx_v_wrap_if_none);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":82
 *         return fn
 *     if wrap_if_none:
 *         def sync_to_async_fn_wrapper(*args, **kwargs):             # <<<<<<<<<<<<<<
 *             return futures.ConstFuture(fn(*args, **kwargs))
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_12get_async_fn_1sync_to_async_fn_wrapper(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_mdef_5asynq_10decorators_12get_async_fn_1sync_to_async_fn_wrapper = {"sync_to_async_fn_wrapper", (PyCFunction)__pyx_pw_5asynq_10decorators_12get_async_fn_1sync_to_async_fn_wrapper, METH_VARARGS|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_5asynq_10decorators_12get_async_fn_1sync_to_async_fn_wrapper(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_args = 0;
  PyObject *__pyx_v_kwargs = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("sync_to_async_fn_wrapper (wrapper)", 0);
  if (unlikely(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "sync_to_async_fn_wrapper", 1))) return NULL;
  if (unlikely(__pyx_kwds)) {
    __pyx_v_kwargs = PyDict_Copy(__pyx_kwds); if (unlikely(!__pyx_v_kwargs)) return NULL;
    __Pyx_GOTREF(__pyx_v_kwargs);
  } else {
    __pyx_v_kwargs = NULL;
  }
  __Pyx_INCREF(__pyx_args);
  __pyx_v_args = __pyx_args;
  __pyx_r = __pyx_pf_5asynq_10decorators_12get_async_fn_sync_to_async_fn_wrapper(__pyx_self, __pyx_v_args, __pyx_v_kwargs);

  /* function exit code */
  __Pyx_XDECREF(__pyx_v_args);
  __Pyx_XDECREF(__pyx_v_kwargs);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_12get_async_fn_sync_to_async_fn_wrapper(PyObject *__pyx_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs) {
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_2_get_async_fn *__pyx_cur_scope;
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_2_get_async_fn *__pyx_outer_scope;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  __Pyx_RefNannySetupContext("sync_to_async_fn_wrapper", 0);
  __pyx_outer_scope = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_2_get_async_fn *) __Pyx_CyFunction_GetClosure(__pyx_self);
  __pyx_cur_scope = __pyx_outer_scope;

  /* "asynq/decorators.py":83
 *     if wrap_if_none:
 *         def sync_to_async_fn_wrapper(*args, **kwargs):
 *             return futures.ConstFuture(fn(*args, **kwargs))             # <<<<<<<<<<<<<<
 * 
 *         sync_to_async_fn_wrapper.is_pure_async_fn = core_helpers.true_fn
 */
  __Pyx_XDECREF(__pyx_r);
  if (unlikely(!__pyx_cur_scope->__pyx_v_fn)) { __Pyx_RaiseClosureNameError("fn"); __PYX_ERR(0, 83, __pyx_L1_error) }
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_cur_scope->__pyx_v_fn, __pyx_v_args, __pyx_v_kwargs); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 83, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 83, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_5asynq_7futures_ConstFuture), __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 83, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "asynq/decorators.py":82
 *         return fn
 *     if wrap_if_none:
 *         def sync_to_async_fn_wrapper(*args, **kwargs):             # <<<<<<<<<<<<<<
 *             return futures.ConstFuture(fn(*args, **kwargs))
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("asynq.decorators.get_async_fn.sync_to_async_fn_wrapper", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":75
 * 
 * 
 * def get_async_fn(fn, wrap_if_none=False):             # <<<<<<<<<<<<<<
 *     """Returns an async function for the specified source function."""
 *     if hasattr(fn, 'async'):
 */

static PyObject *__pyx_pf_5asynq_10decorators_8get_async_fn(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_fn, PyObject *__pyx_v_wrap_if_none) {
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_2_get_async_fn *__pyx_cur_scope;
  PyObject *__pyx_v_sync_to_async_fn_wrapper = 0;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  int __pyx_t_2;
  int __pyx_t_3;
  PyObject *__pyx_t_4 = NULL;
  __Pyx_RefNannySetupContext("get_async_fn", 0);
  __pyx_cur_scope = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_2_get_async_fn *)__pyx_tp_new_5asynq_10decorators___pyx_scope_struct_2_get_async_fn(__pyx_ptype_5asynq_10decorators___pyx_scope_struct_2_get_async_fn, __pyx_empty_tuple, NULL);
  if (unlikely(!__pyx_cur_scope)) {
    __Pyx_RefNannyFinishContext();
    return NULL;
  }
  __Pyx_GOTREF(__pyx_cur_scope);
  __pyx_cur_scope->__pyx_v_fn = __pyx_v_fn;
  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_fn);
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_fn);

  /* "asynq/decorators.py":77
 * def get_async_fn(fn, wrap_if_none=False):
 *     """Returns an async function for the specified source function."""
 *     if hasattr(fn, 'async'):             # <<<<<<<<<<<<<<
 *         return fn.async
 *     if is_pure_async_fn(fn):
 */
  __pyx_t_1 = __pyx_cur_scope->__pyx_v_fn;
  __Pyx_INCREF(__pyx_t_1);
  __pyx_t_2 = PyObject_HasAttr(__pyx_t_1, __pyx_n_s_async); if (unlikely(__pyx_t_2 == -1)) __PYX_ERR(0, 77, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_3 = (__pyx_t_2 != 0);
  if (__pyx_t_3) {

    /* "asynq/decorators.py":78
 *     """Returns an async function for the specified source function."""
 *     if hasattr(fn, 'async'):
 *         return fn.async             # <<<<<<<<<<<<<<
 *     if is_pure_async_fn(fn):
 *         return fn
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_fn, __pyx_n_s_async); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 78, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_r = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L0;

    /* "asynq/decorators.py":77
 * def get_async_fn(fn, wrap_if_none=False):
 *     """Returns an async function for the specified source function."""
 *     if hasattr(fn, 'async'):             # <<<<<<<<<<<<<<
 *         return fn.async
 *     if is_pure_async_fn(fn):
 */
  }

  /* "asynq/decorators.py":79
 *     if hasattr(fn, 'async'):
 *         return fn.async
 *     if is_pure_async_fn(fn):             # <<<<<<<<<<<<<<
 *         return fn
 *     if wrap_if_none:
 */
  __pyx_t_1 = __pyx_cur_scope->__pyx_v_fn;
  __Pyx_INCREF(__pyx_t_1);
  __pyx_t_3 = __pyx_f_5asynq_10decorators_is_pure_async_fn(__pyx_t_1, 0); if (unlikely(__pyx_t_3 == -1)) __PYX_ERR(0, 79, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_2 = (__pyx_t_3 != 0);
  if (__pyx_t_2) {

    /* "asynq/decorators.py":80
 *         return fn.async
 *     if is_pure_async_fn(fn):
 *         return fn             # <<<<<<<<<<<<<<
 *     if wrap_if_none:
 *         def sync_to_async_fn_wrapper(*args, **kwargs):
 */
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(__pyx_cur_scope->__pyx_v_fn);
    __pyx_r = __pyx_cur_scope->__pyx_v_fn;
    goto __pyx_L0;

    /* "asynq/decorators.py":79
 *     if hasattr(fn, 'async'):
 *         return fn.async
 *     if is_pure_async_fn(fn):             # <<<<<<<<<<<<<<
 *         return fn
 *     if wrap_if_none:
 */
  }

  /* "asynq/decorators.py":81
 *     if is_pure_async_fn(fn):
 *         return fn
 *     if wrap_if_none:             # <<<<<<<<<<<<<<
 *         def sync_to_async_fn_wrapper(*args, **kwargs):
 *             return futures.ConstFuture(fn(*args, **kwargs))
 */
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_wrap_if_none); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 81, __pyx_L1_error)
  if (__pyx_t_2) {

    /* "asynq/decorators.py":82
 *         return fn
 *     if wrap_if_none:
 *         def sync_to_async_fn_wrapper(*args, **kwargs):             # <<<<<<<<<<<<<<
 *             return futures.ConstFuture(fn(*args, **kwargs))
 * 
 */
    __pyx_t_1 = __Pyx_CyFunction_NewEx(&__pyx_mdef_5asynq_10decorators_12get_async_fn_1sync_to_async_fn_wrapper, 0, __pyx_n_s_get_async_fn_locals_sync_to_asyn, ((PyObject*)__pyx_cur_scope), __pyx_n_s_asynq_decorators, __pyx_d, ((PyObject *)__pyx_codeobj__4)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 82, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_v_sync_to_async_fn_wrapper = __pyx_t_1;
    __pyx_t_1 = 0;

    /* "asynq/decorators.py":85
 *             return futures.ConstFuture(fn(*args, **kwargs))
 * 
 *         sync_to_async_fn_wrapper.is_pure_async_fn = core_helpers.true_fn             # <<<<<<<<<<<<<<
 *         return sync_to_async_fn_wrapper
 *     return None
 */
    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_core_helpers); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 85, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_true_fn); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 85, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (__Pyx_PyObject_SetAttrStr(__pyx_v_sync_to_async_fn_wrapper, __pyx_n_s_is_pure_async_fn, __pyx_t_4) < 0) __PYX_ERR(0, 85, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;

    /* "asynq/decorators.py":86
 * 
 *         sync_to_async_fn_wrapper.is_pure_async_fn = core_helpers.true_fn
 *         return sync_to_async_fn_wrapper             # <<<<<<<<<<<<<<
 *     return None
 * 
 */
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(__pyx_v_sync_to_async_fn_wrapper);
    __pyx_r = __pyx_v_sync_to_async_fn_wrapper;
    goto __pyx_L0;

    /* "asynq/decorators.py":81
 *     if is_pure_async_fn(fn):
 *         return fn
 *     if wrap_if_none:             # <<<<<<<<<<<<<<
 *         def sync_to_async_fn_wrapper(*args, **kwargs):
 *             return futures.ConstFuture(fn(*args, **kwargs))
 */
  }

  /* "asynq/decorators.py":87
 *         sync_to_async_fn_wrapper.is_pure_async_fn = core_helpers.true_fn
 *         return sync_to_async_fn_wrapper
 *     return None             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(Py_None);
  __pyx_r = Py_None;
  goto __pyx_L0;

  /* "asynq/decorators.py":75
 * 
 * 
 * def get_async_fn(fn, wrap_if_none=False):             # <<<<<<<<<<<<<<
 *     """Returns an async function for the specified source function."""
 *     if hasattr(fn, 'async'):
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("asynq.decorators.get_async_fn", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_sync_to_async_fn_wrapper);
  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":90
 * 
 * 
 * def get_async_or_sync_fn(fn):             # <<<<<<<<<<<<<<
 *     """Returns an async function for the specified fn, if it exists; otherwise returns source."""
 *     if hasattr(fn, 'async'):
 */

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_11get_async_or_sync_fn(PyObject *__pyx_self, PyObject *__pyx_v_fn); /*proto*/
static char __pyx_doc_5asynq_10decorators_10get_async_or_sync_fn[] = "Returns an async function for the specified fn, if it exists; otherwise returns source.";
static PyMethodDef __pyx_mdef_5asynq_10decorators_11get_async_or_sync_fn = {"get_async_or_sync_fn", (PyCFunction)__pyx_pw_5asynq_10decorators_11get_async_or_sync_fn, METH_O, __pyx_doc_5asynq_10decorators_10get_async_or_sync_fn};
static PyObject *__pyx_pw_5asynq_10decorators_11get_async_or_sync_fn(PyObject *__pyx_self, PyObject *__pyx_v_fn) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("get_async_or_sync_fn (wrapper)", 0);
  __pyx_r = __pyx_pf_5asynq_10decorators_10get_async_or_sync_fn(__pyx_self, ((PyObject *)__pyx_v_fn));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_10get_async_or_sync_fn(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_fn) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  __Pyx_RefNannySetupContext("get_async_or_sync_fn", 0);

  /* "asynq/decorators.py":92
 * def get_async_or_sync_fn(fn):
 *     """Returns an async function for the specified fn, if it exists; otherwise returns source."""
 *     if hasattr(fn, 'async'):             # <<<<<<<<<<<<<<
 *         return fn.async
 *     return fn
 */
  __pyx_t_1 = PyObject_HasAttr(__pyx_v_fn, __pyx_n_s_async); if (unlikely(__pyx_t_1 == -1)) __PYX_ERR(0, 92, __pyx_L1_error)
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "asynq/decorators.py":93
 *     """Returns an async function for the specified fn, if it exists; otherwise returns source."""
 *     if hasattr(fn, 'async'):
 *         return fn.async             # <<<<<<<<<<<<<<
 *     return fn
 * 
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_fn, __pyx_n_s_async); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 93, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;

    /* "asynq/decorators.py":92
 * def get_async_or_sync_fn(fn):
 *     """Returns an async function for the specified fn, if it exists; otherwise returns source."""
 *     if hasattr(fn, 'async'):             # <<<<<<<<<<<<<<
 *         return fn.async
 *     return fn
 */
  }

  /* "asynq/decorators.py":94
 *     if hasattr(fn, 'async'):
 *         return fn.async
 *     return fn             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_fn);
  __pyx_r = __pyx_v_fn;
  goto __pyx_L0;

  /* "asynq/decorators.py":90
 * 
 * 
 * def get_async_or_sync_fn(fn):             # <<<<<<<<<<<<<<
 *     """Returns an async function for the specified fn, if it exists; otherwise returns source."""
 *     if hasattr(fn, 'async'):
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("asynq.decorators.get_async_or_sync_fn", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":98
 * 
 * class PureAsyncDecoratorBinder(qcore.decorators.DecoratorBinder):
 *     def is_pure_async_fn(self):             # <<<<<<<<<<<<<<
 *         return True
 * 
 */

static PyObject *__pyx_pw_5asynq_10decorators_24PureAsyncDecoratorBinder_1is_pure_async_fn(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static int __pyx_f_5asynq_10decorators_24PureAsyncDecoratorBinder_is_pure_async_fn(CYTHON_UNUSED struct __pyx_obj_5asynq_10decorators_PureAsyncDecoratorBinder *__pyx_v_self, int __pyx_skip_dispatch) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  int __pyx_t_5;
  __Pyx_RefNannySetupContext("is_pure_async_fn", 0);
  /* Check if called by wrapper */
  if (unlikely(__pyx_skip_dispatch)) ;
  /* Check if overridden in Python */
  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_is_pure_async_fn); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 98, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_5asynq_10decorators_24PureAsyncDecoratorBinder_1is_pure_async_fn)) {
      __Pyx_INCREF(__pyx_t_1);
      __pyx_t_3 = __pyx_t_1; __pyx_t_4 = NULL;
      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_3))) {
        __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
        if (likely(__pyx_t_4)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
          __Pyx_INCREF(__pyx_t_4);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_3, function);
        }
      }
      if (__pyx_t_4) {
        __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 98, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      } else {
        __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 98, __pyx_L1_error)
      }
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 98, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __pyx_r = __pyx_t_5;
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      goto __pyx_L0;
    }
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  }

  /* "asynq/decorators.py":99
 * class PureAsyncDecoratorBinder(qcore.decorators.DecoratorBinder):
 *     def is_pure_async_fn(self):
 *         return True             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __pyx_r = 1;
  goto __pyx_L0;

  /* "asynq/decorators.py":98
 * 
 * class PureAsyncDecoratorBinder(qcore.decorators.DecoratorBinder):
 *     def is_pure_async_fn(self):             # <<<<<<<<<<<<<<
 *         return True
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("asynq.decorators.PureAsyncDecoratorBinder.is_pure_async_fn", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_24PureAsyncDecoratorBinder_1is_pure_async_fn(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyObject *__pyx_pw_5asynq_10decorators_24PureAsyncDecoratorBinder_1is_pure_async_fn(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("is_pure_async_fn (wrapper)", 0);
  __pyx_r = __pyx_pf_5asynq_10decorators_24PureAsyncDecoratorBinder_is_pure_async_fn(((struct __pyx_obj_5asynq_10decorators_PureAsyncDecoratorBinder *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_24PureAsyncDecoratorBinder_is_pure_async_fn(struct __pyx_obj_5asynq_10decorators_PureAsyncDecoratorBinder *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  PyObject *__pyx_t_2 = NULL;
  __Pyx_RefNannySetupContext("is_pure_async_fn", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __pyx_f_5asynq_10decorators_24PureAsyncDecoratorBinder_is_pure_async_fn(__pyx_v_self, 1); if (unlikely(__pyx_t_1 == -1)) __PYX_ERR(0, 98, __pyx_L1_error)
  __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 98, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("asynq.decorators.PureAsyncDecoratorBinder.is_pure_async_fn", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":105
 *     binder_cls = PureAsyncDecoratorBinder
 * 
 *     def __init__(self, fn, task_cls, kwargs={}):             # <<<<<<<<<<<<<<
 *         qcore.decorators.DecoratorBase.__init__(self, fn)
 *         self.task_cls = task_cls
 */

/* Python wrapper */
static int __pyx_pw_5asynq_10decorators_18PureAsyncDecorator_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static int __pyx_pw_5asynq_10decorators_18PureAsyncDecorator_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_fn = 0;
  PyObject *__pyx_v_task_cls = 0;
  PyObject *__pyx_v_kwargs = 0;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_fn,&__pyx_n_s_task_cls,&__pyx_n_s_kwargs,0};
    PyObject* values[3] = {0,0,0};
    values[2] = __pyx_k__5;
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_fn)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_task_cls)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__init__", 0, 2, 3, 1); __PYX_ERR(0, 105, __pyx_L3_error)
        }
        case  2:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_kwargs);
          if (value) { values[2] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 105, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_fn = values[0];
    __pyx_v_task_cls = values[1];
    __pyx_v_kwargs = values[2];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__init__", 0, 2, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 105, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("asynq.decorators.PureAsyncDecorator.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return -1;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5asynq_10decorators_18PureAsyncDecorator___init__(((struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *)__pyx_v_self), __pyx_v_fn, __pyx_v_task_cls, __pyx_v_kwargs);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_5asynq_10decorators_18PureAsyncDecorator___init__(struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *__pyx_v_self, PyObject *__pyx_v_fn, PyObject *__pyx_v_task_cls, PyObject *__pyx_v_kwargs) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  Py_ssize_t __pyx_t_4;
  PyObject *__pyx_t_5 = NULL;
  int __pyx_t_6;
  __Pyx_RefNannySetupContext("__init__", 0);

  /* "asynq/decorators.py":106
 * 
 *     def __init__(self, fn, task_cls, kwargs={}):
 *         qcore.decorators.DecoratorBase.__init__(self, fn)             # <<<<<<<<<<<<<<
 *         self.task_cls = task_cls
 *         self.needs_wrapper = core_inspection.is_cython_or_generator(fn)
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_5qcore_10decorators_DecoratorBase), __pyx_n_s_init); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 106, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  __pyx_t_4 = 0;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
      __pyx_t_4 = 1;
    }
  }
  __pyx_t_5 = PyTuple_New(2+__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 106, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  if (__pyx_t_3) {
    __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3); __pyx_t_3 = NULL;
  }
  __Pyx_INCREF(((PyObject *)__pyx_v_self));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_self));
  PyTuple_SET_ITEM(__pyx_t_5, 0+__pyx_t_4, ((PyObject *)__pyx_v_self));
  __Pyx_INCREF(__pyx_v_fn);
  __Pyx_GIVEREF(__pyx_v_fn);
  PyTuple_SET_ITEM(__pyx_t_5, 1+__pyx_t_4, __pyx_v_fn);
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 106, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "asynq/decorators.py":107
 *     def __init__(self, fn, task_cls, kwargs={}):
 *         qcore.decorators.DecoratorBase.__init__(self, fn)
 *         self.task_cls = task_cls             # <<<<<<<<<<<<<<
 *         self.needs_wrapper = core_inspection.is_cython_or_generator(fn)
 *         self.kwargs = kwargs
 */
  if (!(likely(PyType_CheckExact(__pyx_v_task_cls))||((__pyx_v_task_cls) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "type", Py_TYPE(__pyx_v_task_cls)->tp_name), 0))) __PYX_ERR(0, 107, __pyx_L1_error)
  __pyx_t_1 = __pyx_v_task_cls;
  __Pyx_INCREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_1);
  __Pyx_GOTREF(__pyx_v_self->task_cls);
  __Pyx_DECREF(((PyObject *)__pyx_v_self->task_cls));
  __pyx_v_self->task_cls = ((PyTypeObject*)__pyx_t_1);
  __pyx_t_1 = 0;

  /* "asynq/decorators.py":108
 *         qcore.decorators.DecoratorBase.__init__(self, fn)
 *         self.task_cls = task_cls
 *         self.needs_wrapper = core_inspection.is_cython_or_generator(fn)             # <<<<<<<<<<<<<<
 *         self.kwargs = kwargs
 * 
 */
  __pyx_t_6 = __pyx_f_5qcore_10inspection_is_cython_or_generator(__pyx_v_fn, 0); if (unlikely(__pyx_t_6 == -1)) __PYX_ERR(0, 108, __pyx_L1_error)
  __pyx_v_self->needs_wrapper = __pyx_t_6;

  /* "asynq/decorators.py":109
 *         self.task_cls = task_cls
 *         self.needs_wrapper = core_inspection.is_cython_or_generator(fn)
 *         self.kwargs = kwargs             # <<<<<<<<<<<<<<
 * 
 *     def name(self):
 */
  if (!(likely(PyDict_CheckExact(__pyx_v_kwargs))||((__pyx_v_kwargs) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "dict", Py_TYPE(__pyx_v_kwargs)->tp_name), 0))) __PYX_ERR(0, 109, __pyx_L1_error)
  __pyx_t_1 = __pyx_v_kwargs;
  __Pyx_INCREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_1);
  __Pyx_GOTREF(__pyx_v_self->kwargs);
  __Pyx_DECREF(__pyx_v_self->kwargs);
  __pyx_v_self->kwargs = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;

  /* "asynq/decorators.py":105
 *     binder_cls = PureAsyncDecoratorBinder
 * 
 *     def __init__(self, fn, task_cls, kwargs={}):             # <<<<<<<<<<<<<<
 *         qcore.decorators.DecoratorBase.__init__(self, fn)
 *         self.task_cls = task_cls
 */

  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("asynq.decorators.PureAsyncDecorator.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":111
 *         self.kwargs = kwargs
 * 
 *     def name(self):             # <<<<<<<<<<<<<<
 *         return '@async(pure=True)'
 * 
 */

static PyObject *__pyx_pw_5asynq_10decorators_18PureAsyncDecorator_3name(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyObject *__pyx_f_5asynq_10decorators_18PureAsyncDecorator_name(CYTHON_UNUSED struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *__pyx_v_self, int __pyx_skip_dispatch) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  __Pyx_RefNannySetupContext("name", 0);
  /* Check if called by wrapper */
  if (unlikely(__pyx_skip_dispatch)) ;
  /* Check if overridden in Python */
  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_name); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 111, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_5asynq_10decorators_18PureAsyncDecorator_3name)) {
      __Pyx_XDECREF(__pyx_r);
      __Pyx_INCREF(__pyx_t_1);
      __pyx_t_3 = __pyx_t_1; __pyx_t_4 = NULL;
      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_3))) {
        __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
        if (likely(__pyx_t_4)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
          __Pyx_INCREF(__pyx_t_4);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_3, function);
        }
      }
      if (__pyx_t_4) {
        __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 111, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      } else {
        __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 111, __pyx_L1_error)
      }
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      if (!(likely(PyString_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "str", Py_TYPE(__pyx_t_2)->tp_name), 0))) __PYX_ERR(0, 111, __pyx_L1_error)
      __pyx_r = ((PyObject*)__pyx_t_2);
      __pyx_t_2 = 0;
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      goto __pyx_L0;
    }
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  }

  /* "asynq/decorators.py":112
 * 
 *     def name(self):
 *         return '@async(pure=True)'             # <<<<<<<<<<<<<<
 * 
 *     def is_pure_async_fn(self):
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_kp_s_async_pure_True);
  __pyx_r = __pyx_kp_s_async_pure_True;
  goto __pyx_L0;

  /* "asynq/decorators.py":111
 *         self.kwargs = kwargs
 * 
 *     def name(self):             # <<<<<<<<<<<<<<
 *         return '@async(pure=True)'
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("asynq.decorators.PureAsyncDecorator.name", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_18PureAsyncDecorator_3name(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyObject *__pyx_pw_5asynq_10decorators_18PureAsyncDecorator_3name(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("name (wrapper)", 0);
  __pyx_r = __pyx_pf_5asynq_10decorators_18PureAsyncDecorator_2name(((struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_18PureAsyncDecorator_2name(struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  __Pyx_RefNannySetupContext("name", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __pyx_f_5asynq_10decorators_18PureAsyncDecorator_name(__pyx_v_self, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 111, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("asynq.decorators.PureAsyncDecorator.name", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":114
 *         return '@async(pure=True)'
 * 
 *     def is_pure_async_fn(self):             # <<<<<<<<<<<<<<
 *         return True
 * 
 */

static PyObject *__pyx_pw_5asynq_10decorators_18PureAsyncDecorator_5is_pure_async_fn(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static int __pyx_f_5asynq_10decorators_18PureAsyncDecorator_is_pure_async_fn(CYTHON_UNUSED struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *__pyx_v_self, int __pyx_skip_dispatch) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  int __pyx_t_5;
  __Pyx_RefNannySetupContext("is_pure_async_fn", 0);
  /* Check if called by wrapper */
  if (unlikely(__pyx_skip_dispatch)) ;
  /* Check if overridden in Python */
  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_is_pure_async_fn); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 114, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_5asynq_10decorators_18PureAsyncDecorator_5is_pure_async_fn)) {
      __Pyx_INCREF(__pyx_t_1);
      __pyx_t_3 = __pyx_t_1; __pyx_t_4 = NULL;
      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_3))) {
        __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
        if (likely(__pyx_t_4)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
          __Pyx_INCREF(__pyx_t_4);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_3, function);
        }
      }
      if (__pyx_t_4) {
        __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 114, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      } else {
        __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 114, __pyx_L1_error)
      }
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 114, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __pyx_r = __pyx_t_5;
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      goto __pyx_L0;
    }
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  }

  /* "asynq/decorators.py":115
 * 
 *     def is_pure_async_fn(self):
 *         return True             # <<<<<<<<<<<<<<
 * 
 *     def _fn_wrapper(self, args, kwargs):
 */
  __pyx_r = 1;
  goto __pyx_L0;

  /* "asynq/decorators.py":114
 *         return '@async(pure=True)'
 * 
 *     def is_pure_async_fn(self):             # <<<<<<<<<<<<<<
 *         return True
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("asynq.decorators.PureAsyncDecorator.is_pure_async_fn", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_18PureAsyncDecorator_5is_pure_async_fn(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyObject *__pyx_pw_5asynq_10decorators_18PureAsyncDecorator_5is_pure_async_fn(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("is_pure_async_fn (wrapper)", 0);
  __pyx_r = __pyx_pf_5asynq_10decorators_18PureAsyncDecorator_4is_pure_async_fn(((struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_18PureAsyncDecorator_4is_pure_async_fn(struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  PyObject *__pyx_t_2 = NULL;
  __Pyx_RefNannySetupContext("is_pure_async_fn", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __pyx_f_5asynq_10decorators_18PureAsyncDecorator_is_pure_async_fn(__pyx_v_self, 1); if (unlikely(__pyx_t_1 == -1)) __PYX_ERR(0, 114, __pyx_L1_error)
  __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 114, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("asynq.decorators.PureAsyncDecorator.is_pure_async_fn", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
static PyObject *__pyx_gb_5asynq_10decorators_18PureAsyncDecorator_8generator(__pyx_CoroutineObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */

/* "asynq/decorators.py":117
 *         return True
 * 
 *     def _fn_wrapper(self, args, kwargs):             # <<<<<<<<<<<<<<
 *         raise async_task.AsyncTaskResult(self.fn(*args, **kwargs)); return
 *         yield
 */

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_18PureAsyncDecorator_7_fn_wrapper(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyObject *__pyx_pw_5asynq_10decorators_18PureAsyncDecorator_7_fn_wrapper(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_args = 0;
  PyObject *__pyx_v_kwargs = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_fn_wrapper (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_args,&__pyx_n_s_kwargs,0};
    PyObject* values[2] = {0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_args)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_kwargs)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("_fn_wrapper", 1, 2, 2, 1); __PYX_ERR(0, 117, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_fn_wrapper") < 0)) __PYX_ERR(0, 117, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
    }
    __pyx_v_args = values[0];
    __pyx_v_kwargs = values[1];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("_fn_wrapper", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 117, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("asynq.decorators.PureAsyncDecorator._fn_wrapper", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5asynq_10decorators_18PureAsyncDecorator_6_fn_wrapper(((struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *)__pyx_v_self), __pyx_v_args, __pyx_v_kwargs);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_18PureAsyncDecorator_6_fn_wrapper(struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *__pyx_v_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs) {
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper *__pyx_cur_scope;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_fn_wrapper", 0);
  __pyx_cur_scope = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper *)__pyx_tp_new_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper(__pyx_ptype_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper, __pyx_empty_tuple, NULL);
  if (unlikely(!__pyx_cur_scope)) {
    __Pyx_RefNannyFinishContext();
    return NULL;
  }
  __Pyx_GOTREF(__pyx_cur_scope);
  __pyx_cur_scope->__pyx_v_self = __pyx_v_self;
  __Pyx_INCREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
  __Pyx_GIVEREF((PyObject *)__pyx_cur_scope->__pyx_v_self);
  __pyx_cur_scope->__pyx_v_args = __pyx_v_args;
  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_args);
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_args);
  __pyx_cur_scope->__pyx_v_kwargs = __pyx_v_kwargs;
  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_kwargs);
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_kwargs);
  {
    __pyx_CoroutineObject *gen = __Pyx_Generator_New((__pyx_coroutine_body_t) __pyx_gb_5asynq_10decorators_18PureAsyncDecorator_8generator, (PyObject *) __pyx_cur_scope, __pyx_n_s_fn_wrapper, __pyx_n_s_PureAsyncDecorator__fn_wrapper); if (unlikely(!gen)) __PYX_ERR(0, 117, __pyx_L1_error)
    __Pyx_DECREF(__pyx_cur_scope);
    __Pyx_RefNannyFinishContext();
    return (PyObject *) gen;
  }

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_AddTraceback("asynq.decorators.PureAsyncDecorator._fn_wrapper", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_gb_5asynq_10decorators_18PureAsyncDecorator_8generator(__pyx_CoroutineObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
{
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper *__pyx_cur_scope = ((struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper *)__pyx_generator->closure);
  PyObject *__pyx_r = NULL;
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("None", 0);
  switch (__pyx_generator->resume_label) {
    case 0: goto __pyx_L3_first_run;
    default: /* CPython raises the right error here */
    __Pyx_RefNannyFinishContext();
    return NULL;
  }
  __pyx_L3_first_run:;
  if (unlikely(!__pyx_sent_value)) __PYX_ERR(0, 117, __pyx_L1_error)

  /* "asynq/decorators.py":118
 * 
 *     def _fn_wrapper(self, args, kwargs):
 *         raise async_task.AsyncTaskResult(self.fn(*args, **kwargs)); return             # <<<<<<<<<<<<<<
 *         yield
 * 
 */
  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_async_task); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 118, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_AsyncTaskResult); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 118, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = PySequence_Tuple(__pyx_cur_scope->__pyx_v_args); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 118, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (unlikely(__pyx_cur_scope->__pyx_v_kwargs == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "argument after ** must be a mapping, not NoneType");
    __PYX_ERR(0, 118, __pyx_L1_error)
  }
  if (likely(PyDict_CheckExact(__pyx_cur_scope->__pyx_v_kwargs))) {
    __pyx_t_4 = PyDict_Copy(__pyx_cur_scope->__pyx_v_kwargs); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 118, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
  } else {
    __pyx_t_4 = PyObject_CallFunctionObjArgs((PyObject*)&PyDict_Type, __pyx_cur_scope->__pyx_v_kwargs, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 118, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
  }
  __pyx_t_5 = __Pyx_PyObject_Call(__pyx_cur_scope->__pyx_v_self->__pyx_base.fn, __pyx_t_2, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 118, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_4)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
    }
  }
  if (!__pyx_t_4) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_5); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 118, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __Pyx_GOTREF(__pyx_t_1);
  } else {
    __pyx_t_2 = PyTuple_New(1+1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 118, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_4); __pyx_t_4 = NULL;
    __Pyx_GIVEREF(__pyx_t_5);
    PyTuple_SET_ITEM(__pyx_t_2, 0+1, __pyx_t_5);
    __pyx_t_5 = 0;
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 118, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  }
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_Raise(__pyx_t_1, 0, 0, 0);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __PYX_ERR(0, 118, __pyx_L1_error)

  /* "asynq/decorators.py":117
 *         return True
 * 
 *     def _fn_wrapper(self, args, kwargs):             # <<<<<<<<<<<<<<
 *         raise async_task.AsyncTaskResult(self.fn(*args, **kwargs)); return
 *         yield
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("_fn_wrapper", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
  __pyx_generator->resume_label = -1;
  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":121
 *         yield
 * 
 *     def __call__(self, *args, **kwargs):             # <<<<<<<<<<<<<<
 *         return self._call_pure(args, kwargs)
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_18PureAsyncDecorator_10__call__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyObject *__pyx_pw_5asynq_10decorators_18PureAsyncDecorator_10__call__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_args = 0;
  PyObject *__pyx_v_kwargs = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__call__ (wrapper)", 0);
  if (unlikely(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__call__", 1))) return NULL;
  __pyx_v_kwargs = (__pyx_kwds) ? PyDict_Copy(__pyx_kwds) : PyDict_New(); if (unlikely(!__pyx_v_kwargs)) return NULL;
  __Pyx_GOTREF(__pyx_v_kwargs);
  __Pyx_INCREF(__pyx_args);
  __pyx_v_args = __pyx_args;
  __pyx_r = __pyx_pf_5asynq_10decorators_18PureAsyncDecorator_9__call__(((struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *)__pyx_v_self), __pyx_v_args, __pyx_v_kwargs);

  /* function exit code */
  __Pyx_XDECREF(__pyx_v_args);
  __Pyx_XDECREF(__pyx_v_kwargs);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_18PureAsyncDecorator_9__call__(struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *__pyx_v_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  __Pyx_RefNannySetupContext("__call__", 0);

  /* "asynq/decorators.py":122
 * 
 *     def __call__(self, *args, **kwargs):
 *         return self._call_pure(args, kwargs)             # <<<<<<<<<<<<<<
 * 
 *     def _call_pure(self, args, kwargs):
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = ((struct __pyx_vtabstruct_5asynq_10decorators_PureAsyncDecorator *)__pyx_v_self->__pyx_base.__pyx_vtab)->_call_pure(__pyx_v_self, __pyx_v_args, __pyx_v_kwargs, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 122, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "asynq/decorators.py":121
 *         yield
 * 
 *     def __call__(self, *args, **kwargs):             # <<<<<<<<<<<<<<
 *         return self._call_pure(args, kwargs)
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("asynq.decorators.PureAsyncDecorator.__call__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":124
 *         return self._call_pure(args, kwargs)
 * 
 *     def _call_pure(self, args, kwargs):             # <<<<<<<<<<<<<<
 *         if not self.needs_wrapper:
 *             result = self._fn_wrapper(args, kwargs)
 */

static PyObject *__pyx_pw_5asynq_10decorators_18PureAsyncDecorator_12_call_pure(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyObject *__pyx_f_5asynq_10decorators_18PureAsyncDecorator__call_pure(struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *__pyx_v_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, int __pyx_skip_dispatch) {
  PyObject *__pyx_v_result = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  Py_ssize_t __pyx_t_5;
  PyObject *__pyx_t_6 = NULL;
  int __pyx_t_7;
  __Pyx_RefNannySetupContext("_call_pure", 0);
  /* Check if called by wrapper */
  if (unlikely(__pyx_skip_dispatch)) ;
  /* Check if overridden in Python */
  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_call_pure); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 124, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_5asynq_10decorators_18PureAsyncDecorator_12_call_pure)) {
      __Pyx_XDECREF(__pyx_r);
      __Pyx_INCREF(__pyx_t_1);
      __pyx_t_3 = __pyx_t_1; __pyx_t_4 = NULL;
      __pyx_t_5 = 0;
      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_3))) {
        __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
        if (likely(__pyx_t_4)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
          __Pyx_INCREF(__pyx_t_4);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_3, function);
          __pyx_t_5 = 1;
        }
      }
      __pyx_t_6 = PyTuple_New(2+__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 124, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      if (__pyx_t_4) {
        __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __pyx_t_4 = NULL;
      }
      __Pyx_INCREF(__pyx_v_args);
      __Pyx_GIVEREF(__pyx_v_args);
      PyTuple_SET_ITEM(__pyx_t_6, 0+__pyx_t_5, __pyx_v_args);
      __Pyx_INCREF(__pyx_v_kwargs);
      __Pyx_GIVEREF(__pyx_v_kwargs);
      PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_5, __pyx_v_kwargs);
      __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 124, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __pyx_r = __pyx_t_2;
      __pyx_t_2 = 0;
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      goto __pyx_L0;
    }
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  }

  /* "asynq/decorators.py":125
 * 
 *     def _call_pure(self, args, kwargs):
 *         if not self.needs_wrapper:             # <<<<<<<<<<<<<<
 *             result = self._fn_wrapper(args, kwargs)
 *         else:
 */
  __pyx_t_7 = ((!(__pyx_v_self->needs_wrapper != 0)) != 0);
  if (__pyx_t_7) {

    /* "asynq/decorators.py":126
 *     def _call_pure(self, args, kwargs):
 *         if not self.needs_wrapper:
 *             result = self._fn_wrapper(args, kwargs)             # <<<<<<<<<<<<<<
 *         else:
 *             result = self.fn(*args, **kwargs)
 */
    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_fn_wrapper); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 126, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_3 = NULL;
    __pyx_t_5 = 0;
    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) {
      __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
      if (likely(__pyx_t_3)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
        __Pyx_INCREF(__pyx_t_3);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_2, function);
        __pyx_t_5 = 1;
      }
    }
    __pyx_t_6 = PyTuple_New(2+__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 126, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    if (__pyx_t_3) {
      __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3); __pyx_t_3 = NULL;
    }
    __Pyx_INCREF(__pyx_v_args);
    __Pyx_GIVEREF(__pyx_v_args);
    PyTuple_SET_ITEM(__pyx_t_6, 0+__pyx_t_5, __pyx_v_args);
    __Pyx_INCREF(__pyx_v_kwargs);
    __Pyx_GIVEREF(__pyx_v_kwargs);
    PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_5, __pyx_v_kwargs);
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 126, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_v_result = __pyx_t_1;
    __pyx_t_1 = 0;

    /* "asynq/decorators.py":125
 * 
 *     def _call_pure(self, args, kwargs):
 *         if not self.needs_wrapper:             # <<<<<<<<<<<<<<
 *             result = self._fn_wrapper(args, kwargs)
 *         else:
 */
    goto __pyx_L3;
  }

  /* "asynq/decorators.py":128
 *             result = self._fn_wrapper(args, kwargs)
 *         else:
 *             result = self.fn(*args, **kwargs)             # <<<<<<<<<<<<<<
 *         return self.task_cls(result, self.fn, args, kwargs, **self.kwargs)
 * 
 */
  /*else*/ {
    if (unlikely(__pyx_v_args == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
      __PYX_ERR(0, 128, __pyx_L1_error)
    }
    if (unlikely(__pyx_v_kwargs == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "argument after ** must be a mapping, not NoneType");
      __PYX_ERR(0, 128, __pyx_L1_error)
    }
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_v_self->__pyx_base.fn, __pyx_v_args, __pyx_v_kwargs); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 128, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_v_result = __pyx_t_1;
    __pyx_t_1 = 0;
  }
  __pyx_L3:;

  /* "asynq/decorators.py":129
 *         else:
 *             result = self.fn(*args, **kwargs)
 *         return self.task_cls(result, self.fn, args, kwargs, **self.kwargs)             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = PyTuple_New(4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 129, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_v_result);
  __Pyx_GIVEREF(__pyx_v_result);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_result);
  __Pyx_INCREF(__pyx_v_self->__pyx_base.fn);
  __Pyx_GIVEREF(__pyx_v_self->__pyx_base.fn);
  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->__pyx_base.fn);
  __Pyx_INCREF(__pyx_v_args);
  __Pyx_GIVEREF(__pyx_v_args);
  PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_args);
  __Pyx_INCREF(__pyx_v_kwargs);
  __Pyx_GIVEREF(__pyx_v_kwargs);
  PyTuple_SET_ITEM(__pyx_t_1, 3, __pyx_v_kwargs);
  if (unlikely(__pyx_v_self->kwargs == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "argument after ** must be a mapping, not NoneType");
    __PYX_ERR(0, 129, __pyx_L1_error)
  }
  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_v_self->task_cls), __pyx_t_1, __pyx_v_self->kwargs); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 129, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* "asynq/decorators.py":124
 *         return self._call_pure(args, kwargs)
 * 
 *     def _call_pure(self, args, kwargs):             # <<<<<<<<<<<<<<
 *         if not self.needs_wrapper:
 *             result = self._fn_wrapper(args, kwargs)
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_AddTraceback("asynq.decorators.PureAsyncDecorator._call_pure", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_result);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_18PureAsyncDecorator_12_call_pure(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyObject *__pyx_pw_5asynq_10decorators_18PureAsyncDecorator_12_call_pure(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_args = 0;
  PyObject *__pyx_v_kwargs = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_call_pure (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_args,&__pyx_n_s_kwargs,0};
    PyObject* values[2] = {0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_args)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_kwargs)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("_call_pure", 1, 2, 2, 1); __PYX_ERR(0, 124, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_call_pure") < 0)) __PYX_ERR(0, 124, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
    }
    __pyx_v_args = ((PyObject*)values[0]);
    __pyx_v_kwargs = ((PyObject*)values[1]);
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("_call_pure", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 124, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("asynq.decorators.PureAsyncDecorator._call_pure", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_args), (&PyTuple_Type), 1, "args", 1))) __PYX_ERR(0, 124, __pyx_L1_error)
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_kwargs), (&PyDict_Type), 1, "kwargs", 1))) __PYX_ERR(0, 124, __pyx_L1_error)
  __pyx_r = __pyx_pf_5asynq_10decorators_18PureAsyncDecorator_11_call_pure(((struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *)__pyx_v_self), __pyx_v_args, __pyx_v_kwargs);

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_18PureAsyncDecorator_11_call_pure(struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *__pyx_v_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  __Pyx_RefNannySetupContext("_call_pure", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __pyx_f_5asynq_10decorators_18PureAsyncDecorator__call_pure(__pyx_v_self, __pyx_v_args, __pyx_v_kwargs, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 124, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("asynq.decorators.PureAsyncDecorator._call_pure", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.pxd":38
 * 
 * cdef class PureAsyncDecorator(qcore.decorators.DecoratorBase):
 *     cdef public type task_cls             # <<<<<<<<<<<<<<
 *     cdef public dict kwargs
 *     cdef public bint needs_wrapper
 */

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_18PureAsyncDecorator_8task_cls_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_5asynq_10decorators_18PureAsyncDecorator_8task_cls_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_5asynq_10decorators_18PureAsyncDecorator_8task_cls___get__(((struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_18PureAsyncDecorator_8task_cls___get__(struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(((PyObject *)__pyx_v_self->task_cls));
  __pyx_r = ((PyObject *)__pyx_v_self->task_cls);
  goto __pyx_L0;

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_5asynq_10decorators_18PureAsyncDecorator_8task_cls_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
static int __pyx_pw_5asynq_10decorators_18PureAsyncDecorator_8task_cls_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
  __pyx_r = __pyx_pf_5asynq_10decorators_18PureAsyncDecorator_8task_cls_2__set__(((struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *)__pyx_v_self), ((PyObject *)__pyx_v_value));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_5asynq_10decorators_18PureAsyncDecorator_8task_cls_2__set__(struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  __Pyx_RefNannySetupContext("__set__", 0);
  if (!(likely(PyType_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "type", Py_TYPE(__pyx_v_value)->tp_name), 0))) __PYX_ERR(1, 38, __pyx_L1_error)
  __pyx_t_1 = __pyx_v_value;
  __Pyx_INCREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_1);
  __Pyx_GOTREF(__pyx_v_self->task_cls);
  __Pyx_DECREF(((PyObject *)__pyx_v_self->task_cls));
  __pyx_v_self->task_cls = ((PyTypeObject*)__pyx_t_1);
  __pyx_t_1 = 0;

  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("asynq.decorators.PureAsyncDecorator.task_cls.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_5asynq_10decorators_18PureAsyncDecorator_8task_cls_5__del__(PyObject *__pyx_v_self); /*proto*/
static int __pyx_pw_5asynq_10decorators_18PureAsyncDecorator_8task_cls_5__del__(PyObject *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
  __pyx_r = __pyx_pf_5asynq_10decorators_18PureAsyncDecorator_8task_cls_4__del__(((struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_5asynq_10decorators_18PureAsyncDecorator_8task_cls_4__del__(struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__", 0);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->task_cls);
  __Pyx_DECREF(((PyObject *)__pyx_v_self->task_cls));
  __pyx_v_self->task_cls = ((PyTypeObject*)Py_None);

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.pxd":39
 * cdef class PureAsyncDecorator(qcore.decorators.DecoratorBase):
 *     cdef public type task_cls
 *     cdef public dict kwargs             # <<<<<<<<<<<<<<
 *     cdef public bint needs_wrapper
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_18PureAsyncDecorator_6kwargs_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_5asynq_10decorators_18PureAsyncDecorator_6kwargs_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_5asynq_10decorators_18PureAsyncDecorator_6kwargs___get__(((struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_18PureAsyncDecorator_6kwargs___get__(struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->kwargs);
  __pyx_r = __pyx_v_self->kwargs;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_5asynq_10decorators_18PureAsyncDecorator_6kwargs_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
static int __pyx_pw_5asynq_10decorators_18PureAsyncDecorator_6kwargs_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
  __pyx_r = __pyx_pf_5asynq_10decorators_18PureAsyncDecorator_6kwargs_2__set__(((struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *)__pyx_v_self), ((PyObject *)__pyx_v_value));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_5asynq_10decorators_18PureAsyncDecorator_6kwargs_2__set__(struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  __Pyx_RefNannySetupContext("__set__", 0);
  if (!(likely(PyDict_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "dict", Py_TYPE(__pyx_v_value)->tp_name), 0))) __PYX_ERR(1, 39, __pyx_L1_error)
  __pyx_t_1 = __pyx_v_value;
  __Pyx_INCREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_1);
  __Pyx_GOTREF(__pyx_v_self->kwargs);
  __Pyx_DECREF(__pyx_v_self->kwargs);
  __pyx_v_self->kwargs = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;

  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("asynq.decorators.PureAsyncDecorator.kwargs.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_5asynq_10decorators_18PureAsyncDecorator_6kwargs_5__del__(PyObject *__pyx_v_self); /*proto*/
static int __pyx_pw_5asynq_10decorators_18PureAsyncDecorator_6kwargs_5__del__(PyObject *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
  __pyx_r = __pyx_pf_5asynq_10decorators_18PureAsyncDecorator_6kwargs_4__del__(((struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_5asynq_10decorators_18PureAsyncDecorator_6kwargs_4__del__(struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__", 0);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->kwargs);
  __Pyx_DECREF(__pyx_v_self->kwargs);
  __pyx_v_self->kwargs = ((PyObject*)Py_None);

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.pxd":40
 *     cdef public type task_cls
 *     cdef public dict kwargs
 *     cdef public bint needs_wrapper             # <<<<<<<<<<<<<<
 * 
 *     cpdef str name(self)
 */

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_18PureAsyncDecorator_13needs_wrapper_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_5asynq_10decorators_18PureAsyncDecorator_13needs_wrapper_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_5asynq_10decorators_18PureAsyncDecorator_13needs_wrapper___get__(((struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_18PureAsyncDecorator_13needs_wrapper___get__(struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_self->needs_wrapper); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 40, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("asynq.decorators.PureAsyncDecorator.needs_wrapper.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_5asynq_10decorators_18PureAsyncDecorator_13needs_wrapper_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
static int __pyx_pw_5asynq_10decorators_18PureAsyncDecorator_13needs_wrapper_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
  __pyx_r = __pyx_pf_5asynq_10decorators_18PureAsyncDecorator_13needs_wrapper_2__set__(((struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *)__pyx_v_self), ((PyObject *)__pyx_v_value));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_5asynq_10decorators_18PureAsyncDecorator_13needs_wrapper_2__set__(struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  __Pyx_RefNannySetupContext("__set__", 0);
  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_value); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 40, __pyx_L1_error)
  __pyx_v_self->needs_wrapper = __pyx_t_1;

  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_AddTraceback("asynq.decorators.PureAsyncDecorator.needs_wrapper.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":133
 * 
 * class AsyncDecoratorBinder(qcore.decorators.DecoratorBinder):
 *     def async(self, *args, **kwargs):             # <<<<<<<<<<<<<<
 *         if self.instance is None:
 *             return self.decorator.async(*args, **kwargs)
 */

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_20AsyncDecoratorBinder_1async(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyObject *__pyx_pw_5asynq_10decorators_20AsyncDecoratorBinder_1async(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_args = 0;
  PyObject *__pyx_v_kwargs = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("async (wrapper)", 0);
  if (unlikely(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "async", 1))) return NULL;
  if (unlikely(__pyx_kwds)) {
    __pyx_v_kwargs = PyDict_Copy(__pyx_kwds); if (unlikely(!__pyx_v_kwargs)) return NULL;
    __Pyx_GOTREF(__pyx_v_kwargs);
  } else {
    __pyx_v_kwargs = NULL;
  }
  __Pyx_INCREF(__pyx_args);
  __pyx_v_args = __pyx_args;
  __pyx_r = __pyx_pf_5asynq_10decorators_20AsyncDecoratorBinder_async(((struct __pyx_obj_5asynq_10decorators_AsyncDecoratorBinder *)__pyx_v_self), __pyx_v_args, __pyx_v_kwargs);

  /* function exit code */
  __Pyx_XDECREF(__pyx_v_args);
  __Pyx_XDECREF(__pyx_v_kwargs);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_20AsyncDecoratorBinder_async(struct __pyx_obj_5asynq_10decorators_AsyncDecoratorBinder *__pyx_v_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  __Pyx_RefNannySetupContext("async", 0);

  /* "asynq/decorators.py":134
 * class AsyncDecoratorBinder(qcore.decorators.DecoratorBinder):
 *     def async(self, *args, **kwargs):
 *         if self.instance is None:             # <<<<<<<<<<<<<<
 *             return self.decorator.async(*args, **kwargs)
 *         else:
 */
  __pyx_t_1 = (__pyx_v_self->__pyx_base.instance == Py_None);
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "asynq/decorators.py":135
 *     def async(self, *args, **kwargs):
 *         if self.instance is None:
 *             return self.decorator.async(*args, **kwargs)             # <<<<<<<<<<<<<<
 *         else:
 *             return self.decorator.async(self.instance, *args, **kwargs)
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self->__pyx_base.decorator), __pyx_n_s_async); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 135, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_v_args, __pyx_v_kwargs); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 135, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_r = __pyx_t_4;
    __pyx_t_4 = 0;
    goto __pyx_L0;

    /* "asynq/decorators.py":134
 * class AsyncDecoratorBinder(qcore.decorators.DecoratorBinder):
 *     def async(self, *args, **kwargs):
 *         if self.instance is None:             # <<<<<<<<<<<<<<
 *             return self.decorator.async(*args, **kwargs)
 *         else:
 */
  }

  /* "asynq/decorators.py":137
 *             return self.decorator.async(*args, **kwargs)
 *         else:
 *             return self.decorator.async(self.instance, *args, **kwargs)             # <<<<<<<<<<<<<<
 * 
 * 
 */
  /*else*/ {
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self->__pyx_base.decorator), __pyx_n_s_async); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 137, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 137, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_INCREF(__pyx_v_self->__pyx_base.instance);
    __Pyx_GIVEREF(__pyx_v_self->__pyx_base.instance);
    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_self->__pyx_base.instance);
    __pyx_t_5 = PyNumber_Add(__pyx_t_3, __pyx_v_args); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 137, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_5, __pyx_v_kwargs); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 137, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;
  }

  /* "asynq/decorators.py":133
 * 
 * class AsyncDecoratorBinder(qcore.decorators.DecoratorBinder):
 *     def async(self, *args, **kwargs):             # <<<<<<<<<<<<<<
 *         if self.instance is None:
 *             return self.decorator.async(*args, **kwargs)
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("asynq.decorators.AsyncDecoratorBinder.async", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":143
 *     binder_cls = AsyncDecoratorBinder
 * 
 *     def is_pure_async_fn(self):             # <<<<<<<<<<<<<<
 *         return False
 * 
 */

static PyObject *__pyx_pw_5asynq_10decorators_14AsyncDecorator_1is_pure_async_fn(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static int __pyx_f_5asynq_10decorators_14AsyncDecorator_is_pure_async_fn(CYTHON_UNUSED struct __pyx_obj_5asynq_10decorators_AsyncDecorator *__pyx_v_self, int __pyx_skip_dispatch) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  int __pyx_t_5;
  __Pyx_RefNannySetupContext("is_pure_async_fn", 0);
  /* Check if called by wrapper */
  if (unlikely(__pyx_skip_dispatch)) ;
  /* Check if overridden in Python */
  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_is_pure_async_fn); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 143, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_5asynq_10decorators_14AsyncDecorator_1is_pure_async_fn)) {
      __Pyx_INCREF(__pyx_t_1);
      __pyx_t_3 = __pyx_t_1; __pyx_t_4 = NULL;
      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_3))) {
        __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
        if (likely(__pyx_t_4)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
          __Pyx_INCREF(__pyx_t_4);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_3, function);
        }
      }
      if (__pyx_t_4) {
        __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 143, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      } else {
        __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 143, __pyx_L1_error)
      }
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 143, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __pyx_r = __pyx_t_5;
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      goto __pyx_L0;
    }
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  }

  /* "asynq/decorators.py":144
 * 
 *     def is_pure_async_fn(self):
 *         return False             # <<<<<<<<<<<<<<
 * 
 *     def async(self, *args, **kwargs):
 */
  __pyx_r = 0;
  goto __pyx_L0;

  /* "asynq/decorators.py":143
 *     binder_cls = AsyncDecoratorBinder
 * 
 *     def is_pure_async_fn(self):             # <<<<<<<<<<<<<<
 *         return False
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("asynq.decorators.AsyncDecorator.is_pure_async_fn", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_14AsyncDecorator_1is_pure_async_fn(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyObject *__pyx_pw_5asynq_10decorators_14AsyncDecorator_1is_pure_async_fn(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("is_pure_async_fn (wrapper)", 0);
  __pyx_r = __pyx_pf_5asynq_10decorators_14AsyncDecorator_is_pure_async_fn(((struct __pyx_obj_5asynq_10decorators_AsyncDecorator *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_14AsyncDecorator_is_pure_async_fn(struct __pyx_obj_5asynq_10decorators_AsyncDecorator *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  PyObject *__pyx_t_2 = NULL;
  __Pyx_RefNannySetupContext("is_pure_async_fn", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __pyx_f_5asynq_10decorators_14AsyncDecorator_is_pure_async_fn(__pyx_v_self, 1); if (unlikely(__pyx_t_1 == -1)) __PYX_ERR(0, 143, __pyx_L1_error)
  __pyx_t_2 = __Pyx_PyBool_FromLong(__pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 143, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("asynq.decorators.AsyncDecorator.is_pure_async_fn", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":146
 *         return False
 * 
 *     def async(self, *args, **kwargs):             # <<<<<<<<<<<<<<
 *         return self._call_pure(args, kwargs)
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_14AsyncDecorator_3async(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyObject *__pyx_pw_5asynq_10decorators_14AsyncDecorator_3async(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_args = 0;
  PyObject *__pyx_v_kwargs = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("async (wrapper)", 0);
  if (unlikely(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "async", 1))) return NULL;
  __pyx_v_kwargs = (__pyx_kwds) ? PyDict_Copy(__pyx_kwds) : PyDict_New(); if (unlikely(!__pyx_v_kwargs)) return NULL;
  __Pyx_GOTREF(__pyx_v_kwargs);
  __Pyx_INCREF(__pyx_args);
  __pyx_v_args = __pyx_args;
  __pyx_r = __pyx_pf_5asynq_10decorators_14AsyncDecorator_2async(((struct __pyx_obj_5asynq_10decorators_AsyncDecorator *)__pyx_v_self), __pyx_v_args, __pyx_v_kwargs);

  /* function exit code */
  __Pyx_XDECREF(__pyx_v_args);
  __Pyx_XDECREF(__pyx_v_kwargs);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_14AsyncDecorator_2async(struct __pyx_obj_5asynq_10decorators_AsyncDecorator *__pyx_v_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  __Pyx_RefNannySetupContext("async", 0);

  /* "asynq/decorators.py":147
 * 
 *     def async(self, *args, **kwargs):
 *         return self._call_pure(args, kwargs)             # <<<<<<<<<<<<<<
 * 
 *     def name(self):
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = ((struct __pyx_vtabstruct_5asynq_10decorators_AsyncDecorator *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base._call_pure(((struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *)__pyx_v_self), __pyx_v_args, __pyx_v_kwargs, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 147, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "asynq/decorators.py":146
 *         return False
 * 
 *     def async(self, *args, **kwargs):             # <<<<<<<<<<<<<<
 *         return self._call_pure(args, kwargs)
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("asynq.decorators.AsyncDecorator.async", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":149
 *         return self._call_pure(args, kwargs)
 * 
 *     def name(self):             # <<<<<<<<<<<<<<
 *         return '@async()'
 * 
 */

static PyObject *__pyx_pw_5asynq_10decorators_14AsyncDecorator_5name(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyObject *__pyx_f_5asynq_10decorators_14AsyncDecorator_name(CYTHON_UNUSED struct __pyx_obj_5asynq_10decorators_AsyncDecorator *__pyx_v_self, int __pyx_skip_dispatch) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  __Pyx_RefNannySetupContext("name", 0);
  /* Check if called by wrapper */
  if (unlikely(__pyx_skip_dispatch)) ;
  /* Check if overridden in Python */
  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_name); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 149, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_5asynq_10decorators_14AsyncDecorator_5name)) {
      __Pyx_XDECREF(__pyx_r);
      __Pyx_INCREF(__pyx_t_1);
      __pyx_t_3 = __pyx_t_1; __pyx_t_4 = NULL;
      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_3))) {
        __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
        if (likely(__pyx_t_4)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
          __Pyx_INCREF(__pyx_t_4);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_3, function);
        }
      }
      if (__pyx_t_4) {
        __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 149, __pyx_L1_error)
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      } else {
        __pyx_t_2 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 149, __pyx_L1_error)
      }
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      if (!(likely(PyString_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "str", Py_TYPE(__pyx_t_2)->tp_name), 0))) __PYX_ERR(0, 149, __pyx_L1_error)
      __pyx_r = ((PyObject*)__pyx_t_2);
      __pyx_t_2 = 0;
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      goto __pyx_L0;
    }
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  }

  /* "asynq/decorators.py":150
 * 
 *     def name(self):
 *         return '@async()'             # <<<<<<<<<<<<<<
 * 
 *     def __call__(self, *args, **kwargs):
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_kp_s_async_2);
  __pyx_r = __pyx_kp_s_async_2;
  goto __pyx_L0;

  /* "asynq/decorators.py":149
 *         return self._call_pure(args, kwargs)
 * 
 *     def name(self):             # <<<<<<<<<<<<<<
 *         return '@async()'
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("asynq.decorators.AsyncDecorator.name", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_14AsyncDecorator_5name(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyObject *__pyx_pw_5asynq_10decorators_14AsyncDecorator_5name(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("name (wrapper)", 0);
  __pyx_r = __pyx_pf_5asynq_10decorators_14AsyncDecorator_4name(((struct __pyx_obj_5asynq_10decorators_AsyncDecorator *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_14AsyncDecorator_4name(struct __pyx_obj_5asynq_10decorators_AsyncDecorator *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  __Pyx_RefNannySetupContext("name", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __pyx_f_5asynq_10decorators_14AsyncDecorator_name(__pyx_v_self, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 149, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("asynq.decorators.AsyncDecorator.name", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":152
 *         return '@async()'
 * 
 *     def __call__(self, *args, **kwargs):             # <<<<<<<<<<<<<<
 *         return self._call_pure(args, kwargs).value()
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_14AsyncDecorator_7__call__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyObject *__pyx_pw_5asynq_10decorators_14AsyncDecorator_7__call__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_args = 0;
  PyObject *__pyx_v_kwargs = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__call__ (wrapper)", 0);
  if (unlikely(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__call__", 1))) return NULL;
  __pyx_v_kwargs = (__pyx_kwds) ? PyDict_Copy(__pyx_kwds) : PyDict_New(); if (unlikely(!__pyx_v_kwargs)) return NULL;
  __Pyx_GOTREF(__pyx_v_kwargs);
  __Pyx_INCREF(__pyx_args);
  __pyx_v_args = __pyx_args;
  __pyx_r = __pyx_pf_5asynq_10decorators_14AsyncDecorator_6__call__(((struct __pyx_obj_5asynq_10decorators_AsyncDecorator *)__pyx_v_self), __pyx_v_args, __pyx_v_kwargs);

  /* function exit code */
  __Pyx_XDECREF(__pyx_v_args);
  __Pyx_XDECREF(__pyx_v_kwargs);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_14AsyncDecorator_6__call__(struct __pyx_obj_5asynq_10decorators_AsyncDecorator *__pyx_v_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  __Pyx_RefNannySetupContext("__call__", 0);

  /* "asynq/decorators.py":153
 * 
 *     def __call__(self, *args, **kwargs):
 *         return self._call_pure(args, kwargs).value()             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = ((struct __pyx_vtabstruct_5asynq_10decorators_AsyncDecorator *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base._call_pure(((struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *)__pyx_v_self), __pyx_v_args, __pyx_v_kwargs, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 153, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_value); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 153, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_2)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_2);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
    }
  }
  if (__pyx_t_2) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 153, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  } else {
    __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 153, __pyx_L1_error)
  }
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "asynq/decorators.py":152
 *         return '@async()'
 * 
 *     def __call__(self, *args, **kwargs):             # <<<<<<<<<<<<<<
 *         return self._call_pure(args, kwargs).value()
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("asynq.decorators.AsyncDecorator.__call__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":157
 * 
 * class AsyncAndSyncPairDecoratorBinder(AsyncDecoratorBinder):
 *     def __call__(self, *args, **kwargs):             # <<<<<<<<<<<<<<
 *         # the base class implementation adds .instance here, but we don't want that because we
 *         # called __get__ on the sync_fn manually; if we don't do this we'll end up adding self or
 */

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_31AsyncAndSyncPairDecoratorBinder_1__call__(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_mdef_5asynq_10decorators_31AsyncAndSyncPairDecoratorBinder_1__call__ = {"__call__", (PyCFunction)__pyx_pw_5asynq_10decorators_31AsyncAndSyncPairDecoratorBinder_1__call__, METH_VARARGS|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_5asynq_10decorators_31AsyncAndSyncPairDecoratorBinder_1__call__(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_self = 0;
  PyObject *__pyx_v_args = 0;
  PyObject *__pyx_v_kwargs = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__call__ (wrapper)", 0);
  __pyx_v_kwargs = PyDict_New(); if (unlikely(!__pyx_v_kwargs)) return NULL;
  __Pyx_GOTREF(__pyx_v_kwargs);
  if (PyTuple_GET_SIZE(__pyx_args) > 1) {
    __pyx_v_args = PyTuple_GetSlice(__pyx_args, 1, PyTuple_GET_SIZE(__pyx_args));
    if (unlikely(!__pyx_v_args)) {
      __Pyx_DECREF(__pyx_v_kwargs); __pyx_v_kwargs = 0;
      __Pyx_RefNannyFinishContext();
      return NULL;
    }
    __Pyx_GOTREF(__pyx_v_args);
  } else {
    __pyx_v_args = __pyx_empty_tuple; __Pyx_INCREF(__pyx_empty_tuple);
  }
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_self,0};
    PyObject* values[1] = {0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        default:
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_self)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
      }
      if (unlikely(kw_args > 0)) {
        const Py_ssize_t used_pos_args = (pos_args < 1) ? pos_args : 1;
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, __pyx_v_kwargs, values, used_pos_args, "__call__") < 0)) __PYX_ERR(0, 157, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) < 1) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
    }
    __pyx_v_self = values[0];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__call__", 0, 1, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 157, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_DECREF(__pyx_v_args); __pyx_v_args = 0;
  __Pyx_DECREF(__pyx_v_kwargs); __pyx_v_kwargs = 0;
  __Pyx_AddTraceback("asynq.decorators.AsyncAndSyncPairDecoratorBinder.__call__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5asynq_10decorators_31AsyncAndSyncPairDecoratorBinder___call__(__pyx_self, __pyx_v_self, __pyx_v_args, __pyx_v_kwargs);

  /* function exit code */
  __Pyx_XDECREF(__pyx_v_args);
  __Pyx_XDECREF(__pyx_v_kwargs);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_31AsyncAndSyncPairDecoratorBinder___call__(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  __Pyx_RefNannySetupContext("__call__", 0);

  /* "asynq/decorators.py":161
 *         # called __get__ on the sync_fn manually; if we don't do this we'll end up adding self or
 *         # cls twice
 *         return self.decorator(*args, **kwargs)             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_self, __pyx_n_s_decorator); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 161, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_v_args, __pyx_v_kwargs); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 161, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* "asynq/decorators.py":157
 * 
 * class AsyncAndSyncPairDecoratorBinder(AsyncDecoratorBinder):
 *     def __call__(self, *args, **kwargs):             # <<<<<<<<<<<<<<
 *         # the base class implementation adds .instance here, but we don't want that because we
 *         # called __get__ on the sync_fn manually; if we don't do this we'll end up adding self or
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("asynq.decorators.AsyncAndSyncPairDecoratorBinder.__call__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":167
 *     binder_cls = AsyncAndSyncPairDecoratorBinder
 * 
 *     def __init__(self, fn, cls, sync_fn, kwargs={}):             # <<<<<<<<<<<<<<
 *         AsyncDecorator.__init__(self, fn, cls, kwargs)
 *         self.sync_fn = sync_fn
 */

/* Python wrapper */
static int __pyx_pw_5asynq_10decorators_25AsyncAndSyncPairDecorator_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static int __pyx_pw_5asynq_10decorators_25AsyncAndSyncPairDecorator_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_fn = 0;
  PyObject *__pyx_v_cls = 0;
  PyObject *__pyx_v_sync_fn = 0;
  PyObject *__pyx_v_kwargs = 0;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_fn,&__pyx_n_s_cls,&__pyx_n_s_sync_fn,&__pyx_n_s_kwargs,0};
    PyObject* values[4] = {0,0,0,0};
    values[3] = __pyx_k__6;
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_fn)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_cls)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__init__", 0, 3, 4, 1); __PYX_ERR(0, 167, __pyx_L3_error)
        }
        case  2:
        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_sync_fn)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__init__", 0, 3, 4, 2); __PYX_ERR(0, 167, __pyx_L3_error)
        }
        case  3:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_kwargs);
          if (value) { values[3] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 167, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_fn = values[0];
    __pyx_v_cls = values[1];
    __pyx_v_sync_fn = values[2];
    __pyx_v_kwargs = values[3];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__init__", 0, 3, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 167, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("asynq.decorators.AsyncAndSyncPairDecorator.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return -1;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5asynq_10decorators_25AsyncAndSyncPairDecorator___init__(((struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairDecorator *)__pyx_v_self), __pyx_v_fn, __pyx_v_cls, __pyx_v_sync_fn, __pyx_v_kwargs);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_5asynq_10decorators_25AsyncAndSyncPairDecorator___init__(struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairDecorator *__pyx_v_self, PyObject *__pyx_v_fn, PyObject *__pyx_v_cls, PyObject *__pyx_v_sync_fn, PyObject *__pyx_v_kwargs) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  Py_ssize_t __pyx_t_4;
  PyObject *__pyx_t_5 = NULL;
  __Pyx_RefNannySetupContext("__init__", 0);

  /* "asynq/decorators.py":168
 * 
 *     def __init__(self, fn, cls, sync_fn, kwargs={}):
 *         AsyncDecorator.__init__(self, fn, cls, kwargs)             # <<<<<<<<<<<<<<
 *         self.sync_fn = sync_fn
 * 
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_5asynq_10decorators_AsyncDecorator), __pyx_n_s_init); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 168, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  __pyx_t_4 = 0;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
      __pyx_t_4 = 1;
    }
  }
  __pyx_t_5 = PyTuple_New(4+__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 168, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  if (__pyx_t_3) {
    __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3); __pyx_t_3 = NULL;
  }
  __Pyx_INCREF(((PyObject *)__pyx_v_self));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_self));
  PyTuple_SET_ITEM(__pyx_t_5, 0+__pyx_t_4, ((PyObject *)__pyx_v_self));
  __Pyx_INCREF(__pyx_v_fn);
  __Pyx_GIVEREF(__pyx_v_fn);
  PyTuple_SET_ITEM(__pyx_t_5, 1+__pyx_t_4, __pyx_v_fn);
  __Pyx_INCREF(__pyx_v_cls);
  __Pyx_GIVEREF(__pyx_v_cls);
  PyTuple_SET_ITEM(__pyx_t_5, 2+__pyx_t_4, __pyx_v_cls);
  __Pyx_INCREF(__pyx_v_kwargs);
  __Pyx_GIVEREF(__pyx_v_kwargs);
  PyTuple_SET_ITEM(__pyx_t_5, 3+__pyx_t_4, __pyx_v_kwargs);
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 168, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "asynq/decorators.py":169
 *     def __init__(self, fn, cls, sync_fn, kwargs={}):
 *         AsyncDecorator.__init__(self, fn, cls, kwargs)
 *         self.sync_fn = sync_fn             # <<<<<<<<<<<<<<
 * 
 *     def __call__(self, *args, **kwargs):
 */
  __Pyx_INCREF(__pyx_v_sync_fn);
  __Pyx_GIVEREF(__pyx_v_sync_fn);
  __Pyx_GOTREF(__pyx_v_self->sync_fn);
  __Pyx_DECREF(__pyx_v_self->sync_fn);
  __pyx_v_self->sync_fn = __pyx_v_sync_fn;

  /* "asynq/decorators.py":167
 *     binder_cls = AsyncAndSyncPairDecoratorBinder
 * 
 *     def __init__(self, fn, cls, sync_fn, kwargs={}):             # <<<<<<<<<<<<<<
 *         AsyncDecorator.__init__(self, fn, cls, kwargs)
 *         self.sync_fn = sync_fn
 */

  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("asynq.decorators.AsyncAndSyncPairDecorator.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":171
 *         self.sync_fn = sync_fn
 * 
 *     def __call__(self, *args, **kwargs):             # <<<<<<<<<<<<<<
 *         return self.sync_fn(*args, **kwargs)
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_25AsyncAndSyncPairDecorator_3__call__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyObject *__pyx_pw_5asynq_10decorators_25AsyncAndSyncPairDecorator_3__call__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_args = 0;
  PyObject *__pyx_v_kwargs = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__call__ (wrapper)", 0);
  if (unlikely(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__call__", 1))) return NULL;
  if (unlikely(__pyx_kwds)) {
    __pyx_v_kwargs = PyDict_Copy(__pyx_kwds); if (unlikely(!__pyx_v_kwargs)) return NULL;
    __Pyx_GOTREF(__pyx_v_kwargs);
  } else {
    __pyx_v_kwargs = NULL;
  }
  __Pyx_INCREF(__pyx_args);
  __pyx_v_args = __pyx_args;
  __pyx_r = __pyx_pf_5asynq_10decorators_25AsyncAndSyncPairDecorator_2__call__(((struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairDecorator *)__pyx_v_self), __pyx_v_args, __pyx_v_kwargs);

  /* function exit code */
  __Pyx_XDECREF(__pyx_v_args);
  __Pyx_XDECREF(__pyx_v_kwargs);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_25AsyncAndSyncPairDecorator_2__call__(struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairDecorator *__pyx_v_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  __Pyx_RefNannySetupContext("__call__", 0);

  /* "asynq/decorators.py":172
 * 
 *     def __call__(self, *args, **kwargs):
 *         return self.sync_fn(*args, **kwargs)             # <<<<<<<<<<<<<<
 * 
 *     def __get__(self, owner, cls):
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_v_self->sync_fn, __pyx_v_args, __pyx_v_kwargs); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 172, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "asynq/decorators.py":171
 *         self.sync_fn = sync_fn
 * 
 *     def __call__(self, *args, **kwargs):             # <<<<<<<<<<<<<<
 *         return self.sync_fn(*args, **kwargs)
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("asynq.decorators.AsyncAndSyncPairDecorator.__call__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":174
 *         return self.sync_fn(*args, **kwargs)
 * 
 *     def __get__(self, owner, cls):             # <<<<<<<<<<<<<<
 *         # This is needed so that we can use objects with __get__ as the sync_fn. If we just rely on
 *         # the base class's __get__ implementation, we'll never end up calling __get__ on the
 */

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_25AsyncAndSyncPairDecorator_5__get__(PyObject *__pyx_v_self, PyObject *__pyx_v_owner, PyObject *__pyx_v_cls); /*proto*/
static PyObject *__pyx_pw_5asynq_10decorators_25AsyncAndSyncPairDecorator_5__get__(PyObject *__pyx_v_self, PyObject *__pyx_v_owner, PyObject *__pyx_v_cls) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_5asynq_10decorators_25AsyncAndSyncPairDecorator_4__get__(((struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairDecorator *)__pyx_v_self), ((PyObject *)__pyx_v_owner), ((PyObject *)__pyx_v_cls));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_25AsyncAndSyncPairDecorator_4__get__(struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairDecorator *__pyx_v_self, PyObject *__pyx_v_owner, PyObject *__pyx_v_cls) {
  PyObject *__pyx_v_sync_fn = NULL;
  PyObject *__pyx_v_fn = NULL;
  PyObject *__pyx_v_new_self = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  Py_ssize_t __pyx_t_4;
  PyObject *__pyx_t_5 = NULL;
  int __pyx_t_6;
  int __pyx_t_7;
  PyObject *__pyx_t_8 = NULL;
  __Pyx_RefNannySetupContext("__get__", 0);

  /* "asynq/decorators.py":180
 *         # this by manually calling __get__ on the sync_fn, then creating a copy of ourselves with
 *         # the bound sync_fn and calling the base class's __get__ implementation on it.
 *         sync_fn = self.sync_fn.__get__(owner, cls)             # <<<<<<<<<<<<<<
 *         fn = self.fn
 *         if self.type in (staticmethod, classmethod):
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->sync_fn, __pyx_n_s_get); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 180, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  __pyx_t_4 = 0;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
      __pyx_t_4 = 1;
    }
  }
  __pyx_t_5 = PyTuple_New(2+__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 180, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  if (__pyx_t_3) {
    __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3); __pyx_t_3 = NULL;
  }
  __Pyx_INCREF(__pyx_v_owner);
  __Pyx_GIVEREF(__pyx_v_owner);
  PyTuple_SET_ITEM(__pyx_t_5, 0+__pyx_t_4, __pyx_v_owner);
  __Pyx_INCREF(__pyx_v_cls);
  __Pyx_GIVEREF(__pyx_v_cls);
  PyTuple_SET_ITEM(__pyx_t_5, 1+__pyx_t_4, __pyx_v_cls);
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 180, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_sync_fn = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "asynq/decorators.py":181
 *         # the bound sync_fn and calling the base class's __get__ implementation on it.
 *         sync_fn = self.sync_fn.__get__(owner, cls)
 *         fn = self.fn             # <<<<<<<<<<<<<<
 *         if self.type in (staticmethod, classmethod):
 *             fn = self.type(fn)
 */
  __pyx_t_1 = __pyx_v_self->__pyx_base.__pyx_base.__pyx_base.fn;
  __Pyx_INCREF(__pyx_t_1);
  __pyx_v_fn = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "asynq/decorators.py":182
 *         sync_fn = self.sync_fn.__get__(owner, cls)
 *         fn = self.fn
 *         if self.type in (staticmethod, classmethod):             # <<<<<<<<<<<<<<
 *             fn = self.type(fn)
 *         new_self = qcore.decorators.decorate(
 */
  __Pyx_INCREF(__pyx_v_self->__pyx_base.__pyx_base.__pyx_base.type);
  __pyx_t_1 = __pyx_v_self->__pyx_base.__pyx_base.__pyx_base.type;
  __pyx_t_2 = PyObject_RichCompare(__pyx_t_1, __pyx_builtin_staticmethod, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 182, __pyx_L1_error)
  __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 182, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (!__pyx_t_7) {
  } else {
    __pyx_t_6 = __pyx_t_7;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_2 = PyObject_RichCompare(__pyx_t_1, __pyx_builtin_classmethod, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 182, __pyx_L1_error)
  __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_7 < 0)) __PYX_ERR(0, 182, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_6 = __pyx_t_7;
  __pyx_L4_bool_binop_done:;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_7 = (__pyx_t_6 != 0);
  if (__pyx_t_7) {

    /* "asynq/decorators.py":183
 *         fn = self.fn
 *         if self.type in (staticmethod, classmethod):
 *             fn = self.type(fn)             # <<<<<<<<<<<<<<
 *         new_self = qcore.decorators.decorate(
 *             AsyncAndSyncPairDecorator, self.task_cls, sync_fn, self.kwargs,
 */
    __Pyx_INCREF(__pyx_v_self->__pyx_base.__pyx_base.__pyx_base.type);
    __pyx_t_2 = __pyx_v_self->__pyx_base.__pyx_base.__pyx_base.type; __pyx_t_5 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) {
      __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2);
      if (likely(__pyx_t_5)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
        __Pyx_INCREF(__pyx_t_5);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_2, function);
      }
    }
    if (!__pyx_t_5) {
      __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_fn); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 183, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
    } else {
      __pyx_t_3 = PyTuple_New(1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 183, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_5); __pyx_t_5 = NULL;
      __Pyx_INCREF(__pyx_v_fn);
      __Pyx_GIVEREF(__pyx_v_fn);
      PyTuple_SET_ITEM(__pyx_t_3, 0+1, __pyx_v_fn);
      __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 183, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    }
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF_SET(__pyx_v_fn, __pyx_t_1);
    __pyx_t_1 = 0;

    /* "asynq/decorators.py":182
 *         sync_fn = self.sync_fn.__get__(owner, cls)
 *         fn = self.fn
 *         if self.type in (staticmethod, classmethod):             # <<<<<<<<<<<<<<
 *             fn = self.type(fn)
 *         new_self = qcore.decorators.decorate(
 */
  }

  /* "asynq/decorators.py":184
 *         if self.type in (staticmethod, classmethod):
 *             fn = self.type(fn)
 *         new_self = qcore.decorators.decorate(             # <<<<<<<<<<<<<<
 *             AsyncAndSyncPairDecorator, self.task_cls, sync_fn, self.kwargs,
 *         )(fn)
 */
  __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_qcore); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 184, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_decorators); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 184, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_decorate); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 184, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;

  /* "asynq/decorators.py":185
 *             fn = self.type(fn)
 *         new_self = qcore.decorators.decorate(
 *             AsyncAndSyncPairDecorator, self.task_cls, sync_fn, self.kwargs,             # <<<<<<<<<<<<<<
 *         )(fn)
 *         return AsyncDecorator.__get__(new_self, owner, cls)
 */
  __pyx_t_5 = NULL;
  __pyx_t_4 = 0;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_5)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_5);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
      __pyx_t_4 = 1;
    }
  }
  __pyx_t_8 = PyTuple_New(4+__pyx_t_4); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 184, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_8);
  if (__pyx_t_5) {
    __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_5); __pyx_t_5 = NULL;
  }
  __Pyx_INCREF(((PyObject *)__pyx_ptype_5asynq_10decorators_AsyncAndSyncPairDecorator));
  __Pyx_GIVEREF(((PyObject *)__pyx_ptype_5asynq_10decorators_AsyncAndSyncPairDecorator));
  PyTuple_SET_ITEM(__pyx_t_8, 0+__pyx_t_4, ((PyObject *)__pyx_ptype_5asynq_10decorators_AsyncAndSyncPairDecorator));
  __Pyx_INCREF(((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.task_cls));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.task_cls));
  PyTuple_SET_ITEM(__pyx_t_8, 1+__pyx_t_4, ((PyObject *)__pyx_v_self->__pyx_base.__pyx_base.task_cls));
  __Pyx_INCREF(__pyx_v_sync_fn);
  __Pyx_GIVEREF(__pyx_v_sync_fn);
  PyTuple_SET_ITEM(__pyx_t_8, 2+__pyx_t_4, __pyx_v_sync_fn);
  __Pyx_INCREF(__pyx_v_self->__pyx_base.__pyx_base.kwargs);
  __Pyx_GIVEREF(__pyx_v_self->__pyx_base.__pyx_base.kwargs);
  PyTuple_SET_ITEM(__pyx_t_8, 3+__pyx_t_4, __pyx_v_self->__pyx_base.__pyx_base.kwargs);
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_8, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 184, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;

  /* "asynq/decorators.py":186
 *         new_self = qcore.decorators.decorate(
 *             AsyncAndSyncPairDecorator, self.task_cls, sync_fn, self.kwargs,
 *         )(fn)             # <<<<<<<<<<<<<<
 *         return AsyncDecorator.__get__(new_self, owner, cls)
 * 
 */
  __pyx_t_3 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  if (!__pyx_t_3) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_fn); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 186, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  } else {
    __pyx_t_8 = PyTuple_New(1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 186, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_8);
    __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_3); __pyx_t_3 = NULL;
    __Pyx_INCREF(__pyx_v_fn);
    __Pyx_GIVEREF(__pyx_v_fn);
    PyTuple_SET_ITEM(__pyx_t_8, 0+1, __pyx_v_fn);
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_8, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 186, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_new_self = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "asynq/decorators.py":187
 *             AsyncAndSyncPairDecorator, self.task_cls, sync_fn, self.kwargs,
 *         )(fn)
 *         return AsyncDecorator.__get__(new_self, owner, cls)             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_5asynq_10decorators_AsyncDecorator), __pyx_n_s_get); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 187, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_8 = NULL;
  __pyx_t_4 = 0;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_8)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_8);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
      __pyx_t_4 = 1;
    }
  }
  __pyx_t_3 = PyTuple_New(3+__pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 187, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  if (__pyx_t_8) {
    __Pyx_GIVEREF(__pyx_t_8); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_8); __pyx_t_8 = NULL;
  }
  __Pyx_INCREF(__pyx_v_new_self);
  __Pyx_GIVEREF(__pyx_v_new_self);
  PyTuple_SET_ITEM(__pyx_t_3, 0+__pyx_t_4, __pyx_v_new_self);
  __Pyx_INCREF(__pyx_v_owner);
  __Pyx_GIVEREF(__pyx_v_owner);
  PyTuple_SET_ITEM(__pyx_t_3, 1+__pyx_t_4, __pyx_v_owner);
  __Pyx_INCREF(__pyx_v_cls);
  __Pyx_GIVEREF(__pyx_v_cls);
  PyTuple_SET_ITEM(__pyx_t_3, 2+__pyx_t_4, __pyx_v_cls);
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 187, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "asynq/decorators.py":174
 *         return self.sync_fn(*args, **kwargs)
 * 
 *     def __get__(self, owner, cls):             # <<<<<<<<<<<<<<
 *         # This is needed so that we can use objects with __get__ as the sync_fn. If we just rely on
 *         # the base class's __get__ implementation, we'll never end up calling __get__ on the
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_AddTraceback("asynq.decorators.AsyncAndSyncPairDecorator.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_sync_fn);
  __Pyx_XDECREF(__pyx_v_fn);
  __Pyx_XDECREF(__pyx_v_new_self);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.pxd":56
 * 
 * cdef class AsyncAndSyncPairDecorator(AsyncDecorator):
 *     cdef public object sync_fn             # <<<<<<<<<<<<<<
 * 
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_25AsyncAndSyncPairDecorator_7sync_fn_1__get__(PyObject *__pyx_v_self); /*proto*/
static PyObject *__pyx_pw_5asynq_10decorators_25AsyncAndSyncPairDecorator_7sync_fn_1__get__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
  __pyx_r = __pyx_pf_5asynq_10decorators_25AsyncAndSyncPairDecorator_7sync_fn___get__(((struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairDecorator *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_25AsyncAndSyncPairDecorator_7sync_fn___get__(struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairDecorator *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__get__", 0);
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_self->sync_fn);
  __pyx_r = __pyx_v_self->sync_fn;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_5asynq_10decorators_25AsyncAndSyncPairDecorator_7sync_fn_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value); /*proto*/
static int __pyx_pw_5asynq_10decorators_25AsyncAndSyncPairDecorator_7sync_fn_3__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
  __pyx_r = __pyx_pf_5asynq_10decorators_25AsyncAndSyncPairDecorator_7sync_fn_2__set__(((struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairDecorator *)__pyx_v_self), ((PyObject *)__pyx_v_value));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_5asynq_10decorators_25AsyncAndSyncPairDecorator_7sync_fn_2__set__(struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairDecorator *__pyx_v_self, PyObject *__pyx_v_value) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__set__", 0);
  __Pyx_INCREF(__pyx_v_value);
  __Pyx_GIVEREF(__pyx_v_value);
  __Pyx_GOTREF(__pyx_v_self->sync_fn);
  __Pyx_DECREF(__pyx_v_self->sync_fn);
  __pyx_v_self->sync_fn = __pyx_v_value;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static int __pyx_pw_5asynq_10decorators_25AsyncAndSyncPairDecorator_7sync_fn_5__del__(PyObject *__pyx_v_self); /*proto*/
static int __pyx_pw_5asynq_10decorators_25AsyncAndSyncPairDecorator_7sync_fn_5__del__(PyObject *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
  __pyx_r = __pyx_pf_5asynq_10decorators_25AsyncAndSyncPairDecorator_7sync_fn_4__del__(((struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairDecorator *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_5asynq_10decorators_25AsyncAndSyncPairDecorator_7sync_fn_4__del__(struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairDecorator *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__del__", 0);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __Pyx_GOTREF(__pyx_v_self->sync_fn);
  __Pyx_DECREF(__pyx_v_self->sync_fn);
  __pyx_v_self->sync_fn = Py_None;

  /* function exit code */
  __pyx_r = 0;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":191
 * 
 * class AsyncProxyDecorator(AsyncDecorator):
 *     def __init__(self, fn):             # <<<<<<<<<<<<<<
 *         # we don't need the task class but still need to pass it to the superclass
 *         AsyncDecorator.__init__(self, fn, None)
 */

/* Python wrapper */
static int __pyx_pw_5asynq_10decorators_19AsyncProxyDecorator_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static int __pyx_pw_5asynq_10decorators_19AsyncProxyDecorator_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_fn = 0;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_fn,0};
    PyObject* values[1] = {0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_fn)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 191, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 1) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
    }
    __pyx_v_fn = values[0];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 191, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("asynq.decorators.AsyncProxyDecorator.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return -1;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5asynq_10decorators_19AsyncProxyDecorator___init__(((struct __pyx_obj_5asynq_10decorators_AsyncProxyDecorator *)__pyx_v_self), __pyx_v_fn);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_5asynq_10decorators_19AsyncProxyDecorator___init__(struct __pyx_obj_5asynq_10decorators_AsyncProxyDecorator *__pyx_v_self, PyObject *__pyx_v_fn) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  Py_ssize_t __pyx_t_4;
  PyObject *__pyx_t_5 = NULL;
  __Pyx_RefNannySetupContext("__init__", 0);

  /* "asynq/decorators.py":193
 *     def __init__(self, fn):
 *         # we don't need the task class but still need to pass it to the superclass
 *         AsyncDecorator.__init__(self, fn, None)             # <<<<<<<<<<<<<<
 * 
 *     def _call_pure(self, args, kwargs):
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_5asynq_10decorators_AsyncDecorator), __pyx_n_s_init); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 193, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  __pyx_t_4 = 0;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
      __pyx_t_4 = 1;
    }
  }
  __pyx_t_5 = PyTuple_New(3+__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 193, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  if (__pyx_t_3) {
    __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3); __pyx_t_3 = NULL;
  }
  __Pyx_INCREF(((PyObject *)__pyx_v_self));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_self));
  PyTuple_SET_ITEM(__pyx_t_5, 0+__pyx_t_4, ((PyObject *)__pyx_v_self));
  __Pyx_INCREF(__pyx_v_fn);
  __Pyx_GIVEREF(__pyx_v_fn);
  PyTuple_SET_ITEM(__pyx_t_5, 1+__pyx_t_4, __pyx_v_fn);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_5, 2+__pyx_t_4, Py_None);
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 193, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "asynq/decorators.py":191
 * 
 * class AsyncProxyDecorator(AsyncDecorator):
 *     def __init__(self, fn):             # <<<<<<<<<<<<<<
 *         # we don't need the task class but still need to pass it to the superclass
 *         AsyncDecorator.__init__(self, fn, None)
 */

  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("asynq.decorators.AsyncProxyDecorator.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":195
 *         AsyncDecorator.__init__(self, fn, None)
 * 
 *     def _call_pure(self, args, kwargs):             # <<<<<<<<<<<<<<
 *         return self.fn(*args, **kwargs)
 * 
 */

static PyObject *__pyx_pw_5asynq_10decorators_19AsyncProxyDecorator_3_call_pure(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyObject *__pyx_f_5asynq_10decorators_19AsyncProxyDecorator__call_pure(struct __pyx_obj_5asynq_10decorators_AsyncProxyDecorator *__pyx_v_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, int __pyx_skip_dispatch) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  Py_ssize_t __pyx_t_5;
  PyObject *__pyx_t_6 = NULL;
  __Pyx_RefNannySetupContext("_call_pure", 0);
  /* Check if called by wrapper */
  if (unlikely(__pyx_skip_dispatch)) ;
  /* Check if overridden in Python */
  else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) {
    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_call_pure); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 195, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_5asynq_10decorators_19AsyncProxyDecorator_3_call_pure)) {
      __Pyx_XDECREF(__pyx_r);
      __Pyx_INCREF(__pyx_t_1);
      __pyx_t_3 = __pyx_t_1; __pyx_t_4 = NULL;
      __pyx_t_5 = 0;
      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_3))) {
        __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
        if (likely(__pyx_t_4)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
          __Pyx_INCREF(__pyx_t_4);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_3, function);
          __pyx_t_5 = 1;
        }
      }
      __pyx_t_6 = PyTuple_New(2+__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 195, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      if (__pyx_t_4) {
        __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __pyx_t_4 = NULL;
      }
      __Pyx_INCREF(__pyx_v_args);
      __Pyx_GIVEREF(__pyx_v_args);
      PyTuple_SET_ITEM(__pyx_t_6, 0+__pyx_t_5, __pyx_v_args);
      __Pyx_INCREF(__pyx_v_kwargs);
      __Pyx_GIVEREF(__pyx_v_kwargs);
      PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_5, __pyx_v_kwargs);
      __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 195, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __pyx_r = __pyx_t_2;
      __pyx_t_2 = 0;
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      goto __pyx_L0;
    }
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  }

  /* "asynq/decorators.py":196
 * 
 *     def _call_pure(self, args, kwargs):
 *         return self.fn(*args, **kwargs)             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  if (unlikely(__pyx_v_args == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
    __PYX_ERR(0, 196, __pyx_L1_error)
  }
  if (unlikely(__pyx_v_kwargs == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "argument after ** must be a mapping, not NoneType");
    __PYX_ERR(0, 196, __pyx_L1_error)
  }
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_v_self->__pyx_base.__pyx_base.__pyx_base.fn, __pyx_v_args, __pyx_v_kwargs); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 196, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "asynq/decorators.py":195
 *         AsyncDecorator.__init__(self, fn, None)
 * 
 *     def _call_pure(self, args, kwargs):             # <<<<<<<<<<<<<<
 *         return self.fn(*args, **kwargs)
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_AddTraceback("asynq.decorators.AsyncProxyDecorator._call_pure", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_19AsyncProxyDecorator_3_call_pure(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyObject *__pyx_pw_5asynq_10decorators_19AsyncProxyDecorator_3_call_pure(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_args = 0;
  PyObject *__pyx_v_kwargs = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_call_pure (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_args,&__pyx_n_s_kwargs,0};
    PyObject* values[2] = {0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_args)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_kwargs)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("_call_pure", 1, 2, 2, 1); __PYX_ERR(0, 195, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_call_pure") < 0)) __PYX_ERR(0, 195, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
    }
    __pyx_v_args = ((PyObject*)values[0]);
    __pyx_v_kwargs = ((PyObject*)values[1]);
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("_call_pure", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 195, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("asynq.decorators.AsyncProxyDecorator._call_pure", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_args), (&PyTuple_Type), 1, "args", 1))) __PYX_ERR(0, 195, __pyx_L1_error)
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_kwargs), (&PyDict_Type), 1, "kwargs", 1))) __PYX_ERR(0, 195, __pyx_L1_error)
  __pyx_r = __pyx_pf_5asynq_10decorators_19AsyncProxyDecorator_2_call_pure(((struct __pyx_obj_5asynq_10decorators_AsyncProxyDecorator *)__pyx_v_self), __pyx_v_args, __pyx_v_kwargs);

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_19AsyncProxyDecorator_2_call_pure(struct __pyx_obj_5asynq_10decorators_AsyncProxyDecorator *__pyx_v_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  __Pyx_RefNannySetupContext("_call_pure", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __pyx_f_5asynq_10decorators_19AsyncProxyDecorator__call_pure(__pyx_v_self, __pyx_v_args, __pyx_v_kwargs, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 195, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("asynq.decorators.AsyncProxyDecorator._call_pure", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":200
 * 
 * class AsyncAndSyncPairProxyDecorator(AsyncProxyDecorator):
 *     def __init__(self, fn, sync_fn):             # <<<<<<<<<<<<<<
 *         AsyncProxyDecorator.__init__(self, fn)
 *         self.sync_fn = sync_fn
 */

/* Python wrapper */
static int __pyx_pw_5asynq_10decorators_30AsyncAndSyncPairProxyDecorator_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static int __pyx_pw_5asynq_10decorators_30AsyncAndSyncPairProxyDecorator_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_fn = 0;
  PyObject *__pyx_v_sync_fn = 0;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_fn,&__pyx_n_s_sync_fn,0};
    PyObject* values[2] = {0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_fn)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_sync_fn)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, 1); __PYX_ERR(0, 200, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 200, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
    }
    __pyx_v_fn = values[0];
    __pyx_v_sync_fn = values[1];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 200, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("asynq.decorators.AsyncAndSyncPairProxyDecorator.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return -1;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5asynq_10decorators_30AsyncAndSyncPairProxyDecorator___init__(((struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairProxyDecorator *)__pyx_v_self), __pyx_v_fn, __pyx_v_sync_fn);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_5asynq_10decorators_30AsyncAndSyncPairProxyDecorator___init__(struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairProxyDecorator *__pyx_v_self, PyObject *__pyx_v_fn, PyObject *__pyx_v_sync_fn) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  Py_ssize_t __pyx_t_4;
  PyObject *__pyx_t_5 = NULL;
  __Pyx_RefNannySetupContext("__init__", 0);

  /* "asynq/decorators.py":201
 * class AsyncAndSyncPairProxyDecorator(AsyncProxyDecorator):
 *     def __init__(self, fn, sync_fn):
 *         AsyncProxyDecorator.__init__(self, fn)             # <<<<<<<<<<<<<<
 *         self.sync_fn = sync_fn
 * 
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_5asynq_10decorators_AsyncProxyDecorator), __pyx_n_s_init); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 201, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  __pyx_t_4 = 0;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
      __pyx_t_4 = 1;
    }
  }
  __pyx_t_5 = PyTuple_New(2+__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 201, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  if (__pyx_t_3) {
    __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3); __pyx_t_3 = NULL;
  }
  __Pyx_INCREF(((PyObject *)__pyx_v_self));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_self));
  PyTuple_SET_ITEM(__pyx_t_5, 0+__pyx_t_4, ((PyObject *)__pyx_v_self));
  __Pyx_INCREF(__pyx_v_fn);
  __Pyx_GIVEREF(__pyx_v_fn);
  PyTuple_SET_ITEM(__pyx_t_5, 1+__pyx_t_4, __pyx_v_fn);
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 201, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "asynq/decorators.py":202
 *     def __init__(self, fn, sync_fn):
 *         AsyncProxyDecorator.__init__(self, fn)
 *         self.sync_fn = sync_fn             # <<<<<<<<<<<<<<
 * 
 *     def __call__(self, *args, **kwargs):
 */
  if (__Pyx_PyObject_SetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_sync_fn, __pyx_v_sync_fn) < 0) __PYX_ERR(0, 202, __pyx_L1_error)

  /* "asynq/decorators.py":200
 * 
 * class AsyncAndSyncPairProxyDecorator(AsyncProxyDecorator):
 *     def __init__(self, fn, sync_fn):             # <<<<<<<<<<<<<<
 *         AsyncProxyDecorator.__init__(self, fn)
 *         self.sync_fn = sync_fn
 */

  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("asynq.decorators.AsyncAndSyncPairProxyDecorator.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":204
 *         self.sync_fn = sync_fn
 * 
 *     def __call__(self, *args, **kwargs):             # <<<<<<<<<<<<<<
 *         return self.sync_fn(*args, **kwargs)
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_30AsyncAndSyncPairProxyDecorator_3__call__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyObject *__pyx_pw_5asynq_10decorators_30AsyncAndSyncPairProxyDecorator_3__call__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_args = 0;
  PyObject *__pyx_v_kwargs = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__call__ (wrapper)", 0);
  if (unlikely(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__call__", 1))) return NULL;
  if (unlikely(__pyx_kwds)) {
    __pyx_v_kwargs = PyDict_Copy(__pyx_kwds); if (unlikely(!__pyx_v_kwargs)) return NULL;
    __Pyx_GOTREF(__pyx_v_kwargs);
  } else {
    __pyx_v_kwargs = NULL;
  }
  __Pyx_INCREF(__pyx_args);
  __pyx_v_args = __pyx_args;
  __pyx_r = __pyx_pf_5asynq_10decorators_30AsyncAndSyncPairProxyDecorator_2__call__(((struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairProxyDecorator *)__pyx_v_self), __pyx_v_args, __pyx_v_kwargs);

  /* function exit code */
  __Pyx_XDECREF(__pyx_v_args);
  __Pyx_XDECREF(__pyx_v_kwargs);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_30AsyncAndSyncPairProxyDecorator_2__call__(struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairProxyDecorator *__pyx_v_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  __Pyx_RefNannySetupContext("__call__", 0);

  /* "asynq/decorators.py":205
 * 
 *     def __call__(self, *args, **kwargs):
 *         return self.sync_fn(*args, **kwargs)             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_sync_fn); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 205, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_v_args, __pyx_v_kwargs); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 205, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* "asynq/decorators.py":204
 *         self.sync_fn = sync_fn
 * 
 *     def __call__(self, *args, **kwargs):             # <<<<<<<<<<<<<<
 *         return self.sync_fn(*args, **kwargs)
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("asynq.decorators.AsyncAndSyncPairProxyDecorator.__call__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":208
 * 
 * 
 * def async(pure=False, sync_fn=None, cls=async_task.AsyncTask, **kwargs):             # <<<<<<<<<<<<<<
 *     """Async task decorator.
 *     Converts a method returning generator object to
 */

static PyObject *__pyx_pf_5asynq_10decorators_30__defaults__(CYTHON_UNUSED PyObject *__pyx_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  __Pyx_RefNannySetupContext("__defaults__", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 208, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(((PyObject *)Py_False));
  __Pyx_GIVEREF(((PyObject *)Py_False));
  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_False));
  __Pyx_INCREF(((PyObject *)Py_None));
  __Pyx_GIVEREF(((PyObject *)Py_None));
  PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)Py_None));
  __Pyx_INCREF(__Pyx_CyFunction_Defaults(__pyx_defaults, __pyx_self)->__pyx_arg_cls);
  __Pyx_GIVEREF(__Pyx_CyFunction_Defaults(__pyx_defaults, __pyx_self)->__pyx_arg_cls);
  PyTuple_SET_ITEM(__pyx_t_1, 2, __Pyx_CyFunction_Defaults(__pyx_defaults, __pyx_self)->__pyx_arg_cls);
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 208, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_1);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  PyTuple_SET_ITEM(__pyx_t_2, 1, Py_None);
  __pyx_t_1 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("asynq.decorators.__defaults__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_13async(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_5asynq_10decorators_12async[] = "Async task decorator.\n    Converts a method returning generator object to\n    a method returning AsyncTask object.\n\n    ";
static PyMethodDef __pyx_mdef_5asynq_10decorators_13async = {"async", (PyCFunction)__pyx_pw_5asynq_10decorators_13async, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5asynq_10decorators_12async};
static PyObject *__pyx_pw_5asynq_10decorators_13async(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_pure = 0;
  PyObject *__pyx_v_sync_fn = 0;
  PyObject *__pyx_v_cls = 0;
  PyObject *__pyx_v_kwargs = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("async (wrapper)", 0);
  __pyx_v_kwargs = PyDict_New(); if (unlikely(!__pyx_v_kwargs)) return NULL;
  __Pyx_GOTREF(__pyx_v_kwargs);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pure,&__pyx_n_s_sync_fn,&__pyx_n_s_cls,0};
    PyObject* values[3] = {0,0,0};
    __pyx_defaults *__pyx_dynamic_args = __Pyx_CyFunction_Defaults(__pyx_defaults, __pyx_self);
    values[0] = ((PyObject *)((PyObject *)Py_False));
    values[1] = ((PyObject *)((PyObject *)Py_None));
    values[2] = __pyx_dynamic_args->__pyx_arg_cls;
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_pure);
          if (value) { values[0] = value; kw_args--; }
        }
        case  1:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_sync_fn);
          if (value) { values[1] = value; kw_args--; }
        }
        case  2:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_cls);
          if (value) { values[2] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, __pyx_v_kwargs, values, pos_args, "async") < 0)) __PYX_ERR(0, 208, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_pure = values[0];
    __pyx_v_sync_fn = values[1];
    __pyx_v_cls = values[2];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("async", 0, 0, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 208, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_CLEAR(__pyx_v_kwargs);
  __Pyx_AddTraceback("asynq.decorators.async", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5asynq_10decorators_12async(__pyx_self, __pyx_v_pure, __pyx_v_sync_fn, __pyx_v_cls, __pyx_v_kwargs);

  /* function exit code */
  __Pyx_XDECREF(__pyx_v_kwargs);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":219
 *         assert sync_fn is None, "sync_fn is not supported for pure async functions"
 * 
 *     def decorate(fn):             # <<<<<<<<<<<<<<
 *         assert not (is_pure_async_fn(fn) or has_async_fn(fn)), \
 *             "@async() decorator can be applied just once"
 */

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_5async_1decorate(PyObject *__pyx_self, PyObject *__pyx_v_fn); /*proto*/
static PyMethodDef __pyx_mdef_5asynq_10decorators_5async_1decorate = {"decorate", (PyCFunction)__pyx_pw_5asynq_10decorators_5async_1decorate, METH_O, 0};
static PyObject *__pyx_pw_5asynq_10decorators_5async_1decorate(PyObject *__pyx_self, PyObject *__pyx_v_fn) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("decorate (wrapper)", 0);
  __pyx_r = __pyx_pf_5asynq_10decorators_5async_decorate(__pyx_self, ((PyObject *)__pyx_v_fn));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_5async_decorate(PyObject *__pyx_self, PyObject *__pyx_v_fn) {
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_4_async *__pyx_cur_scope;
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_4_async *__pyx_outer_scope;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  int __pyx_t_3;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  PyObject *__pyx_t_7 = NULL;
  Py_ssize_t __pyx_t_8;
  PyObject *__pyx_t_9 = NULL;
  __Pyx_RefNannySetupContext("decorate", 0);
  __pyx_outer_scope = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_4_async *) __Pyx_CyFunction_GetClosure(__pyx_self);
  __pyx_cur_scope = __pyx_outer_scope;

  /* "asynq/decorators.py":220
 * 
 *     def decorate(fn):
 *         assert not (is_pure_async_fn(fn) or has_async_fn(fn)), \             # <<<<<<<<<<<<<<
 *             "@async() decorator can be applied just once"
 *         if pure:
 */
  #ifndef CYTHON_WITHOUT_ASSERTIONS
  if (unlikely(!Py_OptimizeFlag)) {
    __pyx_t_2 = __pyx_f_5asynq_10decorators_is_pure_async_fn(__pyx_v_fn, 0); if (unlikely(__pyx_t_2 == -1)) __PYX_ERR(0, 220, __pyx_L1_error)
    __pyx_t_3 = (__pyx_t_2 != 0);
    if (!__pyx_t_3) {
    } else {
      __pyx_t_1 = __pyx_t_3;
      goto __pyx_L3_bool_binop_done;
    }
    __pyx_t_3 = __pyx_f_5asynq_10decorators_has_async_fn(__pyx_v_fn, 0); if (unlikely(__pyx_t_3 == -1)) __PYX_ERR(0, 220, __pyx_L1_error)
    __pyx_t_2 = (__pyx_t_3 != 0);
    __pyx_t_1 = __pyx_t_2;
    __pyx_L3_bool_binop_done:;
    if (unlikely(!((!__pyx_t_1) != 0))) {
      PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_async_decorator_can_be_applied);
      __PYX_ERR(0, 220, __pyx_L1_error)
    }
  }
  #endif

  /* "asynq/decorators.py":222
 *         assert not (is_pure_async_fn(fn) or has_async_fn(fn)), \
 *             "@async() decorator can be applied just once"
 *         if pure:             # <<<<<<<<<<<<<<
 *             return qcore.decorators.decorate(PureAsyncDecorator, cls, kwargs)(fn)
 *         elif sync_fn is None:
 */
  if (unlikely(!__pyx_cur_scope->__pyx_v_pure)) { __Pyx_RaiseClosureNameError("pure"); __PYX_ERR(0, 222, __pyx_L1_error) }
  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_pure); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 222, __pyx_L1_error)
  if (__pyx_t_1) {

    /* "asynq/decorators.py":223
 *             "@async() decorator can be applied just once"
 *         if pure:
 *             return qcore.decorators.decorate(PureAsyncDecorator, cls, kwargs)(fn)             # <<<<<<<<<<<<<<
 *         elif sync_fn is None:
 *             return qcore.decorators.decorate(AsyncDecorator, cls)(fn)
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_qcore); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 223, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_decorators); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 223, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_decorate); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 223, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (unlikely(!__pyx_cur_scope->__pyx_v_cls)) { __Pyx_RaiseClosureNameError("cls"); __PYX_ERR(0, 223, __pyx_L1_error) }
    if (unlikely(!__pyx_cur_scope->__pyx_v_kwargs)) { __Pyx_RaiseClosureNameError("kwargs"); __PYX_ERR(0, 223, __pyx_L1_error) }
    __pyx_t_7 = NULL;
    __pyx_t_8 = 0;
    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_6))) {
      __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_6);
      if (likely(__pyx_t_7)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
        __Pyx_INCREF(__pyx_t_7);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_6, function);
        __pyx_t_8 = 1;
      }
    }
    __pyx_t_9 = PyTuple_New(3+__pyx_t_8); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 223, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
    if (__pyx_t_7) {
      __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_7); __pyx_t_7 = NULL;
    }
    __Pyx_INCREF(((PyObject *)__pyx_ptype_5asynq_10decorators_PureAsyncDecorator));
    __Pyx_GIVEREF(((PyObject *)__pyx_ptype_5asynq_10decorators_PureAsyncDecorator));
    PyTuple_SET_ITEM(__pyx_t_9, 0+__pyx_t_8, ((PyObject *)__pyx_ptype_5asynq_10decorators_PureAsyncDecorator));
    __Pyx_INCREF(__pyx_cur_scope->__pyx_v_cls);
    __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_cls);
    PyTuple_SET_ITEM(__pyx_t_9, 1+__pyx_t_8, __pyx_cur_scope->__pyx_v_cls);
    __Pyx_INCREF(__pyx_cur_scope->__pyx_v_kwargs);
    __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_kwargs);
    PyTuple_SET_ITEM(__pyx_t_9, 2+__pyx_t_8, __pyx_cur_scope->__pyx_v_kwargs);
    __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_9, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 223, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_6 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_5))) {
      __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5);
      if (likely(__pyx_t_6)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
        __Pyx_INCREF(__pyx_t_6);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_5, function);
      }
    }
    if (!__pyx_t_6) {
      __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_v_fn); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 223, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
    } else {
      __pyx_t_9 = PyTuple_New(1+1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 223, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_9);
      __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_6); __pyx_t_6 = NULL;
      __Pyx_INCREF(__pyx_v_fn);
      __Pyx_GIVEREF(__pyx_v_fn);
      PyTuple_SET_ITEM(__pyx_t_9, 0+1, __pyx_v_fn);
      __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_9, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 223, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    }
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_r = __pyx_t_4;
    __pyx_t_4 = 0;
    goto __pyx_L0;

    /* "asynq/decorators.py":222
 *         assert not (is_pure_async_fn(fn) or has_async_fn(fn)), \
 *             "@async() decorator can be applied just once"
 *         if pure:             # <<<<<<<<<<<<<<
 *             return qcore.decorators.decorate(PureAsyncDecorator, cls, kwargs)(fn)
 *         elif sync_fn is None:
 */
  }

  /* "asynq/decorators.py":224
 *         if pure:
 *             return qcore.decorators.decorate(PureAsyncDecorator, cls, kwargs)(fn)
 *         elif sync_fn is None:             # <<<<<<<<<<<<<<
 *             return qcore.decorators.decorate(AsyncDecorator, cls)(fn)
 *         else:
 */
  if (unlikely(!__pyx_cur_scope->__pyx_v_sync_fn)) { __Pyx_RaiseClosureNameError("sync_fn"); __PYX_ERR(0, 224, __pyx_L1_error) }
  __pyx_t_1 = (__pyx_cur_scope->__pyx_v_sync_fn == Py_None);
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "asynq/decorators.py":225
 *             return qcore.decorators.decorate(PureAsyncDecorator, cls, kwargs)(fn)
 *         elif sync_fn is None:
 *             return qcore.decorators.decorate(AsyncDecorator, cls)(fn)             # <<<<<<<<<<<<<<
 *         else:
 *             return qcore.decorators.decorate(AsyncAndSyncPairDecorator, cls, sync_fn)(fn)
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_9 = __Pyx_GetModuleGlobalName(__pyx_n_s_qcore); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 225, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_decorators); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 225, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_decorate); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 225, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    if (unlikely(!__pyx_cur_scope->__pyx_v_cls)) { __Pyx_RaiseClosureNameError("cls"); __PYX_ERR(0, 225, __pyx_L1_error) }
    __pyx_t_6 = NULL;
    __pyx_t_8 = 0;
    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_9))) {
      __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_9);
      if (likely(__pyx_t_6)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_9);
        __Pyx_INCREF(__pyx_t_6);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_9, function);
        __pyx_t_8 = 1;
      }
    }
    __pyx_t_7 = PyTuple_New(2+__pyx_t_8); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 225, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    if (__pyx_t_6) {
      __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_6); __pyx_t_6 = NULL;
    }
    __Pyx_INCREF(((PyObject *)__pyx_ptype_5asynq_10decorators_AsyncDecorator));
    __Pyx_GIVEREF(((PyObject *)__pyx_ptype_5asynq_10decorators_AsyncDecorator));
    PyTuple_SET_ITEM(__pyx_t_7, 0+__pyx_t_8, ((PyObject *)__pyx_ptype_5asynq_10decorators_AsyncDecorator));
    __Pyx_INCREF(__pyx_cur_scope->__pyx_v_cls);
    __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_cls);
    PyTuple_SET_ITEM(__pyx_t_7, 1+__pyx_t_8, __pyx_cur_scope->__pyx_v_cls);
    __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_9, __pyx_t_7, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 225, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __pyx_t_9 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_5))) {
      __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_5);
      if (likely(__pyx_t_9)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
        __Pyx_INCREF(__pyx_t_9);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_5, function);
      }
    }
    if (!__pyx_t_9) {
      __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_v_fn); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 225, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
    } else {
      __pyx_t_7 = PyTuple_New(1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 225, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_7);
      __Pyx_GIVEREF(__pyx_t_9); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_9); __pyx_t_9 = NULL;
      __Pyx_INCREF(__pyx_v_fn);
      __Pyx_GIVEREF(__pyx_v_fn);
      PyTuple_SET_ITEM(__pyx_t_7, 0+1, __pyx_v_fn);
      __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_7, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 225, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    }
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_r = __pyx_t_4;
    __pyx_t_4 = 0;
    goto __pyx_L0;

    /* "asynq/decorators.py":224
 *         if pure:
 *             return qcore.decorators.decorate(PureAsyncDecorator, cls, kwargs)(fn)
 *         elif sync_fn is None:             # <<<<<<<<<<<<<<
 *             return qcore.decorators.decorate(AsyncDecorator, cls)(fn)
 *         else:
 */
  }

  /* "asynq/decorators.py":227
 *             return qcore.decorators.decorate(AsyncDecorator, cls)(fn)
 *         else:
 *             return qcore.decorators.decorate(AsyncAndSyncPairDecorator, cls, sync_fn)(fn)             # <<<<<<<<<<<<<<
 * 
 *     return decorate
 */
  /*else*/ {
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_7 = __Pyx_GetModuleGlobalName(__pyx_n_s_qcore); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 227, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_decorators); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 227, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_9, __pyx_n_s_decorate); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 227, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    if (unlikely(!__pyx_cur_scope->__pyx_v_cls)) { __Pyx_RaiseClosureNameError("cls"); __PYX_ERR(0, 227, __pyx_L1_error) }
    if (unlikely(!__pyx_cur_scope->__pyx_v_sync_fn)) { __Pyx_RaiseClosureNameError("sync_fn"); __PYX_ERR(0, 227, __pyx_L1_error) }
    __pyx_t_9 = NULL;
    __pyx_t_8 = 0;
    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_7))) {
      __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_7);
      if (likely(__pyx_t_9)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7);
        __Pyx_INCREF(__pyx_t_9);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_7, function);
        __pyx_t_8 = 1;
      }
    }
    __pyx_t_6 = PyTuple_New(3+__pyx_t_8); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 227, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    if (__pyx_t_9) {
      __Pyx_GIVEREF(__pyx_t_9); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_9); __pyx_t_9 = NULL;
    }
    __Pyx_INCREF(((PyObject *)__pyx_ptype_5asynq_10decorators_AsyncAndSyncPairDecorator));
    __Pyx_GIVEREF(((PyObject *)__pyx_ptype_5asynq_10decorators_AsyncAndSyncPairDecorator));
    PyTuple_SET_ITEM(__pyx_t_6, 0+__pyx_t_8, ((PyObject *)__pyx_ptype_5asynq_10decorators_AsyncAndSyncPairDecorator));
    __Pyx_INCREF(__pyx_cur_scope->__pyx_v_cls);
    __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_cls);
    PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_8, __pyx_cur_scope->__pyx_v_cls);
    __Pyx_INCREF(__pyx_cur_scope->__pyx_v_sync_fn);
    __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_sync_fn);
    PyTuple_SET_ITEM(__pyx_t_6, 2+__pyx_t_8, __pyx_cur_scope->__pyx_v_sync_fn);
    __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_6, NULL); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 227, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __pyx_t_7 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_5))) {
      __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_5);
      if (likely(__pyx_t_7)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
        __Pyx_INCREF(__pyx_t_7);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_5, function);
      }
    }
    if (!__pyx_t_7) {
      __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_v_fn); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 227, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
    } else {
      __pyx_t_6 = PyTuple_New(1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 227, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_7); __pyx_t_7 = NULL;
      __Pyx_INCREF(__pyx_v_fn);
      __Pyx_GIVEREF(__pyx_v_fn);
      PyTuple_SET_ITEM(__pyx_t_6, 0+1, __pyx_v_fn);
      __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_6, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 227, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    }
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_r = __pyx_t_4;
    __pyx_t_4 = 0;
    goto __pyx_L0;
  }

  /* "asynq/decorators.py":219
 *         assert sync_fn is None, "sync_fn is not supported for pure async functions"
 * 
 *     def decorate(fn):             # <<<<<<<<<<<<<<
 *         assert not (is_pure_async_fn(fn) or has_async_fn(fn)), \
 *             "@async() decorator can be applied just once"
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_AddTraceback("asynq.decorators.async.decorate", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":208
 * 
 * 
 * def async(pure=False, sync_fn=None, cls=async_task.AsyncTask, **kwargs):             # <<<<<<<<<<<<<<
 *     """Async task decorator.
 *     Converts a method returning generator object to
 */

static PyObject *__pyx_pf_5asynq_10decorators_12async(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_pure, PyObject *__pyx_v_sync_fn, PyObject *__pyx_v_cls, PyObject *__pyx_v_kwargs) {
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_4_async *__pyx_cur_scope;
  PyObject *__pyx_v_decorate = 0;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  PyObject *__pyx_t_2 = NULL;
  __Pyx_RefNannySetupContext("async", 0);
  __pyx_cur_scope = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_4_async *)__pyx_tp_new_5asynq_10decorators___pyx_scope_struct_4_async(__pyx_ptype_5asynq_10decorators___pyx_scope_struct_4_async, __pyx_empty_tuple, NULL);
  if (unlikely(!__pyx_cur_scope)) {
    __Pyx_RefNannyFinishContext();
    return NULL;
  }
  __Pyx_GOTREF(__pyx_cur_scope);
  __pyx_cur_scope->__pyx_v_pure = __pyx_v_pure;
  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_pure);
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_pure);
  __pyx_cur_scope->__pyx_v_sync_fn = __pyx_v_sync_fn;
  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_sync_fn);
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_sync_fn);
  __pyx_cur_scope->__pyx_v_cls = __pyx_v_cls;
  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_cls);
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_cls);
  __pyx_cur_scope->__pyx_v_kwargs = __pyx_v_kwargs;
  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_kwargs);
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_kwargs);

  /* "asynq/decorators.py":214
 * 
 *     """
 *     if kwargs:             # <<<<<<<<<<<<<<
 *         assert pure, "custom kwargs are only supported with pure=True"
 *     if pure:
 */
  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_kwargs); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 214, __pyx_L1_error)
  if (__pyx_t_1) {

    /* "asynq/decorators.py":215
 *     """
 *     if kwargs:
 *         assert pure, "custom kwargs are only supported with pure=True"             # <<<<<<<<<<<<<<
 *     if pure:
 *         assert sync_fn is None, "sync_fn is not supported for pure async functions"
 */
    #ifndef CYTHON_WITHOUT_ASSERTIONS
    if (unlikely(!Py_OptimizeFlag)) {
      __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_pure); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 215, __pyx_L1_error)
      if (unlikely(!__pyx_t_1)) {
        PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_custom_kwargs_are_only_supported);
        __PYX_ERR(0, 215, __pyx_L1_error)
      }
    }
    #endif

    /* "asynq/decorators.py":214
 * 
 *     """
 *     if kwargs:             # <<<<<<<<<<<<<<
 *         assert pure, "custom kwargs are only supported with pure=True"
 *     if pure:
 */
  }

  /* "asynq/decorators.py":216
 *     if kwargs:
 *         assert pure, "custom kwargs are only supported with pure=True"
 *     if pure:             # <<<<<<<<<<<<<<
 *         assert sync_fn is None, "sync_fn is not supported for pure async functions"
 * 
 */
  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_pure); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 216, __pyx_L1_error)
  if (__pyx_t_1) {

    /* "asynq/decorators.py":217
 *         assert pure, "custom kwargs are only supported with pure=True"
 *     if pure:
 *         assert sync_fn is None, "sync_fn is not supported for pure async functions"             # <<<<<<<<<<<<<<
 * 
 *     def decorate(fn):
 */
    #ifndef CYTHON_WITHOUT_ASSERTIONS
    if (unlikely(!Py_OptimizeFlag)) {
      __pyx_t_1 = (__pyx_cur_scope->__pyx_v_sync_fn == Py_None);
      if (unlikely(!(__pyx_t_1 != 0))) {
        PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_sync_fn_is_not_supported_for_pur);
        __PYX_ERR(0, 217, __pyx_L1_error)
      }
    }
    #endif

    /* "asynq/decorators.py":216
 *     if kwargs:
 *         assert pure, "custom kwargs are only supported with pure=True"
 *     if pure:             # <<<<<<<<<<<<<<
 *         assert sync_fn is None, "sync_fn is not supported for pure async functions"
 * 
 */
  }

  /* "asynq/decorators.py":219
 *         assert sync_fn is None, "sync_fn is not supported for pure async functions"
 * 
 *     def decorate(fn):             # <<<<<<<<<<<<<<
 *         assert not (is_pure_async_fn(fn) or has_async_fn(fn)), \
 *             "@async() decorator can be applied just once"
 */
  __pyx_t_2 = __Pyx_CyFunction_NewEx(&__pyx_mdef_5asynq_10decorators_5async_1decorate, 0, __pyx_n_s_async_locals_decorate, ((PyObject*)__pyx_cur_scope), __pyx_n_s_asynq_decorators, __pyx_d, ((PyObject *)__pyx_codeobj__8)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 219, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_v_decorate = __pyx_t_2;
  __pyx_t_2 = 0;

  /* "asynq/decorators.py":229
 *             return qcore.decorators.decorate(AsyncAndSyncPairDecorator, cls, sync_fn)(fn)
 * 
 *     return decorate             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_decorate);
  __pyx_r = __pyx_v_decorate;
  goto __pyx_L0;

  /* "asynq/decorators.py":208
 * 
 * 
 * def async(pure=False, sync_fn=None, cls=async_task.AsyncTask, **kwargs):             # <<<<<<<<<<<<<<
 *     """Async task decorator.
 *     Converts a method returning generator object to
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("asynq.decorators.async", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_decorate);
  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":232
 * 
 * 
 * def async_proxy(pure=False, sync_fn=None):             # <<<<<<<<<<<<<<
 *     if sync_fn is not None:
 *         assert pure is False, "sync_fn=? cannot be used together with pure=True"
 */

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_15async_proxy(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_mdef_5asynq_10decorators_15async_proxy = {"async_proxy", (PyCFunction)__pyx_pw_5asynq_10decorators_15async_proxy, METH_VARARGS|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_5asynq_10decorators_15async_proxy(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_pure = 0;
  PyObject *__pyx_v_sync_fn = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("async_proxy (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pure,&__pyx_n_s_sync_fn,0};
    PyObject* values[2] = {0,0};
    values[0] = ((PyObject *)((PyObject *)Py_False));
    values[1] = ((PyObject *)((PyObject *)Py_None));
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_pure);
          if (value) { values[0] = value; kw_args--; }
        }
        case  1:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_sync_fn);
          if (value) { values[1] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "async_proxy") < 0)) __PYX_ERR(0, 232, __pyx_L3_error)
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_pure = values[0];
    __pyx_v_sync_fn = values[1];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("async_proxy", 0, 0, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 232, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("asynq.decorators.async_proxy", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5asynq_10decorators_14async_proxy(__pyx_self, __pyx_v_pure, __pyx_v_sync_fn);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":236
 *         assert pure is False, "sync_fn=? cannot be used together with pure=True"
 * 
 *     def decorate(fn):             # <<<<<<<<<<<<<<
 *         if pure:
 *             return fn
 */

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_11async_proxy_1decorate(PyObject *__pyx_self, PyObject *__pyx_v_fn); /*proto*/
static PyMethodDef __pyx_mdef_5asynq_10decorators_11async_proxy_1decorate = {"decorate", (PyCFunction)__pyx_pw_5asynq_10decorators_11async_proxy_1decorate, METH_O, 0};
static PyObject *__pyx_pw_5asynq_10decorators_11async_proxy_1decorate(PyObject *__pyx_self, PyObject *__pyx_v_fn) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("decorate (wrapper)", 0);
  __pyx_r = __pyx_pf_5asynq_10decorators_11async_proxy_decorate(__pyx_self, ((PyObject *)__pyx_v_fn));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_11async_proxy_decorate(PyObject *__pyx_self, PyObject *__pyx_v_fn) {
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_5_async_proxy *__pyx_cur_scope;
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_5_async_proxy *__pyx_outer_scope;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  PyObject *__pyx_t_7 = NULL;
  Py_ssize_t __pyx_t_8;
  __Pyx_RefNannySetupContext("decorate", 0);
  __pyx_outer_scope = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_5_async_proxy *) __Pyx_CyFunction_GetClosure(__pyx_self);
  __pyx_cur_scope = __pyx_outer_scope;

  /* "asynq/decorators.py":237
 * 
 *     def decorate(fn):
 *         if pure:             # <<<<<<<<<<<<<<
 *             return fn
 *         if sync_fn is None:
 */
  if (unlikely(!__pyx_cur_scope->__pyx_v_pure)) { __Pyx_RaiseClosureNameError("pure"); __PYX_ERR(0, 237, __pyx_L1_error) }
  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_pure); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 237, __pyx_L1_error)
  if (__pyx_t_1) {

    /* "asynq/decorators.py":238
 *     def decorate(fn):
 *         if pure:
 *             return fn             # <<<<<<<<<<<<<<
 *         if sync_fn is None:
 *             return qcore.decorators.decorate(AsyncProxyDecorator)(fn)
 */
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(__pyx_v_fn);
    __pyx_r = __pyx_v_fn;
    goto __pyx_L0;

    /* "asynq/decorators.py":237
 * 
 *     def decorate(fn):
 *         if pure:             # <<<<<<<<<<<<<<
 *             return fn
 *         if sync_fn is None:
 */
  }

  /* "asynq/decorators.py":239
 *         if pure:
 *             return fn
 *         if sync_fn is None:             # <<<<<<<<<<<<<<
 *             return qcore.decorators.decorate(AsyncProxyDecorator)(fn)
 *         else:
 */
  if (unlikely(!__pyx_cur_scope->__pyx_v_sync_fn)) { __Pyx_RaiseClosureNameError("sync_fn"); __PYX_ERR(0, 239, __pyx_L1_error) }
  __pyx_t_1 = (__pyx_cur_scope->__pyx_v_sync_fn == Py_None);
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "asynq/decorators.py":240
 *             return fn
 *         if sync_fn is None:
 *             return qcore.decorators.decorate(AsyncProxyDecorator)(fn)             # <<<<<<<<<<<<<<
 *         else:
 *             return qcore.decorators.decorate(AsyncAndSyncPairProxyDecorator, sync_fn)(fn)
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_qcore); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 240, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_decorators); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 240, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_decorate); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 240, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_6 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_5))) {
      __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5);
      if (likely(__pyx_t_6)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
        __Pyx_INCREF(__pyx_t_6);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_5, function);
      }
    }
    if (!__pyx_t_6) {
      __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_5, ((PyObject *)__pyx_ptype_5asynq_10decorators_AsyncProxyDecorator)); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 240, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
    } else {
      __pyx_t_7 = PyTuple_New(1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 240, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_7);
      __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_6); __pyx_t_6 = NULL;
      __Pyx_INCREF(((PyObject *)__pyx_ptype_5asynq_10decorators_AsyncProxyDecorator));
      __Pyx_GIVEREF(((PyObject *)__pyx_ptype_5asynq_10decorators_AsyncProxyDecorator));
      PyTuple_SET_ITEM(__pyx_t_7, 0+1, ((PyObject *)__pyx_ptype_5asynq_10decorators_AsyncProxyDecorator));
      __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_7, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 240, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    }
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_t_5 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_4))) {
      __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4);
      if (likely(__pyx_t_5)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
        __Pyx_INCREF(__pyx_t_5);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_4, function);
      }
    }
    if (!__pyx_t_5) {
      __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_v_fn); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 240, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
    } else {
      __pyx_t_7 = PyTuple_New(1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 240, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_7);
      __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_5); __pyx_t_5 = NULL;
      __Pyx_INCREF(__pyx_v_fn);
      __Pyx_GIVEREF(__pyx_v_fn);
      PyTuple_SET_ITEM(__pyx_t_7, 0+1, __pyx_v_fn);
      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_7, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 240, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    }
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;

    /* "asynq/decorators.py":239
 *         if pure:
 *             return fn
 *         if sync_fn is None:             # <<<<<<<<<<<<<<
 *             return qcore.decorators.decorate(AsyncProxyDecorator)(fn)
 *         else:
 */
  }

  /* "asynq/decorators.py":242
 *             return qcore.decorators.decorate(AsyncProxyDecorator)(fn)
 *         else:
 *             return qcore.decorators.decorate(AsyncAndSyncPairProxyDecorator, sync_fn)(fn)             # <<<<<<<<<<<<<<
 * 
 *     return decorate
 */
  /*else*/ {
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_7 = __Pyx_GetModuleGlobalName(__pyx_n_s_qcore); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 242, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_decorators); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 242, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_decorate); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 242, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    if (unlikely(!__pyx_cur_scope->__pyx_v_sync_fn)) { __Pyx_RaiseClosureNameError("sync_fn"); __PYX_ERR(0, 242, __pyx_L1_error) }
    __pyx_t_5 = NULL;
    __pyx_t_8 = 0;
    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_7))) {
      __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_7);
      if (likely(__pyx_t_5)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7);
        __Pyx_INCREF(__pyx_t_5);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_7, function);
        __pyx_t_8 = 1;
      }
    }
    __pyx_t_6 = PyTuple_New(2+__pyx_t_8); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 242, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    if (__pyx_t_5) {
      __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_5); __pyx_t_5 = NULL;
    }
    __Pyx_INCREF(((PyObject *)__pyx_ptype_5asynq_10decorators_AsyncAndSyncPairProxyDecorator));
    __Pyx_GIVEREF(((PyObject *)__pyx_ptype_5asynq_10decorators_AsyncAndSyncPairProxyDecorator));
    PyTuple_SET_ITEM(__pyx_t_6, 0+__pyx_t_8, ((PyObject *)__pyx_ptype_5asynq_10decorators_AsyncAndSyncPairProxyDecorator));
    __Pyx_INCREF(__pyx_cur_scope->__pyx_v_sync_fn);
    __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_sync_fn);
    PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_8, __pyx_cur_scope->__pyx_v_sync_fn);
    __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_6, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 242, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __pyx_t_7 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_4))) {
      __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_4);
      if (likely(__pyx_t_7)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
        __Pyx_INCREF(__pyx_t_7);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_4, function);
      }
    }
    if (!__pyx_t_7) {
      __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_v_fn); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 242, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
    } else {
      __pyx_t_6 = PyTuple_New(1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 242, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_7); __pyx_t_7 = NULL;
      __Pyx_INCREF(__pyx_v_fn);
      __Pyx_GIVEREF(__pyx_v_fn);
      PyTuple_SET_ITEM(__pyx_t_6, 0+1, __pyx_v_fn);
      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 242, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    }
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;
  }

  /* "asynq/decorators.py":236
 *         assert pure is False, "sync_fn=? cannot be used together with pure=True"
 * 
 *     def decorate(fn):             # <<<<<<<<<<<<<<
 *         if pure:
 *             return fn
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_AddTraceback("asynq.decorators.async_proxy.decorate", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":232
 * 
 * 
 * def async_proxy(pure=False, sync_fn=None):             # <<<<<<<<<<<<<<
 *     if sync_fn is not None:
 *         assert pure is False, "sync_fn=? cannot be used together with pure=True"
 */

static PyObject *__pyx_pf_5asynq_10decorators_14async_proxy(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_pure, PyObject *__pyx_v_sync_fn) {
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_5_async_proxy *__pyx_cur_scope;
  PyObject *__pyx_v_decorate = 0;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  __Pyx_RefNannySetupContext("async_proxy", 0);
  __pyx_cur_scope = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_5_async_proxy *)__pyx_tp_new_5asynq_10decorators___pyx_scope_struct_5_async_proxy(__pyx_ptype_5asynq_10decorators___pyx_scope_struct_5_async_proxy, __pyx_empty_tuple, NULL);
  if (unlikely(!__pyx_cur_scope)) {
    __Pyx_RefNannyFinishContext();
    return NULL;
  }
  __Pyx_GOTREF(__pyx_cur_scope);
  __pyx_cur_scope->__pyx_v_pure = __pyx_v_pure;
  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_pure);
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_pure);
  __pyx_cur_scope->__pyx_v_sync_fn = __pyx_v_sync_fn;
  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_sync_fn);
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_sync_fn);

  /* "asynq/decorators.py":233
 * 
 * def async_proxy(pure=False, sync_fn=None):
 *     if sync_fn is not None:             # <<<<<<<<<<<<<<
 *         assert pure is False, "sync_fn=? cannot be used together with pure=True"
 * 
 */
  __pyx_t_1 = (__pyx_cur_scope->__pyx_v_sync_fn != Py_None);
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "asynq/decorators.py":234
 * def async_proxy(pure=False, sync_fn=None):
 *     if sync_fn is not None:
 *         assert pure is False, "sync_fn=? cannot be used together with pure=True"             # <<<<<<<<<<<<<<
 * 
 *     def decorate(fn):
 */
    #ifndef CYTHON_WITHOUT_ASSERTIONS
    if (unlikely(!Py_OptimizeFlag)) {
      __pyx_t_2 = (__pyx_cur_scope->__pyx_v_pure == Py_False);
      if (unlikely(!(__pyx_t_2 != 0))) {
        PyErr_SetObject(PyExc_AssertionError, __pyx_kp_s_sync_fn_cannot_be_used_together);
        __PYX_ERR(0, 234, __pyx_L1_error)
      }
    }
    #endif

    /* "asynq/decorators.py":233
 * 
 * def async_proxy(pure=False, sync_fn=None):
 *     if sync_fn is not None:             # <<<<<<<<<<<<<<
 *         assert pure is False, "sync_fn=? cannot be used together with pure=True"
 * 
 */
  }

  /* "asynq/decorators.py":236
 *         assert pure is False, "sync_fn=? cannot be used together with pure=True"
 * 
 *     def decorate(fn):             # <<<<<<<<<<<<<<
 *         if pure:
 *             return fn
 */
  __pyx_t_3 = __Pyx_CyFunction_NewEx(&__pyx_mdef_5asynq_10decorators_11async_proxy_1decorate, 0, __pyx_n_s_async_proxy_locals_decorate, ((PyObject*)__pyx_cur_scope), __pyx_n_s_asynq_decorators, __pyx_d, ((PyObject *)__pyx_codeobj__10)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 236, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_v_decorate = __pyx_t_3;
  __pyx_t_3 = 0;

  /* "asynq/decorators.py":244
 *             return qcore.decorators.decorate(AsyncAndSyncPairProxyDecorator, sync_fn)(fn)
 * 
 *     return decorate             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_decorate);
  __pyx_r = __pyx_v_decorate;
  goto __pyx_L0;

  /* "asynq/decorators.py":232
 * 
 * 
 * def async_proxy(pure=False, sync_fn=None):             # <<<<<<<<<<<<<<
 *     if sync_fn is not None:
 *         assert pure is False, "sync_fn=? cannot be used together with pure=True"
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("asynq.decorators.async_proxy", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_decorate);
  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":247
 * 
 * 
 * def cached(cache):             # <<<<<<<<<<<<<<
 *     """Caching decorator. Caches method execution result
 *     based on its name an arguments.
 */

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_17cached(PyObject *__pyx_self, PyObject *__pyx_v_cache); /*proto*/
static char __pyx_doc_5asynq_10decorators_16cached[] = "Caching decorator. Caches method execution result\n    based on its name an arguments.\n    * Works for both async and non-async methods\n    * Result is always async method returning AsyncTask object\n    * Provides dirty(...) member allowing to dirty appropriate cache entry.\n\n    ";
static PyMethodDef __pyx_mdef_5asynq_10decorators_17cached = {"cached", (PyCFunction)__pyx_pw_5asynq_10decorators_17cached, METH_O, __pyx_doc_5asynq_10decorators_16cached};
static PyObject *__pyx_pw_5asynq_10decorators_17cached(PyObject *__pyx_self, PyObject *__pyx_v_cache) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("cached (wrapper)", 0);
  __pyx_r = __pyx_pf_5asynq_10decorators_16cached(__pyx_self, ((PyObject *)__pyx_v_cache));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":257
 *     _assert_apply_without_invocation("async", (cache,))
 * 
 *     def decorate(fn):             # <<<<<<<<<<<<<<
 *         original_fn = core_inspection.get_original_fn(fn)
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_6cached_1decorate(PyObject *__pyx_self, PyObject *__pyx_v_fn); /*proto*/
static PyMethodDef __pyx_mdef_5asynq_10decorators_6cached_1decorate = {"decorate", (PyCFunction)__pyx_pw_5asynq_10decorators_6cached_1decorate, METH_O, 0};
static PyObject *__pyx_pw_5asynq_10decorators_6cached_1decorate(PyObject *__pyx_self, PyObject *__pyx_v_fn) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("decorate (wrapper)", 0);
  __pyx_r = __pyx_pf_5asynq_10decorators_6cached_decorate(__pyx_self, ((PyObject *)__pyx_v_fn));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":261
 * 
 *         @core_inspection.wraps(fn)
 *         def new_fn(*args, **kwargs):             # <<<<<<<<<<<<<<
 *             return _cached(cache, original_fn, fn, args, kwargs)
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_6cached_8decorate_1new_fn(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_mdef_5asynq_10decorators_6cached_8decorate_1new_fn = {"new_fn", (PyCFunction)__pyx_pw_5asynq_10decorators_6cached_8decorate_1new_fn, METH_VARARGS|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_5asynq_10decorators_6cached_8decorate_1new_fn(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_args = 0;
  PyObject *__pyx_v_kwargs = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("new_fn (wrapper)", 0);
  if (unlikely(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "new_fn", 1))) return NULL;
  __pyx_v_kwargs = (__pyx_kwds) ? PyDict_Copy(__pyx_kwds) : PyDict_New(); if (unlikely(!__pyx_v_kwargs)) return NULL;
  __Pyx_GOTREF(__pyx_v_kwargs);
  __Pyx_INCREF(__pyx_args);
  __pyx_v_args = __pyx_args;
  __pyx_r = __pyx_pf_5asynq_10decorators_6cached_8decorate_new_fn(__pyx_self, __pyx_v_args, __pyx_v_kwargs);

  /* function exit code */
  __Pyx_XDECREF(__pyx_v_args);
  __Pyx_XDECREF(__pyx_v_kwargs);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_6cached_8decorate_new_fn(PyObject *__pyx_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs) {
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_7_decorate *__pyx_cur_scope;
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_7_decorate *__pyx_outer_scope;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  Py_ssize_t __pyx_t_4;
  PyObject *__pyx_t_5 = NULL;
  __Pyx_RefNannySetupContext("new_fn", 0);
  __pyx_outer_scope = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_7_decorate *) __Pyx_CyFunction_GetClosure(__pyx_self);
  __pyx_cur_scope = __pyx_outer_scope;

  /* "asynq/decorators.py":262
 *         @core_inspection.wraps(fn)
 *         def new_fn(*args, **kwargs):
 *             return _cached(cache, original_fn, fn, args, kwargs)             # <<<<<<<<<<<<<<
 * 
 *         def dirty(*args, **kwargs):
 */
  __Pyx_XDECREF(__pyx_r);
  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_cache)) { __Pyx_RaiseClosureNameError("cache"); __PYX_ERR(0, 262, __pyx_L1_error) }
  if (unlikely(!__pyx_cur_scope->__pyx_v_original_fn)) { __Pyx_RaiseClosureNameError("original_fn"); __PYX_ERR(0, 262, __pyx_L1_error) }
  if (unlikely(!__pyx_cur_scope->__pyx_v_fn)) { __Pyx_RaiseClosureNameError("fn"); __PYX_ERR(0, 262, __pyx_L1_error) }
  __Pyx_INCREF(__pyx_v_5asynq_10decorators__cached);
  __pyx_t_2 = __pyx_v_5asynq_10decorators__cached; __pyx_t_3 = NULL;
  __pyx_t_4 = 0;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
      __pyx_t_4 = 1;
    }
  }
  __pyx_t_5 = PyTuple_New(5+__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 262, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  if (__pyx_t_3) {
    __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3); __pyx_t_3 = NULL;
  }
  __Pyx_INCREF(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_cache);
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_cache);
  PyTuple_SET_ITEM(__pyx_t_5, 0+__pyx_t_4, __pyx_cur_scope->__pyx_outer_scope->__pyx_v_cache);
  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_original_fn);
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_original_fn);
  PyTuple_SET_ITEM(__pyx_t_5, 1+__pyx_t_4, __pyx_cur_scope->__pyx_v_original_fn);
  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_fn);
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_fn);
  PyTuple_SET_ITEM(__pyx_t_5, 2+__pyx_t_4, __pyx_cur_scope->__pyx_v_fn);
  __Pyx_INCREF(__pyx_v_args);
  __Pyx_GIVEREF(__pyx_v_args);
  PyTuple_SET_ITEM(__pyx_t_5, 3+__pyx_t_4, __pyx_v_args);
  __Pyx_INCREF(__pyx_v_kwargs);
  __Pyx_GIVEREF(__pyx_v_kwargs);
  PyTuple_SET_ITEM(__pyx_t_5, 4+__pyx_t_4, __pyx_v_kwargs);
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 262, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "asynq/decorators.py":261
 * 
 *         @core_inspection.wraps(fn)
 *         def new_fn(*args, **kwargs):             # <<<<<<<<<<<<<<
 *             return _cached(cache, original_fn, fn, args, kwargs)
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("asynq.decorators.cached.decorate.new_fn", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":264
 *             return _cached(cache, original_fn, fn, args, kwargs)
 * 
 *         def dirty(*args, **kwargs):             # <<<<<<<<<<<<<<
 *             key = _get_cache_key(original_fn, args, kwargs)
 *             cache.set(key, core_helpers.miss)
 */

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_6cached_8decorate_3dirty(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_mdef_5asynq_10decorators_6cached_8decorate_3dirty = {"dirty", (PyCFunction)__pyx_pw_5asynq_10decorators_6cached_8decorate_3dirty, METH_VARARGS|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_5asynq_10decorators_6cached_8decorate_3dirty(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_args = 0;
  PyObject *__pyx_v_kwargs = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("dirty (wrapper)", 0);
  if (unlikely(__pyx_kwds) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "dirty", 1))) return NULL;
  __pyx_v_kwargs = (__pyx_kwds) ? PyDict_Copy(__pyx_kwds) : PyDict_New(); if (unlikely(!__pyx_v_kwargs)) return NULL;
  __Pyx_GOTREF(__pyx_v_kwargs);
  __Pyx_INCREF(__pyx_args);
  __pyx_v_args = __pyx_args;
  __pyx_r = __pyx_pf_5asynq_10decorators_6cached_8decorate_2dirty(__pyx_self, __pyx_v_args, __pyx_v_kwargs);

  /* function exit code */
  __Pyx_XDECREF(__pyx_v_args);
  __Pyx_XDECREF(__pyx_v_kwargs);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_6cached_8decorate_2dirty(PyObject *__pyx_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs) {
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_7_decorate *__pyx_cur_scope;
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_7_decorate *__pyx_outer_scope;
  PyObject *__pyx_v_key = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  Py_ssize_t __pyx_t_4;
  PyObject *__pyx_t_5 = NULL;
  __Pyx_RefNannySetupContext("dirty", 0);
  __pyx_outer_scope = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_7_decorate *) __Pyx_CyFunction_GetClosure(__pyx_self);
  __pyx_cur_scope = __pyx_outer_scope;

  /* "asynq/decorators.py":265
 * 
 *         def dirty(*args, **kwargs):
 *             key = _get_cache_key(original_fn, args, kwargs)             # <<<<<<<<<<<<<<
 *             cache.set(key, core_helpers.miss)
 * 
 */
  if (unlikely(!__pyx_cur_scope->__pyx_v_original_fn)) { __Pyx_RaiseClosureNameError("original_fn"); __PYX_ERR(0, 265, __pyx_L1_error) }
  __pyx_t_1 = __pyx_cur_scope->__pyx_v_original_fn;
  __Pyx_INCREF(__pyx_t_1);
  __pyx_t_2 = __pyx_f_5asynq_10decorators__get_cache_key(__pyx_t_1, __pyx_v_args, __pyx_v_kwargs, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 265, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_key = __pyx_t_2;
  __pyx_t_2 = 0;

  /* "asynq/decorators.py":266
 *         def dirty(*args, **kwargs):
 *             key = _get_cache_key(original_fn, args, kwargs)
 *             cache.set(key, core_helpers.miss)             # <<<<<<<<<<<<<<
 * 
 *         new_fn.dirty = dirty
 */
  if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_cache)) { __Pyx_RaiseClosureNameError("cache"); __PYX_ERR(0, 266, __pyx_L1_error) }
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_cache, __pyx_n_s_set); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 266, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = NULL;
  __pyx_t_4 = 0;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_1))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_1);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_1, function);
      __pyx_t_4 = 1;
    }
  }
  __pyx_t_5 = PyTuple_New(2+__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 266, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  if (__pyx_t_3) {
    __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3); __pyx_t_3 = NULL;
  }
  __Pyx_INCREF(__pyx_v_key);
  __Pyx_GIVEREF(__pyx_v_key);
  PyTuple_SET_ITEM(__pyx_t_5, 0+__pyx_t_4, __pyx_v_key);
  __Pyx_INCREF(((PyObject *)__pyx_v_5qcore_7helpers_miss));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_5qcore_7helpers_miss));
  PyTuple_SET_ITEM(__pyx_t_5, 1+__pyx_t_4, ((PyObject *)__pyx_v_5qcore_7helpers_miss));
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_5, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 266, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "asynq/decorators.py":264
 *             return _cached(cache, original_fn, fn, args, kwargs)
 * 
 *         def dirty(*args, **kwargs):             # <<<<<<<<<<<<<<
 *             key = _get_cache_key(original_fn, args, kwargs)
 *             cache.set(key, core_helpers.miss)
 */

  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("asynq.decorators.cached.decorate.dirty", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_key);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":257
 *     _assert_apply_without_invocation("async", (cache,))
 * 
 *     def decorate(fn):             # <<<<<<<<<<<<<<
 *         original_fn = core_inspection.get_original_fn(fn)
 * 
 */

static PyObject *__pyx_pf_5asynq_10decorators_6cached_decorate(PyObject *__pyx_self, PyObject *__pyx_v_fn) {
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_7_decorate *__pyx_cur_scope;
  PyObject *__pyx_v_new_fn = 0;
  PyObject *__pyx_v_dirty = 0;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  __Pyx_RefNannySetupContext("decorate", 0);
  __pyx_cur_scope = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_7_decorate *)__pyx_tp_new_5asynq_10decorators___pyx_scope_struct_7_decorate(__pyx_ptype_5asynq_10decorators___pyx_scope_struct_7_decorate, __pyx_empty_tuple, NULL);
  if (unlikely(!__pyx_cur_scope)) {
    __Pyx_RefNannyFinishContext();
    return NULL;
  }
  __Pyx_GOTREF(__pyx_cur_scope);
  __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_6_cached *) __Pyx_CyFunction_GetClosure(__pyx_self);
  __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_outer_scope));
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope);
  __pyx_cur_scope->__pyx_v_fn = __pyx_v_fn;
  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_fn);
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_fn);

  /* "asynq/decorators.py":258
 * 
 *     def decorate(fn):
 *         original_fn = core_inspection.get_original_fn(fn)             # <<<<<<<<<<<<<<
 * 
 *         @core_inspection.wraps(fn)
 */
  __pyx_t_1 = __pyx_cur_scope->__pyx_v_fn;
  __Pyx_INCREF(__pyx_t_1);
  __pyx_t_2 = __pyx_f_5qcore_10inspection_get_original_fn(__pyx_t_1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 258, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_GIVEREF(__pyx_t_2);
  __pyx_cur_scope->__pyx_v_original_fn = __pyx_t_2;
  __pyx_t_2 = 0;

  /* "asynq/decorators.py":260
 *         original_fn = core_inspection.get_original_fn(fn)
 * 
 *         @core_inspection.wraps(fn)             # <<<<<<<<<<<<<<
 *         def new_fn(*args, **kwargs):
 *             return _cached(cache, original_fn, fn, args, kwargs)
 */
  __pyx_t_1 = __pyx_cur_scope->__pyx_v_fn;
  __Pyx_INCREF(__pyx_t_1);
  __pyx_t_3 = __pyx_f_5qcore_10inspection_wraps(__pyx_t_1, 0, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 260, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "asynq/decorators.py":261
 * 
 *         @core_inspection.wraps(fn)
 *         def new_fn(*args, **kwargs):             # <<<<<<<<<<<<<<
 *             return _cached(cache, original_fn, fn, args, kwargs)
 * 
 */
  __pyx_t_1 = __Pyx_CyFunction_NewEx(&__pyx_mdef_5asynq_10decorators_6cached_8decorate_1new_fn, 0, __pyx_n_s_cached_locals_decorate_locals_ne, ((PyObject*)__pyx_cur_scope), __pyx_n_s_asynq_decorators, __pyx_d, ((PyObject *)__pyx_codeobj__12)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 261, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_4 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_4)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
    }
  }
  if (!__pyx_t_4) {
    __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 260, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_GOTREF(__pyx_t_2);
  } else {
    __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 260, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); __pyx_t_4 = NULL;
    __Pyx_GIVEREF(__pyx_t_1);
    PyTuple_SET_ITEM(__pyx_t_5, 0+1, __pyx_t_1);
    __pyx_t_1 = 0;
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_5, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 260, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  }
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_v_new_fn = __pyx_t_2;
  __pyx_t_2 = 0;

  /* "asynq/decorators.py":264
 *             return _cached(cache, original_fn, fn, args, kwargs)
 * 
 *         def dirty(*args, **kwargs):             # <<<<<<<<<<<<<<
 *             key = _get_cache_key(original_fn, args, kwargs)
 *             cache.set(key, core_helpers.miss)
 */
  __pyx_t_2 = __Pyx_CyFunction_NewEx(&__pyx_mdef_5asynq_10decorators_6cached_8decorate_3dirty, 0, __pyx_n_s_cached_locals_decorate_locals_di, ((PyObject*)__pyx_cur_scope), __pyx_n_s_asynq_decorators, __pyx_d, ((PyObject *)__pyx_codeobj__14)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 264, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_v_dirty = __pyx_t_2;
  __pyx_t_2 = 0;

  /* "asynq/decorators.py":268
 *             cache.set(key, core_helpers.miss)
 * 
 *         new_fn.dirty = dirty             # <<<<<<<<<<<<<<
 *         new_fn.fn = fn
 *         new_fn.is_pure_async_fn = core_helpers.true_fn
 */
  if (__Pyx_PyObject_SetAttrStr(__pyx_v_new_fn, __pyx_n_s_dirty, __pyx_v_dirty) < 0) __PYX_ERR(0, 268, __pyx_L1_error)

  /* "asynq/decorators.py":269
 * 
 *         new_fn.dirty = dirty
 *         new_fn.fn = fn             # <<<<<<<<<<<<<<
 *         new_fn.is_pure_async_fn = core_helpers.true_fn
 * 
 */
  if (__Pyx_PyObject_SetAttrStr(__pyx_v_new_fn, __pyx_n_s_fn, __pyx_cur_scope->__pyx_v_fn) < 0) __PYX_ERR(0, 269, __pyx_L1_error)

  /* "asynq/decorators.py":270
 *         new_fn.dirty = dirty
 *         new_fn.fn = fn
 *         new_fn.is_pure_async_fn = core_helpers.true_fn             # <<<<<<<<<<<<<<
 * 
 *         return new_fn
 */
  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_core_helpers); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 270, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_true_fn); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 270, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (__Pyx_PyObject_SetAttrStr(__pyx_v_new_fn, __pyx_n_s_is_pure_async_fn, __pyx_t_3) < 0) __PYX_ERR(0, 270, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;

  /* "asynq/decorators.py":272
 *         new_fn.is_pure_async_fn = core_helpers.true_fn
 * 
 *         return new_fn             # <<<<<<<<<<<<<<
 *     return decorate
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_new_fn);
  __pyx_r = __pyx_v_new_fn;
  goto __pyx_L0;

  /* "asynq/decorators.py":257
 *     _assert_apply_without_invocation("async", (cache,))
 * 
 *     def decorate(fn):             # <<<<<<<<<<<<<<
 *         original_fn = core_inspection.get_original_fn(fn)
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("asynq.decorators.cached.decorate", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_new_fn);
  __Pyx_XDECREF(__pyx_v_dirty);
  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":247
 * 
 * 
 * def cached(cache):             # <<<<<<<<<<<<<<
 *     """Caching decorator. Caches method execution result
 *     based on its name an arguments.
 */

static PyObject *__pyx_pf_5asynq_10decorators_16cached(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_cache) {
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_6_cached *__pyx_cur_scope;
  PyObject *__pyx_v_decorate = 0;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  __Pyx_RefNannySetupContext("cached", 0);
  __pyx_cur_scope = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_6_cached *)__pyx_tp_new_5asynq_10decorators___pyx_scope_struct_6_cached(__pyx_ptype_5asynq_10decorators___pyx_scope_struct_6_cached, __pyx_empty_tuple, NULL);
  if (unlikely(!__pyx_cur_scope)) {
    __Pyx_RefNannyFinishContext();
    return NULL;
  }
  __Pyx_GOTREF(__pyx_cur_scope);
  __pyx_cur_scope->__pyx_v_cache = __pyx_v_cache;
  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_cache);
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_cache);

  /* "asynq/decorators.py":255
 * 
 *     """
 *     _assert_apply_without_invocation("async", (cache,))             # <<<<<<<<<<<<<<
 * 
 *     def decorate(fn):
 */
  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 255, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_cache);
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_cache);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_cur_scope->__pyx_v_cache);
  __pyx_t_2 = __pyx_f_5asynq_10decorators__assert_apply_without_invocation(__pyx_n_s_async, ((PyObject*)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 255, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "asynq/decorators.py":257
 *     _assert_apply_without_invocation("async", (cache,))
 * 
 *     def decorate(fn):             # <<<<<<<<<<<<<<
 *         original_fn = core_inspection.get_original_fn(fn)
 * 
 */
  __pyx_t_2 = __Pyx_CyFunction_NewEx(&__pyx_mdef_5asynq_10decorators_6cached_1decorate, 0, __pyx_n_s_cached_locals_decorate, ((PyObject*)__pyx_cur_scope), __pyx_n_s_asynq_decorators, __pyx_d, ((PyObject *)__pyx_codeobj__16)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 257, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_v_decorate = __pyx_t_2;
  __pyx_t_2 = 0;

  /* "asynq/decorators.py":273
 * 
 *         return new_fn
 *     return decorate             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_decorate);
  __pyx_r = __pyx_v_decorate;
  goto __pyx_L0;

  /* "asynq/decorators.py":247
 * 
 * 
 * def cached(cache):             # <<<<<<<<<<<<<<
 *     """Caching decorator. Caches method execution result
 *     based on its name an arguments.
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("asynq.decorators.cached", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_decorate);
  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":277
 * 
 * @async_proxy()
 * def async_call(fn, *args, **kwargs):             # <<<<<<<<<<<<<<
 *     """Use this if you are not sure if fn is async or not.
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_19async_call(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_5asynq_10decorators_18async_call[] = "Use this if you are not sure if fn is async or not.\n\n    e.g. when you are within an async function and you need to call fn but it could either be\n    async or non-async, you should write\n    val = yield async_call.async(fn, arg1, kw1=value1)\n\n    ";
static PyMethodDef __pyx_mdef_5asynq_10decorators_19async_call = {"async_call", (PyCFunction)__pyx_pw_5asynq_10decorators_19async_call, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5asynq_10decorators_18async_call};
static PyObject *__pyx_pw_5asynq_10decorators_19async_call(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_fn = 0;
  PyObject *__pyx_v_args = 0;
  PyObject *__pyx_v_kwargs = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("async_call (wrapper)", 0);
  __pyx_v_kwargs = PyDict_New(); if (unlikely(!__pyx_v_kwargs)) return NULL;
  __Pyx_GOTREF(__pyx_v_kwargs);
  if (PyTuple_GET_SIZE(__pyx_args) > 1) {
    __pyx_v_args = PyTuple_GetSlice(__pyx_args, 1, PyTuple_GET_SIZE(__pyx_args));
    if (unlikely(!__pyx_v_args)) {
      __Pyx_DECREF(__pyx_v_kwargs); __pyx_v_kwargs = 0;
      __Pyx_RefNannyFinishContext();
      return NULL;
    }
    __Pyx_GOTREF(__pyx_v_args);
  } else {
    __pyx_v_args = __pyx_empty_tuple; __Pyx_INCREF(__pyx_empty_tuple);
  }
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_fn,0};
    PyObject* values[1] = {0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        default:
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_fn)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
      }
      if (unlikely(kw_args > 0)) {
        const Py_ssize_t used_pos_args = (pos_args < 1) ? pos_args : 1;
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, __pyx_v_kwargs, values, used_pos_args, "async_call") < 0)) __PYX_ERR(0, 277, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) < 1) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
    }
    __pyx_v_fn = values[0];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("async_call", 0, 1, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 277, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_DECREF(__pyx_v_args); __pyx_v_args = 0;
  __Pyx_DECREF(__pyx_v_kwargs); __pyx_v_kwargs = 0;
  __Pyx_AddTraceback("asynq.decorators.async_call", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5asynq_10decorators_18async_call(__pyx_self, __pyx_v_fn, __pyx_v_args, __pyx_v_kwargs);

  /* function exit code */
  __Pyx_XDECREF(__pyx_v_args);
  __Pyx_XDECREF(__pyx_v_kwargs);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_18async_call(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_fn, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  __Pyx_RefNannySetupContext("async_call", 0);

  /* "asynq/decorators.py":285
 * 
 *     """
 *     if is_pure_async_fn(fn):             # <<<<<<<<<<<<<<
 *         return fn(*args, **kwargs)
 *     if is_async_fn(fn):
 */
  __pyx_t_1 = __pyx_f_5asynq_10decorators_is_pure_async_fn(__pyx_v_fn, 0); if (unlikely(__pyx_t_1 == -1)) __PYX_ERR(0, 285, __pyx_L1_error)
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "asynq/decorators.py":286
 *     """
 *     if is_pure_async_fn(fn):
 *         return fn(*args, **kwargs)             # <<<<<<<<<<<<<<
 *     if is_async_fn(fn):
 *         return fn.async(*args, **kwargs)
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_v_fn, __pyx_v_args, __pyx_v_kwargs); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 286, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;

    /* "asynq/decorators.py":285
 * 
 *     """
 *     if is_pure_async_fn(fn):             # <<<<<<<<<<<<<<
 *         return fn(*args, **kwargs)
 *     if is_async_fn(fn):
 */
  }

  /* "asynq/decorators.py":287
 *     if is_pure_async_fn(fn):
 *         return fn(*args, **kwargs)
 *     if is_async_fn(fn):             # <<<<<<<<<<<<<<
 *         return fn.async(*args, **kwargs)
 *     return futures.ConstFuture(fn(*args, **kwargs))
 */
  __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_is_async_fn); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 287, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_5 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_4))) {
    __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4);
    if (likely(__pyx_t_5)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
      __Pyx_INCREF(__pyx_t_5);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_4, function);
    }
  }
  if (!__pyx_t_5) {
    __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_v_fn); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 287, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
  } else {
    __pyx_t_6 = PyTuple_New(1+1); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 287, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_5); __pyx_t_5 = NULL;
    __Pyx_INCREF(__pyx_v_fn);
    __Pyx_GIVEREF(__pyx_v_fn);
    PyTuple_SET_ITEM(__pyx_t_6, 0+1, __pyx_v_fn);
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_6, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 287, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  }
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 287, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (__pyx_t_2) {

    /* "asynq/decorators.py":288
 *         return fn(*args, **kwargs)
 *     if is_async_fn(fn):
 *         return fn.async(*args, **kwargs)             # <<<<<<<<<<<<<<
 *     return futures.ConstFuture(fn(*args, **kwargs))
 * 
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_fn, __pyx_n_s_async); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 288, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_v_args, __pyx_v_kwargs); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 288, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_r = __pyx_t_4;
    __pyx_t_4 = 0;
    goto __pyx_L0;

    /* "asynq/decorators.py":287
 *     if is_pure_async_fn(fn):
 *         return fn(*args, **kwargs)
 *     if is_async_fn(fn):             # <<<<<<<<<<<<<<
 *         return fn.async(*args, **kwargs)
 *     return futures.ConstFuture(fn(*args, **kwargs))
 */
  }

  /* "asynq/decorators.py":289
 *     if is_async_fn(fn):
 *         return fn.async(*args, **kwargs)
 *     return futures.ConstFuture(fn(*args, **kwargs))             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_4 = __Pyx_PyObject_Call(__pyx_v_fn, __pyx_v_args, __pyx_v_kwargs); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 289, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 289, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4);
  __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_5asynq_7futures_ConstFuture), __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 289, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;

  /* "asynq/decorators.py":277
 * 
 * @async_proxy()
 * def async_call(fn, *args, **kwargs):             # <<<<<<<<<<<<<<
 *     """Use this if you are not sure if fn is async or not.
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_AddTraceback("asynq.decorators.async_call", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":296
 *     binder_cls = AsyncDecoratorBinder
 * 
 *     def __init__(self, fn, wrapper_fn, name):             # <<<<<<<<<<<<<<
 *         super(AsyncWrapper, self).__init__(fn)
 *         self.wrapper_fn = wrapper_fn
 */

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_12AsyncWrapper_1__init__(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_mdef_5asynq_10decorators_12AsyncWrapper_1__init__ = {"__init__", (PyCFunction)__pyx_pw_5asynq_10decorators_12AsyncWrapper_1__init__, METH_VARARGS|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_5asynq_10decorators_12AsyncWrapper_1__init__(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_self = 0;
  PyObject *__pyx_v_fn = 0;
  PyObject *__pyx_v_wrapper_fn = 0;
  PyObject *__pyx_v_name = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__init__ (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_self,&__pyx_n_s_fn,&__pyx_n_s_wrapper_fn,&__pyx_n_s_name,0};
    PyObject* values[4] = {0,0,0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_self)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_fn)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__init__", 1, 4, 4, 1); __PYX_ERR(0, 296, __pyx_L3_error)
        }
        case  2:
        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_wrapper_fn)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__init__", 1, 4, 4, 2); __PYX_ERR(0, 296, __pyx_L3_error)
        }
        case  3:
        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_name)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("__init__", 1, 4, 4, 3); __PYX_ERR(0, 296, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 296, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 4) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
    }
    __pyx_v_self = values[0];
    __pyx_v_fn = values[1];
    __pyx_v_wrapper_fn = values[2];
    __pyx_v_name = values[3];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__init__", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 296, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("asynq.decorators.AsyncWrapper.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5asynq_10decorators_12AsyncWrapper___init__(__pyx_self, __pyx_v_self, __pyx_v_fn, __pyx_v_wrapper_fn, __pyx_v_name);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_12AsyncWrapper___init__(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_self, PyObject *__pyx_v_fn, PyObject *__pyx_v_wrapper_fn, PyObject *__pyx_v_name) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  __Pyx_RefNannySetupContext("__init__", 0);

  /* "asynq/decorators.py":297
 * 
 *     def __init__(self, fn, wrapper_fn, name):
 *         super(AsyncWrapper, self).__init__(fn)             # <<<<<<<<<<<<<<
 *         self.wrapper_fn = wrapper_fn
 *         self.function_name = name
 */
  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_AsyncWrapper); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 297, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 297, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2);
  __Pyx_INCREF(__pyx_v_self);
  __Pyx_GIVEREF(__pyx_v_self);
  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_self);
  __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_super, __pyx_t_3, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 297, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_init); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 297, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_2)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_2);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
    }
  }
  if (!__pyx_t_2) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_v_fn); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 297, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  } else {
    __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 297, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __pyx_t_2 = NULL;
    __Pyx_INCREF(__pyx_v_fn);
    __Pyx_GIVEREF(__pyx_v_fn);
    PyTuple_SET_ITEM(__pyx_t_4, 0+1, __pyx_v_fn);
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 297, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  }
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "asynq/decorators.py":298
 *     def __init__(self, fn, wrapper_fn, name):
 *         super(AsyncWrapper, self).__init__(fn)
 *         self.wrapper_fn = wrapper_fn             # <<<<<<<<<<<<<<
 *         self.function_name = name
 * 
 */
  if (__Pyx_PyObject_SetAttrStr(__pyx_v_self, __pyx_n_s_wrapper_fn, __pyx_v_wrapper_fn) < 0) __PYX_ERR(0, 298, __pyx_L1_error)

  /* "asynq/decorators.py":299
 *         super(AsyncWrapper, self).__init__(fn)
 *         self.wrapper_fn = wrapper_fn
 *         self.function_name = name             # <<<<<<<<<<<<<<
 * 
 *     def name(self):
 */
  if (__Pyx_PyObject_SetAttrStr(__pyx_v_self, __pyx_n_s_function_name, __pyx_v_name) < 0) __PYX_ERR(0, 299, __pyx_L1_error)

  /* "asynq/decorators.py":296
 *     binder_cls = AsyncDecoratorBinder
 * 
 *     def __init__(self, fn, wrapper_fn, name):             # <<<<<<<<<<<<<<
 *         super(AsyncWrapper, self).__init__(fn)
 *         self.wrapper_fn = wrapper_fn
 */

  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("asynq.decorators.AsyncWrapper.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":301
 *         self.function_name = name
 * 
 *     def name(self):             # <<<<<<<<<<<<<<
 *         return '@%s()' % self.function_name
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_12AsyncWrapper_3name(PyObject *__pyx_self, PyObject *__pyx_v_self); /*proto*/
static PyMethodDef __pyx_mdef_5asynq_10decorators_12AsyncWrapper_3name = {"name", (PyCFunction)__pyx_pw_5asynq_10decorators_12AsyncWrapper_3name, METH_O, 0};
static PyObject *__pyx_pw_5asynq_10decorators_12AsyncWrapper_3name(PyObject *__pyx_self, PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("name (wrapper)", 0);
  __pyx_r = __pyx_pf_5asynq_10decorators_12AsyncWrapper_2name(__pyx_self, ((PyObject *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_12AsyncWrapper_2name(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  __Pyx_RefNannySetupContext("name", 0);

  /* "asynq/decorators.py":302
 * 
 *     def name(self):
 *         return '@%s()' % self.function_name             # <<<<<<<<<<<<<<
 * 
 *     def _call_async(self, args, kwargs):
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_self, __pyx_n_s_function_name); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 302, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyString_Format(__pyx_kp_s_s, __pyx_t_1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 302, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* "asynq/decorators.py":301
 *         self.function_name = name
 * 
 *     def name(self):             # <<<<<<<<<<<<<<
 *         return '@%s()' % self.function_name
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("asynq.decorators.AsyncWrapper.name", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":304
 *         return '@%s()' % self.function_name
 * 
 *     def _call_async(self, args, kwargs):             # <<<<<<<<<<<<<<
 *         return self.wrapper_fn(*args, **kwargs)
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_12AsyncWrapper_5_call_async(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_mdef_5asynq_10decorators_12AsyncWrapper_5_call_async = {"_call_async", (PyCFunction)__pyx_pw_5asynq_10decorators_12AsyncWrapper_5_call_async, METH_VARARGS|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_5asynq_10decorators_12AsyncWrapper_5_call_async(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_self = 0;
  PyObject *__pyx_v_args = 0;
  PyObject *__pyx_v_kwargs = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_call_async (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_self,&__pyx_n_s_args,&__pyx_n_s_kwargs,0};
    PyObject* values[3] = {0,0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_self)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_args)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("_call_async", 1, 3, 3, 1); __PYX_ERR(0, 304, __pyx_L3_error)
        }
        case  2:
        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_kwargs)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("_call_async", 1, 3, 3, 2); __PYX_ERR(0, 304, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_call_async") < 0)) __PYX_ERR(0, 304, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
    }
    __pyx_v_self = values[0];
    __pyx_v_args = values[1];
    __pyx_v_kwargs = values[2];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("_call_async", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 304, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("asynq.decorators.AsyncWrapper._call_async", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5asynq_10decorators_12AsyncWrapper_4_call_async(__pyx_self, __pyx_v_self, __pyx_v_args, __pyx_v_kwargs);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_12AsyncWrapper_4_call_async(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  __Pyx_RefNannySetupContext("_call_async", 0);

  /* "asynq/decorators.py":305
 * 
 *     def _call_async(self, args, kwargs):
 *         return self.wrapper_fn(*args, **kwargs)             # <<<<<<<<<<<<<<
 * 
 *     def __call__(self, *args, **kwargs):
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_self, __pyx_n_s_wrapper_fn); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 305, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PySequence_Tuple(__pyx_v_args); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 305, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  if (unlikely(__pyx_v_kwargs == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "argument after ** must be a mapping, not NoneType");
    __PYX_ERR(0, 305, __pyx_L1_error)
  }
  if (likely(PyDict_CheckExact(__pyx_v_kwargs))) {
    __pyx_t_3 = PyDict_Copy(__pyx_v_kwargs); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 305, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
  } else {
    __pyx_t_3 = PyObject_CallFunctionObjArgs((PyObject*)&PyDict_Type, __pyx_v_kwargs, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 305, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
  }
  __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 305, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;

  /* "asynq/decorators.py":304
 *         return '@%s()' % self.function_name
 * 
 *     def _call_async(self, args, kwargs):             # <<<<<<<<<<<<<<
 *         return self.wrapper_fn(*args, **kwargs)
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("asynq.decorators.AsyncWrapper._call_async", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":307
 *         return self.wrapper_fn(*args, **kwargs)
 * 
 *     def __call__(self, *args, **kwargs):             # <<<<<<<<<<<<<<
 *         return self._call_async(args, kwargs).value()
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_12AsyncWrapper_7__call__(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_mdef_5asynq_10decorators_12AsyncWrapper_7__call__ = {"__call__", (PyCFunction)__pyx_pw_5asynq_10decorators_12AsyncWrapper_7__call__, METH_VARARGS|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_5asynq_10decorators_12AsyncWrapper_7__call__(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_self = 0;
  PyObject *__pyx_v_args = 0;
  PyObject *__pyx_v_kwargs = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__call__ (wrapper)", 0);
  __pyx_v_kwargs = PyDict_New(); if (unlikely(!__pyx_v_kwargs)) return NULL;
  __Pyx_GOTREF(__pyx_v_kwargs);
  if (PyTuple_GET_SIZE(__pyx_args) > 1) {
    __pyx_v_args = PyTuple_GetSlice(__pyx_args, 1, PyTuple_GET_SIZE(__pyx_args));
    if (unlikely(!__pyx_v_args)) {
      __Pyx_DECREF(__pyx_v_kwargs); __pyx_v_kwargs = 0;
      __Pyx_RefNannyFinishContext();
      return NULL;
    }
    __Pyx_GOTREF(__pyx_v_args);
  } else {
    __pyx_v_args = __pyx_empty_tuple; __Pyx_INCREF(__pyx_empty_tuple);
  }
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_self,0};
    PyObject* values[1] = {0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        default:
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_self)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
      }
      if (unlikely(kw_args > 0)) {
        const Py_ssize_t used_pos_args = (pos_args < 1) ? pos_args : 1;
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, __pyx_v_kwargs, values, used_pos_args, "__call__") < 0)) __PYX_ERR(0, 307, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) < 1) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
    }
    __pyx_v_self = values[0];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__call__", 0, 1, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 307, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_DECREF(__pyx_v_args); __pyx_v_args = 0;
  __Pyx_DECREF(__pyx_v_kwargs); __pyx_v_kwargs = 0;
  __Pyx_AddTraceback("asynq.decorators.AsyncWrapper.__call__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5asynq_10decorators_12AsyncWrapper_6__call__(__pyx_self, __pyx_v_self, __pyx_v_args, __pyx_v_kwargs);

  /* function exit code */
  __Pyx_XDECREF(__pyx_v_args);
  __Pyx_XDECREF(__pyx_v_kwargs);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_12AsyncWrapper_6__call__(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  Py_ssize_t __pyx_t_5;
  PyObject *__pyx_t_6 = NULL;
  __Pyx_RefNannySetupContext("__call__", 0);

  /* "asynq/decorators.py":308
 * 
 *     def __call__(self, *args, **kwargs):
 *         return self._call_async(args, kwargs).value()             # <<<<<<<<<<<<<<
 * 
 *     def async(self, *args, **kwargs):
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_self, __pyx_n_s_call_async); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 308, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = NULL;
  __pyx_t_5 = 0;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_4)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
      __pyx_t_5 = 1;
    }
  }
  __pyx_t_6 = PyTuple_New(2+__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 308, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_6);
  if (__pyx_t_4) {
    __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __pyx_t_4 = NULL;
  }
  __Pyx_INCREF(__pyx_v_args);
  __Pyx_GIVEREF(__pyx_v_args);
  PyTuple_SET_ITEM(__pyx_t_6, 0+__pyx_t_5, __pyx_v_args);
  __Pyx_INCREF(__pyx_v_kwargs);
  __Pyx_GIVEREF(__pyx_v_kwargs);
  PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_5, __pyx_v_kwargs);
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 308, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_value); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 308, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_2)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_2);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
    }
  }
  if (__pyx_t_2) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 308, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  } else {
    __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 308, __pyx_L1_error)
  }
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "asynq/decorators.py":307
 *         return self.wrapper_fn(*args, **kwargs)
 * 
 *     def __call__(self, *args, **kwargs):             # <<<<<<<<<<<<<<
 *         return self._call_async(args, kwargs).value()
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_AddTraceback("asynq.decorators.AsyncWrapper.__call__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":310
 *         return self._call_async(args, kwargs).value()
 * 
 *     def async(self, *args, **kwargs):             # <<<<<<<<<<<<<<
 *         return self._call_async(args, kwargs)
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_12AsyncWrapper_9async(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_mdef_5asynq_10decorators_12AsyncWrapper_9async = {"async", (PyCFunction)__pyx_pw_5asynq_10decorators_12AsyncWrapper_9async, METH_VARARGS|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_5asynq_10decorators_12AsyncWrapper_9async(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_self = 0;
  PyObject *__pyx_v_args = 0;
  PyObject *__pyx_v_kwargs = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("async (wrapper)", 0);
  __pyx_v_kwargs = PyDict_New(); if (unlikely(!__pyx_v_kwargs)) return NULL;
  __Pyx_GOTREF(__pyx_v_kwargs);
  if (PyTuple_GET_SIZE(__pyx_args) > 1) {
    __pyx_v_args = PyTuple_GetSlice(__pyx_args, 1, PyTuple_GET_SIZE(__pyx_args));
    if (unlikely(!__pyx_v_args)) {
      __Pyx_DECREF(__pyx_v_kwargs); __pyx_v_kwargs = 0;
      __Pyx_RefNannyFinishContext();
      return NULL;
    }
    __Pyx_GOTREF(__pyx_v_args);
  } else {
    __pyx_v_args = __pyx_empty_tuple; __Pyx_INCREF(__pyx_empty_tuple);
  }
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_self,0};
    PyObject* values[1] = {0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        default:
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_self)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
      }
      if (unlikely(kw_args > 0)) {
        const Py_ssize_t used_pos_args = (pos_args < 1) ? pos_args : 1;
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, __pyx_v_kwargs, values, used_pos_args, "async") < 0)) __PYX_ERR(0, 310, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) < 1) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
    }
    __pyx_v_self = values[0];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("async", 0, 1, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 310, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_DECREF(__pyx_v_args); __pyx_v_args = 0;
  __Pyx_DECREF(__pyx_v_kwargs); __pyx_v_kwargs = 0;
  __Pyx_AddTraceback("asynq.decorators.AsyncWrapper.async", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5asynq_10decorators_12AsyncWrapper_8async(__pyx_self, __pyx_v_self, __pyx_v_args, __pyx_v_kwargs);

  /* function exit code */
  __Pyx_XDECREF(__pyx_v_args);
  __Pyx_XDECREF(__pyx_v_kwargs);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_12AsyncWrapper_8async(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_self, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  Py_ssize_t __pyx_t_4;
  PyObject *__pyx_t_5 = NULL;
  __Pyx_RefNannySetupContext("async", 0);

  /* "asynq/decorators.py":311
 * 
 *     def async(self, *args, **kwargs):
 *         return self._call_async(args, kwargs)             # <<<<<<<<<<<<<<
 * 
 *     def is_pure_async_fn(self):
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self, __pyx_n_s_call_async); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 311, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  __pyx_t_4 = 0;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
      __pyx_t_4 = 1;
    }
  }
  __pyx_t_5 = PyTuple_New(2+__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 311, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  if (__pyx_t_3) {
    __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3); __pyx_t_3 = NULL;
  }
  __Pyx_INCREF(__pyx_v_args);
  __Pyx_GIVEREF(__pyx_v_args);
  PyTuple_SET_ITEM(__pyx_t_5, 0+__pyx_t_4, __pyx_v_args);
  __Pyx_INCREF(__pyx_v_kwargs);
  __Pyx_GIVEREF(__pyx_v_kwargs);
  PyTuple_SET_ITEM(__pyx_t_5, 1+__pyx_t_4, __pyx_v_kwargs);
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 311, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "asynq/decorators.py":310
 *         return self._call_async(args, kwargs).value()
 * 
 *     def async(self, *args, **kwargs):             # <<<<<<<<<<<<<<
 *         return self._call_async(args, kwargs)
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("asynq.decorators.AsyncWrapper.async", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":313
 *         return self._call_async(args, kwargs)
 * 
 *     def is_pure_async_fn(self):             # <<<<<<<<<<<<<<
 *         return False
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_12AsyncWrapper_11is_pure_async_fn(PyObject *__pyx_self, PyObject *__pyx_v_self); /*proto*/
static PyMethodDef __pyx_mdef_5asynq_10decorators_12AsyncWrapper_11is_pure_async_fn = {"is_pure_async_fn", (PyCFunction)__pyx_pw_5asynq_10decorators_12AsyncWrapper_11is_pure_async_fn, METH_O, 0};
static PyObject *__pyx_pw_5asynq_10decorators_12AsyncWrapper_11is_pure_async_fn(PyObject *__pyx_self, PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("is_pure_async_fn (wrapper)", 0);
  __pyx_r = __pyx_pf_5asynq_10decorators_12AsyncWrapper_10is_pure_async_fn(__pyx_self, ((PyObject *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_12AsyncWrapper_10is_pure_async_fn(CYTHON_UNUSED PyObject *__pyx_self, CYTHON_UNUSED PyObject *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("is_pure_async_fn", 0);

  /* "asynq/decorators.py":314
 * 
 *     def is_pure_async_fn(self):
 *         return False             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(Py_False);
  __pyx_r = Py_False;
  goto __pyx_L0;

  /* "asynq/decorators.py":313
 *         return self._call_async(args, kwargs)
 * 
 *     def is_pure_async_fn(self):             # <<<<<<<<<<<<<<
 *         return False
 * 
 */

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":317
 * 
 * 
 * def make_async_decorator(fn, wrapper_fn, name):             # <<<<<<<<<<<<<<
 *     """For implementing decorators that wrap async functions.
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_21make_async_decorator(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_5asynq_10decorators_20make_async_decorator[] = "For implementing decorators that wrap async functions.\n\n    Arguments:\n    - fn: the function to be wrapped\n    - wrapper_fn: function used to implement the decorator. Must return a Future.\n    - name: name of the decorator (used for introspection)\n\n    ";
static PyMethodDef __pyx_mdef_5asynq_10decorators_21make_async_decorator = {"make_async_decorator", (PyCFunction)__pyx_pw_5asynq_10decorators_21make_async_decorator, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5asynq_10decorators_20make_async_decorator};
static PyObject *__pyx_pw_5asynq_10decorators_21make_async_decorator(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_fn = 0;
  PyObject *__pyx_v_wrapper_fn = 0;
  PyObject *__pyx_v_name = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("make_async_decorator (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_fn,&__pyx_n_s_wrapper_fn,&__pyx_n_s_name,0};
    PyObject* values[3] = {0,0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_fn)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_wrapper_fn)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("make_async_decorator", 1, 3, 3, 1); __PYX_ERR(0, 317, __pyx_L3_error)
        }
        case  2:
        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_name)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("make_async_decorator", 1, 3, 3, 2); __PYX_ERR(0, 317, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "make_async_decorator") < 0)) __PYX_ERR(0, 317, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
    }
    __pyx_v_fn = values[0];
    __pyx_v_wrapper_fn = values[1];
    __pyx_v_name = values[2];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("make_async_decorator", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 317, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("asynq.decorators.make_async_decorator", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5asynq_10decorators_20make_async_decorator(__pyx_self, __pyx_v_fn, __pyx_v_wrapper_fn, __pyx_v_name);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_20make_async_decorator(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_fn, PyObject *__pyx_v_wrapper_fn, PyObject *__pyx_v_name) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  Py_ssize_t __pyx_t_6;
  PyObject *__pyx_t_7 = NULL;
  __Pyx_RefNannySetupContext("make_async_decorator", 0);

  /* "asynq/decorators.py":326
 * 
 *     """
 *     return qcore.decorators.decorate(             # <<<<<<<<<<<<<<
 *         AsyncWrapper,
 *         wrapper_fn,
 */
  __Pyx_XDECREF(__pyx_r);

  /* "asynq/decorators.py":330
 *         wrapper_fn,
 *         name,
 *     )(fn)             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_qcore); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 326, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);

  /* "asynq/decorators.py":326
 * 
 *     """
 *     return qcore.decorators.decorate(             # <<<<<<<<<<<<<<
 *         AsyncWrapper,
 *         wrapper_fn,
 */
  __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_decorators); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 326, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_decorate); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 326, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;

  /* "asynq/decorators.py":327
 *     """
 *     return qcore.decorators.decorate(
 *         AsyncWrapper,             # <<<<<<<<<<<<<<
 *         wrapper_fn,
 *         name,
 */
  __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_AsyncWrapper); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 327, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_4);

  /* "asynq/decorators.py":329
 *         AsyncWrapper,
 *         wrapper_fn,
 *         name,             # <<<<<<<<<<<<<<
 *     )(fn)
 * 
 */
  __pyx_t_5 = NULL;
  __pyx_t_6 = 0;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_5)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_5);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
      __pyx_t_6 = 1;
    }
  }
  __pyx_t_7 = PyTuple_New(3+__pyx_t_6); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 326, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_7);
  if (__pyx_t_5) {
    __Pyx_GIVEREF(__pyx_t_5); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_5); __pyx_t_5 = NULL;
  }
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_7, 0+__pyx_t_6, __pyx_t_4);
  __Pyx_INCREF(__pyx_v_wrapper_fn);
  __Pyx_GIVEREF(__pyx_v_wrapper_fn);
  PyTuple_SET_ITEM(__pyx_t_7, 1+__pyx_t_6, __pyx_v_wrapper_fn);
  __Pyx_INCREF(__pyx_v_name);
  __Pyx_GIVEREF(__pyx_v_name);
  PyTuple_SET_ITEM(__pyx_t_7, 2+__pyx_t_6, __pyx_v_name);
  __pyx_t_4 = 0;
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_7, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 326, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;

  /* "asynq/decorators.py":330
 *         wrapper_fn,
 *         name,
 *     )(fn)             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __pyx_t_3 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  if (!__pyx_t_3) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_fn); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 330, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  } else {
    __pyx_t_7 = PyTuple_New(1+1); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 330, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_3); __pyx_t_3 = NULL;
    __Pyx_INCREF(__pyx_v_fn);
    __Pyx_GIVEREF(__pyx_v_fn);
    PyTuple_SET_ITEM(__pyx_t_7, 0+1, __pyx_v_fn);
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_7, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 330, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "asynq/decorators.py":317
 * 
 * 
 * def make_async_decorator(fn, wrapper_fn, name):             # <<<<<<<<<<<<<<
 *     """For implementing decorators that wrap async functions.
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_AddTraceback("asynq.decorators.make_async_decorator", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":335
 * # Private part
 * 
 * def _assert_apply_without_invocation(decorator, task_args, task_kwargs={}):             # <<<<<<<<<<<<<<
 *     if not task_kwargs and len(task_args) == 1:
 *         assert not isinstance(task_args[0], FunctionType), "you must use @%s(...) instead of @%s" % (decorator, decorator)
 */

static PyObject *__pyx_f_5asynq_10decorators__assert_apply_without_invocation(PyObject *__pyx_v_decorator, PyObject *__pyx_v_task_args, struct __pyx_opt_args_5asynq_10decorators__assert_apply_without_invocation *__pyx_optional_args) {
  PyObject *__pyx_v_task_kwargs = __pyx_k__17;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  int __pyx_t_3;
  Py_ssize_t __pyx_t_4;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  __Pyx_RefNannySetupContext("_assert_apply_without_invocation", 0);
  if (__pyx_optional_args) {
    if (__pyx_optional_args->__pyx_n > 0) {
      __pyx_v_task_kwargs = __pyx_optional_args->task_kwargs;
    }
  }

  /* "asynq/decorators.py":336
 * 
 * def _assert_apply_without_invocation(decorator, task_args, task_kwargs={}):
 *     if not task_kwargs and len(task_args) == 1:             # <<<<<<<<<<<<<<
 *         assert not isinstance(task_args[0], FunctionType), "you must use @%s(...) instead of @%s" % (decorator, decorator)
 * 
 */
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_task_kwargs); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 336, __pyx_L1_error)
  __pyx_t_3 = ((!__pyx_t_2) != 0);
  if (__pyx_t_3) {
  } else {
    __pyx_t_1 = __pyx_t_3;
    goto __pyx_L4_bool_binop_done;
  }
  if (unlikely(__pyx_v_task_args == Py_None)) {
    PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
    __PYX_ERR(0, 336, __pyx_L1_error)
  }
  __pyx_t_4 = PyTuple_GET_SIZE(__pyx_v_task_args); if (unlikely(__pyx_t_4 == -1)) __PYX_ERR(0, 336, __pyx_L1_error)
  __pyx_t_3 = ((__pyx_t_4 == 1) != 0);
  __pyx_t_1 = __pyx_t_3;
  __pyx_L4_bool_binop_done:;
  if (__pyx_t_1) {

    /* "asynq/decorators.py":337
 * def _assert_apply_without_invocation(decorator, task_args, task_kwargs={}):
 *     if not task_kwargs and len(task_args) == 1:
 *         assert not isinstance(task_args[0], FunctionType), "you must use @%s(...) instead of @%s" % (decorator, decorator)             # <<<<<<<<<<<<<<
 * 
 * 
 */
    #ifndef CYTHON_WITHOUT_ASSERTIONS
    if (unlikely(!Py_OptimizeFlag)) {
      if (unlikely(__pyx_v_task_args == Py_None)) {
        PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
        __PYX_ERR(0, 337, __pyx_L1_error)
      }
      __pyx_t_5 = __Pyx_GetItemInt_Tuple(__pyx_v_task_args, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 337, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_5);
      __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_FunctionType); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 337, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_6);
      __pyx_t_1 = PyObject_IsInstance(__pyx_t_5, __pyx_t_6); if (unlikely(__pyx_t_1 == -1)) __PYX_ERR(0, 337, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      if (unlikely(!((!(__pyx_t_1 != 0)) != 0))) {
        __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 337, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_6);
        __Pyx_INCREF(__pyx_v_decorator);
        __Pyx_GIVEREF(__pyx_v_decorator);
        PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_decorator);
        __Pyx_INCREF(__pyx_v_decorator);
        __Pyx_GIVEREF(__pyx_v_decorator);
        PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_v_decorator);
        __pyx_t_5 = __Pyx_PyString_Format(__pyx_kp_s_you_must_use_s_instead_of_s, __pyx_t_6); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 337, __pyx_L1_error)
        __Pyx_GOTREF(__pyx_t_5);
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        PyErr_SetObject(PyExc_AssertionError, __pyx_t_5);
        __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
        __PYX_ERR(0, 337, __pyx_L1_error)
      }
    }
    #endif

    /* "asynq/decorators.py":336
 * 
 * def _assert_apply_without_invocation(decorator, task_args, task_kwargs={}):
 *     if not task_kwargs and len(task_args) == 1:             # <<<<<<<<<<<<<<
 *         assert not isinstance(task_args[0], FunctionType), "you must use @%s(...) instead of @%s" % (decorator, decorator)
 * 
 */
  }

  /* "asynq/decorators.py":335
 * # Private part
 * 
 * def _assert_apply_without_invocation(decorator, task_args, task_kwargs={}):             # <<<<<<<<<<<<<<
 *     if not task_kwargs and len(task_args) == 1:
 *         assert not isinstance(task_args[0], FunctionType), "you must use @%s(...) instead of @%s" % (decorator, decorator)
 */

  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_AddTraceback("asynq.decorators._assert_apply_without_invocation", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
static PyObject *__pyx_gb_5asynq_10decorators_24generator1(__pyx_CoroutineObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */

/* "asynq/decorators.py":340
 * 
 * 
 * def _cached_impl(cache, original_fn, fn, args, kwargs):             # <<<<<<<<<<<<<<
 *     """Internal async method used by @cached decorator.
 *     Implements cache check/update in async fashion.
 */

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_23_cached_impl(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_5asynq_10decorators_22_cached_impl[] = "Internal async method used by @cached decorator.\n    Implements cache check/update in async fashion.\n\n    ";
static PyMethodDef __pyx_mdef_5asynq_10decorators_23_cached_impl = {"_cached_impl", (PyCFunction)__pyx_pw_5asynq_10decorators_23_cached_impl, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5asynq_10decorators_22_cached_impl};
static PyObject *__pyx_pw_5asynq_10decorators_23_cached_impl(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_cache = 0;
  PyObject *__pyx_v_original_fn = 0;
  PyObject *__pyx_v_fn = 0;
  PyObject *__pyx_v_args = 0;
  PyObject *__pyx_v_kwargs = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_cached_impl (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_cache,&__pyx_n_s_original_fn,&__pyx_n_s_fn,&__pyx_n_s_args,&__pyx_n_s_kwargs,0};
    PyObject* values[5] = {0,0,0,0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_cache)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_original_fn)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("_cached_impl", 1, 5, 5, 1); __PYX_ERR(0, 340, __pyx_L3_error)
        }
        case  2:
        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_fn)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("_cached_impl", 1, 5, 5, 2); __PYX_ERR(0, 340, __pyx_L3_error)
        }
        case  3:
        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_args)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("_cached_impl", 1, 5, 5, 3); __PYX_ERR(0, 340, __pyx_L3_error)
        }
        case  4:
        if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_kwargs)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("_cached_impl", 1, 5, 5, 4); __PYX_ERR(0, 340, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_cached_impl") < 0)) __PYX_ERR(0, 340, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 5) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
      values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
    }
    __pyx_v_cache = values[0];
    __pyx_v_original_fn = values[1];
    __pyx_v_fn = values[2];
    __pyx_v_args = values[3];
    __pyx_v_kwargs = values[4];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("_cached_impl", 1, 5, 5, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 340, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("asynq.decorators._cached_impl", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5asynq_10decorators_22_cached_impl(__pyx_self, __pyx_v_cache, __pyx_v_original_fn, __pyx_v_fn, __pyx_v_args, __pyx_v_kwargs);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_22_cached_impl(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_cache, PyObject *__pyx_v_original_fn, PyObject *__pyx_v_fn, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs) {
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_8__cached_impl *__pyx_cur_scope;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_cached_impl", 0);
  __pyx_cur_scope = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_8__cached_impl *)__pyx_tp_new_5asynq_10decorators___pyx_scope_struct_8__cached_impl(__pyx_ptype_5asynq_10decorators___pyx_scope_struct_8__cached_impl, __pyx_empty_tuple, NULL);
  if (unlikely(!__pyx_cur_scope)) {
    __Pyx_RefNannyFinishContext();
    return NULL;
  }
  __Pyx_GOTREF(__pyx_cur_scope);
  __pyx_cur_scope->__pyx_v_cache = __pyx_v_cache;
  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_cache);
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_cache);
  __pyx_cur_scope->__pyx_v_original_fn = __pyx_v_original_fn;
  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_original_fn);
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_original_fn);
  __pyx_cur_scope->__pyx_v_fn = __pyx_v_fn;
  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_fn);
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_fn);
  __pyx_cur_scope->__pyx_v_args = __pyx_v_args;
  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_args);
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_args);
  __pyx_cur_scope->__pyx_v_kwargs = __pyx_v_kwargs;
  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_kwargs);
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_kwargs);
  {
    __pyx_CoroutineObject *gen = __Pyx_Generator_New((__pyx_coroutine_body_t) __pyx_gb_5asynq_10decorators_24generator1, (PyObject *) __pyx_cur_scope, __pyx_n_s_cached_impl, __pyx_n_s_cached_impl); if (unlikely(!gen)) __PYX_ERR(0, 340, __pyx_L1_error)
    __Pyx_DECREF(__pyx_cur_scope);
    __Pyx_RefNannyFinishContext();
    return (PyObject *) gen;
  }

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_AddTraceback("asynq.decorators._cached_impl", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_gb_5asynq_10decorators_24generator1(__pyx_CoroutineObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
{
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_8__cached_impl *__pyx_cur_scope = ((struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_8__cached_impl *)__pyx_generator->closure);
  PyObject *__pyx_r = NULL;
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  int __pyx_t_5;
  int __pyx_t_6;
  Py_ssize_t __pyx_t_7;
  PyObject *__pyx_t_8 = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("None", 0);
  switch (__pyx_generator->resume_label) {
    case 0: goto __pyx_L3_first_run;
    case 1: goto __pyx_L4_resume_from_yield;
    case 2: goto __pyx_L7_resume_from_yield;
    default: /* CPython raises the right error here */
    __Pyx_RefNannyFinishContext();
    return NULL;
  }
  __pyx_L3_first_run:;
  if (unlikely(!__pyx_sent_value)) __PYX_ERR(0, 340, __pyx_L1_error)

  /* "asynq/decorators.py":345
 * 
 *     """
 *     key = _get_cache_key(original_fn, args, kwargs)             # <<<<<<<<<<<<<<
 *     cached = yield cache.get(key)
 *     if cached is not core_helpers.miss:
 */
  if (!(likely(PyTuple_CheckExact(__pyx_cur_scope->__pyx_v_args))||((__pyx_cur_scope->__pyx_v_args) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_cur_scope->__pyx_v_args)->tp_name), 0))) __PYX_ERR(0, 345, __pyx_L1_error)
  if (!(likely(PyDict_CheckExact(__pyx_cur_scope->__pyx_v_kwargs))||((__pyx_cur_scope->__pyx_v_kwargs) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "dict", Py_TYPE(__pyx_cur_scope->__pyx_v_kwargs)->tp_name), 0))) __PYX_ERR(0, 345, __pyx_L1_error)
  __pyx_t_1 = __pyx_f_5asynq_10decorators__get_cache_key(__pyx_cur_scope->__pyx_v_original_fn, ((PyObject*)__pyx_cur_scope->__pyx_v_args), ((PyObject*)__pyx_cur_scope->__pyx_v_kwargs), 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 345, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_1);
  __pyx_cur_scope->__pyx_v_key = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "asynq/decorators.py":346
 *     """
 *     key = _get_cache_key(original_fn, args, kwargs)
 *     cached = yield cache.get(key)             # <<<<<<<<<<<<<<
 *     if cached is not core_helpers.miss:
 *         raise async_task.AsyncTaskResult(cached); return
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_cache, __pyx_n_s_get_2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 346, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  if (!__pyx_t_3) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_cur_scope->__pyx_v_key); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 346, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
  } else {
    __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 346, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); __pyx_t_3 = NULL;
    __Pyx_INCREF(__pyx_cur_scope->__pyx_v_key);
    __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_key);
    PyTuple_SET_ITEM(__pyx_t_4, 0+1, __pyx_cur_scope->__pyx_v_key);
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 346, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  /* return from generator, yielding value */
  __pyx_generator->resume_label = 1;
  return __pyx_r;
  __pyx_L4_resume_from_yield:;
  if (unlikely(!__pyx_sent_value)) __PYX_ERR(0, 346, __pyx_L1_error)
  __pyx_t_1 = __pyx_sent_value; __Pyx_INCREF(__pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_1);
  __pyx_cur_scope->__pyx_v_cached = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "asynq/decorators.py":347
 *     key = _get_cache_key(original_fn, args, kwargs)
 *     cached = yield cache.get(key)
 *     if cached is not core_helpers.miss:             # <<<<<<<<<<<<<<
 *         raise async_task.AsyncTaskResult(cached); return
 *     else:
 */
  __pyx_t_5 = (__pyx_cur_scope->__pyx_v_cached != ((PyObject *)__pyx_v_5qcore_7helpers_miss));
  __pyx_t_6 = (__pyx_t_5 != 0);
  if (__pyx_t_6) {

    /* "asynq/decorators.py":348
 *     cached = yield cache.get(key)
 *     if cached is not core_helpers.miss:
 *         raise async_task.AsyncTaskResult(cached); return             # <<<<<<<<<<<<<<
 *     else:
 *         result = fn(*args, **kwargs)
 */
    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_async_task); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 348, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_AsyncTaskResult); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 348, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_2 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_4))) {
      __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_4);
      if (likely(__pyx_t_2)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
        __Pyx_INCREF(__pyx_t_2);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_4, function);
      }
    }
    if (!__pyx_t_2) {
      __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_cur_scope->__pyx_v_cached); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 348, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
    } else {
      __pyx_t_3 = PyTuple_New(1+1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 348, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2); __pyx_t_2 = NULL;
      __Pyx_INCREF(__pyx_cur_scope->__pyx_v_cached);
      __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_cached);
      PyTuple_SET_ITEM(__pyx_t_3, 0+1, __pyx_cur_scope->__pyx_v_cached);
      __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_3, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 348, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    }
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __PYX_ERR(0, 348, __pyx_L1_error)

    /* "asynq/decorators.py":347
 *     key = _get_cache_key(original_fn, args, kwargs)
 *     cached = yield cache.get(key)
 *     if cached is not core_helpers.miss:             # <<<<<<<<<<<<<<
 *         raise async_task.AsyncTaskResult(cached); return
 *     else:
 */
  }

  /* "asynq/decorators.py":350
 *         raise async_task.AsyncTaskResult(cached); return
 *     else:
 *         result = fn(*args, **kwargs)             # <<<<<<<<<<<<<<
 *         if isinstance(result, futures.FutureBase):
 *             result = yield result
 */
  /*else*/ {
    __pyx_t_1 = PySequence_Tuple(__pyx_cur_scope->__pyx_v_args); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 350, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    if (unlikely(__pyx_cur_scope->__pyx_v_kwargs == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "argument after ** must be a mapping, not NoneType");
      __PYX_ERR(0, 350, __pyx_L1_error)
    }
    if (likely(PyDict_CheckExact(__pyx_cur_scope->__pyx_v_kwargs))) {
      __pyx_t_4 = PyDict_Copy(__pyx_cur_scope->__pyx_v_kwargs); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 350, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
    } else {
      __pyx_t_4 = PyObject_CallFunctionObjArgs((PyObject*)&PyDict_Type, __pyx_cur_scope->__pyx_v_kwargs, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 350, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_4);
    }
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_cur_scope->__pyx_v_fn, __pyx_t_1, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 350, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_GIVEREF(__pyx_t_3);
    __pyx_cur_scope->__pyx_v_result = __pyx_t_3;
    __pyx_t_3 = 0;

    /* "asynq/decorators.py":351
 *     else:
 *         result = fn(*args, **kwargs)
 *         if isinstance(result, futures.FutureBase):             # <<<<<<<<<<<<<<
 *             result = yield result
 *         _cache_set(cache, key, result).start()
 */
    __pyx_t_6 = __Pyx_TypeCheck(__pyx_cur_scope->__pyx_v_result, __pyx_ptype_5asynq_7futures_FutureBase); 
    __pyx_t_5 = (__pyx_t_6 != 0);
    if (__pyx_t_5) {

      /* "asynq/decorators.py":352
 *         result = fn(*args, **kwargs)
 *         if isinstance(result, futures.FutureBase):
 *             result = yield result             # <<<<<<<<<<<<<<
 *         _cache_set(cache, key, result).start()
 *         raise async_task.AsyncTaskResult(result); return
 */
      __Pyx_INCREF(__pyx_cur_scope->__pyx_v_result);
      __pyx_r = __pyx_cur_scope->__pyx_v_result;
      __Pyx_XGIVEREF(__pyx_r);
      __Pyx_RefNannyFinishContext();
      /* return from generator, yielding value */
      __pyx_generator->resume_label = 2;
      return __pyx_r;
      __pyx_L7_resume_from_yield:;
      if (unlikely(!__pyx_sent_value)) __PYX_ERR(0, 352, __pyx_L1_error)
      __pyx_t_3 = __pyx_sent_value; __Pyx_INCREF(__pyx_t_3);
      __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_result);
      __Pyx_DECREF_SET(__pyx_cur_scope->__pyx_v_result, __pyx_t_3);
      __Pyx_GIVEREF(__pyx_t_3);
      __pyx_t_3 = 0;

      /* "asynq/decorators.py":351
 *     else:
 *         result = fn(*args, **kwargs)
 *         if isinstance(result, futures.FutureBase):             # <<<<<<<<<<<<<<
 *             result = yield result
 *         _cache_set(cache, key, result).start()
 */
    }

    /* "asynq/decorators.py":353
 *         if isinstance(result, futures.FutureBase):
 *             result = yield result
 *         _cache_set(cache, key, result).start()             # <<<<<<<<<<<<<<
 *         raise async_task.AsyncTaskResult(result); return
 * 
 */
    __Pyx_INCREF(__pyx_v_5asynq_10decorators__cache_set);
    __pyx_t_1 = __pyx_v_5asynq_10decorators__cache_set; __pyx_t_2 = NULL;
    __pyx_t_7 = 0;
    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_1))) {
      __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_1);
      if (likely(__pyx_t_2)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
        __Pyx_INCREF(__pyx_t_2);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_1, function);
        __pyx_t_7 = 1;
      }
    }
    __pyx_t_8 = PyTuple_New(3+__pyx_t_7); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 353, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_8);
    if (__pyx_t_2) {
      __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_2); __pyx_t_2 = NULL;
    }
    __Pyx_INCREF(__pyx_cur_scope->__pyx_v_cache);
    __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_cache);
    PyTuple_SET_ITEM(__pyx_t_8, 0+__pyx_t_7, __pyx_cur_scope->__pyx_v_cache);
    __Pyx_INCREF(__pyx_cur_scope->__pyx_v_key);
    __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_key);
    PyTuple_SET_ITEM(__pyx_t_8, 1+__pyx_t_7, __pyx_cur_scope->__pyx_v_key);
    __Pyx_INCREF(__pyx_cur_scope->__pyx_v_result);
    __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_result);
    PyTuple_SET_ITEM(__pyx_t_8, 2+__pyx_t_7, __pyx_cur_scope->__pyx_v_result);
    __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_8, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 353, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_start); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 353, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_4 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_1))) {
      __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_1);
      if (likely(__pyx_t_4)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
        __Pyx_INCREF(__pyx_t_4);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_1, function);
      }
    }
    if (__pyx_t_4) {
      __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 353, __pyx_L1_error)
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    } else {
      __pyx_t_3 = __Pyx_PyObject_CallNoArg(__pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 353, __pyx_L1_error)
    }
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;

    /* "asynq/decorators.py":354
 *             result = yield result
 *         _cache_set(cache, key, result).start()
 *         raise async_task.AsyncTaskResult(result); return             # <<<<<<<<<<<<<<
 * 
 * # Applying decorator by this way to make it work with Cython
 */
    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_async_task); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 354, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_AsyncTaskResult); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 354, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_1 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_4))) {
      __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_4);
      if (likely(__pyx_t_1)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
        __Pyx_INCREF(__pyx_t_1);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_4, function);
      }
    }
    if (!__pyx_t_1) {
      __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_cur_scope->__pyx_v_result); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 354, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
    } else {
      __pyx_t_8 = PyTuple_New(1+1); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 354, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_8);
      __Pyx_GIVEREF(__pyx_t_1); PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_1); __pyx_t_1 = NULL;
      __Pyx_INCREF(__pyx_cur_scope->__pyx_v_result);
      __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_result);
      PyTuple_SET_ITEM(__pyx_t_8, 0+1, __pyx_cur_scope->__pyx_v_result);
      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_8, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 354, __pyx_L1_error)
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    }
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __PYX_ERR(0, 354, __pyx_L1_error)
  }

  /* "asynq/decorators.py":340
 * 
 * 
 * def _cached_impl(cache, original_fn, fn, args, kwargs):             # <<<<<<<<<<<<<<
 *     """Internal async method used by @cached decorator.
 *     Implements cache check/update in async fashion.
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_AddTraceback("_cached_impl", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
  __pyx_generator->resume_label = -1;
  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
static PyObject *__pyx_gb_5asynq_10decorators_27generator2(__pyx_CoroutineObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */

/* "asynq/decorators.py":361
 * 
 * 
 * def _cache_set_impl(cache, key, value):             # <<<<<<<<<<<<<<
 *     yield cache.set(key, value)
 *     raise StopIteration()
 */

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_26_cache_set_impl(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_mdef_5asynq_10decorators_26_cache_set_impl = {"_cache_set_impl", (PyCFunction)__pyx_pw_5asynq_10decorators_26_cache_set_impl, METH_VARARGS|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_5asynq_10decorators_26_cache_set_impl(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_cache = 0;
  PyObject *__pyx_v_key = 0;
  PyObject *__pyx_v_value = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_cache_set_impl (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_cache,&__pyx_n_s_key,&__pyx_n_s_value,0};
    PyObject* values[3] = {0,0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_cache)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_key)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("_cache_set_impl", 1, 3, 3, 1); __PYX_ERR(0, 361, __pyx_L3_error)
        }
        case  2:
        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_value)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("_cache_set_impl", 1, 3, 3, 2); __PYX_ERR(0, 361, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_cache_set_impl") < 0)) __PYX_ERR(0, 361, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
    }
    __pyx_v_cache = values[0];
    __pyx_v_key = values[1];
    __pyx_v_value = values[2];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("_cache_set_impl", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 361, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("asynq.decorators._cache_set_impl", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_5asynq_10decorators_25_cache_set_impl(__pyx_self, __pyx_v_cache, __pyx_v_key, __pyx_v_value);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_25_cache_set_impl(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_cache, PyObject *__pyx_v_key, PyObject *__pyx_v_value) {
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl *__pyx_cur_scope;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_cache_set_impl", 0);
  __pyx_cur_scope = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl *)__pyx_tp_new_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl(__pyx_ptype_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl, __pyx_empty_tuple, NULL);
  if (unlikely(!__pyx_cur_scope)) {
    __Pyx_RefNannyFinishContext();
    return NULL;
  }
  __Pyx_GOTREF(__pyx_cur_scope);
  __pyx_cur_scope->__pyx_v_cache = __pyx_v_cache;
  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_cache);
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_cache);
  __pyx_cur_scope->__pyx_v_key = __pyx_v_key;
  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_key);
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_key);
  __pyx_cur_scope->__pyx_v_value = __pyx_v_value;
  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_value);
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_value);
  {
    __pyx_CoroutineObject *gen = __Pyx_Generator_New((__pyx_coroutine_body_t) __pyx_gb_5asynq_10decorators_27generator2, (PyObject *) __pyx_cur_scope, __pyx_n_s_cache_set_impl, __pyx_n_s_cache_set_impl); if (unlikely(!gen)) __PYX_ERR(0, 361, __pyx_L1_error)
    __Pyx_DECREF(__pyx_cur_scope);
    __Pyx_RefNannyFinishContext();
    return (PyObject *) gen;
  }

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_AddTraceback("asynq.decorators._cache_set_impl", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_gb_5asynq_10decorators_27generator2(__pyx_CoroutineObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
{
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl *__pyx_cur_scope = ((struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl *)__pyx_generator->closure);
  PyObject *__pyx_r = NULL;
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  Py_ssize_t __pyx_t_4;
  PyObject *__pyx_t_5 = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("None", 0);
  switch (__pyx_generator->resume_label) {
    case 0: goto __pyx_L3_first_run;
    case 1: goto __pyx_L4_resume_from_yield;
    default: /* CPython raises the right error here */
    __Pyx_RefNannyFinishContext();
    return NULL;
  }
  __pyx_L3_first_run:;
  if (unlikely(!__pyx_sent_value)) __PYX_ERR(0, 361, __pyx_L1_error)

  /* "asynq/decorators.py":362
 * 
 * def _cache_set_impl(cache, key, value):
 *     yield cache.set(key, value)             # <<<<<<<<<<<<<<
 *     raise StopIteration()
 * 
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_cur_scope->__pyx_v_cache, __pyx_n_s_set); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 362, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  __pyx_t_4 = 0;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
      __pyx_t_4 = 1;
    }
  }
  __pyx_t_5 = PyTuple_New(2+__pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 362, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_5);
  if (__pyx_t_3) {
    __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3); __pyx_t_3 = NULL;
  }
  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_key);
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_key);
  PyTuple_SET_ITEM(__pyx_t_5, 0+__pyx_t_4, __pyx_cur_scope->__pyx_v_key);
  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_value);
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_value);
  PyTuple_SET_ITEM(__pyx_t_5, 1+__pyx_t_4, __pyx_cur_scope->__pyx_v_value);
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 362, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  /* return from generator, yielding value */
  __pyx_generator->resume_label = 1;
  return __pyx_r;
  __pyx_L4_resume_from_yield:;
  if (unlikely(!__pyx_sent_value)) __PYX_ERR(0, 362, __pyx_L1_error)

  /* "asynq/decorators.py":363
 * def _cache_set_impl(cache, key, value):
 *     yield cache.set(key, value)
 *     raise StopIteration()             # <<<<<<<<<<<<<<
 * 
 * # Applying decorator by this way to make it work with Cython
 */
  __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_builtin_StopIteration); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 363, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_Raise(__pyx_t_1, 0, 0, 0);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __PYX_ERR(0, 363, __pyx_L1_error)

  /* "asynq/decorators.py":361
 * 
 * 
 * def _cache_set_impl(cache, key, value):             # <<<<<<<<<<<<<<
 *     yield cache.set(key, value)
 *     raise StopIteration()
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("_cache_set_impl", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_XDECREF(__pyx_r); __pyx_r = 0;
  __pyx_generator->resume_label = -1;
  __Pyx_Coroutine_clear((PyObject*)__pyx_generator);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "asynq/decorators.py":370
 * 
 * 
 * def _get_cache_key(fn, args, kwargs):             # <<<<<<<<<<<<<<
 *     return core_inspection.get_function_call_repr(fn, args, kwargs)
 */

static PyObject *__pyx_pw_5asynq_10decorators_29_get_cache_key(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyObject *__pyx_f_5asynq_10decorators__get_cache_key(PyObject *__pyx_v_fn, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs, CYTHON_UNUSED int __pyx_skip_dispatch) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  __Pyx_RefNannySetupContext("_get_cache_key", 0);

  /* "asynq/decorators.py":371
 * 
 * def _get_cache_key(fn, args, kwargs):
 *     return core_inspection.get_function_call_repr(fn, args, kwargs)             # <<<<<<<<<<<<<<
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __pyx_f_5qcore_10inspection_get_function_call_repr(__pyx_v_fn, __pyx_v_args, __pyx_v_kwargs, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 371, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "asynq/decorators.py":370
 * 
 * 
 * def _get_cache_key(fn, args, kwargs):             # <<<<<<<<<<<<<<
 *     return core_inspection.get_function_call_repr(fn, args, kwargs)
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("asynq.decorators._get_cache_key", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* Python wrapper */
static PyObject *__pyx_pw_5asynq_10decorators_29_get_cache_key(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyObject *__pyx_pw_5asynq_10decorators_29_get_cache_key(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_fn = 0;
  PyObject *__pyx_v_args = 0;
  PyObject *__pyx_v_kwargs = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_get_cache_key (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_fn,&__pyx_n_s_args,&__pyx_n_s_kwargs,0};
    PyObject* values[3] = {0,0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_fn)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_args)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("_get_cache_key", 1, 3, 3, 1); __PYX_ERR(0, 370, __pyx_L3_error)
        }
        case  2:
        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_kwargs)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("_get_cache_key", 1, 3, 3, 2); __PYX_ERR(0, 370, __pyx_L3_error)
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_get_cache_key") < 0)) __PYX_ERR(0, 370, __pyx_L3_error)
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 3) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
    }
    __pyx_v_fn = values[0];
    __pyx_v_args = ((PyObject*)values[1]);
    __pyx_v_kwargs = ((PyObject*)values[2]);
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("_get_cache_key", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 370, __pyx_L3_error)
  __pyx_L3_error:;
  __Pyx_AddTraceback("asynq.decorators._get_cache_key", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_args), (&PyTuple_Type), 1, "args", 1))) __PYX_ERR(0, 370, __pyx_L1_error)
  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_kwargs), (&PyDict_Type), 1, "kwargs", 1))) __PYX_ERR(0, 370, __pyx_L1_error)
  __pyx_r = __pyx_pf_5asynq_10decorators_28_get_cache_key(__pyx_self, __pyx_v_fn, __pyx_v_args, __pyx_v_kwargs);

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_5asynq_10decorators_28_get_cache_key(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_fn, PyObject *__pyx_v_args, PyObject *__pyx_v_kwargs) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  __Pyx_RefNannySetupContext("_get_cache_key", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __pyx_f_5asynq_10decorators__get_cache_key(__pyx_v_fn, __pyx_v_args, __pyx_v_kwargs, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 370, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("asynq.decorators._get_cache_key", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
static struct __pyx_vtabstruct_5asynq_10decorators_PureAsyncDecoratorBinder __pyx_vtable_5asynq_10decorators_PureAsyncDecoratorBinder;

static PyObject *__pyx_tp_new_5asynq_10decorators_PureAsyncDecoratorBinder(PyTypeObject *t, PyObject *a, PyObject *k) {
  struct __pyx_obj_5asynq_10decorators_PureAsyncDecoratorBinder *p;
  PyObject *o = __pyx_ptype_5qcore_10decorators_DecoratorBinder->tp_new(t, a, k);
  if (unlikely(!o)) return 0;
  p = ((struct __pyx_obj_5asynq_10decorators_PureAsyncDecoratorBinder *)o);
  p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_5qcore_10decorators_DecoratorBinder*)__pyx_vtabptr_5asynq_10decorators_PureAsyncDecoratorBinder;
  return o;
}

static void __pyx_tp_dealloc_5asynq_10decorators_PureAsyncDecoratorBinder(PyObject *o) {
  #if PY_VERSION_HEX >= 0x030400a1
  if (unlikely(Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) {
    if (PyObject_CallFinalizerFromDealloc(o)) return;
  }
  #endif
  PyObject_GC_UnTrack(o);
  PyObject_GC_Track(o);
  if (likely(__pyx_ptype_5qcore_10decorators_DecoratorBinder)) __pyx_ptype_5qcore_10decorators_DecoratorBinder->tp_dealloc(o); else __Pyx_call_next_tp_dealloc(o, __pyx_tp_dealloc_5asynq_10decorators_PureAsyncDecoratorBinder);
}

static int __pyx_tp_traverse_5asynq_10decorators_PureAsyncDecoratorBinder(PyObject *o, visitproc v, void *a) {
  int e;
  e = ((likely(__pyx_ptype_5qcore_10decorators_DecoratorBinder)) ? ((__pyx_ptype_5qcore_10decorators_DecoratorBinder->tp_traverse) ? __pyx_ptype_5qcore_10decorators_DecoratorBinder->tp_traverse(o, v, a) : 0) : __Pyx_call_next_tp_traverse(o, v, a, __pyx_tp_traverse_5asynq_10decorators_PureAsyncDecoratorBinder)); if (e) return e;
  return 0;
}

static int __pyx_tp_clear_5asynq_10decorators_PureAsyncDecoratorBinder(PyObject *o) {
  if (likely(__pyx_ptype_5qcore_10decorators_DecoratorBinder)) { if (__pyx_ptype_5qcore_10decorators_DecoratorBinder->tp_clear) __pyx_ptype_5qcore_10decorators_DecoratorBinder->tp_clear(o); } else __Pyx_call_next_tp_clear(o, __pyx_tp_clear_5asynq_10decorators_PureAsyncDecoratorBinder);
  return 0;
}

static PyMethodDef __pyx_methods_5asynq_10decorators_PureAsyncDecoratorBinder[] = {
  {"is_pure_async_fn", (PyCFunction)__pyx_pw_5asynq_10decorators_24PureAsyncDecoratorBinder_1is_pure_async_fn, METH_NOARGS, 0},
  {0, 0, 0, 0}
};

static PyTypeObject __pyx_type_5asynq_10decorators_PureAsyncDecoratorBinder = {
  PyVarObject_HEAD_INIT(0, 0)
  "asynq.decorators.PureAsyncDecoratorBinder", /*tp_name*/
  sizeof(struct __pyx_obj_5asynq_10decorators_PureAsyncDecoratorBinder), /*tp_basicsize*/
  0, /*tp_itemsize*/
  __pyx_tp_dealloc_5asynq_10decorators_PureAsyncDecoratorBinder, /*tp_dealloc*/
  0, /*tp_print*/
  0, /*tp_getattr*/
  0, /*tp_setattr*/
  #if PY_MAJOR_VERSION < 3
  0, /*tp_compare*/
  #endif
  #if PY_MAJOR_VERSION >= 3
  0, /*tp_as_async*/
  #endif
  0, /*tp_repr*/
  0, /*tp_as_number*/
  0, /*tp_as_sequence*/
  0, /*tp_as_mapping*/
  0, /*tp_hash*/
  0, /*tp_call*/
  0, /*tp_str*/
  0, /*tp_getattro*/
  0, /*tp_setattro*/
  0, /*tp_as_buffer*/
  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
  0, /*tp_doc*/
  __pyx_tp_traverse_5asynq_10decorators_PureAsyncDecoratorBinder, /*tp_traverse*/
  __pyx_tp_clear_5asynq_10decorators_PureAsyncDecoratorBinder, /*tp_clear*/
  0, /*tp_richcompare*/
  0, /*tp_weaklistoffset*/
  0, /*tp_iter*/
  0, /*tp_iternext*/
  __pyx_methods_5asynq_10decorators_PureAsyncDecoratorBinder, /*tp_methods*/
  0, /*tp_members*/
  0, /*tp_getset*/
  0, /*tp_base*/
  0, /*tp_dict*/
  0, /*tp_descr_get*/
  0, /*tp_descr_set*/
  0, /*tp_dictoffset*/
  0, /*tp_init*/
  0, /*tp_alloc*/
  __pyx_tp_new_5asynq_10decorators_PureAsyncDecoratorBinder, /*tp_new*/
  0, /*tp_free*/
  0, /*tp_is_gc*/
  0, /*tp_bases*/
  0, /*tp_mro*/
  0, /*tp_cache*/
  0, /*tp_subclasses*/
  0, /*tp_weaklist*/
  0, /*tp_del*/
  0, /*tp_version_tag*/
  #if PY_VERSION_HEX >= 0x030400a1
  0, /*tp_finalize*/
  #endif
};
static struct __pyx_vtabstruct_5asynq_10decorators_PureAsyncDecorator __pyx_vtable_5asynq_10decorators_PureAsyncDecorator;

static PyObject *__pyx_tp_new_5asynq_10decorators_PureAsyncDecorator(PyTypeObject *t, PyObject *a, PyObject *k) {
  struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *p;
  PyObject *o = __pyx_ptype_5qcore_10decorators_DecoratorBase->tp_new(t, a, k);
  if (unlikely(!o)) return 0;
  p = ((struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *)o);
  p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_5qcore_10decorators_DecoratorBase*)__pyx_vtabptr_5asynq_10decorators_PureAsyncDecorator;
  p->task_cls = ((PyTypeObject*)Py_None); Py_INCREF(Py_None);
  p->kwargs = ((PyObject*)Py_None); Py_INCREF(Py_None);
  return o;
}

static void __pyx_tp_dealloc_5asynq_10decorators_PureAsyncDecorator(PyObject *o) {
  struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *p = (struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *)o;
  #if PY_VERSION_HEX >= 0x030400a1
  if (unlikely(Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) {
    if (PyObject_CallFinalizerFromDealloc(o)) return;
  }
  #endif
  PyObject_GC_UnTrack(o);
  Py_CLEAR(p->task_cls);
  Py_CLEAR(p->kwargs);
  PyObject_GC_Track(o);
  if (likely(__pyx_ptype_5qcore_10decorators_DecoratorBase)) __pyx_ptype_5qcore_10decorators_DecoratorBase->tp_dealloc(o); else __Pyx_call_next_tp_dealloc(o, __pyx_tp_dealloc_5asynq_10decorators_PureAsyncDecorator);
}

static int __pyx_tp_traverse_5asynq_10decorators_PureAsyncDecorator(PyObject *o, visitproc v, void *a) {
  int e;
  struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *p = (struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *)o;
  e = ((likely(__pyx_ptype_5qcore_10decorators_DecoratorBase)) ? ((__pyx_ptype_5qcore_10decorators_DecoratorBase->tp_traverse) ? __pyx_ptype_5qcore_10decorators_DecoratorBase->tp_traverse(o, v, a) : 0) : __Pyx_call_next_tp_traverse(o, v, a, __pyx_tp_traverse_5asynq_10decorators_PureAsyncDecorator)); if (e) return e;
  if (p->task_cls) {
    e = (*v)(p->task_cls, a); if (e) return e;
  }
  if (p->kwargs) {
    e = (*v)(p->kwargs, a); if (e) return e;
  }
  return 0;
}

static int __pyx_tp_clear_5asynq_10decorators_PureAsyncDecorator(PyObject *o) {
  PyObject* tmp;
  struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *p = (struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *)o;
  if (likely(__pyx_ptype_5qcore_10decorators_DecoratorBase)) { if (__pyx_ptype_5qcore_10decorators_DecoratorBase->tp_clear) __pyx_ptype_5qcore_10decorators_DecoratorBase->tp_clear(o); } else __Pyx_call_next_tp_clear(o, __pyx_tp_clear_5asynq_10decorators_PureAsyncDecorator);
  tmp = ((PyObject*)p->task_cls);
  p->task_cls = ((PyTypeObject*)Py_None); Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->kwargs);
  p->kwargs = ((PyObject*)Py_None); Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  return 0;
}

static PyObject *__pyx_getprop_5asynq_10decorators_18PureAsyncDecorator_task_cls(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_5asynq_10decorators_18PureAsyncDecorator_8task_cls_1__get__(o);
}

static int __pyx_setprop_5asynq_10decorators_18PureAsyncDecorator_task_cls(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
  if (v) {
    return __pyx_pw_5asynq_10decorators_18PureAsyncDecorator_8task_cls_3__set__(o, v);
  }
  else {
    return __pyx_pw_5asynq_10decorators_18PureAsyncDecorator_8task_cls_5__del__(o);
  }
}

static PyObject *__pyx_getprop_5asynq_10decorators_18PureAsyncDecorator_kwargs(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_5asynq_10decorators_18PureAsyncDecorator_6kwargs_1__get__(o);
}

static int __pyx_setprop_5asynq_10decorators_18PureAsyncDecorator_kwargs(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
  if (v) {
    return __pyx_pw_5asynq_10decorators_18PureAsyncDecorator_6kwargs_3__set__(o, v);
  }
  else {
    return __pyx_pw_5asynq_10decorators_18PureAsyncDecorator_6kwargs_5__del__(o);
  }
}

static PyObject *__pyx_getprop_5asynq_10decorators_18PureAsyncDecorator_needs_wrapper(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_5asynq_10decorators_18PureAsyncDecorator_13needs_wrapper_1__get__(o);
}

static int __pyx_setprop_5asynq_10decorators_18PureAsyncDecorator_needs_wrapper(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
  if (v) {
    return __pyx_pw_5asynq_10decorators_18PureAsyncDecorator_13needs_wrapper_3__set__(o, v);
  }
  else {
    PyErr_SetString(PyExc_NotImplementedError, "__del__");
    return -1;
  }
}

static PyMethodDef __pyx_methods_5asynq_10decorators_PureAsyncDecorator[] = {
  {"name", (PyCFunction)__pyx_pw_5asynq_10decorators_18PureAsyncDecorator_3name, METH_NOARGS, 0},
  {"is_pure_async_fn", (PyCFunction)__pyx_pw_5asynq_10decorators_18PureAsyncDecorator_5is_pure_async_fn, METH_NOARGS, 0},
  {"_fn_wrapper", (PyCFunction)__pyx_pw_5asynq_10decorators_18PureAsyncDecorator_7_fn_wrapper, METH_VARARGS|METH_KEYWORDS, 0},
  {"_call_pure", (PyCFunction)__pyx_pw_5asynq_10decorators_18PureAsyncDecorator_12_call_pure, METH_VARARGS|METH_KEYWORDS, 0},
  {0, 0, 0, 0}
};

static struct PyGetSetDef __pyx_getsets_5asynq_10decorators_PureAsyncDecorator[] = {
  {(char *)"task_cls", __pyx_getprop_5asynq_10decorators_18PureAsyncDecorator_task_cls, __pyx_setprop_5asynq_10decorators_18PureAsyncDecorator_task_cls, (char *)0, 0},
  {(char *)"kwargs", __pyx_getprop_5asynq_10decorators_18PureAsyncDecorator_kwargs, __pyx_setprop_5asynq_10decorators_18PureAsyncDecorator_kwargs, (char *)0, 0},
  {(char *)"needs_wrapper", __pyx_getprop_5asynq_10decorators_18PureAsyncDecorator_needs_wrapper, __pyx_setprop_5asynq_10decorators_18PureAsyncDecorator_needs_wrapper, (char *)0, 0},
  {0, 0, 0, 0, 0}
};

static PyTypeObject __pyx_type_5asynq_10decorators_PureAsyncDecorator = {
  PyVarObject_HEAD_INIT(0, 0)
  "asynq.decorators.PureAsyncDecorator", /*tp_name*/
  sizeof(struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator), /*tp_basicsize*/
  0, /*tp_itemsize*/
  __pyx_tp_dealloc_5asynq_10decorators_PureAsyncDecorator, /*tp_dealloc*/
  0, /*tp_print*/
  0, /*tp_getattr*/
  0, /*tp_setattr*/
  #if PY_MAJOR_VERSION < 3
  0, /*tp_compare*/
  #endif
  #if PY_MAJOR_VERSION >= 3
  0, /*tp_as_async*/
  #endif
  0, /*tp_repr*/
  0, /*tp_as_number*/
  0, /*tp_as_sequence*/
  0, /*tp_as_mapping*/
  0, /*tp_hash*/
  __pyx_pw_5asynq_10decorators_18PureAsyncDecorator_10__call__, /*tp_call*/
  0, /*tp_str*/
  0, /*tp_getattro*/
  0, /*tp_setattro*/
  0, /*tp_as_buffer*/
  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
  0, /*tp_doc*/
  __pyx_tp_traverse_5asynq_10decorators_PureAsyncDecorator, /*tp_traverse*/
  __pyx_tp_clear_5asynq_10decorators_PureAsyncDecorator, /*tp_clear*/
  0, /*tp_richcompare*/
  0, /*tp_weaklistoffset*/
  0, /*tp_iter*/
  0, /*tp_iternext*/
  __pyx_methods_5asynq_10decorators_PureAsyncDecorator, /*tp_methods*/
  0, /*tp_members*/
  __pyx_getsets_5asynq_10decorators_PureAsyncDecorator, /*tp_getset*/
  0, /*tp_base*/
  0, /*tp_dict*/
  0, /*tp_descr_get*/
  0, /*tp_descr_set*/
  0, /*tp_dictoffset*/
  __pyx_pw_5asynq_10decorators_18PureAsyncDecorator_1__init__, /*tp_init*/
  0, /*tp_alloc*/
  __pyx_tp_new_5asynq_10decorators_PureAsyncDecorator, /*tp_new*/
  0, /*tp_free*/
  0, /*tp_is_gc*/
  0, /*tp_bases*/
  0, /*tp_mro*/
  0, /*tp_cache*/
  0, /*tp_subclasses*/
  0, /*tp_weaklist*/
  0, /*tp_del*/
  0, /*tp_version_tag*/
  #if PY_VERSION_HEX >= 0x030400a1
  0, /*tp_finalize*/
  #endif
};
static struct __pyx_vtabstruct_5asynq_10decorators_AsyncDecoratorBinder __pyx_vtable_5asynq_10decorators_AsyncDecoratorBinder;

static PyObject *__pyx_tp_new_5asynq_10decorators_AsyncDecoratorBinder(PyTypeObject *t, PyObject *a, PyObject *k) {
  struct __pyx_obj_5asynq_10decorators_AsyncDecoratorBinder *p;
  PyObject *o = __pyx_ptype_5qcore_10decorators_DecoratorBinder->tp_new(t, a, k);
  if (unlikely(!o)) return 0;
  p = ((struct __pyx_obj_5asynq_10decorators_AsyncDecoratorBinder *)o);
  p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_5qcore_10decorators_DecoratorBinder*)__pyx_vtabptr_5asynq_10decorators_AsyncDecoratorBinder;
  return o;
}

static void __pyx_tp_dealloc_5asynq_10decorators_AsyncDecoratorBinder(PyObject *o) {
  #if PY_VERSION_HEX >= 0x030400a1
  if (unlikely(Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) {
    if (PyObject_CallFinalizerFromDealloc(o)) return;
  }
  #endif
  PyObject_GC_UnTrack(o);
  PyObject_GC_Track(o);
  if (likely(__pyx_ptype_5qcore_10decorators_DecoratorBinder)) __pyx_ptype_5qcore_10decorators_DecoratorBinder->tp_dealloc(o); else __Pyx_call_next_tp_dealloc(o, __pyx_tp_dealloc_5asynq_10decorators_AsyncDecoratorBinder);
}

static int __pyx_tp_traverse_5asynq_10decorators_AsyncDecoratorBinder(PyObject *o, visitproc v, void *a) {
  int e;
  e = ((likely(__pyx_ptype_5qcore_10decorators_DecoratorBinder)) ? ((__pyx_ptype_5qcore_10decorators_DecoratorBinder->tp_traverse) ? __pyx_ptype_5qcore_10decorators_DecoratorBinder->tp_traverse(o, v, a) : 0) : __Pyx_call_next_tp_traverse(o, v, a, __pyx_tp_traverse_5asynq_10decorators_AsyncDecoratorBinder)); if (e) return e;
  return 0;
}

static int __pyx_tp_clear_5asynq_10decorators_AsyncDecoratorBinder(PyObject *o) {
  if (likely(__pyx_ptype_5qcore_10decorators_DecoratorBinder)) { if (__pyx_ptype_5qcore_10decorators_DecoratorBinder->tp_clear) __pyx_ptype_5qcore_10decorators_DecoratorBinder->tp_clear(o); } else __Pyx_call_next_tp_clear(o, __pyx_tp_clear_5asynq_10decorators_AsyncDecoratorBinder);
  return 0;
}

static PyMethodDef __pyx_methods_5asynq_10decorators_AsyncDecoratorBinder[] = {
  {"async", (PyCFunction)__pyx_pw_5asynq_10decorators_20AsyncDecoratorBinder_1async, METH_VARARGS|METH_KEYWORDS, 0},
  {0, 0, 0, 0}
};

static PyTypeObject __pyx_type_5asynq_10decorators_AsyncDecoratorBinder = {
  PyVarObject_HEAD_INIT(0, 0)
  "asynq.decorators.AsyncDecoratorBinder", /*tp_name*/
  sizeof(struct __pyx_obj_5asynq_10decorators_AsyncDecoratorBinder), /*tp_basicsize*/
  0, /*tp_itemsize*/
  __pyx_tp_dealloc_5asynq_10decorators_AsyncDecoratorBinder, /*tp_dealloc*/
  0, /*tp_print*/
  0, /*tp_getattr*/
  0, /*tp_setattr*/
  #if PY_MAJOR_VERSION < 3
  0, /*tp_compare*/
  #endif
  #if PY_MAJOR_VERSION >= 3
  0, /*tp_as_async*/
  #endif
  0, /*tp_repr*/
  0, /*tp_as_number*/
  0, /*tp_as_sequence*/
  0, /*tp_as_mapping*/
  0, /*tp_hash*/
  0, /*tp_call*/
  0, /*tp_str*/
  0, /*tp_getattro*/
  0, /*tp_setattro*/
  0, /*tp_as_buffer*/
  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
  0, /*tp_doc*/
  __pyx_tp_traverse_5asynq_10decorators_AsyncDecoratorBinder, /*tp_traverse*/
  __pyx_tp_clear_5asynq_10decorators_AsyncDecoratorBinder, /*tp_clear*/
  0, /*tp_richcompare*/
  0, /*tp_weaklistoffset*/
  0, /*tp_iter*/
  0, /*tp_iternext*/
  __pyx_methods_5asynq_10decorators_AsyncDecoratorBinder, /*tp_methods*/
  0, /*tp_members*/
  0, /*tp_getset*/
  0, /*tp_base*/
  0, /*tp_dict*/
  0, /*tp_descr_get*/
  0, /*tp_descr_set*/
  0, /*tp_dictoffset*/
  0, /*tp_init*/
  0, /*tp_alloc*/
  __pyx_tp_new_5asynq_10decorators_AsyncDecoratorBinder, /*tp_new*/
  0, /*tp_free*/
  0, /*tp_is_gc*/
  0, /*tp_bases*/
  0, /*tp_mro*/
  0, /*tp_cache*/
  0, /*tp_subclasses*/
  0, /*tp_weaklist*/
  0, /*tp_del*/
  0, /*tp_version_tag*/
  #if PY_VERSION_HEX >= 0x030400a1
  0, /*tp_finalize*/
  #endif
};
static struct __pyx_vtabstruct_5asynq_10decorators_AsyncDecorator __pyx_vtable_5asynq_10decorators_AsyncDecorator;

static PyObject *__pyx_tp_new_5asynq_10decorators_AsyncDecorator(PyTypeObject *t, PyObject *a, PyObject *k) {
  struct __pyx_obj_5asynq_10decorators_AsyncDecorator *p;
  PyObject *o = __pyx_tp_new_5asynq_10decorators_PureAsyncDecorator(t, a, k);
  if (unlikely(!o)) return 0;
  p = ((struct __pyx_obj_5asynq_10decorators_AsyncDecorator *)o);
  p->__pyx_base.__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_5qcore_10decorators_DecoratorBase*)__pyx_vtabptr_5asynq_10decorators_AsyncDecorator;
  return o;
}

static PyMethodDef __pyx_methods_5asynq_10decorators_AsyncDecorator[] = {
  {"is_pure_async_fn", (PyCFunction)__pyx_pw_5asynq_10decorators_14AsyncDecorator_1is_pure_async_fn, METH_NOARGS, 0},
  {"async", (PyCFunction)__pyx_pw_5asynq_10decorators_14AsyncDecorator_3async, METH_VARARGS|METH_KEYWORDS, 0},
  {"name", (PyCFunction)__pyx_pw_5asynq_10decorators_14AsyncDecorator_5name, METH_NOARGS, 0},
  {0, 0, 0, 0}
};

static PyTypeObject __pyx_type_5asynq_10decorators_AsyncDecorator = {
  PyVarObject_HEAD_INIT(0, 0)
  "asynq.decorators.AsyncDecorator", /*tp_name*/
  sizeof(struct __pyx_obj_5asynq_10decorators_AsyncDecorator), /*tp_basicsize*/
  0, /*tp_itemsize*/
  __pyx_tp_dealloc_5asynq_10decorators_PureAsyncDecorator, /*tp_dealloc*/
  0, /*tp_print*/
  0, /*tp_getattr*/
  0, /*tp_setattr*/
  #if PY_MAJOR_VERSION < 3
  0, /*tp_compare*/
  #endif
  #if PY_MAJOR_VERSION >= 3
  0, /*tp_as_async*/
  #endif
  0, /*tp_repr*/
  0, /*tp_as_number*/
  0, /*tp_as_sequence*/
  0, /*tp_as_mapping*/
  0, /*tp_hash*/
  __pyx_pw_5asynq_10decorators_14AsyncDecorator_7__call__, /*tp_call*/
  0, /*tp_str*/
  0, /*tp_getattro*/
  0, /*tp_setattro*/
  0, /*tp_as_buffer*/
  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
  0, /*tp_doc*/
  __pyx_tp_traverse_5asynq_10decorators_PureAsyncDecorator, /*tp_traverse*/
  __pyx_tp_clear_5asynq_10decorators_PureAsyncDecorator, /*tp_clear*/
  0, /*tp_richcompare*/
  0, /*tp_weaklistoffset*/
  0, /*tp_iter*/
  0, /*tp_iternext*/
  __pyx_methods_5asynq_10decorators_AsyncDecorator, /*tp_methods*/
  0, /*tp_members*/
  0, /*tp_getset*/
  0, /*tp_base*/
  0, /*tp_dict*/
  0, /*tp_descr_get*/
  0, /*tp_descr_set*/
  0, /*tp_dictoffset*/
  #if CYTHON_COMPILING_IN_PYPY
  __pyx_pw_5asynq_10decorators_18PureAsyncDecorator_1__init__, /*tp_init*/
  #else
  0, /*tp_init*/
  #endif
  0, /*tp_alloc*/
  __pyx_tp_new_5asynq_10decorators_AsyncDecorator, /*tp_new*/
  0, /*tp_free*/
  0, /*tp_is_gc*/
  0, /*tp_bases*/
  0, /*tp_mro*/
  0, /*tp_cache*/
  0, /*tp_subclasses*/
  0, /*tp_weaklist*/
  0, /*tp_del*/
  0, /*tp_version_tag*/
  #if PY_VERSION_HEX >= 0x030400a1
  0, /*tp_finalize*/
  #endif
};
static struct __pyx_vtabstruct_5asynq_10decorators_AsyncAndSyncPairDecorator __pyx_vtable_5asynq_10decorators_AsyncAndSyncPairDecorator;

static PyObject *__pyx_tp_new_5asynq_10decorators_AsyncAndSyncPairDecorator(PyTypeObject *t, PyObject *a, PyObject *k) {
  struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairDecorator *p;
  PyObject *o = __pyx_tp_new_5asynq_10decorators_AsyncDecorator(t, a, k);
  if (unlikely(!o)) return 0;
  p = ((struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairDecorator *)o);
  p->__pyx_base.__pyx_base.__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_5qcore_10decorators_DecoratorBase*)__pyx_vtabptr_5asynq_10decorators_AsyncAndSyncPairDecorator;
  p->sync_fn = Py_None; Py_INCREF(Py_None);
  return o;
}

static void __pyx_tp_dealloc_5asynq_10decorators_AsyncAndSyncPairDecorator(PyObject *o) {
  struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairDecorator *p = (struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairDecorator *)o;
  #if PY_VERSION_HEX >= 0x030400a1
  if (unlikely(Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) {
    if (PyObject_CallFinalizerFromDealloc(o)) return;
  }
  #endif
  PyObject_GC_UnTrack(o);
  Py_CLEAR(p->sync_fn);
  PyObject_GC_Track(o);
  __pyx_tp_dealloc_5asynq_10decorators_PureAsyncDecorator(o);
}

static int __pyx_tp_traverse_5asynq_10decorators_AsyncAndSyncPairDecorator(PyObject *o, visitproc v, void *a) {
  int e;
  struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairDecorator *p = (struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairDecorator *)o;
  e = __pyx_tp_traverse_5asynq_10decorators_PureAsyncDecorator(o, v, a); if (e) return e;
  if (p->sync_fn) {
    e = (*v)(p->sync_fn, a); if (e) return e;
  }
  return 0;
}

static int __pyx_tp_clear_5asynq_10decorators_AsyncAndSyncPairDecorator(PyObject *o) {
  PyObject* tmp;
  struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairDecorator *p = (struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairDecorator *)o;
  __pyx_tp_clear_5asynq_10decorators_PureAsyncDecorator(o);
  tmp = ((PyObject*)p->sync_fn);
  p->sync_fn = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  return 0;
}

static PyObject *__pyx_tp_descr_get_5asynq_10decorators_AsyncAndSyncPairDecorator(PyObject *o, PyObject *i, PyObject *c) {
  PyObject *r = 0;
  if (!i) i = Py_None;
  if (!c) c = Py_None;
  r = __pyx_pw_5asynq_10decorators_25AsyncAndSyncPairDecorator_5__get__(o, i, c);
  return r;
}

static PyObject *__pyx_getprop_5asynq_10decorators_25AsyncAndSyncPairDecorator_sync_fn(PyObject *o, CYTHON_UNUSED void *x) {
  return __pyx_pw_5asynq_10decorators_25AsyncAndSyncPairDecorator_7sync_fn_1__get__(o);
}

static int __pyx_setprop_5asynq_10decorators_25AsyncAndSyncPairDecorator_sync_fn(PyObject *o, PyObject *v, CYTHON_UNUSED void *x) {
  if (v) {
    return __pyx_pw_5asynq_10decorators_25AsyncAndSyncPairDecorator_7sync_fn_3__set__(o, v);
  }
  else {
    return __pyx_pw_5asynq_10decorators_25AsyncAndSyncPairDecorator_7sync_fn_5__del__(o);
  }
}

static PyMethodDef __pyx_methods_5asynq_10decorators_AsyncAndSyncPairDecorator[] = {
  {0, 0, 0, 0}
};

static struct PyGetSetDef __pyx_getsets_5asynq_10decorators_AsyncAndSyncPairDecorator[] = {
  {(char *)"sync_fn", __pyx_getprop_5asynq_10decorators_25AsyncAndSyncPairDecorator_sync_fn, __pyx_setprop_5asynq_10decorators_25AsyncAndSyncPairDecorator_sync_fn, (char *)0, 0},
  {0, 0, 0, 0, 0}
};

static PyTypeObject __pyx_type_5asynq_10decorators_AsyncAndSyncPairDecorator = {
  PyVarObject_HEAD_INIT(0, 0)
  "asynq.decorators.AsyncAndSyncPairDecorator", /*tp_name*/
  sizeof(struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairDecorator), /*tp_basicsize*/
  0, /*tp_itemsize*/
  __pyx_tp_dealloc_5asynq_10decorators_AsyncAndSyncPairDecorator, /*tp_dealloc*/
  0, /*tp_print*/
  0, /*tp_getattr*/
  0, /*tp_setattr*/
  #if PY_MAJOR_VERSION < 3
  0, /*tp_compare*/
  #endif
  #if PY_MAJOR_VERSION >= 3
  0, /*tp_as_async*/
  #endif
  0, /*tp_repr*/
  0, /*tp_as_number*/
  0, /*tp_as_sequence*/
  0, /*tp_as_mapping*/
  0, /*tp_hash*/
  __pyx_pw_5asynq_10decorators_25AsyncAndSyncPairDecorator_3__call__, /*tp_call*/
  0, /*tp_str*/
  0, /*tp_getattro*/
  0, /*tp_setattro*/
  0, /*tp_as_buffer*/
  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
  0, /*tp_doc*/
  __pyx_tp_traverse_5asynq_10decorators_AsyncAndSyncPairDecorator, /*tp_traverse*/
  __pyx_tp_clear_5asynq_10decorators_AsyncAndSyncPairDecorator, /*tp_clear*/
  0, /*tp_richcompare*/
  0, /*tp_weaklistoffset*/
  0, /*tp_iter*/
  0, /*tp_iternext*/
  __pyx_methods_5asynq_10decorators_AsyncAndSyncPairDecorator, /*tp_methods*/
  0, /*tp_members*/
  __pyx_getsets_5asynq_10decorators_AsyncAndSyncPairDecorator, /*tp_getset*/
  0, /*tp_base*/
  0, /*tp_dict*/
  __pyx_tp_descr_get_5asynq_10decorators_AsyncAndSyncPairDecorator, /*tp_descr_get*/
  0, /*tp_descr_set*/
  0, /*tp_dictoffset*/
  __pyx_pw_5asynq_10decorators_25AsyncAndSyncPairDecorator_1__init__, /*tp_init*/
  0, /*tp_alloc*/
  __pyx_tp_new_5asynq_10decorators_AsyncAndSyncPairDecorator, /*tp_new*/
  0, /*tp_free*/
  0, /*tp_is_gc*/
  0, /*tp_bases*/
  0, /*tp_mro*/
  0, /*tp_cache*/
  0, /*tp_subclasses*/
  0, /*tp_weaklist*/
  0, /*tp_del*/
  0, /*tp_version_tag*/
  #if PY_VERSION_HEX >= 0x030400a1
  0, /*tp_finalize*/
  #endif
};
static struct __pyx_vtabstruct_5asynq_10decorators_AsyncProxyDecorator __pyx_vtable_5asynq_10decorators_AsyncProxyDecorator;

static PyObject *__pyx_tp_new_5asynq_10decorators_AsyncProxyDecorator(PyTypeObject *t, PyObject *a, PyObject *k) {
  struct __pyx_obj_5asynq_10decorators_AsyncProxyDecorator *p;
  PyObject *o = __pyx_tp_new_5asynq_10decorators_AsyncDecorator(t, a, k);
  if (unlikely(!o)) return 0;
  p = ((struct __pyx_obj_5asynq_10decorators_AsyncProxyDecorator *)o);
  p->__pyx_base.__pyx_base.__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_5qcore_10decorators_DecoratorBase*)__pyx_vtabptr_5asynq_10decorators_AsyncProxyDecorator;
  return o;
}

static PyMethodDef __pyx_methods_5asynq_10decorators_AsyncProxyDecorator[] = {
  {"_call_pure", (PyCFunction)__pyx_pw_5asynq_10decorators_19AsyncProxyDecorator_3_call_pure, METH_VARARGS|METH_KEYWORDS, 0},
  {0, 0, 0, 0}
};

static PyTypeObject __pyx_type_5asynq_10decorators_AsyncProxyDecorator = {
  PyVarObject_HEAD_INIT(0, 0)
  "asynq.decorators.AsyncProxyDecorator", /*tp_name*/
  sizeof(struct __pyx_obj_5asynq_10decorators_AsyncProxyDecorator), /*tp_basicsize*/
  0, /*tp_itemsize*/
  __pyx_tp_dealloc_5asynq_10decorators_PureAsyncDecorator, /*tp_dealloc*/
  0, /*tp_print*/
  0, /*tp_getattr*/
  0, /*tp_setattr*/
  #if PY_MAJOR_VERSION < 3
  0, /*tp_compare*/
  #endif
  #if PY_MAJOR_VERSION >= 3
  0, /*tp_as_async*/
  #endif
  0, /*tp_repr*/
  0, /*tp_as_number*/
  0, /*tp_as_sequence*/
  0, /*tp_as_mapping*/
  0, /*tp_hash*/
  #if CYTHON_COMPILING_IN_PYPY
  __pyx_pw_5asynq_10decorators_14AsyncDecorator_7__call__, /*tp_call*/
  #else
  0, /*tp_call*/
  #endif
  0, /*tp_str*/
  0, /*tp_getattro*/
  0, /*tp_setattro*/
  0, /*tp_as_buffer*/
  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
  0, /*tp_doc*/
  __pyx_tp_traverse_5asynq_10decorators_PureAsyncDecorator, /*tp_traverse*/
  __pyx_tp_clear_5asynq_10decorators_PureAsyncDecorator, /*tp_clear*/
  0, /*tp_richcompare*/
  0, /*tp_weaklistoffset*/
  0, /*tp_iter*/
  0, /*tp_iternext*/
  __pyx_methods_5asynq_10decorators_AsyncProxyDecorator, /*tp_methods*/
  0, /*tp_members*/
  0, /*tp_getset*/
  0, /*tp_base*/
  0, /*tp_dict*/
  0, /*tp_descr_get*/
  0, /*tp_descr_set*/
  0, /*tp_dictoffset*/
  __pyx_pw_5asynq_10decorators_19AsyncProxyDecorator_1__init__, /*tp_init*/
  0, /*tp_alloc*/
  __pyx_tp_new_5asynq_10decorators_AsyncProxyDecorator, /*tp_new*/
  0, /*tp_free*/
  0, /*tp_is_gc*/
  0, /*tp_bases*/
  0, /*tp_mro*/
  0, /*tp_cache*/
  0, /*tp_subclasses*/
  0, /*tp_weaklist*/
  0, /*tp_del*/
  0, /*tp_version_tag*/
  #if PY_VERSION_HEX >= 0x030400a1
  0, /*tp_finalize*/
  #endif
};
static struct __pyx_vtabstruct_5asynq_10decorators_AsyncAndSyncPairProxyDecorator __pyx_vtable_5asynq_10decorators_AsyncAndSyncPairProxyDecorator;

static PyObject *__pyx_tp_new_5asynq_10decorators_AsyncAndSyncPairProxyDecorator(PyTypeObject *t, PyObject *a, PyObject *k) {
  struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairProxyDecorator *p;
  PyObject *o = __pyx_tp_new_5asynq_10decorators_AsyncProxyDecorator(t, a, k);
  if (unlikely(!o)) return 0;
  p = ((struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairProxyDecorator *)o);
  p->__pyx_base.__pyx_base.__pyx_base.__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_5qcore_10decorators_DecoratorBase*)__pyx_vtabptr_5asynq_10decorators_AsyncAndSyncPairProxyDecorator;
  return o;
}

static PyMethodDef __pyx_methods_5asynq_10decorators_AsyncAndSyncPairProxyDecorator[] = {
  {0, 0, 0, 0}
};

static PyTypeObject __pyx_type_5asynq_10decorators_AsyncAndSyncPairProxyDecorator = {
  PyVarObject_HEAD_INIT(0, 0)
  "asynq.decorators.AsyncAndSyncPairProxyDecorator", /*tp_name*/
  sizeof(struct __pyx_obj_5asynq_10decorators_AsyncAndSyncPairProxyDecorator), /*tp_basicsize*/
  0, /*tp_itemsize*/
  __pyx_tp_dealloc_5asynq_10decorators_PureAsyncDecorator, /*tp_dealloc*/
  0, /*tp_print*/
  0, /*tp_getattr*/
  0, /*tp_setattr*/
  #if PY_MAJOR_VERSION < 3
  0, /*tp_compare*/
  #endif
  #if PY_MAJOR_VERSION >= 3
  0, /*tp_as_async*/
  #endif
  0, /*tp_repr*/
  0, /*tp_as_number*/
  0, /*tp_as_sequence*/
  0, /*tp_as_mapping*/
  0, /*tp_hash*/
  __pyx_pw_5asynq_10decorators_30AsyncAndSyncPairProxyDecorator_3__call__, /*tp_call*/
  0, /*tp_str*/
  0, /*tp_getattro*/
  0, /*tp_setattro*/
  0, /*tp_as_buffer*/
  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
  0, /*tp_doc*/
  __pyx_tp_traverse_5asynq_10decorators_PureAsyncDecorator, /*tp_traverse*/
  __pyx_tp_clear_5asynq_10decorators_PureAsyncDecorator, /*tp_clear*/
  0, /*tp_richcompare*/
  0, /*tp_weaklistoffset*/
  0, /*tp_iter*/
  0, /*tp_iternext*/
  __pyx_methods_5asynq_10decorators_AsyncAndSyncPairProxyDecorator, /*tp_methods*/
  0, /*tp_members*/
  0, /*tp_getset*/
  0, /*tp_base*/
  0, /*tp_dict*/
  0, /*tp_descr_get*/
  0, /*tp_descr_set*/
  0, /*tp_dictoffset*/
  __pyx_pw_5asynq_10decorators_30AsyncAndSyncPairProxyDecorator_1__init__, /*tp_init*/
  0, /*tp_alloc*/
  __pyx_tp_new_5asynq_10decorators_AsyncAndSyncPairProxyDecorator, /*tp_new*/
  0, /*tp_free*/
  0, /*tp_is_gc*/
  0, /*tp_bases*/
  0, /*tp_mro*/
  0, /*tp_cache*/
  0, /*tp_subclasses*/
  0, /*tp_weaklist*/
  0, /*tp_del*/
  0, /*tp_version_tag*/
  #if PY_VERSION_HEX >= 0x030400a1
  0, /*tp_finalize*/
  #endif
};

static struct __pyx_obj_5asynq_10decorators___pyx_scope_struct__lazy *__pyx_freelist_5asynq_10decorators___pyx_scope_struct__lazy[8];
static int __pyx_freecount_5asynq_10decorators___pyx_scope_struct__lazy = 0;

static PyObject *__pyx_tp_new_5asynq_10decorators___pyx_scope_struct__lazy(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
  PyObject *o;
  if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_5asynq_10decorators___pyx_scope_struct__lazy > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct__lazy)))) {
    o = (PyObject*)__pyx_freelist_5asynq_10decorators___pyx_scope_struct__lazy[--__pyx_freecount_5asynq_10decorators___pyx_scope_struct__lazy];
    memset(o, 0, sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct__lazy));
    (void) PyObject_INIT(o, t);
    PyObject_GC_Track(o);
  } else {
    o = (*t->tp_alloc)(t, 0);
    if (unlikely(!o)) return 0;
  }
  return o;
}

static void __pyx_tp_dealloc_5asynq_10decorators___pyx_scope_struct__lazy(PyObject *o) {
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct__lazy *p = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct__lazy *)o;
  PyObject_GC_UnTrack(o);
  Py_CLEAR(p->__pyx_v_fn);
  if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_5asynq_10decorators___pyx_scope_struct__lazy < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct__lazy)))) {
    __pyx_freelist_5asynq_10decorators___pyx_scope_struct__lazy[__pyx_freecount_5asynq_10decorators___pyx_scope_struct__lazy++] = ((struct __pyx_obj_5asynq_10decorators___pyx_scope_struct__lazy *)o);
  } else {
    (*Py_TYPE(o)->tp_free)(o);
  }
}

static int __pyx_tp_traverse_5asynq_10decorators___pyx_scope_struct__lazy(PyObject *o, visitproc v, void *a) {
  int e;
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct__lazy *p = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct__lazy *)o;
  if (p->__pyx_v_fn) {
    e = (*v)(p->__pyx_v_fn, a); if (e) return e;
  }
  return 0;
}

static int __pyx_tp_clear_5asynq_10decorators___pyx_scope_struct__lazy(PyObject *o) {
  PyObject* tmp;
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct__lazy *p = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct__lazy *)o;
  tmp = ((PyObject*)p->__pyx_v_fn);
  p->__pyx_v_fn = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  return 0;
}

static PyTypeObject __pyx_type_5asynq_10decorators___pyx_scope_struct__lazy = {
  PyVarObject_HEAD_INIT(0, 0)
  "asynq.decorators.__pyx_scope_struct__lazy", /*tp_name*/
  sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct__lazy), /*tp_basicsize*/
  0, /*tp_itemsize*/
  __pyx_tp_dealloc_5asynq_10decorators___pyx_scope_struct__lazy, /*tp_dealloc*/
  0, /*tp_print*/
  0, /*tp_getattr*/
  0, /*tp_setattr*/
  #if PY_MAJOR_VERSION < 3
  0, /*tp_compare*/
  #endif
  #if PY_MAJOR_VERSION >= 3
  0, /*tp_as_async*/
  #endif
  0, /*tp_repr*/
  0, /*tp_as_number*/
  0, /*tp_as_sequence*/
  0, /*tp_as_mapping*/
  0, /*tp_hash*/
  0, /*tp_call*/
  0, /*tp_str*/
  0, /*tp_getattro*/
  0, /*tp_setattro*/
  0, /*tp_as_buffer*/
  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
  0, /*tp_doc*/
  __pyx_tp_traverse_5asynq_10decorators___pyx_scope_struct__lazy, /*tp_traverse*/
  __pyx_tp_clear_5asynq_10decorators___pyx_scope_struct__lazy, /*tp_clear*/
  0, /*tp_richcompare*/
  0, /*tp_weaklistoffset*/
  0, /*tp_iter*/
  0, /*tp_iternext*/
  0, /*tp_methods*/
  0, /*tp_members*/
  0, /*tp_getset*/
  0, /*tp_base*/
  0, /*tp_dict*/
  0, /*tp_descr_get*/
  0, /*tp_descr_set*/
  0, /*tp_dictoffset*/
  0, /*tp_init*/
  0, /*tp_alloc*/
  __pyx_tp_new_5asynq_10decorators___pyx_scope_struct__lazy, /*tp_new*/
  0, /*tp_free*/
  0, /*tp_is_gc*/
  0, /*tp_bases*/
  0, /*tp_mro*/
  0, /*tp_cache*/
  0, /*tp_subclasses*/
  0, /*tp_weaklist*/
  0, /*tp_del*/
  0, /*tp_version_tag*/
  #if PY_VERSION_HEX >= 0x030400a1
  0, /*tp_finalize*/
  #endif
};

static struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_1_new_fn *__pyx_freelist_5asynq_10decorators___pyx_scope_struct_1_new_fn[8];
static int __pyx_freecount_5asynq_10decorators___pyx_scope_struct_1_new_fn = 0;

static PyObject *__pyx_tp_new_5asynq_10decorators___pyx_scope_struct_1_new_fn(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
  PyObject *o;
  if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_5asynq_10decorators___pyx_scope_struct_1_new_fn > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_1_new_fn)))) {
    o = (PyObject*)__pyx_freelist_5asynq_10decorators___pyx_scope_struct_1_new_fn[--__pyx_freecount_5asynq_10decorators___pyx_scope_struct_1_new_fn];
    memset(o, 0, sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_1_new_fn));
    (void) PyObject_INIT(o, t);
    PyObject_GC_Track(o);
  } else {
    o = (*t->tp_alloc)(t, 0);
    if (unlikely(!o)) return 0;
  }
  return o;
}

static void __pyx_tp_dealloc_5asynq_10decorators___pyx_scope_struct_1_new_fn(PyObject *o) {
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_1_new_fn *p = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_1_new_fn *)o;
  PyObject_GC_UnTrack(o);
  Py_CLEAR(p->__pyx_outer_scope);
  Py_CLEAR(p->__pyx_v_args);
  Py_CLEAR(p->__pyx_v_kwargs);
  if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_5asynq_10decorators___pyx_scope_struct_1_new_fn < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_1_new_fn)))) {
    __pyx_freelist_5asynq_10decorators___pyx_scope_struct_1_new_fn[__pyx_freecount_5asynq_10decorators___pyx_scope_struct_1_new_fn++] = ((struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_1_new_fn *)o);
  } else {
    (*Py_TYPE(o)->tp_free)(o);
  }
}

static int __pyx_tp_traverse_5asynq_10decorators___pyx_scope_struct_1_new_fn(PyObject *o, visitproc v, void *a) {
  int e;
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_1_new_fn *p = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_1_new_fn *)o;
  if (p->__pyx_outer_scope) {
    e = (*v)(((PyObject*)p->__pyx_outer_scope), a); if (e) return e;
  }
  if (p->__pyx_v_args) {
    e = (*v)(p->__pyx_v_args, a); if (e) return e;
  }
  if (p->__pyx_v_kwargs) {
    e = (*v)(p->__pyx_v_kwargs, a); if (e) return e;
  }
  return 0;
}

static int __pyx_tp_clear_5asynq_10decorators___pyx_scope_struct_1_new_fn(PyObject *o) {
  PyObject* tmp;
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_1_new_fn *p = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_1_new_fn *)o;
  tmp = ((PyObject*)p->__pyx_outer_scope);
  p->__pyx_outer_scope = ((struct __pyx_obj_5asynq_10decorators___pyx_scope_struct__lazy *)Py_None); Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_args);
  p->__pyx_v_args = ((PyObject*)Py_None); Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_kwargs);
  p->__pyx_v_kwargs = ((PyObject*)Py_None); Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  return 0;
}

static PyTypeObject __pyx_type_5asynq_10decorators___pyx_scope_struct_1_new_fn = {
  PyVarObject_HEAD_INIT(0, 0)
  "asynq.decorators.__pyx_scope_struct_1_new_fn", /*tp_name*/
  sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_1_new_fn), /*tp_basicsize*/
  0, /*tp_itemsize*/
  __pyx_tp_dealloc_5asynq_10decorators___pyx_scope_struct_1_new_fn, /*tp_dealloc*/
  0, /*tp_print*/
  0, /*tp_getattr*/
  0, /*tp_setattr*/
  #if PY_MAJOR_VERSION < 3
  0, /*tp_compare*/
  #endif
  #if PY_MAJOR_VERSION >= 3
  0, /*tp_as_async*/
  #endif
  0, /*tp_repr*/
  0, /*tp_as_number*/
  0, /*tp_as_sequence*/
  0, /*tp_as_mapping*/
  0, /*tp_hash*/
  0, /*tp_call*/
  0, /*tp_str*/
  0, /*tp_getattro*/
  0, /*tp_setattro*/
  0, /*tp_as_buffer*/
  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
  0, /*tp_doc*/
  __pyx_tp_traverse_5asynq_10decorators___pyx_scope_struct_1_new_fn, /*tp_traverse*/
  __pyx_tp_clear_5asynq_10decorators___pyx_scope_struct_1_new_fn, /*tp_clear*/
  0, /*tp_richcompare*/
  0, /*tp_weaklistoffset*/
  0, /*tp_iter*/
  0, /*tp_iternext*/
  0, /*tp_methods*/
  0, /*tp_members*/
  0, /*tp_getset*/
  0, /*tp_base*/
  0, /*tp_dict*/
  0, /*tp_descr_get*/
  0, /*tp_descr_set*/
  0, /*tp_dictoffset*/
  0, /*tp_init*/
  0, /*tp_alloc*/
  __pyx_tp_new_5asynq_10decorators___pyx_scope_struct_1_new_fn, /*tp_new*/
  0, /*tp_free*/
  0, /*tp_is_gc*/
  0, /*tp_bases*/
  0, /*tp_mro*/
  0, /*tp_cache*/
  0, /*tp_subclasses*/
  0, /*tp_weaklist*/
  0, /*tp_del*/
  0, /*tp_version_tag*/
  #if PY_VERSION_HEX >= 0x030400a1
  0, /*tp_finalize*/
  #endif
};

static struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_2_get_async_fn *__pyx_freelist_5asynq_10decorators___pyx_scope_struct_2_get_async_fn[8];
static int __pyx_freecount_5asynq_10decorators___pyx_scope_struct_2_get_async_fn = 0;

static PyObject *__pyx_tp_new_5asynq_10decorators___pyx_scope_struct_2_get_async_fn(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
  PyObject *o;
  if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_5asynq_10decorators___pyx_scope_struct_2_get_async_fn > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_2_get_async_fn)))) {
    o = (PyObject*)__pyx_freelist_5asynq_10decorators___pyx_scope_struct_2_get_async_fn[--__pyx_freecount_5asynq_10decorators___pyx_scope_struct_2_get_async_fn];
    memset(o, 0, sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_2_get_async_fn));
    (void) PyObject_INIT(o, t);
    PyObject_GC_Track(o);
  } else {
    o = (*t->tp_alloc)(t, 0);
    if (unlikely(!o)) return 0;
  }
  return o;
}

static void __pyx_tp_dealloc_5asynq_10decorators___pyx_scope_struct_2_get_async_fn(PyObject *o) {
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_2_get_async_fn *p = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_2_get_async_fn *)o;
  PyObject_GC_UnTrack(o);
  Py_CLEAR(p->__pyx_v_fn);
  if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_5asynq_10decorators___pyx_scope_struct_2_get_async_fn < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_2_get_async_fn)))) {
    __pyx_freelist_5asynq_10decorators___pyx_scope_struct_2_get_async_fn[__pyx_freecount_5asynq_10decorators___pyx_scope_struct_2_get_async_fn++] = ((struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_2_get_async_fn *)o);
  } else {
    (*Py_TYPE(o)->tp_free)(o);
  }
}

static int __pyx_tp_traverse_5asynq_10decorators___pyx_scope_struct_2_get_async_fn(PyObject *o, visitproc v, void *a) {
  int e;
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_2_get_async_fn *p = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_2_get_async_fn *)o;
  if (p->__pyx_v_fn) {
    e = (*v)(p->__pyx_v_fn, a); if (e) return e;
  }
  return 0;
}

static int __pyx_tp_clear_5asynq_10decorators___pyx_scope_struct_2_get_async_fn(PyObject *o) {
  PyObject* tmp;
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_2_get_async_fn *p = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_2_get_async_fn *)o;
  tmp = ((PyObject*)p->__pyx_v_fn);
  p->__pyx_v_fn = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  return 0;
}

static PyTypeObject __pyx_type_5asynq_10decorators___pyx_scope_struct_2_get_async_fn = {
  PyVarObject_HEAD_INIT(0, 0)
  "asynq.decorators.__pyx_scope_struct_2_get_async_fn", /*tp_name*/
  sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_2_get_async_fn), /*tp_basicsize*/
  0, /*tp_itemsize*/
  __pyx_tp_dealloc_5asynq_10decorators___pyx_scope_struct_2_get_async_fn, /*tp_dealloc*/
  0, /*tp_print*/
  0, /*tp_getattr*/
  0, /*tp_setattr*/
  #if PY_MAJOR_VERSION < 3
  0, /*tp_compare*/
  #endif
  #if PY_MAJOR_VERSION >= 3
  0, /*tp_as_async*/
  #endif
  0, /*tp_repr*/
  0, /*tp_as_number*/
  0, /*tp_as_sequence*/
  0, /*tp_as_mapping*/
  0, /*tp_hash*/
  0, /*tp_call*/
  0, /*tp_str*/
  0, /*tp_getattro*/
  0, /*tp_setattro*/
  0, /*tp_as_buffer*/
  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
  0, /*tp_doc*/
  __pyx_tp_traverse_5asynq_10decorators___pyx_scope_struct_2_get_async_fn, /*tp_traverse*/
  __pyx_tp_clear_5asynq_10decorators___pyx_scope_struct_2_get_async_fn, /*tp_clear*/
  0, /*tp_richcompare*/
  0, /*tp_weaklistoffset*/
  0, /*tp_iter*/
  0, /*tp_iternext*/
  0, /*tp_methods*/
  0, /*tp_members*/
  0, /*tp_getset*/
  0, /*tp_base*/
  0, /*tp_dict*/
  0, /*tp_descr_get*/
  0, /*tp_descr_set*/
  0, /*tp_dictoffset*/
  0, /*tp_init*/
  0, /*tp_alloc*/
  __pyx_tp_new_5asynq_10decorators___pyx_scope_struct_2_get_async_fn, /*tp_new*/
  0, /*tp_free*/
  0, /*tp_is_gc*/
  0, /*tp_bases*/
  0, /*tp_mro*/
  0, /*tp_cache*/
  0, /*tp_subclasses*/
  0, /*tp_weaklist*/
  0, /*tp_del*/
  0, /*tp_version_tag*/
  #if PY_VERSION_HEX >= 0x030400a1
  0, /*tp_finalize*/
  #endif
};

static struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper *__pyx_freelist_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper[8];
static int __pyx_freecount_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper = 0;

static PyObject *__pyx_tp_new_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
  PyObject *o;
  if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper)))) {
    o = (PyObject*)__pyx_freelist_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper[--__pyx_freecount_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper];
    memset(o, 0, sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper));
    (void) PyObject_INIT(o, t);
    PyObject_GC_Track(o);
  } else {
    o = (*t->tp_alloc)(t, 0);
    if (unlikely(!o)) return 0;
  }
  return o;
}

static void __pyx_tp_dealloc_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper(PyObject *o) {
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper *p = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper *)o;
  PyObject_GC_UnTrack(o);
  Py_CLEAR(p->__pyx_v_args);
  Py_CLEAR(p->__pyx_v_kwargs);
  Py_CLEAR(p->__pyx_v_self);
  if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper)))) {
    __pyx_freelist_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper[__pyx_freecount_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper++] = ((struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper *)o);
  } else {
    (*Py_TYPE(o)->tp_free)(o);
  }
}

static int __pyx_tp_traverse_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper(PyObject *o, visitproc v, void *a) {
  int e;
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper *p = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper *)o;
  if (p->__pyx_v_args) {
    e = (*v)(p->__pyx_v_args, a); if (e) return e;
  }
  if (p->__pyx_v_kwargs) {
    e = (*v)(p->__pyx_v_kwargs, a); if (e) return e;
  }
  if (p->__pyx_v_self) {
    e = (*v)(((PyObject*)p->__pyx_v_self), a); if (e) return e;
  }
  return 0;
}

static int __pyx_tp_clear_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper(PyObject *o) {
  PyObject* tmp;
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper *p = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper *)o;
  tmp = ((PyObject*)p->__pyx_v_args);
  p->__pyx_v_args = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_kwargs);
  p->__pyx_v_kwargs = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_self);
  p->__pyx_v_self = ((struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *)Py_None); Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  return 0;
}

static PyTypeObject __pyx_type_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper = {
  PyVarObject_HEAD_INIT(0, 0)
  "asynq.decorators.__pyx_scope_struct_3__fn_wrapper", /*tp_name*/
  sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper), /*tp_basicsize*/
  0, /*tp_itemsize*/
  __pyx_tp_dealloc_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper, /*tp_dealloc*/
  0, /*tp_print*/
  0, /*tp_getattr*/
  0, /*tp_setattr*/
  #if PY_MAJOR_VERSION < 3
  0, /*tp_compare*/
  #endif
  #if PY_MAJOR_VERSION >= 3
  0, /*tp_as_async*/
  #endif
  0, /*tp_repr*/
  0, /*tp_as_number*/
  0, /*tp_as_sequence*/
  0, /*tp_as_mapping*/
  0, /*tp_hash*/
  0, /*tp_call*/
  0, /*tp_str*/
  0, /*tp_getattro*/
  0, /*tp_setattro*/
  0, /*tp_as_buffer*/
  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
  0, /*tp_doc*/
  __pyx_tp_traverse_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper, /*tp_traverse*/
  __pyx_tp_clear_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper, /*tp_clear*/
  0, /*tp_richcompare*/
  0, /*tp_weaklistoffset*/
  0, /*tp_iter*/
  0, /*tp_iternext*/
  0, /*tp_methods*/
  0, /*tp_members*/
  0, /*tp_getset*/
  0, /*tp_base*/
  0, /*tp_dict*/
  0, /*tp_descr_get*/
  0, /*tp_descr_set*/
  0, /*tp_dictoffset*/
  0, /*tp_init*/
  0, /*tp_alloc*/
  __pyx_tp_new_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper, /*tp_new*/
  0, /*tp_free*/
  0, /*tp_is_gc*/
  0, /*tp_bases*/
  0, /*tp_mro*/
  0, /*tp_cache*/
  0, /*tp_subclasses*/
  0, /*tp_weaklist*/
  0, /*tp_del*/
  0, /*tp_version_tag*/
  #if PY_VERSION_HEX >= 0x030400a1
  0, /*tp_finalize*/
  #endif
};

static struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_4_async *__pyx_freelist_5asynq_10decorators___pyx_scope_struct_4_async[8];
static int __pyx_freecount_5asynq_10decorators___pyx_scope_struct_4_async = 0;

static PyObject *__pyx_tp_new_5asynq_10decorators___pyx_scope_struct_4_async(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
  PyObject *o;
  if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_5asynq_10decorators___pyx_scope_struct_4_async > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_4_async)))) {
    o = (PyObject*)__pyx_freelist_5asynq_10decorators___pyx_scope_struct_4_async[--__pyx_freecount_5asynq_10decorators___pyx_scope_struct_4_async];
    memset(o, 0, sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_4_async));
    (void) PyObject_INIT(o, t);
    PyObject_GC_Track(o);
  } else {
    o = (*t->tp_alloc)(t, 0);
    if (unlikely(!o)) return 0;
  }
  return o;
}

static void __pyx_tp_dealloc_5asynq_10decorators___pyx_scope_struct_4_async(PyObject *o) {
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_4_async *p = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_4_async *)o;
  PyObject_GC_UnTrack(o);
  Py_CLEAR(p->__pyx_v_cls);
  Py_CLEAR(p->__pyx_v_kwargs);
  Py_CLEAR(p->__pyx_v_pure);
  Py_CLEAR(p->__pyx_v_sync_fn);
  if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_5asynq_10decorators___pyx_scope_struct_4_async < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_4_async)))) {
    __pyx_freelist_5asynq_10decorators___pyx_scope_struct_4_async[__pyx_freecount_5asynq_10decorators___pyx_scope_struct_4_async++] = ((struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_4_async *)o);
  } else {
    (*Py_TYPE(o)->tp_free)(o);
  }
}

static int __pyx_tp_traverse_5asynq_10decorators___pyx_scope_struct_4_async(PyObject *o, visitproc v, void *a) {
  int e;
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_4_async *p = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_4_async *)o;
  if (p->__pyx_v_cls) {
    e = (*v)(p->__pyx_v_cls, a); if (e) return e;
  }
  if (p->__pyx_v_kwargs) {
    e = (*v)(p->__pyx_v_kwargs, a); if (e) return e;
  }
  if (p->__pyx_v_pure) {
    e = (*v)(p->__pyx_v_pure, a); if (e) return e;
  }
  if (p->__pyx_v_sync_fn) {
    e = (*v)(p->__pyx_v_sync_fn, a); if (e) return e;
  }
  return 0;
}

static int __pyx_tp_clear_5asynq_10decorators___pyx_scope_struct_4_async(PyObject *o) {
  PyObject* tmp;
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_4_async *p = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_4_async *)o;
  tmp = ((PyObject*)p->__pyx_v_cls);
  p->__pyx_v_cls = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_kwargs);
  p->__pyx_v_kwargs = ((PyObject*)Py_None); Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_pure);
  p->__pyx_v_pure = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_sync_fn);
  p->__pyx_v_sync_fn = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  return 0;
}

static PyTypeObject __pyx_type_5asynq_10decorators___pyx_scope_struct_4_async = {
  PyVarObject_HEAD_INIT(0, 0)
  "asynq.decorators.__pyx_scope_struct_4_async", /*tp_name*/
  sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_4_async), /*tp_basicsize*/
  0, /*tp_itemsize*/
  __pyx_tp_dealloc_5asynq_10decorators___pyx_scope_struct_4_async, /*tp_dealloc*/
  0, /*tp_print*/
  0, /*tp_getattr*/
  0, /*tp_setattr*/
  #if PY_MAJOR_VERSION < 3
  0, /*tp_compare*/
  #endif
  #if PY_MAJOR_VERSION >= 3
  0, /*tp_as_async*/
  #endif
  0, /*tp_repr*/
  0, /*tp_as_number*/
  0, /*tp_as_sequence*/
  0, /*tp_as_mapping*/
  0, /*tp_hash*/
  0, /*tp_call*/
  0, /*tp_str*/
  0, /*tp_getattro*/
  0, /*tp_setattro*/
  0, /*tp_as_buffer*/
  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
  0, /*tp_doc*/
  __pyx_tp_traverse_5asynq_10decorators___pyx_scope_struct_4_async, /*tp_traverse*/
  __pyx_tp_clear_5asynq_10decorators___pyx_scope_struct_4_async, /*tp_clear*/
  0, /*tp_richcompare*/
  0, /*tp_weaklistoffset*/
  0, /*tp_iter*/
  0, /*tp_iternext*/
  0, /*tp_methods*/
  0, /*tp_members*/
  0, /*tp_getset*/
  0, /*tp_base*/
  0, /*tp_dict*/
  0, /*tp_descr_get*/
  0, /*tp_descr_set*/
  0, /*tp_dictoffset*/
  0, /*tp_init*/
  0, /*tp_alloc*/
  __pyx_tp_new_5asynq_10decorators___pyx_scope_struct_4_async, /*tp_new*/
  0, /*tp_free*/
  0, /*tp_is_gc*/
  0, /*tp_bases*/
  0, /*tp_mro*/
  0, /*tp_cache*/
  0, /*tp_subclasses*/
  0, /*tp_weaklist*/
  0, /*tp_del*/
  0, /*tp_version_tag*/
  #if PY_VERSION_HEX >= 0x030400a1
  0, /*tp_finalize*/
  #endif
};

static struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_5_async_proxy *__pyx_freelist_5asynq_10decorators___pyx_scope_struct_5_async_proxy[8];
static int __pyx_freecount_5asynq_10decorators___pyx_scope_struct_5_async_proxy = 0;

static PyObject *__pyx_tp_new_5asynq_10decorators___pyx_scope_struct_5_async_proxy(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
  PyObject *o;
  if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_5asynq_10decorators___pyx_scope_struct_5_async_proxy > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_5_async_proxy)))) {
    o = (PyObject*)__pyx_freelist_5asynq_10decorators___pyx_scope_struct_5_async_proxy[--__pyx_freecount_5asynq_10decorators___pyx_scope_struct_5_async_proxy];
    memset(o, 0, sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_5_async_proxy));
    (void) PyObject_INIT(o, t);
    PyObject_GC_Track(o);
  } else {
    o = (*t->tp_alloc)(t, 0);
    if (unlikely(!o)) return 0;
  }
  return o;
}

static void __pyx_tp_dealloc_5asynq_10decorators___pyx_scope_struct_5_async_proxy(PyObject *o) {
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_5_async_proxy *p = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_5_async_proxy *)o;
  PyObject_GC_UnTrack(o);
  Py_CLEAR(p->__pyx_v_pure);
  Py_CLEAR(p->__pyx_v_sync_fn);
  if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_5asynq_10decorators___pyx_scope_struct_5_async_proxy < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_5_async_proxy)))) {
    __pyx_freelist_5asynq_10decorators___pyx_scope_struct_5_async_proxy[__pyx_freecount_5asynq_10decorators___pyx_scope_struct_5_async_proxy++] = ((struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_5_async_proxy *)o);
  } else {
    (*Py_TYPE(o)->tp_free)(o);
  }
}

static int __pyx_tp_traverse_5asynq_10decorators___pyx_scope_struct_5_async_proxy(PyObject *o, visitproc v, void *a) {
  int e;
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_5_async_proxy *p = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_5_async_proxy *)o;
  if (p->__pyx_v_pure) {
    e = (*v)(p->__pyx_v_pure, a); if (e) return e;
  }
  if (p->__pyx_v_sync_fn) {
    e = (*v)(p->__pyx_v_sync_fn, a); if (e) return e;
  }
  return 0;
}

static int __pyx_tp_clear_5asynq_10decorators___pyx_scope_struct_5_async_proxy(PyObject *o) {
  PyObject* tmp;
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_5_async_proxy *p = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_5_async_proxy *)o;
  tmp = ((PyObject*)p->__pyx_v_pure);
  p->__pyx_v_pure = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_sync_fn);
  p->__pyx_v_sync_fn = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  return 0;
}

static PyTypeObject __pyx_type_5asynq_10decorators___pyx_scope_struct_5_async_proxy = {
  PyVarObject_HEAD_INIT(0, 0)
  "asynq.decorators.__pyx_scope_struct_5_async_proxy", /*tp_name*/
  sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_5_async_proxy), /*tp_basicsize*/
  0, /*tp_itemsize*/
  __pyx_tp_dealloc_5asynq_10decorators___pyx_scope_struct_5_async_proxy, /*tp_dealloc*/
  0, /*tp_print*/
  0, /*tp_getattr*/
  0, /*tp_setattr*/
  #if PY_MAJOR_VERSION < 3
  0, /*tp_compare*/
  #endif
  #if PY_MAJOR_VERSION >= 3
  0, /*tp_as_async*/
  #endif
  0, /*tp_repr*/
  0, /*tp_as_number*/
  0, /*tp_as_sequence*/
  0, /*tp_as_mapping*/
  0, /*tp_hash*/
  0, /*tp_call*/
  0, /*tp_str*/
  0, /*tp_getattro*/
  0, /*tp_setattro*/
  0, /*tp_as_buffer*/
  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
  0, /*tp_doc*/
  __pyx_tp_traverse_5asynq_10decorators___pyx_scope_struct_5_async_proxy, /*tp_traverse*/
  __pyx_tp_clear_5asynq_10decorators___pyx_scope_struct_5_async_proxy, /*tp_clear*/
  0, /*tp_richcompare*/
  0, /*tp_weaklistoffset*/
  0, /*tp_iter*/
  0, /*tp_iternext*/
  0, /*tp_methods*/
  0, /*tp_members*/
  0, /*tp_getset*/
  0, /*tp_base*/
  0, /*tp_dict*/
  0, /*tp_descr_get*/
  0, /*tp_descr_set*/
  0, /*tp_dictoffset*/
  0, /*tp_init*/
  0, /*tp_alloc*/
  __pyx_tp_new_5asynq_10decorators___pyx_scope_struct_5_async_proxy, /*tp_new*/
  0, /*tp_free*/
  0, /*tp_is_gc*/
  0, /*tp_bases*/
  0, /*tp_mro*/
  0, /*tp_cache*/
  0, /*tp_subclasses*/
  0, /*tp_weaklist*/
  0, /*tp_del*/
  0, /*tp_version_tag*/
  #if PY_VERSION_HEX >= 0x030400a1
  0, /*tp_finalize*/
  #endif
};

static struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_6_cached *__pyx_freelist_5asynq_10decorators___pyx_scope_struct_6_cached[8];
static int __pyx_freecount_5asynq_10decorators___pyx_scope_struct_6_cached = 0;

static PyObject *__pyx_tp_new_5asynq_10decorators___pyx_scope_struct_6_cached(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
  PyObject *o;
  if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_5asynq_10decorators___pyx_scope_struct_6_cached > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_6_cached)))) {
    o = (PyObject*)__pyx_freelist_5asynq_10decorators___pyx_scope_struct_6_cached[--__pyx_freecount_5asynq_10decorators___pyx_scope_struct_6_cached];
    memset(o, 0, sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_6_cached));
    (void) PyObject_INIT(o, t);
    PyObject_GC_Track(o);
  } else {
    o = (*t->tp_alloc)(t, 0);
    if (unlikely(!o)) return 0;
  }
  return o;
}

static void __pyx_tp_dealloc_5asynq_10decorators___pyx_scope_struct_6_cached(PyObject *o) {
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_6_cached *p = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_6_cached *)o;
  PyObject_GC_UnTrack(o);
  Py_CLEAR(p->__pyx_v_cache);
  if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_5asynq_10decorators___pyx_scope_struct_6_cached < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_6_cached)))) {
    __pyx_freelist_5asynq_10decorators___pyx_scope_struct_6_cached[__pyx_freecount_5asynq_10decorators___pyx_scope_struct_6_cached++] = ((struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_6_cached *)o);
  } else {
    (*Py_TYPE(o)->tp_free)(o);
  }
}

static int __pyx_tp_traverse_5asynq_10decorators___pyx_scope_struct_6_cached(PyObject *o, visitproc v, void *a) {
  int e;
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_6_cached *p = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_6_cached *)o;
  if (p->__pyx_v_cache) {
    e = (*v)(p->__pyx_v_cache, a); if (e) return e;
  }
  return 0;
}

static int __pyx_tp_clear_5asynq_10decorators___pyx_scope_struct_6_cached(PyObject *o) {
  PyObject* tmp;
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_6_cached *p = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_6_cached *)o;
  tmp = ((PyObject*)p->__pyx_v_cache);
  p->__pyx_v_cache = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  return 0;
}

static PyTypeObject __pyx_type_5asynq_10decorators___pyx_scope_struct_6_cached = {
  PyVarObject_HEAD_INIT(0, 0)
  "asynq.decorators.__pyx_scope_struct_6_cached", /*tp_name*/
  sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_6_cached), /*tp_basicsize*/
  0, /*tp_itemsize*/
  __pyx_tp_dealloc_5asynq_10decorators___pyx_scope_struct_6_cached, /*tp_dealloc*/
  0, /*tp_print*/
  0, /*tp_getattr*/
  0, /*tp_setattr*/
  #if PY_MAJOR_VERSION < 3
  0, /*tp_compare*/
  #endif
  #if PY_MAJOR_VERSION >= 3
  0, /*tp_as_async*/
  #endif
  0, /*tp_repr*/
  0, /*tp_as_number*/
  0, /*tp_as_sequence*/
  0, /*tp_as_mapping*/
  0, /*tp_hash*/
  0, /*tp_call*/
  0, /*tp_str*/
  0, /*tp_getattro*/
  0, /*tp_setattro*/
  0, /*tp_as_buffer*/
  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
  0, /*tp_doc*/
  __pyx_tp_traverse_5asynq_10decorators___pyx_scope_struct_6_cached, /*tp_traverse*/
  __pyx_tp_clear_5asynq_10decorators___pyx_scope_struct_6_cached, /*tp_clear*/
  0, /*tp_richcompare*/
  0, /*tp_weaklistoffset*/
  0, /*tp_iter*/
  0, /*tp_iternext*/
  0, /*tp_methods*/
  0, /*tp_members*/
  0, /*tp_getset*/
  0, /*tp_base*/
  0, /*tp_dict*/
  0, /*tp_descr_get*/
  0, /*tp_descr_set*/
  0, /*tp_dictoffset*/
  0, /*tp_init*/
  0, /*tp_alloc*/
  __pyx_tp_new_5asynq_10decorators___pyx_scope_struct_6_cached, /*tp_new*/
  0, /*tp_free*/
  0, /*tp_is_gc*/
  0, /*tp_bases*/
  0, /*tp_mro*/
  0, /*tp_cache*/
  0, /*tp_subclasses*/
  0, /*tp_weaklist*/
  0, /*tp_del*/
  0, /*tp_version_tag*/
  #if PY_VERSION_HEX >= 0x030400a1
  0, /*tp_finalize*/
  #endif
};

static struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_7_decorate *__pyx_freelist_5asynq_10decorators___pyx_scope_struct_7_decorate[8];
static int __pyx_freecount_5asynq_10decorators___pyx_scope_struct_7_decorate = 0;

static PyObject *__pyx_tp_new_5asynq_10decorators___pyx_scope_struct_7_decorate(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
  PyObject *o;
  if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_5asynq_10decorators___pyx_scope_struct_7_decorate > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_7_decorate)))) {
    o = (PyObject*)__pyx_freelist_5asynq_10decorators___pyx_scope_struct_7_decorate[--__pyx_freecount_5asynq_10decorators___pyx_scope_struct_7_decorate];
    memset(o, 0, sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_7_decorate));
    (void) PyObject_INIT(o, t);
    PyObject_GC_Track(o);
  } else {
    o = (*t->tp_alloc)(t, 0);
    if (unlikely(!o)) return 0;
  }
  return o;
}

static void __pyx_tp_dealloc_5asynq_10decorators___pyx_scope_struct_7_decorate(PyObject *o) {
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_7_decorate *p = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_7_decorate *)o;
  PyObject_GC_UnTrack(o);
  Py_CLEAR(p->__pyx_outer_scope);
  Py_CLEAR(p->__pyx_v_fn);
  Py_CLEAR(p->__pyx_v_original_fn);
  if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_5asynq_10decorators___pyx_scope_struct_7_decorate < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_7_decorate)))) {
    __pyx_freelist_5asynq_10decorators___pyx_scope_struct_7_decorate[__pyx_freecount_5asynq_10decorators___pyx_scope_struct_7_decorate++] = ((struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_7_decorate *)o);
  } else {
    (*Py_TYPE(o)->tp_free)(o);
  }
}

static int __pyx_tp_traverse_5asynq_10decorators___pyx_scope_struct_7_decorate(PyObject *o, visitproc v, void *a) {
  int e;
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_7_decorate *p = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_7_decorate *)o;
  if (p->__pyx_outer_scope) {
    e = (*v)(((PyObject*)p->__pyx_outer_scope), a); if (e) return e;
  }
  if (p->__pyx_v_fn) {
    e = (*v)(p->__pyx_v_fn, a); if (e) return e;
  }
  if (p->__pyx_v_original_fn) {
    e = (*v)(p->__pyx_v_original_fn, a); if (e) return e;
  }
  return 0;
}

static int __pyx_tp_clear_5asynq_10decorators___pyx_scope_struct_7_decorate(PyObject *o) {
  PyObject* tmp;
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_7_decorate *p = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_7_decorate *)o;
  tmp = ((PyObject*)p->__pyx_outer_scope);
  p->__pyx_outer_scope = ((struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_6_cached *)Py_None); Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_fn);
  p->__pyx_v_fn = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_original_fn);
  p->__pyx_v_original_fn = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  return 0;
}

static PyTypeObject __pyx_type_5asynq_10decorators___pyx_scope_struct_7_decorate = {
  PyVarObject_HEAD_INIT(0, 0)
  "asynq.decorators.__pyx_scope_struct_7_decorate", /*tp_name*/
  sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_7_decorate), /*tp_basicsize*/
  0, /*tp_itemsize*/
  __pyx_tp_dealloc_5asynq_10decorators___pyx_scope_struct_7_decorate, /*tp_dealloc*/
  0, /*tp_print*/
  0, /*tp_getattr*/
  0, /*tp_setattr*/
  #if PY_MAJOR_VERSION < 3
  0, /*tp_compare*/
  #endif
  #if PY_MAJOR_VERSION >= 3
  0, /*tp_as_async*/
  #endif
  0, /*tp_repr*/
  0, /*tp_as_number*/
  0, /*tp_as_sequence*/
  0, /*tp_as_mapping*/
  0, /*tp_hash*/
  0, /*tp_call*/
  0, /*tp_str*/
  0, /*tp_getattro*/
  0, /*tp_setattro*/
  0, /*tp_as_buffer*/
  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
  0, /*tp_doc*/
  __pyx_tp_traverse_5asynq_10decorators___pyx_scope_struct_7_decorate, /*tp_traverse*/
  __pyx_tp_clear_5asynq_10decorators___pyx_scope_struct_7_decorate, /*tp_clear*/
  0, /*tp_richcompare*/
  0, /*tp_weaklistoffset*/
  0, /*tp_iter*/
  0, /*tp_iternext*/
  0, /*tp_methods*/
  0, /*tp_members*/
  0, /*tp_getset*/
  0, /*tp_base*/
  0, /*tp_dict*/
  0, /*tp_descr_get*/
  0, /*tp_descr_set*/
  0, /*tp_dictoffset*/
  0, /*tp_init*/
  0, /*tp_alloc*/
  __pyx_tp_new_5asynq_10decorators___pyx_scope_struct_7_decorate, /*tp_new*/
  0, /*tp_free*/
  0, /*tp_is_gc*/
  0, /*tp_bases*/
  0, /*tp_mro*/
  0, /*tp_cache*/
  0, /*tp_subclasses*/
  0, /*tp_weaklist*/
  0, /*tp_del*/
  0, /*tp_version_tag*/
  #if PY_VERSION_HEX >= 0x030400a1
  0, /*tp_finalize*/
  #endif
};

static struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_8__cached_impl *__pyx_freelist_5asynq_10decorators___pyx_scope_struct_8__cached_impl[8];
static int __pyx_freecount_5asynq_10decorators___pyx_scope_struct_8__cached_impl = 0;

static PyObject *__pyx_tp_new_5asynq_10decorators___pyx_scope_struct_8__cached_impl(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
  PyObject *o;
  if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_5asynq_10decorators___pyx_scope_struct_8__cached_impl > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_8__cached_impl)))) {
    o = (PyObject*)__pyx_freelist_5asynq_10decorators___pyx_scope_struct_8__cached_impl[--__pyx_freecount_5asynq_10decorators___pyx_scope_struct_8__cached_impl];
    memset(o, 0, sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_8__cached_impl));
    (void) PyObject_INIT(o, t);
    PyObject_GC_Track(o);
  } else {
    o = (*t->tp_alloc)(t, 0);
    if (unlikely(!o)) return 0;
  }
  return o;
}

static void __pyx_tp_dealloc_5asynq_10decorators___pyx_scope_struct_8__cached_impl(PyObject *o) {
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_8__cached_impl *p = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_8__cached_impl *)o;
  PyObject_GC_UnTrack(o);
  Py_CLEAR(p->__pyx_v_args);
  Py_CLEAR(p->__pyx_v_cache);
  Py_CLEAR(p->__pyx_v_cached);
  Py_CLEAR(p->__pyx_v_fn);
  Py_CLEAR(p->__pyx_v_key);
  Py_CLEAR(p->__pyx_v_kwargs);
  Py_CLEAR(p->__pyx_v_original_fn);
  Py_CLEAR(p->__pyx_v_result);
  if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_5asynq_10decorators___pyx_scope_struct_8__cached_impl < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_8__cached_impl)))) {
    __pyx_freelist_5asynq_10decorators___pyx_scope_struct_8__cached_impl[__pyx_freecount_5asynq_10decorators___pyx_scope_struct_8__cached_impl++] = ((struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_8__cached_impl *)o);
  } else {
    (*Py_TYPE(o)->tp_free)(o);
  }
}

static int __pyx_tp_traverse_5asynq_10decorators___pyx_scope_struct_8__cached_impl(PyObject *o, visitproc v, void *a) {
  int e;
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_8__cached_impl *p = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_8__cached_impl *)o;
  if (p->__pyx_v_args) {
    e = (*v)(p->__pyx_v_args, a); if (e) return e;
  }
  if (p->__pyx_v_cache) {
    e = (*v)(p->__pyx_v_cache, a); if (e) return e;
  }
  if (p->__pyx_v_cached) {
    e = (*v)(p->__pyx_v_cached, a); if (e) return e;
  }
  if (p->__pyx_v_fn) {
    e = (*v)(p->__pyx_v_fn, a); if (e) return e;
  }
  if (p->__pyx_v_key) {
    e = (*v)(p->__pyx_v_key, a); if (e) return e;
  }
  if (p->__pyx_v_kwargs) {
    e = (*v)(p->__pyx_v_kwargs, a); if (e) return e;
  }
  if (p->__pyx_v_original_fn) {
    e = (*v)(p->__pyx_v_original_fn, a); if (e) return e;
  }
  if (p->__pyx_v_result) {
    e = (*v)(p->__pyx_v_result, a); if (e) return e;
  }
  return 0;
}

static int __pyx_tp_clear_5asynq_10decorators___pyx_scope_struct_8__cached_impl(PyObject *o) {
  PyObject* tmp;
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_8__cached_impl *p = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_8__cached_impl *)o;
  tmp = ((PyObject*)p->__pyx_v_args);
  p->__pyx_v_args = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_cache);
  p->__pyx_v_cache = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_cached);
  p->__pyx_v_cached = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_fn);
  p->__pyx_v_fn = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_key);
  p->__pyx_v_key = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_kwargs);
  p->__pyx_v_kwargs = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_original_fn);
  p->__pyx_v_original_fn = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_result);
  p->__pyx_v_result = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  return 0;
}

static PyTypeObject __pyx_type_5asynq_10decorators___pyx_scope_struct_8__cached_impl = {
  PyVarObject_HEAD_INIT(0, 0)
  "asynq.decorators.__pyx_scope_struct_8__cached_impl", /*tp_name*/
  sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_8__cached_impl), /*tp_basicsize*/
  0, /*tp_itemsize*/
  __pyx_tp_dealloc_5asynq_10decorators___pyx_scope_struct_8__cached_impl, /*tp_dealloc*/
  0, /*tp_print*/
  0, /*tp_getattr*/
  0, /*tp_setattr*/
  #if PY_MAJOR_VERSION < 3
  0, /*tp_compare*/
  #endif
  #if PY_MAJOR_VERSION >= 3
  0, /*tp_as_async*/
  #endif
  0, /*tp_repr*/
  0, /*tp_as_number*/
  0, /*tp_as_sequence*/
  0, /*tp_as_mapping*/
  0, /*tp_hash*/
  0, /*tp_call*/
  0, /*tp_str*/
  0, /*tp_getattro*/
  0, /*tp_setattro*/
  0, /*tp_as_buffer*/
  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
  0, /*tp_doc*/
  __pyx_tp_traverse_5asynq_10decorators___pyx_scope_struct_8__cached_impl, /*tp_traverse*/
  __pyx_tp_clear_5asynq_10decorators___pyx_scope_struct_8__cached_impl, /*tp_clear*/
  0, /*tp_richcompare*/
  0, /*tp_weaklistoffset*/
  0, /*tp_iter*/
  0, /*tp_iternext*/
  0, /*tp_methods*/
  0, /*tp_members*/
  0, /*tp_getset*/
  0, /*tp_base*/
  0, /*tp_dict*/
  0, /*tp_descr_get*/
  0, /*tp_descr_set*/
  0, /*tp_dictoffset*/
  0, /*tp_init*/
  0, /*tp_alloc*/
  __pyx_tp_new_5asynq_10decorators___pyx_scope_struct_8__cached_impl, /*tp_new*/
  0, /*tp_free*/
  0, /*tp_is_gc*/
  0, /*tp_bases*/
  0, /*tp_mro*/
  0, /*tp_cache*/
  0, /*tp_subclasses*/
  0, /*tp_weaklist*/
  0, /*tp_del*/
  0, /*tp_version_tag*/
  #if PY_VERSION_HEX >= 0x030400a1
  0, /*tp_finalize*/
  #endif
};

static struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl *__pyx_freelist_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl[8];
static int __pyx_freecount_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl = 0;

static PyObject *__pyx_tp_new_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
  PyObject *o;
  if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl)))) {
    o = (PyObject*)__pyx_freelist_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl[--__pyx_freecount_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl];
    memset(o, 0, sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl));
    (void) PyObject_INIT(o, t);
    PyObject_GC_Track(o);
  } else {
    o = (*t->tp_alloc)(t, 0);
    if (unlikely(!o)) return 0;
  }
  return o;
}

static void __pyx_tp_dealloc_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl(PyObject *o) {
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl *p = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl *)o;
  PyObject_GC_UnTrack(o);
  Py_CLEAR(p->__pyx_v_cache);
  Py_CLEAR(p->__pyx_v_key);
  Py_CLEAR(p->__pyx_v_value);
  if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl)))) {
    __pyx_freelist_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl[__pyx_freecount_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl++] = ((struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl *)o);
  } else {
    (*Py_TYPE(o)->tp_free)(o);
  }
}

static int __pyx_tp_traverse_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl(PyObject *o, visitproc v, void *a) {
  int e;
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl *p = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl *)o;
  if (p->__pyx_v_cache) {
    e = (*v)(p->__pyx_v_cache, a); if (e) return e;
  }
  if (p->__pyx_v_key) {
    e = (*v)(p->__pyx_v_key, a); if (e) return e;
  }
  if (p->__pyx_v_value) {
    e = (*v)(p->__pyx_v_value, a); if (e) return e;
  }
  return 0;
}

static int __pyx_tp_clear_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl(PyObject *o) {
  PyObject* tmp;
  struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl *p = (struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl *)o;
  tmp = ((PyObject*)p->__pyx_v_cache);
  p->__pyx_v_cache = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_key);
  p->__pyx_v_key = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_value);
  p->__pyx_v_value = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  return 0;
}

static PyTypeObject __pyx_type_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl = {
  PyVarObject_HEAD_INIT(0, 0)
  "asynq.decorators.__pyx_scope_struct_9__cache_set_impl", /*tp_name*/
  sizeof(struct __pyx_obj_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl), /*tp_basicsize*/
  0, /*tp_itemsize*/
  __pyx_tp_dealloc_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl, /*tp_dealloc*/
  0, /*tp_print*/
  0, /*tp_getattr*/
  0, /*tp_setattr*/
  #if PY_MAJOR_VERSION < 3
  0, /*tp_compare*/
  #endif
  #if PY_MAJOR_VERSION >= 3
  0, /*tp_as_async*/
  #endif
  0, /*tp_repr*/
  0, /*tp_as_number*/
  0, /*tp_as_sequence*/
  0, /*tp_as_mapping*/
  0, /*tp_hash*/
  0, /*tp_call*/
  0, /*tp_str*/
  0, /*tp_getattro*/
  0, /*tp_setattro*/
  0, /*tp_as_buffer*/
  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
  0, /*tp_doc*/
  __pyx_tp_traverse_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl, /*tp_traverse*/
  __pyx_tp_clear_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl, /*tp_clear*/
  0, /*tp_richcompare*/
  0, /*tp_weaklistoffset*/
  0, /*tp_iter*/
  0, /*tp_iternext*/
  0, /*tp_methods*/
  0, /*tp_members*/
  0, /*tp_getset*/
  0, /*tp_base*/
  0, /*tp_dict*/
  0, /*tp_descr_get*/
  0, /*tp_descr_set*/
  0, /*tp_dictoffset*/
  0, /*tp_init*/
  0, /*tp_alloc*/
  __pyx_tp_new_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl, /*tp_new*/
  0, /*tp_free*/
  0, /*tp_is_gc*/
  0, /*tp_bases*/
  0, /*tp_mro*/
  0, /*tp_cache*/
  0, /*tp_subclasses*/
  0, /*tp_weaklist*/
  0, /*tp_del*/
  0, /*tp_version_tag*/
  #if PY_VERSION_HEX >= 0x030400a1
  0, /*tp_finalize*/
  #endif
};

static PyMethodDef __pyx_methods[] = {
  {"has_async_fn", (PyCFunction)__pyx_pw_5asynq_10decorators_3has_async_fn, METH_O, __pyx_doc_5asynq_10decorators_2has_async_fn},
  {"is_pure_async_fn", (PyCFunction)__pyx_pw_5asynq_10decorators_5is_pure_async_fn, METH_O, __pyx_doc_5asynq_10decorators_4is_pure_async_fn},
  {"_get_cache_key", (PyCFunction)__pyx_pw_5asynq_10decorators_29_get_cache_key, METH_VARARGS|METH_KEYWORDS, 0},
  {0, 0, 0, 0}
};

#if PY_MAJOR_VERSION >= 3
static struct PyModuleDef __pyx_moduledef = {
  #if PY_VERSION_HEX < 0x03020000
    { PyObject_HEAD_INIT(NULL) NULL, 0, NULL },
  #else
    PyModuleDef_HEAD_INIT,
  #endif
    "decorators",
    0, /* m_doc */
    -1, /* m_size */
    __pyx_methods /* m_methods */,
    NULL, /* m_reload */
    NULL, /* m_traverse */
    NULL, /* m_clear */
    NULL /* m_free */
};
#endif

static __Pyx_StringTabEntry __pyx_string_tab[] = {
  {&__pyx_n_s_AsyncAndSyncPairDecoratorBinder, __pyx_k_AsyncAndSyncPairDecoratorBinder, sizeof(__pyx_k_AsyncAndSyncPairDecoratorBinder), 0, 0, 1, 1},
  {&__pyx_n_s_AsyncAndSyncPairDecoratorBinder_2, __pyx_k_AsyncAndSyncPairDecoratorBinder_2, sizeof(__pyx_k_AsyncAndSyncPairDecoratorBinder_2), 0, 0, 1, 1},
  {&__pyx_n_s_AsyncTaskResult, __pyx_k_AsyncTaskResult, sizeof(__pyx_k_AsyncTaskResult), 0, 0, 1, 1},
  {&__pyx_n_s_AsyncWrapper, __pyx_k_AsyncWrapper, sizeof(__pyx_k_AsyncWrapper), 0, 0, 1, 1},
  {&__pyx_n_s_AsyncWrapper___call, __pyx_k_AsyncWrapper___call, sizeof(__pyx_k_AsyncWrapper___call), 0, 0, 1, 1},
  {&__pyx_n_s_AsyncWrapper___init, __pyx_k_AsyncWrapper___init, sizeof(__pyx_k_AsyncWrapper___init), 0, 0, 1, 1},
  {&__pyx_n_s_AsyncWrapper__call_async, __pyx_k_AsyncWrapper__call_async, sizeof(__pyx_k_AsyncWrapper__call_async), 0, 0, 1, 1},
  {&__pyx_n_s_AsyncWrapper_async, __pyx_k_AsyncWrapper_async, sizeof(__pyx_k_AsyncWrapper_async), 0, 0, 1, 1},
  {&__pyx_n_s_AsyncWrapper_is_pure_async_fn, __pyx_k_AsyncWrapper_is_pure_async_fn, sizeof(__pyx_k_AsyncWrapper_is_pure_async_fn), 0, 0, 1, 1},
  {&__pyx_n_s_AsyncWrapper_name, __pyx_k_AsyncWrapper_name, sizeof(__pyx_k_AsyncWrapper_name), 0, 0, 1, 1},
  {&__pyx_n_s_AttributeError, __pyx_k_AttributeError, sizeof(__pyx_k_AttributeError), 0, 0, 1, 1},
  {&__pyx_n_s_FunctionType, __pyx_k_FunctionType, sizeof(__pyx_k_FunctionType), 0, 0, 1, 1},
  {&__pyx_kp_s_Implements_make_async_decorator, __pyx_k_Implements_make_async_decorator, sizeof(__pyx_k_Implements_make_async_decorator), 0, 0, 1, 0},
  {&__pyx_n_s_PureAsyncDecorator__fn_wrapper, __pyx_k_PureAsyncDecorator__fn_wrapper, sizeof(__pyx_k_PureAsyncDecorator__fn_wrapper), 0, 0, 1, 1},
  {&__pyx_n_s_StopIteration, __pyx_k_StopIteration, sizeof(__pyx_k_StopIteration), 0, 0, 1, 1},
  {&__pyx_n_s_TypeError, __pyx_k_TypeError, sizeof(__pyx_k_TypeError), 0, 0, 1, 1},
  {&__pyx_n_s__18, __pyx_k__18, sizeof(__pyx_k__18), 0, 0, 1, 1},
  {&__pyx_n_s__19, __pyx_k__19, sizeof(__pyx_k__19), 0, 0, 1, 1},
  {&__pyx_n_s_args, __pyx_k_args, sizeof(__pyx_k_args), 0, 0, 1, 1},
  {&__pyx_n_s_async, __pyx_k_async, sizeof(__pyx_k_async), 0, 0, 1, 1},
  {&__pyx_kp_s_async_2, __pyx_k_async_2, sizeof(__pyx_k_async_2), 0, 0, 1, 0},
  {&__pyx_n_s_async_call, __pyx_k_async_call, sizeof(__pyx_k_async_call), 0, 0, 1, 1},
  {&__pyx_kp_s_async_decorator_can_be_applied, __pyx_k_async_decorator_can_be_applied, sizeof(__pyx_k_async_decorator_can_be_applied), 0, 0, 1, 0},
  {&__pyx_n_s_async_locals_decorate, __pyx_k_async_locals_decorate, sizeof(__pyx_k_async_locals_decorate), 0, 0, 1, 1},
  {&__pyx_n_s_async_proxy, __pyx_k_async_proxy, sizeof(__pyx_k_async_proxy), 0, 0, 1, 1},
  {&__pyx_n_s_async_proxy_locals_decorate, __pyx_k_async_proxy_locals_decorate, sizeof(__pyx_k_async_proxy_locals_decorate), 0, 0, 1, 1},
  {&__pyx_kp_s_async_pure_True, __pyx_k_async_pure_True, sizeof(__pyx_k_async_pure_True), 0, 0, 1, 0},
  {&__pyx_n_s_async_task, __pyx_k_async_task, sizeof(__pyx_k_async_task), 0, 0, 1, 1},
  {&__pyx_n_s_asynq_decorators, __pyx_k_asynq_decorators, sizeof(__pyx_k_asynq_decorators), 0, 0, 1, 1},
  {&__pyx_n_s_binder_cls, __pyx_k_binder_cls, sizeof(__pyx_k_binder_cls), 0, 0, 1, 1},
  {&__pyx_n_s_cache, __pyx_k_cache, sizeof(__pyx_k_cache), 0, 0, 1, 1},
  {&__pyx_n_s_cache_set, __pyx_k_cache_set, sizeof(__pyx_k_cache_set), 0, 0, 1, 1},
  {&__pyx_n_s_cache_set_impl, __pyx_k_cache_set_impl, sizeof(__pyx_k_cache_set_impl), 0, 0, 1, 1},
  {&__pyx_n_s_cached, __pyx_k_cached, sizeof(__pyx_k_cached), 0, 0, 1, 1},
  {&__pyx_n_s_cached_2, __pyx_k_cached_2, sizeof(__pyx_k_cached_2), 0, 0, 1, 1},
  {&__pyx_n_s_cached_impl, __pyx_k_cached_impl, sizeof(__pyx_k_cached_impl), 0, 0, 1, 1},
  {&__pyx_n_s_cached_locals_decorate, __pyx_k_cached_locals_decorate, sizeof(__pyx_k_cached_locals_decorate), 0, 0, 1, 1},
  {&__pyx_n_s_cached_locals_decorate_locals_di, __pyx_k_cached_locals_decorate_locals_di, sizeof(__pyx_k_cached_locals_decorate_locals_di), 0, 0, 1, 1},
  {&__pyx_n_s_cached_locals_decorate_locals_ne, __pyx_k_cached_locals_decorate_locals_ne, sizeof(__pyx_k_cached_locals_decorate_locals_ne), 0, 0, 1, 1},
  {&__pyx_n_s_call, __pyx_k_call, sizeof(__pyx_k_call), 0, 0, 1, 1},
  {&__pyx_n_s_call_async, __pyx_k_call_async, sizeof(__pyx_k_call_async), 0, 0, 1, 1},
  {&__pyx_n_s_call_pure, __pyx_k_call_pure, sizeof(__pyx_k_call_pure), 0, 0, 1, 1},
  {&__pyx_n_s_classmethod, __pyx_k_classmethod, sizeof(__pyx_k_classmethod), 0, 0, 1, 1},
  {&__pyx_n_s_close, __pyx_k_close, sizeof(__pyx_k_close), 0, 0, 1, 1},
  {&__pyx_n_s_cls, __pyx_k_cls, sizeof(__pyx_k_cls), 0, 0, 1, 1},
  {&__pyx_n_s_core_helpers, __pyx_k_core_helpers, sizeof(__pyx_k_core_helpers), 0, 0, 1, 1},
  {&__pyx_n_s_core_inspection, __pyx_k_core_inspection, sizeof(__pyx_k_core_inspection), 0, 0, 1, 1},
  {&__pyx_kp_s_custom_kwargs_are_only_supported, __pyx_k_custom_kwargs_are_only_supported, sizeof(__pyx_k_custom_kwargs_are_only_supported), 0, 0, 1, 0},
  {&__pyx_n_s_debug, __pyx_k_debug, sizeof(__pyx_k_debug), 0, 0, 1, 1},
  {&__pyx_n_s_debug_options, __pyx_k_debug_options, sizeof(__pyx_k_debug_options), 0, 0, 1, 1},
  {&__pyx_n_s_decorate, __pyx_k_decorate, sizeof(__pyx_k_decorate), 0, 0, 1, 1},
  {&__pyx_n_s_decorator, __pyx_k_decorator, sizeof(__pyx_k_decorator), 0, 0, 1, 1},
  {&__pyx_n_s_decorators, __pyx_k_decorators, sizeof(__pyx_k_decorators), 0, 0, 1, 1},
  {&__pyx_n_s_dirty, __pyx_k_dirty, sizeof(__pyx_k_dirty), 0, 0, 1, 1},
  {&__pyx_n_s_doc, __pyx_k_doc, sizeof(__pyx_k_doc), 0, 0, 1, 1},
  {&__pyx_n_s_false_fn, __pyx_k_false_fn, sizeof(__pyx_k_false_fn), 0, 0, 1, 1},
  {&__pyx_n_s_fn, __pyx_k_fn, sizeof(__pyx_k_fn), 0, 0, 1, 1},
  {&__pyx_n_s_fn_wrapper, __pyx_k_fn_wrapper, sizeof(__pyx_k_fn_wrapper), 0, 0, 1, 1},
  {&__pyx_n_s_function_name, __pyx_k_function_name, sizeof(__pyx_k_function_name), 0, 0, 1, 1},
  {&__pyx_n_s_futures, __pyx_k_futures, sizeof(__pyx_k_futures), 0, 0, 1, 1},
  {&__pyx_n_s_get, __pyx_k_get, sizeof(__pyx_k_get), 0, 0, 1, 1},
  {&__pyx_n_s_get_2, __pyx_k_get_2, sizeof(__pyx_k_get_2), 0, 0, 1, 1},
  {&__pyx_n_s_get_async_fn, __pyx_k_get_async_fn, sizeof(__pyx_k_get_async_fn), 0, 0, 1, 1},
  {&__pyx_n_s_get_async_fn_locals_sync_to_asyn, __pyx_k_get_async_fn_locals_sync_to_asyn, sizeof(__pyx_k_get_async_fn_locals_sync_to_asyn), 0, 0, 1, 1},
  {&__pyx_n_s_get_async_or_sync_fn, __pyx_k_get_async_or_sync_fn, sizeof(__pyx_k_get_async_or_sync_fn), 0, 0, 1, 1},
  {&__pyx_kp_s_home_jelle_github_asynq_asynq_d, __pyx_k_home_jelle_github_asynq_asynq_d, sizeof(__pyx_k_home_jelle_github_asynq_asynq_d), 0, 0, 1, 0},
  {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1},
  {&__pyx_n_s_init, __pyx_k_init, sizeof(__pyx_k_init), 0, 0, 1, 1},
  {&__pyx_n_s_inspect, __pyx_k_inspect, sizeof(__pyx_k_inspect), 0, 0, 1, 1},
  {&__pyx_n_s_is_async_fn, __pyx_k_is_async_fn, sizeof(__pyx_k_is_async_fn), 0, 0, 1, 1},
  {&__pyx_n_s_is_pure_async_fn, __pyx_k_is_pure_async_fn, sizeof(__pyx_k_is_pure_async_fn), 0, 0, 1, 1},
  {&__pyx_n_s_key, __pyx_k_key, sizeof(__pyx_k_key), 0, 0, 1, 1},
  {&__pyx_n_s_kwargs, __pyx_k_kwargs, sizeof(__pyx_k_kwargs), 0, 0, 1, 1},
  {&__pyx_n_s_lazy, __pyx_k_lazy, sizeof(__pyx_k_lazy), 0, 0, 1, 1},
  {&__pyx_n_s_lazy_locals_new_fn, __pyx_k_lazy_locals_new_fn, sizeof(__pyx_k_lazy_locals_new_fn), 0, 0, 1, 1},
  {&__pyx_n_s_lazy_locals_new_fn_locals_lambda, __pyx_k_lazy_locals_new_fn_locals_lambda, sizeof(__pyx_k_lazy_locals_new_fn_locals_lambda), 0, 0, 1, 1},
  {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1},
  {&__pyx_n_s_make_async_decorator, __pyx_k_make_async_decorator, sizeof(__pyx_k_make_async_decorator), 0, 0, 1, 1},
  {&__pyx_n_s_metaclass, __pyx_k_metaclass, sizeof(__pyx_k_metaclass), 0, 0, 1, 1},
  {&__pyx_n_s_module, __pyx_k_module, sizeof(__pyx_k_module), 0, 0, 1, 1},
  {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1},
  {&__pyx_n_s_new_fn, __pyx_k_new_fn, sizeof(__pyx_k_new_fn), 0, 0, 1, 1},
  {&__pyx_n_s_original_fn, __pyx_k_original_fn, sizeof(__pyx_k_original_fn), 0, 0, 1, 1},
  {&__pyx_n_s_prepare, __pyx_k_prepare, sizeof(__pyx_k_prepare), 0, 0, 1, 1},
  {&__pyx_n_s_pure, __pyx_k_pure, sizeof(__pyx_k_pure), 0, 0, 1, 1},
  {&__pyx_n_s_pyx_capi, __pyx_k_pyx_capi, sizeof(__pyx_k_pyx_capi), 0, 0, 1, 1},
  {&__pyx_n_s_pyx_vtable, __pyx_k_pyx_vtable, sizeof(__pyx_k_pyx_vtable), 0, 0, 1, 1},
  {&__pyx_n_s_qcore, __pyx_k_qcore, sizeof(__pyx_k_qcore), 0, 0, 1, 1},
  {&__pyx_n_s_qcore_decorators, __pyx_k_qcore_decorators, sizeof(__pyx_k_qcore_decorators), 0, 0, 1, 1},
  {&__pyx_n_s_qcore_helpers, __pyx_k_qcore_helpers, sizeof(__pyx_k_qcore_helpers), 0, 0, 1, 1},
  {&__pyx_n_s_qcore_inspection, __pyx_k_qcore_inspection, sizeof(__pyx_k_qcore_inspection), 0, 0, 1, 1},
  {&__pyx_n_s_qualname, __pyx_k_qualname, sizeof(__pyx_k_qualname), 0, 0, 1, 1},
  {&__pyx_n_s_result, __pyx_k_result, sizeof(__pyx_k_result), 0, 0, 1, 1},
  {&__pyx_kp_s_s, __pyx_k_s, sizeof(__pyx_k_s), 0, 0, 1, 0},
  {&__pyx_n_s_self, __pyx_k_self, sizeof(__pyx_k_self), 0, 0, 1, 1},
  {&__pyx_n_s_send, __pyx_k_send, sizeof(__pyx_k_send), 0, 0, 1, 1},
  {&__pyx_n_s_set, __pyx_k_set, sizeof(__pyx_k_set), 0, 0, 1, 1},
  {&__pyx_n_s_start, __pyx_k_start, sizeof(__pyx_k_start), 0, 0, 1, 1},
  {&__pyx_n_s_staticmethod, __pyx_k_staticmethod, sizeof(__pyx_k_staticmethod), 0, 0, 1, 1},
  {&__pyx_n_s_super, __pyx_k_super, sizeof(__pyx_k_super), 0, 0, 1, 1},
  {&__pyx_n_s_sync_fn, __pyx_k_sync_fn, sizeof(__pyx_k_sync_fn), 0, 0, 1, 1},
  {&__pyx_kp_s_sync_fn_cannot_be_used_together, __pyx_k_sync_fn_cannot_be_used_together, sizeof(__pyx_k_sync_fn_cannot_be_used_together), 0, 0, 1, 0},
  {&__pyx_kp_s_sync_fn_is_not_supported_for_pur, __pyx_k_sync_fn_is_not_supported_for_pur, sizeof(__pyx_k_sync_fn_is_not_supported_for_pur), 0, 0, 1, 0},
  {&__pyx_n_s_sync_to_async_fn_wrapper, __pyx_k_sync_to_async_fn_wrapper, sizeof(__pyx_k_sync_to_async_fn_wrapper), 0, 0, 1, 1},
  {&__pyx_n_s_task_cls, __pyx_k_task_cls, sizeof(__pyx_k_task_cls), 0, 0, 1, 1},
  {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1},
  {&__pyx_n_s_throw, __pyx_k_throw, sizeof(__pyx_k_throw), 0, 0, 1, 1},
  {&__pyx_n_s_traceback_hide, __pyx_k_traceback_hide, sizeof(__pyx_k_traceback_hide), 0, 0, 1, 1},
  {&__pyx_n_s_true_fn, __pyx_k_true_fn, sizeof(__pyx_k_true_fn), 0, 0, 1, 1},
  {&__pyx_n_s_types, __pyx_k_types, sizeof(__pyx_k_types), 0, 0, 1, 1},
  {&__pyx_n_s_value, __pyx_k_value, sizeof(__pyx_k_value), 0, 0, 1, 1},
  {&__pyx_n_s_value_provider, __pyx_k_value_provider, sizeof(__pyx_k_value_provider), 0, 0, 1, 1},
  {&__pyx_n_s_wrap_if_none, __pyx_k_wrap_if_none, sizeof(__pyx_k_wrap_if_none), 0, 0, 1, 1},
  {&__pyx_n_s_wrapper_fn, __pyx_k_wrapper_fn, sizeof(__pyx_k_wrapper_fn), 0, 0, 1, 1},
  {&__pyx_kp_s_you_must_use_s_instead_of_s, __pyx_k_you_must_use_s_instead_of_s, sizeof(__pyx_k_you_must_use_s_instead_of_s), 0, 0, 1, 0},
  {0, 0, 0, 0, 0, 0, 0}
};
static int __Pyx_InitCachedBuiltins(void) {
  __pyx_builtin_TypeError = __Pyx_GetBuiltinName(__pyx_n_s_TypeError); if (!__pyx_builtin_TypeError) __PYX_ERR(0, 56, __pyx_L1_error)
  __pyx_builtin_AttributeError = __Pyx_GetBuiltinName(__pyx_n_s_AttributeError); if (!__pyx_builtin_AttributeError) __PYX_ERR(0, 64, __pyx_L1_error)
  __pyx_builtin_staticmethod = __Pyx_GetBuiltinName(__pyx_n_s_staticmethod); if (!__pyx_builtin_staticmethod) __PYX_ERR(0, 182, __pyx_L1_error)
  __pyx_builtin_classmethod = __Pyx_GetBuiltinName(__pyx_n_s_classmethod); if (!__pyx_builtin_classmethod) __PYX_ERR(0, 182, __pyx_L1_error)
  __pyx_builtin_super = __Pyx_GetBuiltinName(__pyx_n_s_super); if (!__pyx_builtin_super) __PYX_ERR(0, 297, __pyx_L1_error)
  __pyx_builtin_StopIteration = __Pyx_GetBuiltinName(__pyx_n_s_StopIteration); if (!__pyx_builtin_StopIteration) __PYX_ERR(0, 363, __pyx_L1_error)
  return 0;
  __pyx_L1_error:;
  return -1;
}

static int __Pyx_InitCachedConstants(void) {
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0);

  /* "asynq/decorators.py":38
 *     """
 *     @core_inspection.wraps(fn)
 *     def new_fn(*args, **kwargs):             # <<<<<<<<<<<<<<
 *         value_provider = lambda: fn(*args, **kwargs)
 *         return futures.Future(value_provider)
 */
  __pyx_tuple_ = PyTuple_Pack(3, __pyx_n_s_args, __pyx_n_s_kwargs, __pyx_n_s_value_provider); if (unlikely(!__pyx_tuple_)) __PYX_ERR(0, 38, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple_);
  __Pyx_GIVEREF(__pyx_tuple_);
  __pyx_codeobj__2 = (PyObject*)__Pyx_PyCode_New(0, 0, 3, 0, CO_VARARGS|CO_VARKEYWORDS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple_, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_jelle_github_asynq_asynq_d, __pyx_n_s_new_fn, 38, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__2)) __PYX_ERR(0, 38, __pyx_L1_error)

  /* "asynq/decorators.py":82
 *         return fn
 *     if wrap_if_none:
 *         def sync_to_async_fn_wrapper(*args, **kwargs):             # <<<<<<<<<<<<<<
 *             return futures.ConstFuture(fn(*args, **kwargs))
 * 
 */
  __pyx_tuple__3 = PyTuple_Pack(2, __pyx_n_s_args, __pyx_n_s_kwargs); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(0, 82, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__3);
  __Pyx_GIVEREF(__pyx_tuple__3);
  __pyx_codeobj__4 = (PyObject*)__Pyx_PyCode_New(0, 0, 2, 0, CO_VARARGS|CO_VARKEYWORDS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__3, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_jelle_github_asynq_asynq_d, __pyx_n_s_sync_to_async_fn_wrapper, 82, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__4)) __PYX_ERR(0, 82, __pyx_L1_error)

  /* "asynq/decorators.py":219
 *         assert sync_fn is None, "sync_fn is not supported for pure async functions"
 * 
 *     def decorate(fn):             # <<<<<<<<<<<<<<
 *         assert not (is_pure_async_fn(fn) or has_async_fn(fn)), \
 *             "@async() decorator can be applied just once"
 */
  __pyx_tuple__7 = PyTuple_Pack(1, __pyx_n_s_fn); if (unlikely(!__pyx_tuple__7)) __PYX_ERR(0, 219, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__7);
  __Pyx_GIVEREF(__pyx_tuple__7);
  __pyx_codeobj__8 = (PyObject*)__Pyx_PyCode_New(1, 0, 1, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__7, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_jelle_github_asynq_asynq_d, __pyx_n_s_decorate, 219, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__8)) __PYX_ERR(0, 219, __pyx_L1_error)

  /* "asynq/decorators.py":236
 *         assert pure is False, "sync_fn=? cannot be used together with pure=True"
 * 
 *     def decorate(fn):             # <<<<<<<<<<<<<<
 *         if pure:
 *             return fn
 */
  __pyx_tuple__9 = PyTuple_Pack(1, __pyx_n_s_fn); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(0, 236, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__9);
  __Pyx_GIVEREF(__pyx_tuple__9);
  __pyx_codeobj__10 = (PyObject*)__Pyx_PyCode_New(1, 0, 1, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__9, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_jelle_github_asynq_asynq_d, __pyx_n_s_decorate, 236, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__10)) __PYX_ERR(0, 236, __pyx_L1_error)

  /* "asynq/decorators.py":261
 * 
 *         @core_inspection.wraps(fn)
 *         def new_fn(*args, **kwargs):             # <<<<<<<<<<<<<<
 *             return _cached(cache, original_fn, fn, args, kwargs)
 * 
 */
  __pyx_tuple__11 = PyTuple_Pack(2, __pyx_n_s_args, __pyx_n_s_kwargs); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(0, 261, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__11);
  __Pyx_GIVEREF(__pyx_tuple__11);
  __pyx_codeobj__12 = (PyObject*)__Pyx_PyCode_New(0, 0, 2, 0, CO_VARARGS|CO_VARKEYWORDS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__11, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_jelle_github_asynq_asynq_d, __pyx_n_s_new_fn, 261, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__12)) __PYX_ERR(0, 261, __pyx_L1_error)

  /* "asynq/decorators.py":264
 *             return _cached(cache, original_fn, fn, args, kwargs)
 * 
 *         def dirty(*args, **kwargs):             # <<<<<<<<<<<<<<
 *             key = _get_cache_key(original_fn, args, kwargs)
 *             cache.set(key, core_helpers.miss)
 */
  __pyx_tuple__13 = PyTuple_Pack(3, __pyx_n_s_args, __pyx_n_s_kwargs, __pyx_n_s_key); if (unlikely(!__pyx_tuple__13)) __PYX_ERR(0, 264, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__13);
  __Pyx_GIVEREF(__pyx_tuple__13);
  __pyx_codeobj__14 = (PyObject*)__Pyx_PyCode_New(0, 0, 3, 0, CO_VARARGS|CO_VARKEYWORDS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__13, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_jelle_github_asynq_asynq_d, __pyx_n_s_dirty, 264, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__14)) __PYX_ERR(0, 264, __pyx_L1_error)

  /* "asynq/decorators.py":257
 *     _assert_apply_without_invocation("async", (cache,))
 * 
 *     def decorate(fn):             # <<<<<<<<<<<<<<
 *         original_fn = core_inspection.get_original_fn(fn)
 * 
 */
  __pyx_tuple__15 = PyTuple_Pack(6, __pyx_n_s_fn, __pyx_n_s_original_fn, __pyx_n_s_new_fn, __pyx_n_s_new_fn, __pyx_n_s_dirty, __pyx_n_s_dirty); if (unlikely(!__pyx_tuple__15)) __PYX_ERR(0, 257, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__15);
  __Pyx_GIVEREF(__pyx_tuple__15);
  __pyx_codeobj__16 = (PyObject*)__Pyx_PyCode_New(1, 0, 6, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__15, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_jelle_github_asynq_asynq_d, __pyx_n_s_decorate, 257, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__16)) __PYX_ERR(0, 257, __pyx_L1_error)

  /* "asynq/decorators.py":31
 * 
 * 
 * def lazy(fn):             # <<<<<<<<<<<<<<
 *     """Converts a function into a lazy one - i.e. its call
 *     returns a Future bound to a function call with passed
 */
  __pyx_tuple__20 = PyTuple_Pack(3, __pyx_n_s_fn, __pyx_n_s_new_fn, __pyx_n_s_new_fn); if (unlikely(!__pyx_tuple__20)) __PYX_ERR(0, 31, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__20);
  __Pyx_GIVEREF(__pyx_tuple__20);
  __pyx_codeobj__21 = (PyObject*)__Pyx_PyCode_New(1, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__20, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_jelle_github_asynq_asynq_d, __pyx_n_s_lazy, 31, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__21)) __PYX_ERR(0, 31, __pyx_L1_error)

  /* "asynq/decorators.py":70
 * 
 * 
 * def is_async_fn(fn):             # <<<<<<<<<<<<<<
 *     """Returns true if fn is an @async([pure=True]) or @async_proxy(pure=True) function."""
 *     return hasattr(fn, 'async') or is_pure_async_fn(fn)
 */
  __pyx_tuple__22 = PyTuple_Pack(1, __pyx_n_s_fn); if (unlikely(!__pyx_tuple__22)) __PYX_ERR(0, 70, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__22);
  __Pyx_GIVEREF(__pyx_tuple__22);
  __pyx_codeobj__23 = (PyObject*)__Pyx_PyCode_New(1, 0, 1, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__22, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_jelle_github_asynq_asynq_d, __pyx_n_s_is_async_fn, 70, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__23)) __PYX_ERR(0, 70, __pyx_L1_error)

  /* "asynq/decorators.py":75
 * 
 * 
 * def get_async_fn(fn, wrap_if_none=False):             # <<<<<<<<<<<<<<
 *     """Returns an async function for the specified source function."""
 *     if hasattr(fn, 'async'):
 */
  __pyx_tuple__24 = PyTuple_Pack(4, __pyx_n_s_fn, __pyx_n_s_wrap_if_none, __pyx_n_s_sync_to_async_fn_wrapper, __pyx_n_s_sync_to_async_fn_wrapper); if (unlikely(!__pyx_tuple__24)) __PYX_ERR(0, 75, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__24);
  __Pyx_GIVEREF(__pyx_tuple__24);
  __pyx_codeobj__25 = (PyObject*)__Pyx_PyCode_New(2, 0, 4, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__24, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_jelle_github_asynq_asynq_d, __pyx_n_s_get_async_fn, 75, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__25)) __PYX_ERR(0, 75, __pyx_L1_error)
  __pyx_tuple__26 = PyTuple_Pack(1, ((PyObject *)Py_False)); if (unlikely(!__pyx_tuple__26)) __PYX_ERR(0, 75, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__26);
  __Pyx_GIVEREF(__pyx_tuple__26);

  /* "asynq/decorators.py":90
 * 
 * 
 * def get_async_or_sync_fn(fn):             # <<<<<<<<<<<<<<
 *     """Returns an async function for the specified fn, if it exists; otherwise returns source."""
 *     if hasattr(fn, 'async'):
 */
  __pyx_tuple__27 = PyTuple_Pack(1, __pyx_n_s_fn); if (unlikely(!__pyx_tuple__27)) __PYX_ERR(0, 90, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__27);
  __Pyx_GIVEREF(__pyx_tuple__27);
  __pyx_codeobj__28 = (PyObject*)__Pyx_PyCode_New(1, 0, 1, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__27, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_jelle_github_asynq_asynq_d, __pyx_n_s_get_async_or_sync_fn, 90, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__28)) __PYX_ERR(0, 90, __pyx_L1_error)

  /* "asynq/decorators.py":157
 * 
 * class AsyncAndSyncPairDecoratorBinder(AsyncDecoratorBinder):
 *     def __call__(self, *args, **kwargs):             # <<<<<<<<<<<<<<
 *         # the base class implementation adds .instance here, but we don't want that because we
 *         # called __get__ on the sync_fn manually; if we don't do this we'll end up adding self or
 */
  __pyx_tuple__29 = PyTuple_Pack(3, __pyx_n_s_self, __pyx_n_s_args, __pyx_n_s_kwargs); if (unlikely(!__pyx_tuple__29)) __PYX_ERR(0, 157, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__29);
  __Pyx_GIVEREF(__pyx_tuple__29);
  __pyx_codeobj__30 = (PyObject*)__Pyx_PyCode_New(1, 0, 3, 0, CO_VARARGS|CO_VARKEYWORDS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__29, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_jelle_github_asynq_asynq_d, __pyx_n_s_call, 157, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__30)) __PYX_ERR(0, 157, __pyx_L1_error)

  /* "asynq/decorators.py":208
 * 
 * 
 * def async(pure=False, sync_fn=None, cls=async_task.AsyncTask, **kwargs):             # <<<<<<<<<<<<<<
 *     """Async task decorator.
 *     Converts a method returning generator object to
 */
  __pyx_tuple__31 = PyTuple_Pack(6, __pyx_n_s_pure, __pyx_n_s_sync_fn, __pyx_n_s_cls, __pyx_n_s_kwargs, __pyx_n_s_decorate, __pyx_n_s_decorate); if (unlikely(!__pyx_tuple__31)) __PYX_ERR(0, 208, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__31);
  __Pyx_GIVEREF(__pyx_tuple__31);
  __pyx_codeobj__32 = (PyObject*)__Pyx_PyCode_New(3, 0, 6, 0, CO_VARKEYWORDS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__31, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_jelle_github_asynq_asynq_d, __pyx_n_s_async, 208, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__32)) __PYX_ERR(0, 208, __pyx_L1_error)

  /* "asynq/decorators.py":232
 * 
 * 
 * def async_proxy(pure=False, sync_fn=None):             # <<<<<<<<<<<<<<
 *     if sync_fn is not None:
 *         assert pure is False, "sync_fn=? cannot be used together with pure=True"
 */
  __pyx_tuple__33 = PyTuple_Pack(4, __pyx_n_s_pure, __pyx_n_s_sync_fn, __pyx_n_s_decorate, __pyx_n_s_decorate); if (unlikely(!__pyx_tuple__33)) __PYX_ERR(0, 232, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__33);
  __Pyx_GIVEREF(__pyx_tuple__33);
  __pyx_codeobj__34 = (PyObject*)__Pyx_PyCode_New(2, 0, 4, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__33, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_jelle_github_asynq_asynq_d, __pyx_n_s_async_proxy, 232, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__34)) __PYX_ERR(0, 232, __pyx_L1_error)
  __pyx_tuple__35 = PyTuple_Pack(2, ((PyObject *)Py_False), ((PyObject *)Py_None)); if (unlikely(!__pyx_tuple__35)) __PYX_ERR(0, 232, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__35);
  __Pyx_GIVEREF(__pyx_tuple__35);

  /* "asynq/decorators.py":247
 * 
 * 
 * def cached(cache):             # <<<<<<<<<<<<<<
 *     """Caching decorator. Caches method execution result
 *     based on its name an arguments.
 */
  __pyx_tuple__36 = PyTuple_Pack(3, __pyx_n_s_cache, __pyx_n_s_decorate, __pyx_n_s_decorate); if (unlikely(!__pyx_tuple__36)) __PYX_ERR(0, 247, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__36);
  __Pyx_GIVEREF(__pyx_tuple__36);
  __pyx_codeobj__37 = (PyObject*)__Pyx_PyCode_New(1, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__36, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_jelle_github_asynq_asynq_d, __pyx_n_s_cached_2, 247, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__37)) __PYX_ERR(0, 247, __pyx_L1_error)

  /* "asynq/decorators.py":277
 * 
 * @async_proxy()
 * def async_call(fn, *args, **kwargs):             # <<<<<<<<<<<<<<
 *     """Use this if you are not sure if fn is async or not.
 * 
 */
  __pyx_tuple__38 = PyTuple_Pack(3, __pyx_n_s_fn, __pyx_n_s_args, __pyx_n_s_kwargs); if (unlikely(!__pyx_tuple__38)) __PYX_ERR(0, 277, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__38);
  __Pyx_GIVEREF(__pyx_tuple__38);
  __pyx_codeobj__39 = (PyObject*)__Pyx_PyCode_New(1, 0, 3, 0, CO_VARARGS|CO_VARKEYWORDS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__38, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_jelle_github_asynq_asynq_d, __pyx_n_s_async_call, 277, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__39)) __PYX_ERR(0, 277, __pyx_L1_error)

  /* "asynq/decorators.py":296
 *     binder_cls = AsyncDecoratorBinder
 * 
 *     def __init__(self, fn, wrapper_fn, name):             # <<<<<<<<<<<<<<
 *         super(AsyncWrapper, self).__init__(fn)
 *         self.wrapper_fn = wrapper_fn
 */
  __pyx_tuple__40 = PyTuple_Pack(4, __pyx_n_s_self, __pyx_n_s_fn, __pyx_n_s_wrapper_fn, __pyx_n_s_name); if (unlikely(!__pyx_tuple__40)) __PYX_ERR(0, 296, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__40);
  __Pyx_GIVEREF(__pyx_tuple__40);
  __pyx_codeobj__41 = (PyObject*)__Pyx_PyCode_New(4, 0, 4, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__40, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_jelle_github_asynq_asynq_d, __pyx_n_s_init, 296, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__41)) __PYX_ERR(0, 296, __pyx_L1_error)

  /* "asynq/decorators.py":301
 *         self.function_name = name
 * 
 *     def name(self):             # <<<<<<<<<<<<<<
 *         return '@%s()' % self.function_name
 * 
 */
  __pyx_tuple__42 = PyTuple_Pack(1, __pyx_n_s_self); if (unlikely(!__pyx_tuple__42)) __PYX_ERR(0, 301, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__42);
  __Pyx_GIVEREF(__pyx_tuple__42);
  __pyx_codeobj__43 = (PyObject*)__Pyx_PyCode_New(1, 0, 1, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__42, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_jelle_github_asynq_asynq_d, __pyx_n_s_name, 301, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__43)) __PYX_ERR(0, 301, __pyx_L1_error)

  /* "asynq/decorators.py":304
 *         return '@%s()' % self.function_name
 * 
 *     def _call_async(self, args, kwargs):             # <<<<<<<<<<<<<<
 *         return self.wrapper_fn(*args, **kwargs)
 * 
 */
  __pyx_tuple__44 = PyTuple_Pack(3, __pyx_n_s_self, __pyx_n_s_args, __pyx_n_s_kwargs); if (unlikely(!__pyx_tuple__44)) __PYX_ERR(0, 304, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__44);
  __Pyx_GIVEREF(__pyx_tuple__44);
  __pyx_codeobj__45 = (PyObject*)__Pyx_PyCode_New(3, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__44, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_jelle_github_asynq_asynq_d, __pyx_n_s_call_async, 304, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__45)) __PYX_ERR(0, 304, __pyx_L1_error)

  /* "asynq/decorators.py":307
 *         return self.wrapper_fn(*args, **kwargs)
 * 
 *     def __call__(self, *args, **kwargs):             # <<<<<<<<<<<<<<
 *         return self._call_async(args, kwargs).value()
 * 
 */
  __pyx_tuple__46 = PyTuple_Pack(3, __pyx_n_s_self, __pyx_n_s_args, __pyx_n_s_kwargs); if (unlikely(!__pyx_tuple__46)) __PYX_ERR(0, 307, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__46);
  __Pyx_GIVEREF(__pyx_tuple__46);
  __pyx_codeobj__47 = (PyObject*)__Pyx_PyCode_New(1, 0, 3, 0, CO_VARARGS|CO_VARKEYWORDS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__46, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_jelle_github_asynq_asynq_d, __pyx_n_s_call, 307, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__47)) __PYX_ERR(0, 307, __pyx_L1_error)

  /* "asynq/decorators.py":310
 *         return self._call_async(args, kwargs).value()
 * 
 *     def async(self, *args, **kwargs):             # <<<<<<<<<<<<<<
 *         return self._call_async(args, kwargs)
 * 
 */
  __pyx_tuple__48 = PyTuple_Pack(3, __pyx_n_s_self, __pyx_n_s_args, __pyx_n_s_kwargs); if (unlikely(!__pyx_tuple__48)) __PYX_ERR(0, 310, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__48);
  __Pyx_GIVEREF(__pyx_tuple__48);
  __pyx_codeobj__49 = (PyObject*)__Pyx_PyCode_New(1, 0, 3, 0, CO_VARARGS|CO_VARKEYWORDS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__48, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_jelle_github_asynq_asynq_d, __pyx_n_s_async, 310, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__49)) __PYX_ERR(0, 310, __pyx_L1_error)

  /* "asynq/decorators.py":313
 *         return self._call_async(args, kwargs)
 * 
 *     def is_pure_async_fn(self):             # <<<<<<<<<<<<<<
 *         return False
 * 
 */
  __pyx_tuple__50 = PyTuple_Pack(1, __pyx_n_s_self); if (unlikely(!__pyx_tuple__50)) __PYX_ERR(0, 313, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__50);
  __Pyx_GIVEREF(__pyx_tuple__50);
  __pyx_codeobj__51 = (PyObject*)__Pyx_PyCode_New(1, 0, 1, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__50, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_jelle_github_asynq_asynq_d, __pyx_n_s_is_pure_async_fn, 313, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__51)) __PYX_ERR(0, 313, __pyx_L1_error)

  /* "asynq/decorators.py":317
 * 
 * 
 * def make_async_decorator(fn, wrapper_fn, name):             # <<<<<<<<<<<<<<
 *     """For implementing decorators that wrap async functions.
 * 
 */
  __pyx_tuple__52 = PyTuple_Pack(3, __pyx_n_s_fn, __pyx_n_s_wrapper_fn, __pyx_n_s_name); if (unlikely(!__pyx_tuple__52)) __PYX_ERR(0, 317, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__52);
  __Pyx_GIVEREF(__pyx_tuple__52);
  __pyx_codeobj__53 = (PyObject*)__Pyx_PyCode_New(3, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__52, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_jelle_github_asynq_asynq_d, __pyx_n_s_make_async_decorator, 317, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__53)) __PYX_ERR(0, 317, __pyx_L1_error)

  /* "asynq/decorators.py":340
 * 
 * 
 * def _cached_impl(cache, original_fn, fn, args, kwargs):             # <<<<<<<<<<<<<<
 *     """Internal async method used by @cached decorator.
 *     Implements cache check/update in async fashion.
 */
  __pyx_tuple__54 = PyTuple_Pack(8, __pyx_n_s_cache, __pyx_n_s_original_fn, __pyx_n_s_fn, __pyx_n_s_args, __pyx_n_s_kwargs, __pyx_n_s_key, __pyx_n_s_cached_2, __pyx_n_s_result); if (unlikely(!__pyx_tuple__54)) __PYX_ERR(0, 340, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__54);
  __Pyx_GIVEREF(__pyx_tuple__54);
  __pyx_codeobj__55 = (PyObject*)__Pyx_PyCode_New(5, 0, 8, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__54, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_jelle_github_asynq_asynq_d, __pyx_n_s_cached_impl, 340, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__55)) __PYX_ERR(0, 340, __pyx_L1_error)

  /* "asynq/decorators.py":361
 * 
 * 
 * def _cache_set_impl(cache, key, value):             # <<<<<<<<<<<<<<
 *     yield cache.set(key, value)
 *     raise StopIteration()
 */
  __pyx_tuple__56 = PyTuple_Pack(3, __pyx_n_s_cache, __pyx_n_s_key, __pyx_n_s_value); if (unlikely(!__pyx_tuple__56)) __PYX_ERR(0, 361, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_tuple__56);
  __Pyx_GIVEREF(__pyx_tuple__56);
  __pyx_codeobj__57 = (PyObject*)__Pyx_PyCode_New(3, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__56, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_jelle_github_asynq_asynq_d, __pyx_n_s_cache_set_impl, 361, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__57)) __PYX_ERR(0, 361, __pyx_L1_error)
  __Pyx_RefNannyFinishContext();
  return 0;
  __pyx_L1_error:;
  __Pyx_RefNannyFinishContext();
  return -1;
}

static int __Pyx_InitGlobals(void) {
  if (__Pyx_InitStrings(__pyx_string_tab) < 0) __PYX_ERR(0, 1, __pyx_L1_error);
  return 0;
  __pyx_L1_error:;
  return -1;
}

#if PY_MAJOR_VERSION < 3
PyMODINIT_FUNC initdecorators(void); /*proto*/
PyMODINIT_FUNC initdecorators(void)
#else
PyMODINIT_FUNC PyInit_decorators(void); /*proto*/
PyMODINIT_FUNC PyInit_decorators(void)
#endif
{
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  PyObject *__pyx_t_7 = NULL;
  PyObject *__pyx_t_8 = NULL;
  PyObject *__pyx_t_9 = NULL;
  PyObject *__pyx_t_10 = NULL;
  PyObject *__pyx_t_11 = NULL;
  PyObject *__pyx_t_12 = NULL;
  PyObject *__pyx_t_13 = NULL;
  __Pyx_RefNannyDeclarations
  #if CYTHON_REFNANNY
  __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny");
  if (!__Pyx_RefNanny) {
      PyErr_Clear();
      __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny");
      if (!__Pyx_RefNanny)
          Py_FatalError("failed to import 'refnanny' module");
  }
  #endif
  __Pyx_RefNannySetupContext("PyMODINIT_FUNC PyInit_decorators(void)", 0);
  if (__Pyx_check_binary_version() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error)
  __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error)
  __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error)
  #ifdef __Pyx_CyFunction_USED
  if (__pyx_CyFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  #endif
  #ifdef __Pyx_FusedFunction_USED
  if (__pyx_FusedFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  #endif
  #ifdef __Pyx_Coroutine_USED
  if (__pyx_Coroutine_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  #endif
  #ifdef __Pyx_Generator_USED
  if (__pyx_Generator_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  #endif
  #ifdef __Pyx_StopAsyncIteration_USED
  if (__pyx_StopAsyncIteration_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  #endif
  /*--- Library function declarations ---*/
  /*--- Threads initialization code ---*/
  #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS
  #ifdef WITH_THREAD /* Python build with threading support? */
  PyEval_InitThreads();
  #endif
  #endif
  /*--- Module creation code ---*/
  #if PY_MAJOR_VERSION < 3
  __pyx_m = Py_InitModule4("decorators", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m);
  #else
  __pyx_m = PyModule_Create(&__pyx_moduledef);
  #endif
  if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error)
  __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error)
  Py_INCREF(__pyx_d);
  __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error)
  #if CYTHON_COMPILING_IN_PYPY
  Py_INCREF(__pyx_b);
  #endif
  if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error);
  /*--- Initialize various global constants etc. ---*/
  if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT)
  if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  #endif
  if (__pyx_module_is_main_asynq__decorators) {
    if (PyObject_SetAttrString(__pyx_m, "__name__", __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  }
  #if PY_MAJOR_VERSION >= 3
  {
    PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error)
    if (!PyDict_GetItemString(modules, "asynq.decorators")) {
      if (unlikely(PyDict_SetItemString(modules, "asynq.decorators", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error)
    }
  }
  #endif
  /*--- Builtin init code ---*/
  if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  /*--- Constants init code ---*/
  if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  /*--- Global init code ---*/
  __pyx_v_5asynq_10decorators__debug_options = ((struct __pyx_obj_5asynq_6_debug_DebugOptions *)Py_None); Py_INCREF(Py_None);
  __pyx_v_5asynq_10decorators__cached = Py_None; Py_INCREF(Py_None);
  __pyx_v_5asynq_10decorators__cache_set = Py_None; Py_INCREF(Py_None);
  /*--- Variable export code ---*/
  if (__Pyx_ExportVoidPtr(__pyx_n_s_debug_options, (void *)&__pyx_v_5asynq_10decorators__debug_options, "struct __pyx_obj_5asynq_6_debug_DebugOptions *") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  if (__Pyx_ExportVoidPtr(__pyx_n_s_cached, (void *)&__pyx_v_5asynq_10decorators__cached, "PyObject *") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  if (__Pyx_ExportVoidPtr(__pyx_n_s_cache_set, (void *)&__pyx_v_5asynq_10decorators__cache_set, "PyObject *") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  /*--- Function export code ---*/
  if (__Pyx_ExportFunction("has_async_fn", (void (*)(void))__pyx_f_5asynq_10decorators_has_async_fn, "int (PyObject *, int __pyx_skip_dispatch)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  if (__Pyx_ExportFunction("is_pure_async_fn", (void (*)(void))__pyx_f_5asynq_10decorators_is_pure_async_fn, "int (PyObject *, int __pyx_skip_dispatch)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  if (__Pyx_ExportFunction("_assert_apply_without_invocation", (void (*)(void))__pyx_f_5asynq_10decorators__assert_apply_without_invocation, "PyObject *(PyObject *, PyObject *, struct __pyx_opt_args_5asynq_10decorators__assert_apply_without_invocation *__pyx_optional_args)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  if (__Pyx_ExportFunction("_get_cache_key", (void (*)(void))__pyx_f_5asynq_10decorators__get_cache_key, "PyObject *(PyObject *, PyObject *, PyObject *, int __pyx_skip_dispatch)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  /*--- Type init code ---*/
  __pyx_ptype_5qcore_10decorators_DecoratorBinder = __Pyx_ImportType("qcore.decorators", "DecoratorBinder", sizeof(struct __pyx_obj_5qcore_10decorators_DecoratorBinder), 1); if (unlikely(!__pyx_ptype_5qcore_10decorators_DecoratorBinder)) __PYX_ERR(0, 1, __pyx_L1_error)
  __pyx_vtabptr_5qcore_10decorators_DecoratorBinder = (struct __pyx_vtabstruct_5qcore_10decorators_DecoratorBinder*)__Pyx_GetVtable(__pyx_ptype_5qcore_10decorators_DecoratorBinder->tp_dict); if (unlikely(!__pyx_vtabptr_5qcore_10decorators_DecoratorBinder)) __PYX_ERR(0, 1, __pyx_L1_error)
  __pyx_vtabptr_5asynq_10decorators_PureAsyncDecoratorBinder = &__pyx_vtable_5asynq_10decorators_PureAsyncDecoratorBinder;
  __pyx_vtable_5asynq_10decorators_PureAsyncDecoratorBinder.__pyx_base = *__pyx_vtabptr_5qcore_10decorators_DecoratorBinder;
  __pyx_vtable_5asynq_10decorators_PureAsyncDecoratorBinder.is_pure_async_fn = (int (*)(struct __pyx_obj_5asynq_10decorators_PureAsyncDecoratorBinder *, int __pyx_skip_dispatch))__pyx_f_5asynq_10decorators_24PureAsyncDecoratorBinder_is_pure_async_fn;
  __pyx_type_5asynq_10decorators_PureAsyncDecoratorBinder.tp_base = __pyx_ptype_5qcore_10decorators_DecoratorBinder;
  if (PyType_Ready(&__pyx_type_5asynq_10decorators_PureAsyncDecoratorBinder) < 0) __PYX_ERR(0, 97, __pyx_L1_error)
  __pyx_type_5asynq_10decorators_PureAsyncDecoratorBinder.tp_print = 0;
  if (__Pyx_SetVtable(__pyx_type_5asynq_10decorators_PureAsyncDecoratorBinder.tp_dict, __pyx_vtabptr_5asynq_10decorators_PureAsyncDecoratorBinder) < 0) __PYX_ERR(0, 97, __pyx_L1_error)
  if (PyObject_SetAttrString(__pyx_m, "PureAsyncDecoratorBinder", (PyObject *)&__pyx_type_5asynq_10decorators_PureAsyncDecoratorBinder) < 0) __PYX_ERR(0, 97, __pyx_L1_error)
  __pyx_ptype_5asynq_10decorators_PureAsyncDecoratorBinder = &__pyx_type_5asynq_10decorators_PureAsyncDecoratorBinder;
  __pyx_ptype_5qcore_10decorators_DecoratorBase = __Pyx_ImportType("qcore.decorators", "DecoratorBase", sizeof(struct __pyx_obj_5qcore_10decorators_DecoratorBase), 1); if (unlikely(!__pyx_ptype_5qcore_10decorators_DecoratorBase)) __PYX_ERR(0, 1, __pyx_L1_error)
  __pyx_vtabptr_5qcore_10decorators_DecoratorBase = (struct __pyx_vtabstruct_5qcore_10decorators_DecoratorBase*)__Pyx_GetVtable(__pyx_ptype_5qcore_10decorators_DecoratorBase->tp_dict); if (unlikely(!__pyx_vtabptr_5qcore_10decorators_DecoratorBase)) __PYX_ERR(0, 1, __pyx_L1_error)
  __pyx_vtabptr_5asynq_10decorators_PureAsyncDecorator = &__pyx_vtable_5asynq_10decorators_PureAsyncDecorator;
  __pyx_vtable_5asynq_10decorators_PureAsyncDecorator.__pyx_base = *__pyx_vtabptr_5qcore_10decorators_DecoratorBase;
  __pyx_vtable_5asynq_10decorators_PureAsyncDecorator.__pyx_base.name = (PyObject *(*)(struct __pyx_obj_5qcore_10decorators_DecoratorBase *, int __pyx_skip_dispatch))__pyx_f_5asynq_10decorators_18PureAsyncDecorator_name;
  __pyx_vtable_5asynq_10decorators_PureAsyncDecorator.is_pure_async_fn = (int (*)(struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *, int __pyx_skip_dispatch))__pyx_f_5asynq_10decorators_18PureAsyncDecorator_is_pure_async_fn;
  __pyx_vtable_5asynq_10decorators_PureAsyncDecorator._call_pure = (PyObject *(*)(struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *, PyObject *, PyObject *, int __pyx_skip_dispatch))__pyx_f_5asynq_10decorators_18PureAsyncDecorator__call_pure;
  __pyx_type_5asynq_10decorators_PureAsyncDecorator.tp_base = __pyx_ptype_5qcore_10decorators_DecoratorBase;
  if (PyType_Ready(&__pyx_type_5asynq_10decorators_PureAsyncDecorator) < 0) __PYX_ERR(0, 102, __pyx_L1_error)
  __pyx_type_5asynq_10decorators_PureAsyncDecorator.tp_print = 0;
  if (__Pyx_SetVtable(__pyx_type_5asynq_10decorators_PureAsyncDecorator.tp_dict, __pyx_vtabptr_5asynq_10decorators_PureAsyncDecorator) < 0) __PYX_ERR(0, 102, __pyx_L1_error)
  if (PyObject_SetAttrString(__pyx_m, "PureAsyncDecorator", (PyObject *)&__pyx_type_5asynq_10decorators_PureAsyncDecorator) < 0) __PYX_ERR(0, 102, __pyx_L1_error)
  __pyx_ptype_5asynq_10decorators_PureAsyncDecorator = &__pyx_type_5asynq_10decorators_PureAsyncDecorator;
  __pyx_vtabptr_5asynq_10decorators_AsyncDecoratorBinder = &__pyx_vtable_5asynq_10decorators_AsyncDecoratorBinder;
  __pyx_vtable_5asynq_10decorators_AsyncDecoratorBinder.__pyx_base = *__pyx_vtabptr_5qcore_10decorators_DecoratorBinder;
  __pyx_type_5asynq_10decorators_AsyncDecoratorBinder.tp_base = __pyx_ptype_5qcore_10decorators_DecoratorBinder;
  if (PyType_Ready(&__pyx_type_5asynq_10decorators_AsyncDecoratorBinder) < 0) __PYX_ERR(0, 132, __pyx_L1_error)
  __pyx_type_5asynq_10decorators_AsyncDecoratorBinder.tp_print = 0;
  if (__Pyx_SetVtable(__pyx_type_5asynq_10decorators_AsyncDecoratorBinder.tp_dict, __pyx_vtabptr_5asynq_10decorators_AsyncDecoratorBinder) < 0) __PYX_ERR(0, 132, __pyx_L1_error)
  if (PyObject_SetAttrString(__pyx_m, "AsyncDecoratorBinder", (PyObject *)&__pyx_type_5asynq_10decorators_AsyncDecoratorBinder) < 0) __PYX_ERR(0, 132, __pyx_L1_error)
  __pyx_ptype_5asynq_10decorators_AsyncDecoratorBinder = &__pyx_type_5asynq_10decorators_AsyncDecoratorBinder;
  __pyx_vtabptr_5asynq_10decorators_AsyncDecorator = &__pyx_vtable_5asynq_10decorators_AsyncDecorator;
  __pyx_vtable_5asynq_10decorators_AsyncDecorator.__pyx_base = *__pyx_vtabptr_5asynq_10decorators_PureAsyncDecorator;
  __pyx_vtable_5asynq_10decorators_AsyncDecorator.__pyx_base.__pyx_base.name = (PyObject *(*)(struct __pyx_obj_5qcore_10decorators_DecoratorBase *, int __pyx_skip_dispatch))__pyx_f_5asynq_10decorators_14AsyncDecorator_name;
  __pyx_vtable_5asynq_10decorators_AsyncDecorator.__pyx_base.is_pure_async_fn = (int (*)(struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *, int __pyx_skip_dispatch))__pyx_f_5asynq_10decorators_14AsyncDecorator_is_pure_async_fn;
  __pyx_type_5asynq_10decorators_AsyncDecorator.tp_base = __pyx_ptype_5asynq_10decorators_PureAsyncDecorator;
  if (PyType_Ready(&__pyx_type_5asynq_10decorators_AsyncDecorator) < 0) __PYX_ERR(0, 140, __pyx_L1_error)
  __pyx_type_5asynq_10decorators_AsyncDecorator.tp_print = 0;
  if (__Pyx_SetVtable(__pyx_type_5asynq_10decorators_AsyncDecorator.tp_dict, __pyx_vtabptr_5asynq_10decorators_AsyncDecorator) < 0) __PYX_ERR(0, 140, __pyx_L1_error)
  if (PyObject_SetAttrString(__pyx_m, "AsyncDecorator", (PyObject *)&__pyx_type_5asynq_10decorators_AsyncDecorator) < 0) __PYX_ERR(0, 140, __pyx_L1_error)
  __pyx_ptype_5asynq_10decorators_AsyncDecorator = &__pyx_type_5asynq_10decorators_AsyncDecorator;
  __pyx_vtabptr_5asynq_10decorators_AsyncAndSyncPairDecorator = &__pyx_vtable_5asynq_10decorators_AsyncAndSyncPairDecorator;
  __pyx_vtable_5asynq_10decorators_AsyncAndSyncPairDecorator.__pyx_base = *__pyx_vtabptr_5asynq_10decorators_AsyncDecorator;
  __pyx_type_5asynq_10decorators_AsyncAndSyncPairDecorator.tp_base = __pyx_ptype_5asynq_10decorators_AsyncDecorator;
  if (PyType_Ready(&__pyx_type_5asynq_10decorators_AsyncAndSyncPairDecorator) < 0) __PYX_ERR(0, 164, __pyx_L1_error)
  __pyx_type_5asynq_10decorators_AsyncAndSyncPairDecorator.tp_print = 0;
  if (__Pyx_SetVtable(__pyx_type_5asynq_10decorators_AsyncAndSyncPairDecorator.tp_dict, __pyx_vtabptr_5asynq_10decorators_AsyncAndSyncPairDecorator) < 0) __PYX_ERR(0, 164, __pyx_L1_error)
  if (PyObject_SetAttrString(__pyx_m, "AsyncAndSyncPairDecorator", (PyObject *)&__pyx_type_5asynq_10decorators_AsyncAndSyncPairDecorator) < 0) __PYX_ERR(0, 164, __pyx_L1_error)
  __pyx_ptype_5asynq_10decorators_AsyncAndSyncPairDecorator = &__pyx_type_5asynq_10decorators_AsyncAndSyncPairDecorator;
  __pyx_vtabptr_5asynq_10decorators_AsyncProxyDecorator = &__pyx_vtable_5asynq_10decorators_AsyncProxyDecorator;
  __pyx_vtable_5asynq_10decorators_AsyncProxyDecorator.__pyx_base = *__pyx_vtabptr_5asynq_10decorators_AsyncDecorator;
  __pyx_vtable_5asynq_10decorators_AsyncProxyDecorator.__pyx_base.__pyx_base._call_pure = (PyObject *(*)(struct __pyx_obj_5asynq_10decorators_PureAsyncDecorator *, PyObject *, PyObject *, int __pyx_skip_dispatch))__pyx_f_5asynq_10decorators_19AsyncProxyDecorator__call_pure;
  __pyx_type_5asynq_10decorators_AsyncProxyDecorator.tp_base = __pyx_ptype_5asynq_10decorators_AsyncDecorator;
  if (PyType_Ready(&__pyx_type_5asynq_10decorators_AsyncProxyDecorator) < 0) __PYX_ERR(0, 190, __pyx_L1_error)
  __pyx_type_5asynq_10decorators_AsyncProxyDecorator.tp_print = 0;
  if (__Pyx_SetVtable(__pyx_type_5asynq_10decorators_AsyncProxyDecorator.tp_dict, __pyx_vtabptr_5asynq_10decorators_AsyncProxyDecorator) < 0) __PYX_ERR(0, 190, __pyx_L1_error)
  if (PyObject_SetAttrString(__pyx_m, "AsyncProxyDecorator", (PyObject *)&__pyx_type_5asynq_10decorators_AsyncProxyDecorator) < 0) __PYX_ERR(0, 190, __pyx_L1_error)
  __pyx_ptype_5asynq_10decorators_AsyncProxyDecorator = &__pyx_type_5asynq_10decorators_AsyncProxyDecorator;
  __pyx_vtabptr_5asynq_10decorators_AsyncAndSyncPairProxyDecorator = &__pyx_vtable_5asynq_10decorators_AsyncAndSyncPairProxyDecorator;
  __pyx_vtable_5asynq_10decorators_AsyncAndSyncPairProxyDecorator.__pyx_base = *__pyx_vtabptr_5asynq_10decorators_AsyncProxyDecorator;
  __pyx_type_5asynq_10decorators_AsyncAndSyncPairProxyDecorator.tp_base = __pyx_ptype_5asynq_10decorators_AsyncProxyDecorator;
  if (PyType_Ready(&__pyx_type_5asynq_10decorators_AsyncAndSyncPairProxyDecorator) < 0) __PYX_ERR(0, 199, __pyx_L1_error)
  __pyx_type_5asynq_10decorators_AsyncAndSyncPairProxyDecorator.tp_print = 0;
  if (__Pyx_SetVtable(__pyx_type_5asynq_10decorators_AsyncAndSyncPairProxyDecorator.tp_dict, __pyx_vtabptr_5asynq_10decorators_AsyncAndSyncPairProxyDecorator) < 0) __PYX_ERR(0, 199, __pyx_L1_error)
  if (PyObject_SetAttrString(__pyx_m, "AsyncAndSyncPairProxyDecorator", (PyObject *)&__pyx_type_5asynq_10decorators_AsyncAndSyncPairProxyDecorator) < 0) __PYX_ERR(0, 199, __pyx_L1_error)
  __pyx_ptype_5asynq_10decorators_AsyncAndSyncPairProxyDecorator = &__pyx_type_5asynq_10decorators_AsyncAndSyncPairProxyDecorator;
  if (PyType_Ready(&__pyx_type_5asynq_10decorators___pyx_scope_struct__lazy) < 0) __PYX_ERR(0, 31, __pyx_L1_error)
  __pyx_type_5asynq_10decorators___pyx_scope_struct__lazy.tp_print = 0;
  __pyx_ptype_5asynq_10decorators___pyx_scope_struct__lazy = &__pyx_type_5asynq_10decorators___pyx_scope_struct__lazy;
  if (PyType_Ready(&__pyx_type_5asynq_10decorators___pyx_scope_struct_1_new_fn) < 0) __PYX_ERR(0, 38, __pyx_L1_error)
  __pyx_type_5asynq_10decorators___pyx_scope_struct_1_new_fn.tp_print = 0;
  __pyx_ptype_5asynq_10decorators___pyx_scope_struct_1_new_fn = &__pyx_type_5asynq_10decorators___pyx_scope_struct_1_new_fn;
  if (PyType_Ready(&__pyx_type_5asynq_10decorators___pyx_scope_struct_2_get_async_fn) < 0) __PYX_ERR(0, 75, __pyx_L1_error)
  __pyx_type_5asynq_10decorators___pyx_scope_struct_2_get_async_fn.tp_print = 0;
  __pyx_ptype_5asynq_10decorators___pyx_scope_struct_2_get_async_fn = &__pyx_type_5asynq_10decorators___pyx_scope_struct_2_get_async_fn;
  if (PyType_Ready(&__pyx_type_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper) < 0) __PYX_ERR(0, 117, __pyx_L1_error)
  __pyx_type_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper.tp_print = 0;
  __pyx_ptype_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper = &__pyx_type_5asynq_10decorators___pyx_scope_struct_3__fn_wrapper;
  if (PyType_Ready(&__pyx_type_5asynq_10decorators___pyx_scope_struct_4_async) < 0) __PYX_ERR(0, 208, __pyx_L1_error)
  __pyx_type_5asynq_10decorators___pyx_scope_struct_4_async.tp_print = 0;
  __pyx_ptype_5asynq_10decorators___pyx_scope_struct_4_async = &__pyx_type_5asynq_10decorators___pyx_scope_struct_4_async;
  if (PyType_Ready(&__pyx_type_5asynq_10decorators___pyx_scope_struct_5_async_proxy) < 0) __PYX_ERR(0, 232, __pyx_L1_error)
  __pyx_type_5asynq_10decorators___pyx_scope_struct_5_async_proxy.tp_print = 0;
  __pyx_ptype_5asynq_10decorators___pyx_scope_struct_5_async_proxy = &__pyx_type_5asynq_10decorators___pyx_scope_struct_5_async_proxy;
  if (PyType_Ready(&__pyx_type_5asynq_10decorators___pyx_scope_struct_6_cached) < 0) __PYX_ERR(0, 247, __pyx_L1_error)
  __pyx_type_5asynq_10decorators___pyx_scope_struct_6_cached.tp_print = 0;
  __pyx_ptype_5asynq_10decorators___pyx_scope_struct_6_cached = &__pyx_type_5asynq_10decorators___pyx_scope_struct_6_cached;
  if (PyType_Ready(&__pyx_type_5asynq_10decorators___pyx_scope_struct_7_decorate) < 0) __PYX_ERR(0, 257, __pyx_L1_error)
  __pyx_type_5asynq_10decorators___pyx_scope_struct_7_decorate.tp_print = 0;
  __pyx_ptype_5asynq_10decorators___pyx_scope_struct_7_decorate = &__pyx_type_5asynq_10decorators___pyx_scope_struct_7_decorate;
  if (PyType_Ready(&__pyx_type_5asynq_10decorators___pyx_scope_struct_8__cached_impl) < 0) __PYX_ERR(0, 340, __pyx_L1_error)
  __pyx_type_5asynq_10decorators___pyx_scope_struct_8__cached_impl.tp_print = 0;
  __pyx_ptype_5asynq_10decorators___pyx_scope_struct_8__cached_impl = &__pyx_type_5asynq_10decorators___pyx_scope_struct_8__cached_impl;
  if (PyType_Ready(&__pyx_type_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl) < 0) __PYX_ERR(0, 361, __pyx_L1_error)
  __pyx_type_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl.tp_print = 0;
  __pyx_ptype_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl = &__pyx_type_5asynq_10decorators___pyx_scope_struct_9__cache_set_impl;
  /*--- Type import code ---*/
  __pyx_ptype_7cpython_4type_type = __Pyx_ImportType(__Pyx_BUILTIN_MODULE_NAME, "type", 
  #if CYTHON_COMPILING_IN_PYPY
  sizeof(PyTypeObject),
  #else
  sizeof(PyHeapTypeObject),
  #endif
  0); if (unlikely(!__pyx_ptype_7cpython_4type_type)) __PYX_ERR(2, 9, __pyx_L1_error)
  __pyx_ptype_7cpython_4bool_bool = __Pyx_ImportType(__Pyx_BUILTIN_MODULE_NAME, "bool", sizeof(PyBoolObject), 0); if (unlikely(!__pyx_ptype_7cpython_4bool_bool)) __PYX_ERR(3, 8, __pyx_L1_error)
  __pyx_ptype_7cpython_7complex_complex = __Pyx_ImportType(__Pyx_BUILTIN_MODULE_NAME, "complex", sizeof(PyComplexObject), 0); if (unlikely(!__pyx_ptype_7cpython_7complex_complex)) __PYX_ERR(4, 15, __pyx_L1_error)
  __pyx_ptype_5qcore_7helpers_MarkerObject = __Pyx_ImportType("qcore.helpers", "MarkerObject", sizeof(struct __pyx_obj_5qcore_7helpers_MarkerObject), 1); if (unlikely(!__pyx_ptype_5qcore_7helpers_MarkerObject)) __PYX_ERR(5, 24, __pyx_L1_error)
  __pyx_ptype_5qcore_7helpers_EmptyContext = __Pyx_ImportType("qcore.helpers", "EmptyContext", sizeof(struct __pyx_obj_5qcore_7helpers_EmptyContext), 1); if (unlikely(!__pyx_ptype_5qcore_7helpers_EmptyContext)) __PYX_ERR(5, 33, __pyx_L1_error)
  __pyx_vtabptr_5qcore_7helpers_EmptyContext = (struct __pyx_vtabstruct_5qcore_7helpers_EmptyContext*)__Pyx_GetVtable(__pyx_ptype_5qcore_7helpers_EmptyContext->tp_dict); if (unlikely(!__pyx_vtabptr_5qcore_7helpers_EmptyContext)) __PYX_ERR(5, 33, __pyx_L1_error)
  __pyx_ptype_5qcore_7helpers_CythonCachedHashWrapper = __Pyx_ImportType("qcore.helpers", "CythonCachedHashWrapper", sizeof(struct __pyx_obj_5qcore_7helpers_CythonCachedHashWrapper), 1); if (unlikely(!__pyx_ptype_5qcore_7helpers_CythonCachedHashWrapper)) __PYX_ERR(5, 40, __pyx_L1_error)
  __pyx_vtabptr_5qcore_7helpers_CythonCachedHashWrapper = (struct __pyx_vtabstruct_5qcore_7helpers_CythonCachedHashWrapper*)__Pyx_GetVtable(__pyx_ptype_5qcore_7helpers_CythonCachedHashWrapper->tp_dict); if (unlikely(!__pyx_vtabptr_5qcore_7helpers_CythonCachedHashWrapper)) __PYX_ERR(5, 40, __pyx_L1_error)
  __pyx_ptype_5qcore_7helpers__ScopedValueOverrideContext = __Pyx_ImportType("qcore.helpers", "_ScopedValueOverrideContext", sizeof(struct __pyx_obj_5qcore_7helpers__ScopedValueOverrideContext), 1); if (unlikely(!__pyx_ptype_5qcore_7helpers__ScopedValueOverrideContext)) __PYX_ERR(5, 50, __pyx_L1_error)
  __pyx_ptype_5qcore_7helpers_ScopedValue = __Pyx_ImportType("qcore.helpers", "ScopedValue", sizeof(struct __pyx_obj_5qcore_7helpers_ScopedValue), 1); if (unlikely(!__pyx_ptype_5qcore_7helpers_ScopedValue)) __PYX_ERR(5, 52, __pyx_L1_error)
  __pyx_vtabptr_5qcore_7helpers_ScopedValue = (struct __pyx_vtabstruct_5qcore_7helpers_ScopedValue*)__Pyx_GetVtable(__pyx_ptype_5qcore_7helpers_ScopedValue->tp_dict); if (unlikely(!__pyx_vtabptr_5qcore_7helpers_ScopedValue)) __PYX_ERR(5, 52, __pyx_L1_error)
  __pyx_ptype_5qcore_7helpers__PropertyOverrideContext = __Pyx_ImportType("qcore.helpers", "_PropertyOverrideContext", sizeof(struct __pyx_obj_5qcore_7helpers__PropertyOverrideContext), 1); if (unlikely(!__pyx_ptype_5qcore_7helpers__PropertyOverrideContext)) __PYX_ERR(5, 65, __pyx_L1_error)
  __pyx_ptype_5qcore_6events_EventHook = __Pyx_ImportType("qcore.events", "EventHook", sizeof(struct __pyx_obj_5qcore_6events_EventHook), 1); if (unlikely(!__pyx_ptype_5qcore_6events_EventHook)) __PYX_ERR(6, 15, __pyx_L1_error)
  __pyx_ptype_5qcore_6events_SinkingEventHook = __Pyx_ImportType("qcore.events", "SinkingEventHook", sizeof(struct __pyx_obj_5qcore_6events_SinkingEventHook), 1); if (unlikely(!__pyx_ptype_5qcore_6events_SinkingEventHook)) __PYX_ERR(6, 19, __pyx_L1_error)
  __pyx_ptype_5qcore_6events_EventInterceptor = __Pyx_ImportType("qcore.events", "EventInterceptor", sizeof(struct __pyx_obj_5qcore_6events_EventInterceptor), 1); if (unlikely(!__pyx_ptype_5qcore_6events_EventInterceptor)) __PYX_ERR(6, 25, __pyx_L1_error)
  __pyx_ptype_5asynq_6_debug_DebugOptions = __Pyx_ImportType("asynq._debug", "DebugOptions", sizeof(struct __pyx_obj_5asynq_6_debug_DebugOptions), 1); if (unlikely(!__pyx_ptype_5asynq_6_debug_DebugOptions)) __PYX_ERR(7, 18, __pyx_L1_error)
  __pyx_vtabptr_5asynq_6_debug_DebugOptions = (struct __pyx_vtabstruct_5asynq_6_debug_DebugOptions*)__Pyx_GetVtable(__pyx_ptype_5asynq_6_debug_DebugOptions->tp_dict); if (unlikely(!__pyx_vtabptr_5asynq_6_debug_DebugOptions)) __PYX_ERR(7, 18, __pyx_L1_error)
  __pyx_ptype_5asynq_7futures_FutureBase = __Pyx_ImportType("asynq.futures", "FutureBase", sizeof(struct __pyx_obj_5asynq_7futures_FutureBase), 1); if (unlikely(!__pyx_ptype_5asynq_7futures_FutureBase)) __PYX_ERR(8, 26, __pyx_L1_error)
  __pyx_vtabptr_5asynq_7futures_FutureBase = (struct __pyx_vtabstruct_5asynq_7futures_FutureBase*)__Pyx_GetVtable(__pyx_ptype_5asynq_7futures_FutureBase->tp_dict); if (unlikely(!__pyx_vtabptr_5asynq_7futures_FutureBase)) __PYX_ERR(8, 26, __pyx_L1_error)
  __pyx_ptype_5asynq_7futures_Future = __Pyx_ImportType("asynq.futures", "Future", sizeof(struct __pyx_obj_5asynq_7futures_Future), 1); if (unlikely(!__pyx_ptype_5asynq_7futures_Future)) __PYX_ERR(8, 49, __pyx_L1_error)
  __pyx_vtabptr_5asynq_7futures_Future = (struct __pyx_vtabstruct_5asynq_7futures_Future*)__Pyx_GetVtable(__pyx_ptype_5asynq_7futures_Future->tp_dict); if (unlikely(!__pyx_vtabptr_5asynq_7futures_Future)) __PYX_ERR(8, 49, __pyx_L1_error)
  __pyx_ptype_5asynq_7futures_ConstFuture = __Pyx_ImportType("asynq.futures", "ConstFuture", sizeof(struct __pyx_obj_5asynq_7futures_ConstFuture), 1); if (unlikely(!__pyx_ptype_5asynq_7futures_ConstFuture)) __PYX_ERR(8, 54, __pyx_L1_error)
  __pyx_vtabptr_5asynq_7futures_ConstFuture = (struct __pyx_vtabstruct_5asynq_7futures_ConstFuture*)__Pyx_GetVtable(__pyx_ptype_5asynq_7futures_ConstFuture->tp_dict); if (unlikely(!__pyx_vtabptr_5asynq_7futures_ConstFuture)) __PYX_ERR(8, 54, __pyx_L1_error)
  __pyx_ptype_5asynq_7futures_ErrorFuture = __Pyx_ImportType("asynq.futures", "ErrorFuture", sizeof(struct __pyx_obj_5asynq_7futures_ErrorFuture), 1); if (unlikely(!__pyx_ptype_5asynq_7futures_ErrorFuture)) __PYX_ERR(8, 57, __pyx_L1_error)
  __pyx_vtabptr_5asynq_7futures_ErrorFuture = (struct __pyx_vtabstruct_5asynq_7futures_ErrorFuture*)__Pyx_GetVtable(__pyx_ptype_5asynq_7futures_ErrorFuture->tp_dict); if (unlikely(!__pyx_vtabptr_5asynq_7futures_ErrorFuture)) __PYX_ERR(8, 57, __pyx_L1_error)
  __pyx_ptype_5asynq_8batching_BatchBase = __Pyx_ImportType("asynq.batching", "BatchBase", sizeof(struct __pyx_obj_5asynq_8batching_BatchBase), 1); if (unlikely(!__pyx_ptype_5asynq_8batching_BatchBase)) __PYX_ERR(9, 26, __pyx_L1_error)
  __pyx_vtabptr_5asynq_8batching_BatchBase = (struct __pyx_vtabstruct_5asynq_8batching_BatchBase*)__Pyx_GetVtable(__pyx_ptype_5asynq_8batching_BatchBase->tp_dict); if (unlikely(!__pyx_vtabptr_5asynq_8batching_BatchBase)) __PYX_ERR(9, 26, __pyx_L1_error)
  __pyx_ptype_5asynq_8batching_BatchItemBase = __Pyx_ImportType("asynq.batching", "BatchItemBase", sizeof(struct __pyx_obj_5asynq_8batching_BatchItemBase), 1); if (unlikely(!__pyx_ptype_5asynq_8batching_BatchItemBase)) __PYX_ERR(9, 45, __pyx_L1_error)
  __pyx_vtabptr_5asynq_8batching_BatchItemBase = (struct __pyx_vtabstruct_5asynq_8batching_BatchItemBase*)__Pyx_GetVtable(__pyx_ptype_5asynq_8batching_BatchItemBase->tp_dict); if (unlikely(!__pyx_vtabptr_5asynq_8batching_BatchItemBase)) __PYX_ERR(9, 45, __pyx_L1_error)
  __pyx_ptype_5asynq_8batching_DebugBatchItem = __Pyx_ImportType("asynq.batching", "DebugBatchItem", sizeof(struct __pyx_obj_5asynq_8batching_DebugBatchItem), 1); if (unlikely(!__pyx_ptype_5asynq_8batching_DebugBatchItem)) __PYX_ERR(9, 53, __pyx_L1_error)
  __pyx_vtabptr_5asynq_8batching_DebugBatchItem = (struct __pyx_vtabstruct_5asynq_8batching_DebugBatchItem*)__Pyx_GetVtable(__pyx_ptype_5asynq_8batching_DebugBatchItem->tp_dict); if (unlikely(!__pyx_vtabptr_5asynq_8batching_DebugBatchItem)) __PYX_ERR(9, 53, __pyx_L1_error)
  __pyx_ptype_5asynq_8batching_DebugBatch = __Pyx_ImportType("asynq.batching", "DebugBatch", sizeof(struct __pyx_obj_5asynq_8batching_DebugBatch), 1); if (unlikely(!__pyx_ptype_5asynq_8batching_DebugBatch)) __PYX_ERR(9, 56, __pyx_L1_error)
  __pyx_vtabptr_5asynq_8batching_DebugBatch = (struct __pyx_vtabstruct_5asynq_8batching_DebugBatch*)__Pyx_GetVtable(__pyx_ptype_5asynq_8batching_DebugBatch->tp_dict); if (unlikely(!__pyx_vtabptr_5asynq_8batching_DebugBatch)) __PYX_ERR(9, 56, __pyx_L1_error)
  __pyx_ptype_5asynq_9scheduler_TaskScheduler = __Pyx_ImportType("asynq.scheduler", "TaskScheduler", sizeof(struct __pyx_obj_5asynq_9scheduler_TaskScheduler), 1); if (unlikely(!__pyx_ptype_5asynq_9scheduler_TaskScheduler)) __PYX_ERR(10, 29, __pyx_L1_error)
  __pyx_vtabptr_5asynq_9scheduler_TaskScheduler = (struct __pyx_vtabstruct_5asynq_9scheduler_TaskScheduler*)__Pyx_GetVtable(__pyx_ptype_5asynq_9scheduler_TaskScheduler->tp_dict); if (unlikely(!__pyx_vtabptr_5asynq_9scheduler_TaskScheduler)) __PYX_ERR(10, 29, __pyx_L1_error)
  __pyx_ptype_5asynq_9scheduler_TaskSchedulerActivator = __Pyx_ImportType("asynq.scheduler", "TaskSchedulerActivator", sizeof(struct __pyx_obj_5asynq_9scheduler_TaskSchedulerActivator), 1); if (unlikely(!__pyx_ptype_5asynq_9scheduler_TaskSchedulerActivator)) __PYX_ERR(10, 88, __pyx_L1_error)
  __pyx_ptype_5asynq_10async_task_AsyncTask = __Pyx_ImportType("asynq.async_task", "AsyncTask", sizeof(struct __pyx_obj_5asynq_10async_task_AsyncTask), 1); if (unlikely(!__pyx_ptype_5asynq_10async_task_AsyncTask)) __PYX_ERR(11, 31, __pyx_L1_error)
  __pyx_vtabptr_5asynq_10async_task_AsyncTask = (struct __pyx_vtabstruct_5asynq_10async_task_AsyncTask*)__Pyx_GetVtable(__pyx_ptype_5asynq_10async_task_AsyncTask->tp_dict); if (unlikely(!__pyx_vtabptr_5asynq_10async_task_AsyncTask)) __PYX_ERR(11, 31, __pyx_L1_error)
  /*--- Variable import code ---*/
  __pyx_t_1 = __Pyx_ImportModule("qcore.helpers"); if (!__pyx_t_1) __PYX_ERR(0, 1, __pyx_L1_error)
  if (__Pyx_ImportVoidPtr(__pyx_t_1, "empty_list", (void **)&__pyx_vp_5qcore_7helpers_empty_list, "PyObject *") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  if (__Pyx_ImportVoidPtr(__pyx_t_1, "empty_tuple", (void **)&__pyx_vp_5qcore_7helpers_empty_tuple, "PyObject *") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  if (__Pyx_ImportVoidPtr(__pyx_t_1, "empty_dict", (void **)&__pyx_vp_5qcore_7helpers_empty_dict, "PyObject *") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  if (__Pyx_ImportVoidPtr(__pyx_t_1, "none", (void **)&__pyx_vp_5qcore_7helpers_none, "struct __pyx_obj_5qcore_7helpers_MarkerObject *") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  if (__Pyx_ImportVoidPtr(__pyx_t_1, "miss", (void **)&__pyx_vp_5qcore_7helpers_miss, "struct __pyx_obj_5qcore_7helpers_MarkerObject *") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  if (__Pyx_ImportVoidPtr(__pyx_t_1, "same", (void **)&__pyx_vp_5qcore_7helpers_same, "struct __pyx_obj_5qcore_7helpers_MarkerObject *") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  if (__Pyx_ImportVoidPtr(__pyx_t_1, "unspecified", (void **)&__pyx_vp_5qcore_7helpers_unspecified, "struct __pyx_obj_5qcore_7helpers_MarkerObject *") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  if (__Pyx_ImportVoidPtr(__pyx_t_1, "empty_context", (void **)&__pyx_vp_5qcore_7helpers_empty_context, "struct __pyx_obj_5qcore_7helpers_EmptyContext *") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  if (__Pyx_ImportVoidPtr(__pyx_t_1, "CachedHashWrapper", (void **)&__pyx_vp_5qcore_7helpers_CachedHashWrapper, "PyObject *") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  if (__Pyx_ImportVoidPtr(__pyx_t_1, "override", (void **)&__pyx_vp_5qcore_7helpers_override, "PyObject *") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  Py_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_2 = __Pyx_ImportModule("qcore.events"); if (!__pyx_t_2) __PYX_ERR(0, 1, __pyx_L1_error)
  if (__Pyx_ImportVoidPtr(__pyx_t_2, "sinking_event_hook", (void **)&__pyx_vp_5qcore_6events_sinking_event_hook, "struct __pyx_obj_5qcore_6events_SinkingEventHook *") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  Py_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_3 = __Pyx_ImportModule("asynq._debug"); if (!__pyx_t_3) __PYX_ERR(0, 1, __pyx_L1_error)
  if (__Pyx_ImportVoidPtr(__pyx_t_3, "options", (void **)&__pyx_vp_5asynq_6_debug_options, "struct __pyx_obj_5asynq_6_debug_DebugOptions *") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  Py_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_4 = __Pyx_ImportModule("asynq.futures"); if (!__pyx_t_4) __PYX_ERR(0, 1, __pyx_L1_error)
  if (__Pyx_ImportVoidPtr(__pyx_t_4, "_debug_options", (void **)&__pyx_vp_5asynq_7futures__debug_options, "struct __pyx_obj_5asynq_6_debug_DebugOptions *") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  if (__Pyx_ImportVoidPtr(__pyx_t_4, "_none", (void **)&__pyx_vp_5asynq_7futures__none, "struct __pyx_obj_5qcore_7helpers_MarkerObject *") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  Py_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_5 = __Pyx_ImportModule("asynq.batching"); if (!__pyx_t_5) __PYX_ERR(0, 1, __pyx_L1_error)
  if (__Pyx_ImportVoidPtr(__pyx_t_5, "_debug_options", (void **)&__pyx_vp_5asynq_8batching__debug_options, "struct __pyx_obj_5asynq_6_debug_DebugOptions *") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  if (__Pyx_ImportVoidPtr(__pyx_t_5, "_debug_batch_state", (void **)&__pyx_vp_5asynq_8batching__debug_batch_state, "PyObject *") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  Py_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_6 = __Pyx_ImportModule("asynq.scheduler"); if (!__pyx_t_6) __PYX_ERR(0, 1, __pyx_L1_error)
  if (__Pyx_ImportVoidPtr(__pyx_t_6, "_debug_options", (void **)&__pyx_vp_5asynq_9scheduler__debug_options, "struct __pyx_obj_5asynq_6_debug_DebugOptions *") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  if (__Pyx_ImportVoidPtr(__pyx_t_6, "_futures_none", (void **)&__pyx_vp_5asynq_9scheduler__futures_none, "PyObject *") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  if (__Pyx_ImportVoidPtr(__pyx_t_6, "_state", (void **)&__pyx_vp_5asynq_9scheduler__state, "PyObject *") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  Py_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_7 = __Pyx_ImportModule("asynq.async_task"); if (!__pyx_t_7) __PYX_ERR(0, 1, __pyx_L1_error)
  if (__Pyx_ImportVoidPtr(__pyx_t_7, "_debug_options", (void **)&__pyx_vp_5asynq_10async_task__debug_options, "struct __pyx_obj_5asynq_6_debug_DebugOptions *") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  if (__Pyx_ImportVoidPtr(__pyx_t_7, "_futures_none", (void **)&__pyx_vp_5asynq_10async_task__futures_none, "PyObject *") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  if (__Pyx_ImportVoidPtr(__pyx_t_7, "_none_future", (void **)&__pyx_vp_5asynq_10async_task__none_future, "PyObject *") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  if (__Pyx_ImportVoidPtr(__pyx_t_7, "_empty_tuple", (void **)&__pyx_vp_5asynq_10async_task__empty_tuple, "PyObject *") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  if (__Pyx_ImportVoidPtr(__pyx_t_7, "_empty_dictionary", (void **)&__pyx_vp_5asynq_10async_task__empty_dictionary, "PyObject *") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  Py_DECREF(__pyx_t_7); __pyx_t_7 = 0;
  /*--- Function import code ---*/
  __pyx_t_8 = __Pyx_ImportModule("qcore.inspection"); if (!__pyx_t_8) __PYX_ERR(0, 1, __pyx_L1_error)
  if (__Pyx_ImportFunction(__pyx_t_8, "get_original_fn", (void (**)(void))&__pyx_f_5qcore_10inspection_get_original_fn, "PyObject *(PyObject *, int __pyx_skip_dispatch)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  if (__Pyx_ImportFunction(__pyx_t_8, "get_function_call_repr", (void (**)(void))&__pyx_f_5qcore_10inspection_get_function_call_repr, "PyObject *(PyObject *, PyObject *, PyObject *, int __pyx_skip_dispatch)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  if (__Pyx_ImportFunction(__pyx_t_8, "is_cython_or_generator", (void (**)(void))&__pyx_f_5qcore_10inspection_is_cython_or_generator, "int (PyObject *, int __pyx_skip_dispatch)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  if (__Pyx_ImportFunction(__pyx_t_8, "wraps", (void (**)(void))&__pyx_f_5qcore_10inspection_wraps, "PyObject *(PyObject *, int __pyx_skip_dispatch, struct __pyx_opt_args_5qcore_10inspection_wraps *__pyx_optional_args)") < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  Py_DECREF(__pyx_t_8); __pyx_t_8 = 0;
  /*--- Execution code ---*/
  #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED)
  if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  #endif

  /* "asynq/decorators.py":15
 * # limitations under the License.
 * 
 * import inspect             # <<<<<<<<<<<<<<
 * from types import FunctionType
 * 
 */
  __pyx_t_9 = __Pyx_patch_inspect(__Pyx_Import(__pyx_n_s_inspect, 0, -1)); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 15, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_inspect, __pyx_t_9) < 0) __PYX_ERR(0, 15, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;

  /* "asynq/decorators.py":16
 * 
 * import inspect
 * from types import FunctionType             # <<<<<<<<<<<<<<
 * 
 * import qcore.helpers as core_helpers
 */
  __pyx_t_9 = PyList_New(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 16, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_INCREF(__pyx_n_s_FunctionType);
  __Pyx_GIVEREF(__pyx_n_s_FunctionType);
  PyList_SET_ITEM(__pyx_t_9, 0, __pyx_n_s_FunctionType);
  __pyx_t_10 = __Pyx_Import(__pyx_n_s_types, __pyx_t_9, -1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 16, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_10);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_9 = __Pyx_ImportFrom(__pyx_t_10, __pyx_n_s_FunctionType); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 16, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_FunctionType, __pyx_t_9) < 0) __PYX_ERR(0, 16, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;

  /* "asynq/decorators.py":18
 * from types import FunctionType
 * 
 * import qcore.helpers as core_helpers             # <<<<<<<<<<<<<<
 * import qcore.inspection as core_inspection
 * import qcore.decorators
 */
  __pyx_t_10 = PyList_New(1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 18, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_10);
  __Pyx_INCREF(__pyx_n_s__18);
  __Pyx_GIVEREF(__pyx_n_s__18);
  PyList_SET_ITEM(__pyx_t_10, 0, __pyx_n_s__18);
  __pyx_t_9 = __Pyx_Import(__pyx_n_s_qcore_helpers, __pyx_t_10, -1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 18, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_core_helpers, __pyx_t_9) < 0) __PYX_ERR(0, 18, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;

  /* "asynq/decorators.py":19
 * 
 * import qcore.helpers as core_helpers
 * import qcore.inspection as core_inspection             # <<<<<<<<<<<<<<
 * import qcore.decorators
 * 
 */
  __pyx_t_9 = PyList_New(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 19, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_INCREF(__pyx_n_s__18);
  __Pyx_GIVEREF(__pyx_n_s__18);
  PyList_SET_ITEM(__pyx_t_9, 0, __pyx_n_s__18);
  __pyx_t_10 = __Pyx_Import(__pyx_n_s_qcore_inspection, __pyx_t_9, -1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 19, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_10);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_core_inspection, __pyx_t_10) < 0) __PYX_ERR(0, 19, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;

  /* "asynq/decorators.py":20
 * import qcore.helpers as core_helpers
 * import qcore.inspection as core_inspection
 * import qcore.decorators             # <<<<<<<<<<<<<<
 * 
 * from . import futures
 */
  __pyx_t_10 = __Pyx_Import(__pyx_n_s_qcore_decorators, 0, -1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 20, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_10);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_qcore, __pyx_t_10) < 0) __PYX_ERR(0, 20, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;

  /* "asynq/decorators.py":22
 * import qcore.decorators
 * 
 * from . import futures             # <<<<<<<<<<<<<<
 * from . import async_task
 * from . import _debug
 */
  __pyx_t_10 = PyList_New(1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 22, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_10);
  __Pyx_INCREF(__pyx_n_s_futures);
  __Pyx_GIVEREF(__pyx_n_s_futures);
  PyList_SET_ITEM(__pyx_t_10, 0, __pyx_n_s_futures);
  __pyx_t_9 = __Pyx_Import(__pyx_n_s__19, __pyx_t_10, 1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 22, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
  __pyx_t_10 = __Pyx_ImportFrom(__pyx_t_9, __pyx_n_s_futures); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 22, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_10);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_futures, __pyx_t_10) < 0) __PYX_ERR(0, 22, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;

  /* "asynq/decorators.py":23
 * 
 * from . import futures
 * from . import async_task             # <<<<<<<<<<<<<<
 * from . import _debug
 * 
 */
  __pyx_t_9 = PyList_New(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 23, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_INCREF(__pyx_n_s_async_task);
  __Pyx_GIVEREF(__pyx_n_s_async_task);
  PyList_SET_ITEM(__pyx_t_9, 0, __pyx_n_s_async_task);
  __pyx_t_10 = __Pyx_Import(__pyx_n_s__19, __pyx_t_9, 1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 23, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_10);
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __pyx_t_9 = __Pyx_ImportFrom(__pyx_t_10, __pyx_n_s_async_task); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 23, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_async_task, __pyx_t_9) < 0) __PYX_ERR(0, 23, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;

  /* "asynq/decorators.py":24
 * from . import futures
 * from . import async_task
 * from . import _debug             # <<<<<<<<<<<<<<
 * 
 * __traceback_hide__ = True
 */
  __pyx_t_10 = PyList_New(1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 24, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_10);
  __Pyx_INCREF(__pyx_n_s_debug);
  __Pyx_GIVEREF(__pyx_n_s_debug);
  PyList_SET_ITEM(__pyx_t_10, 0, __pyx_n_s_debug);
  __pyx_t_9 = __Pyx_Import(__pyx_n_s__19, __pyx_t_10, 1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 24, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
  __pyx_t_10 = __Pyx_ImportFrom(__pyx_t_9, __pyx_n_s_debug); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 24, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_10);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_debug, __pyx_t_10) < 0) __PYX_ERR(0, 24, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;

  /* "asynq/decorators.py":26
 * from . import _debug
 * 
 * __traceback_hide__ = True             # <<<<<<<<<<<<<<
 * 
 * _debug_options = _debug.options
 */
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_traceback_hide, Py_True) < 0) __PYX_ERR(0, 26, __pyx_L1_error)

  /* "asynq/decorators.py":28
 * __traceback_hide__ = True
 * 
 * _debug_options = _debug.options             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_INCREF(((PyObject *)__pyx_v_5asynq_6_debug_options));
  __Pyx_XGOTREF(((PyObject *)__pyx_v_5asynq_10decorators__debug_options));
  __Pyx_DECREF_SET(__pyx_v_5asynq_10decorators__debug_options, __pyx_v_5asynq_6_debug_options);
  __Pyx_GIVEREF(((PyObject *)__pyx_v_5asynq_6_debug_options));

  /* "asynq/decorators.py":31
 * 
 * 
 * def lazy(fn):             # <<<<<<<<<<<<<<
 *     """Converts a function into a lazy one - i.e. its call
 *     returns a Future bound to a function call with passed
 */
  __pyx_t_9 = __Pyx_CyFunction_NewEx(&__pyx_mdef_5asynq_10decorators_1lazy, 0, __pyx_n_s_lazy, NULL, __pyx_n_s_asynq_decorators, __pyx_d, ((PyObject *)__pyx_codeobj__21)); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 31, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_lazy, __pyx_t_9) < 0) __PYX_ERR(0, 31, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;

  /* "asynq/decorators.py":70
 * 
 * 
 * def is_async_fn(fn):             # <<<<<<<<<<<<<<
 *     """Returns true if fn is an @async([pure=True]) or @async_proxy(pure=True) function."""
 *     return hasattr(fn, 'async') or is_pure_async_fn(fn)
 */
  __pyx_t_9 = __Pyx_CyFunction_NewEx(&__pyx_mdef_5asynq_10decorators_7is_async_fn, 0, __pyx_n_s_is_async_fn, NULL, __pyx_n_s_asynq_decorators, __pyx_d, ((PyObject *)__pyx_codeobj__23)); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 70, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_is_async_fn, __pyx_t_9) < 0) __PYX_ERR(0, 70, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;

  /* "asynq/decorators.py":75
 * 
 * 
 * def get_async_fn(fn, wrap_if_none=False):             # <<<<<<<<<<<<<<
 *     """Returns an async function for the specified source function."""
 *     if hasattr(fn, 'async'):
 */
  __pyx_t_9 = __Pyx_CyFunction_NewEx(&__pyx_mdef_5asynq_10decorators_9get_async_fn, 0, __pyx_n_s_get_async_fn, NULL, __pyx_n_s_asynq_decorators, __pyx_d, ((PyObject *)__pyx_codeobj__25)); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 75, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_9, __pyx_tuple__26);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_async_fn, __pyx_t_9) < 0) __PYX_ERR(0, 75, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;

  /* "asynq/decorators.py":90
 * 
 * 
 * def get_async_or_sync_fn(fn):             # <<<<<<<<<<<<<<
 *     """Returns an async function for the specified fn, if it exists; otherwise returns source."""
 *     if hasattr(fn, 'async'):
 */
  __pyx_t_9 = __Pyx_CyFunction_NewEx(&__pyx_mdef_5asynq_10decorators_11get_async_or_sync_fn, 0, __pyx_n_s_get_async_or_sync_fn, NULL, __pyx_n_s_asynq_decorators, __pyx_d, ((PyObject *)__pyx_codeobj__28)); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 90, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_async_or_sync_fn, __pyx_t_9) < 0) __PYX_ERR(0, 90, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;

  /* "asynq/decorators.py":103
 * 
 * class PureAsyncDecorator(qcore.decorators.DecoratorBase):
 *     binder_cls = PureAsyncDecoratorBinder             # <<<<<<<<<<<<<<
 * 
 *     def __init__(self, fn, task_cls, kwargs={}):
 */
  if (PyDict_SetItem((PyObject *)__pyx_ptype_5asynq_10decorators_PureAsyncDecorator->tp_dict, __pyx_n_s_binder_cls, ((PyObject *)__pyx_ptype_5asynq_10decorators_PureAsyncDecoratorBinder)) < 0) __PYX_ERR(0, 103, __pyx_L1_error)
  PyType_Modified(__pyx_ptype_5asynq_10decorators_PureAsyncDecorator);

  /* "asynq/decorators.py":105
 *     binder_cls = PureAsyncDecoratorBinder
 * 
 *     def __init__(self, fn, task_cls, kwargs={}):             # <<<<<<<<<<<<<<
 *         qcore.decorators.DecoratorBase.__init__(self, fn)
 *         self.task_cls = task_cls
 */
  __pyx_t_9 = PyDict_New(); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 105, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_k__5 = __pyx_t_9;
  __Pyx_GIVEREF(__pyx_t_9);
  __pyx_t_9 = 0;

  /* "asynq/decorators.py":141
 * 
 * class AsyncDecorator(PureAsyncDecorator):
 *     binder_cls = AsyncDecoratorBinder             # <<<<<<<<<<<<<<
 * 
 *     def is_pure_async_fn(self):
 */
  if (PyDict_SetItem((PyObject *)__pyx_ptype_5asynq_10decorators_AsyncDecorator->tp_dict, __pyx_n_s_binder_cls, ((PyObject *)__pyx_ptype_5asynq_10decorators_AsyncDecoratorBinder)) < 0) __PYX_ERR(0, 141, __pyx_L1_error)
  PyType_Modified(__pyx_ptype_5asynq_10decorators_AsyncDecorator);

  /* "asynq/decorators.py":156
 * 
 * 
 * class AsyncAndSyncPairDecoratorBinder(AsyncDecoratorBinder):             # <<<<<<<<<<<<<<
 *     def __call__(self, *args, **kwargs):
 *         # the base class implementation adds .instance here, but we don't want that because we
 */
  __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 156, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_INCREF(((PyObject *)__pyx_ptype_5asynq_10decorators_AsyncDecoratorBinder));
  __Pyx_GIVEREF(((PyObject *)__pyx_ptype_5asynq_10decorators_AsyncDecoratorBinder));
  PyTuple_SET_ITEM(__pyx_t_9, 0, ((PyObject *)__pyx_ptype_5asynq_10decorators_AsyncDecoratorBinder));
  __pyx_t_10 = __Pyx_CalculateMetaclass(NULL, __pyx_t_9); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 156, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_10);
  __pyx_t_11 = __Pyx_Py3MetaclassPrepare(__pyx_t_10, __pyx_t_9, __pyx_n_s_AsyncAndSyncPairDecoratorBinder, __pyx_n_s_AsyncAndSyncPairDecoratorBinder, (PyObject *) NULL, __pyx_n_s_asynq_decorators, (PyObject *) NULL); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 156, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);

  /* "asynq/decorators.py":157
 * 
 * class AsyncAndSyncPairDecoratorBinder(AsyncDecoratorBinder):
 *     def __call__(self, *args, **kwargs):             # <<<<<<<<<<<<<<
 *         # the base class implementation adds .instance here, but we don't want that because we
 *         # called __get__ on the sync_fn manually; if we don't do this we'll end up adding self or
 */
  __pyx_t_12 = __Pyx_CyFunction_NewEx(&__pyx_mdef_5asynq_10decorators_31AsyncAndSyncPairDecoratorBinder_1__call__, 0, __pyx_n_s_AsyncAndSyncPairDecoratorBinder_2, NULL, __pyx_n_s_asynq_decorators, __pyx_d, ((PyObject *)__pyx_codeobj__30)); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 157, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  if (PyObject_SetItem(__pyx_t_11, __pyx_n_s_call, __pyx_t_12) < 0) __PYX_ERR(0, 157, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;

  /* "asynq/decorators.py":156
 * 
 * 
 * class AsyncAndSyncPairDecoratorBinder(AsyncDecoratorBinder):             # <<<<<<<<<<<<<<
 *     def __call__(self, *args, **kwargs):
 *         # the base class implementation adds .instance here, but we don't want that because we
 */
  __pyx_t_12 = __Pyx_Py3ClassCreate(__pyx_t_10, __pyx_n_s_AsyncAndSyncPairDecoratorBinder, __pyx_t_9, __pyx_t_11, NULL, 0, 1); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 156, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_AsyncAndSyncPairDecoratorBinder, __pyx_t_12) < 0) __PYX_ERR(0, 156, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;

  /* "asynq/decorators.py":165
 * 
 * class AsyncAndSyncPairDecorator(AsyncDecorator):
 *     binder_cls = AsyncAndSyncPairDecoratorBinder             # <<<<<<<<<<<<<<
 * 
 *     def __init__(self, fn, cls, sync_fn, kwargs={}):
 */
  __pyx_t_9 = __Pyx_GetModuleGlobalName(__pyx_n_s_AsyncAndSyncPairDecoratorBinder); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 165, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  if (PyDict_SetItem((PyObject *)__pyx_ptype_5asynq_10decorators_AsyncAndSyncPairDecorator->tp_dict, __pyx_n_s_binder_cls, __pyx_t_9) < 0) __PYX_ERR(0, 165, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
  PyType_Modified(__pyx_ptype_5asynq_10decorators_AsyncAndSyncPairDecorator);

  /* "asynq/decorators.py":167
 *     binder_cls = AsyncAndSyncPairDecoratorBinder
 * 
 *     def __init__(self, fn, cls, sync_fn, kwargs={}):             # <<<<<<<<<<<<<<
 *         AsyncDecorator.__init__(self, fn, cls, kwargs)
 *         self.sync_fn = sync_fn
 */
  __pyx_t_9 = PyDict_New(); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 167, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_k__6 = __pyx_t_9;
  __Pyx_GIVEREF(__pyx_t_9);
  __pyx_t_9 = 0;

  /* "asynq/decorators.py":208
 * 
 * 
 * def async(pure=False, sync_fn=None, cls=async_task.AsyncTask, **kwargs):             # <<<<<<<<<<<<<<
 *     """Async task decorator.
 *     Converts a method returning generator object to
 */
  __pyx_t_9 = __Pyx_CyFunction_NewEx(&__pyx_mdef_5asynq_10decorators_13async, 0, __pyx_n_s_async, NULL, __pyx_n_s_asynq_decorators, __pyx_d, ((PyObject *)__pyx_codeobj__32)); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 208, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  if (!__Pyx_CyFunction_InitDefaults(__pyx_t_9, sizeof(__pyx_defaults), 1)) __PYX_ERR(0, 208, __pyx_L1_error)
  __Pyx_INCREF(((PyObject *)__pyx_ptype_5asynq_10async_task_AsyncTask));
  __Pyx_CyFunction_Defaults(__pyx_defaults, __pyx_t_9)->__pyx_arg_cls = ((PyObject *)__pyx_ptype_5asynq_10async_task_AsyncTask);
  __Pyx_GIVEREF(__pyx_ptype_5asynq_10async_task_AsyncTask);
  __Pyx_CyFunction_SetDefaultsGetter(__pyx_t_9, __pyx_pf_5asynq_10decorators_30__defaults__);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_async, __pyx_t_9) < 0) __PYX_ERR(0, 208, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;

  /* "asynq/decorators.py":232
 * 
 * 
 * def async_proxy(pure=False, sync_fn=None):             # <<<<<<<<<<<<<<
 *     if sync_fn is not None:
 *         assert pure is False, "sync_fn=? cannot be used together with pure=True"
 */
  __pyx_t_9 = __Pyx_CyFunction_NewEx(&__pyx_mdef_5asynq_10decorators_15async_proxy, 0, __pyx_n_s_async_proxy, NULL, __pyx_n_s_asynq_decorators, __pyx_d, ((PyObject *)__pyx_codeobj__34)); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 232, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_CyFunction_SetDefaultsTuple(__pyx_t_9, __pyx_tuple__35);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_async_proxy, __pyx_t_9) < 0) __PYX_ERR(0, 232, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;

  /* "asynq/decorators.py":247
 * 
 * 
 * def cached(cache):             # <<<<<<<<<<<<<<
 *     """Caching decorator. Caches method execution result
 *     based on its name an arguments.
 */
  __pyx_t_9 = __Pyx_CyFunction_NewEx(&__pyx_mdef_5asynq_10decorators_17cached, 0, __pyx_n_s_cached_2, NULL, __pyx_n_s_asynq_decorators, __pyx_d, ((PyObject *)__pyx_codeobj__37)); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 247, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_cached_2, __pyx_t_9) < 0) __PYX_ERR(0, 247, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;

  /* "asynq/decorators.py":276
 * 
 * 
 * @async_proxy()             # <<<<<<<<<<<<<<
 * def async_call(fn, *args, **kwargs):
 *     """Use this if you are not sure if fn is async or not.
 */
  __pyx_t_11 = __Pyx_GetModuleGlobalName(__pyx_n_s_async_proxy); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 276, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_12 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_11))) {
    __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_11);
    if (likely(__pyx_t_12)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_11);
      __Pyx_INCREF(__pyx_t_12);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_11, function);
    }
  }
  if (__pyx_t_12) {
    __pyx_t_10 = __Pyx_PyObject_CallOneArg(__pyx_t_11, __pyx_t_12); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 276, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  } else {
    __pyx_t_10 = __Pyx_PyObject_CallNoArg(__pyx_t_11); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 276, __pyx_L1_error)
  }
  __Pyx_GOTREF(__pyx_t_10);
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;

  /* "asynq/decorators.py":277
 * 
 * @async_proxy()
 * def async_call(fn, *args, **kwargs):             # <<<<<<<<<<<<<<
 *     """Use this if you are not sure if fn is async or not.
 * 
 */
  __pyx_t_11 = __Pyx_CyFunction_NewEx(&__pyx_mdef_5asynq_10decorators_19async_call, 0, __pyx_n_s_async_call, NULL, __pyx_n_s_asynq_decorators, __pyx_d, ((PyObject *)__pyx_codeobj__39)); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 277, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_12 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_10))) {
    __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_10);
    if (likely(__pyx_t_12)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_10);
      __Pyx_INCREF(__pyx_t_12);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_10, function);
    }
  }
  if (!__pyx_t_12) {
    __pyx_t_9 = __Pyx_PyObject_CallOneArg(__pyx_t_10, __pyx_t_11); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 276, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __Pyx_GOTREF(__pyx_t_9);
  } else {
    __pyx_t_13 = PyTuple_New(1+1); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 276, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_13);
    __Pyx_GIVEREF(__pyx_t_12); PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_12); __pyx_t_12 = NULL;
    __Pyx_GIVEREF(__pyx_t_11);
    PyTuple_SET_ITEM(__pyx_t_13, 0+1, __pyx_t_11);
    __pyx_t_11 = 0;
    __pyx_t_9 = __Pyx_PyObject_Call(__pyx_t_10, __pyx_t_13, NULL); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 276, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
  }
  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_async_call, __pyx_t_9) < 0) __PYX_ERR(0, 277, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;

  /* "asynq/decorators.py":292
 * 
 * 
 * class AsyncWrapper(qcore.decorators.DecoratorBase):             # <<<<<<<<<<<<<<
 *     """Implements make_async_decorator."""
 *     binder_cls = AsyncDecoratorBinder
 */
  __pyx_t_9 = PyTuple_New(1); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 292, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __Pyx_INCREF(((PyObject *)__pyx_ptype_5qcore_10decorators_DecoratorBase));
  __Pyx_GIVEREF(((PyObject *)__pyx_ptype_5qcore_10decorators_DecoratorBase));
  PyTuple_SET_ITEM(__pyx_t_9, 0, ((PyObject *)__pyx_ptype_5qcore_10decorators_DecoratorBase));
  __pyx_t_10 = __Pyx_CalculateMetaclass(NULL, __pyx_t_9); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 292, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_10);
  __pyx_t_13 = __Pyx_Py3MetaclassPrepare(__pyx_t_10, __pyx_t_9, __pyx_n_s_AsyncWrapper, __pyx_n_s_AsyncWrapper, (PyObject *) NULL, __pyx_n_s_asynq_decorators, __pyx_kp_s_Implements_make_async_decorator); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 292, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_13);

  /* "asynq/decorators.py":294
 * class AsyncWrapper(qcore.decorators.DecoratorBase):
 *     """Implements make_async_decorator."""
 *     binder_cls = AsyncDecoratorBinder             # <<<<<<<<<<<<<<
 * 
 *     def __init__(self, fn, wrapper_fn, name):
 */
  if (PyObject_SetItem(__pyx_t_13, __pyx_n_s_binder_cls, ((PyObject *)__pyx_ptype_5asynq_10decorators_AsyncDecoratorBinder)) < 0) __PYX_ERR(0, 294, __pyx_L1_error)

  /* "asynq/decorators.py":296
 *     binder_cls = AsyncDecoratorBinder
 * 
 *     def __init__(self, fn, wrapper_fn, name):             # <<<<<<<<<<<<<<
 *         super(AsyncWrapper, self).__init__(fn)
 *         self.wrapper_fn = wrapper_fn
 */
  __pyx_t_11 = __Pyx_CyFunction_NewEx(&__pyx_mdef_5asynq_10decorators_12AsyncWrapper_1__init__, 0, __pyx_n_s_AsyncWrapper___init, NULL, __pyx_n_s_asynq_decorators, __pyx_d, ((PyObject *)__pyx_codeobj__41)); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 296, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  if (PyObject_SetItem(__pyx_t_13, __pyx_n_s_init, __pyx_t_11) < 0) __PYX_ERR(0, 296, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;

  /* "asynq/decorators.py":301
 *         self.function_name = name
 * 
 *     def name(self):             # <<<<<<<<<<<<<<
 *         return '@%s()' % self.function_name
 * 
 */
  __pyx_t_11 = __Pyx_CyFunction_NewEx(&__pyx_mdef_5asynq_10decorators_12AsyncWrapper_3name, 0, __pyx_n_s_AsyncWrapper_name, NULL, __pyx_n_s_asynq_decorators, __pyx_d, ((PyObject *)__pyx_codeobj__43)); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 301, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  if (PyObject_SetItem(__pyx_t_13, __pyx_n_s_name, __pyx_t_11) < 0) __PYX_ERR(0, 301, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;

  /* "asynq/decorators.py":304
 *         return '@%s()' % self.function_name
 * 
 *     def _call_async(self, args, kwargs):             # <<<<<<<<<<<<<<
 *         return self.wrapper_fn(*args, **kwargs)
 * 
 */
  __pyx_t_11 = __Pyx_CyFunction_NewEx(&__pyx_mdef_5asynq_10decorators_12AsyncWrapper_5_call_async, 0, __pyx_n_s_AsyncWrapper__call_async, NULL, __pyx_n_s_asynq_decorators, __pyx_d, ((PyObject *)__pyx_codeobj__45)); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 304, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  if (PyObject_SetItem(__pyx_t_13, __pyx_n_s_call_async, __pyx_t_11) < 0) __PYX_ERR(0, 304, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;

  /* "asynq/decorators.py":307
 *         return self.wrapper_fn(*args, **kwargs)
 * 
 *     def __call__(self, *args, **kwargs):             # <<<<<<<<<<<<<<
 *         return self._call_async(args, kwargs).value()
 * 
 */
  __pyx_t_11 = __Pyx_CyFunction_NewEx(&__pyx_mdef_5asynq_10decorators_12AsyncWrapper_7__call__, 0, __pyx_n_s_AsyncWrapper___call, NULL, __pyx_n_s_asynq_decorators, __pyx_d, ((PyObject *)__pyx_codeobj__47)); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 307, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  if (PyObject_SetItem(__pyx_t_13, __pyx_n_s_call, __pyx_t_11) < 0) __PYX_ERR(0, 307, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;

  /* "asynq/decorators.py":310
 *         return self._call_async(args, kwargs).value()
 * 
 *     def async(self, *args, **kwargs):             # <<<<<<<<<<<<<<
 *         return self._call_async(args, kwargs)
 * 
 */
  __pyx_t_11 = __Pyx_CyFunction_NewEx(&__pyx_mdef_5asynq_10decorators_12AsyncWrapper_9async, 0, __pyx_n_s_AsyncWrapper_async, NULL, __pyx_n_s_asynq_decorators, __pyx_d, ((PyObject *)__pyx_codeobj__49)); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 310, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  if (PyObject_SetItem(__pyx_t_13, __pyx_n_s_async, __pyx_t_11) < 0) __PYX_ERR(0, 310, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;

  /* "asynq/decorators.py":313
 *         return self._call_async(args, kwargs)
 * 
 *     def is_pure_async_fn(self):             # <<<<<<<<<<<<<<
 *         return False
 * 
 */
  __pyx_t_11 = __Pyx_CyFunction_NewEx(&__pyx_mdef_5asynq_10decorators_12AsyncWrapper_11is_pure_async_fn, 0, __pyx_n_s_AsyncWrapper_is_pure_async_fn, NULL, __pyx_n_s_asynq_decorators, __pyx_d, ((PyObject *)__pyx_codeobj__51)); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 313, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  if (PyObject_SetItem(__pyx_t_13, __pyx_n_s_is_pure_async_fn, __pyx_t_11) < 0) __PYX_ERR(0, 313, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;

  /* "asynq/decorators.py":292
 * 
 * 
 * class AsyncWrapper(qcore.decorators.DecoratorBase):             # <<<<<<<<<<<<<<
 *     """Implements make_async_decorator."""
 *     binder_cls = AsyncDecoratorBinder
 */
  __pyx_t_11 = __Pyx_Py3ClassCreate(__pyx_t_10, __pyx_n_s_AsyncWrapper, __pyx_t_9, __pyx_t_13, NULL, 0, 1); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 292, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_AsyncWrapper, __pyx_t_11) < 0) __PYX_ERR(0, 292, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;

  /* "asynq/decorators.py":317
 * 
 * 
 * def make_async_decorator(fn, wrapper_fn, name):             # <<<<<<<<<<<<<<
 *     """For implementing decorators that wrap async functions.
 * 
 */
  __pyx_t_9 = __Pyx_CyFunction_NewEx(&__pyx_mdef_5asynq_10decorators_21make_async_decorator, 0, __pyx_n_s_make_async_decorator, NULL, __pyx_n_s_asynq_decorators, __pyx_d, ((PyObject *)__pyx_codeobj__53)); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 317, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_make_async_decorator, __pyx_t_9) < 0) __PYX_ERR(0, 317, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;

  /* "asynq/decorators.py":335
 * # Private part
 * 
 * def _assert_apply_without_invocation(decorator, task_args, task_kwargs={}):             # <<<<<<<<<<<<<<
 *     if not task_kwargs and len(task_args) == 1:
 *         assert not isinstance(task_args[0], FunctionType), "you must use @%s(...) instead of @%s" % (decorator, decorator)
 */
  __pyx_t_9 = PyDict_New(); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 335, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  __pyx_k__17 = ((PyObject*)__pyx_t_9);
  __Pyx_GIVEREF(__pyx_t_9);
  __pyx_t_9 = 0;

  /* "asynq/decorators.py":340
 * 
 * 
 * def _cached_impl(cache, original_fn, fn, args, kwargs):             # <<<<<<<<<<<<<<
 *     """Internal async method used by @cached decorator.
 *     Implements cache check/update in async fashion.
 */
  __pyx_t_9 = __Pyx_CyFunction_NewEx(&__pyx_mdef_5asynq_10decorators_23_cached_impl, 0, __pyx_n_s_cached_impl, NULL, __pyx_n_s_asynq_decorators, __pyx_d, ((PyObject *)__pyx_codeobj__55)); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 340, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_cached_impl, __pyx_t_9) < 0) __PYX_ERR(0, 340, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;

  /* "asynq/decorators.py":357
 * 
 * # Applying decorator by this way to make it work with Cython
 * _cached = async(pure=True)(_cached_impl)             # <<<<<<<<<<<<<<
 * globals()['_cached'] = _cached
 * 
 */
  __pyx_t_10 = __Pyx_GetModuleGlobalName(__pyx_n_s_async); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 357, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_10);
  __pyx_t_13 = PyDict_New(); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 357, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_13);
  if (PyDict_SetItem(__pyx_t_13, __pyx_n_s_pure, Py_True) < 0) __PYX_ERR(0, 357, __pyx_L1_error)
  __pyx_t_11 = __Pyx_PyObject_Call(__pyx_t_10, __pyx_empty_tuple, __pyx_t_13); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 357, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
  __pyx_t_13 = __Pyx_GetModuleGlobalName(__pyx_n_s_cached_impl); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 357, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_13);
  __pyx_t_10 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_11))) {
    __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_11);
    if (likely(__pyx_t_10)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_11);
      __Pyx_INCREF(__pyx_t_10);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_11, function);
    }
  }
  if (!__pyx_t_10) {
    __pyx_t_9 = __Pyx_PyObject_CallOneArg(__pyx_t_11, __pyx_t_13); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 357, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
    __Pyx_GOTREF(__pyx_t_9);
  } else {
    __pyx_t_12 = PyTuple_New(1+1); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 357, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_12);
    __Pyx_GIVEREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_10); __pyx_t_10 = NULL;
    __Pyx_GIVEREF(__pyx_t_13);
    PyTuple_SET_ITEM(__pyx_t_12, 0+1, __pyx_t_13);
    __pyx_t_13 = 0;
    __pyx_t_9 = __Pyx_PyObject_Call(__pyx_t_11, __pyx_t_12, NULL); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 357, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  }
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
  __Pyx_XGOTREF(__pyx_v_5asynq_10decorators__cached);
  __Pyx_DECREF_SET(__pyx_v_5asynq_10decorators__cached, __pyx_t_9);
  __Pyx_GIVEREF(__pyx_t_9);
  __pyx_t_9 = 0;

  /* "asynq/decorators.py":358
 * # Applying decorator by this way to make it work with Cython
 * _cached = async(pure=True)(_cached_impl)
 * globals()['_cached'] = _cached             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __pyx_t_9 = __Pyx_Globals(); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 358, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  if (unlikely(PyObject_SetItem(__pyx_t_9, __pyx_n_s_cached, __pyx_v_5asynq_10decorators__cached) < 0)) __PYX_ERR(0, 358, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;

  /* "asynq/decorators.py":361
 * 
 * 
 * def _cache_set_impl(cache, key, value):             # <<<<<<<<<<<<<<
 *     yield cache.set(key, value)
 *     raise StopIteration()
 */
  __pyx_t_9 = __Pyx_CyFunction_NewEx(&__pyx_mdef_5asynq_10decorators_26_cache_set_impl, 0, __pyx_n_s_cache_set_impl, NULL, __pyx_n_s_asynq_decorators, __pyx_d, ((PyObject *)__pyx_codeobj__57)); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 361, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_cache_set_impl, __pyx_t_9) < 0) __PYX_ERR(0, 361, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;

  /* "asynq/decorators.py":366
 * 
 * # Applying decorator by this way to make it work with Cython
 * _cache_set = async(pure=True)(_cache_set_impl)             # <<<<<<<<<<<<<<
 * globals()['_cache_set'] = _cache_set
 * 
 */
  __pyx_t_11 = __Pyx_GetModuleGlobalName(__pyx_n_s_async); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 366, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_11);
  __pyx_t_12 = PyDict_New(); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 366, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  if (PyDict_SetItem(__pyx_t_12, __pyx_n_s_pure, Py_True) < 0) __PYX_ERR(0, 366, __pyx_L1_error)
  __pyx_t_13 = __Pyx_PyObject_Call(__pyx_t_11, __pyx_empty_tuple, __pyx_t_12); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 366, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_13);
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
  __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
  __pyx_t_12 = __Pyx_GetModuleGlobalName(__pyx_n_s_cache_set_impl); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 366, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_12);
  __pyx_t_11 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_13))) {
    __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_13);
    if (likely(__pyx_t_11)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_13);
      __Pyx_INCREF(__pyx_t_11);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_13, function);
    }
  }
  if (!__pyx_t_11) {
    __pyx_t_9 = __Pyx_PyObject_CallOneArg(__pyx_t_13, __pyx_t_12); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 366, __pyx_L1_error)
    __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_GOTREF(__pyx_t_9);
  } else {
    __pyx_t_10 = PyTuple_New(1+1); if (unlikely(!__pyx_t_10)) __PYX_ERR(0, 366, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_10);
    __Pyx_GIVEREF(__pyx_t_11); PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_t_11); __pyx_t_11 = NULL;
    __Pyx_GIVEREF(__pyx_t_12);
    PyTuple_SET_ITEM(__pyx_t_10, 0+1, __pyx_t_12);
    __pyx_t_12 = 0;
    __pyx_t_9 = __Pyx_PyObject_Call(__pyx_t_13, __pyx_t_10, NULL); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 366, __pyx_L1_error)
    __Pyx_GOTREF(__pyx_t_9);
    __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
  }
  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
  __Pyx_XGOTREF(__pyx_v_5asynq_10decorators__cache_set);
  __Pyx_DECREF_SET(__pyx_v_5asynq_10decorators__cache_set, __pyx_t_9);
  __Pyx_GIVEREF(__pyx_t_9);
  __pyx_t_9 = 0;

  /* "asynq/decorators.py":367
 * # Applying decorator by this way to make it work with Cython
 * _cache_set = async(pure=True)(_cache_set_impl)
 * globals()['_cache_set'] = _cache_set             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __pyx_t_9 = __Pyx_Globals(); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 367, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  if (unlikely(PyObject_SetItem(__pyx_t_9, __pyx_n_s_cache_set, __pyx_v_5asynq_10decorators__cache_set) < 0)) __PYX_ERR(0, 367, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;

  /* "asynq/decorators.py":1
 * # Copyright 2016 Quora, Inc.             # <<<<<<<<<<<<<<
 * #
 * # Licensed under the Apache License, Version 2.0 (the "License");
 */
  __pyx_t_9 = PyDict_New(); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 1, __pyx_L1_error)
  __Pyx_GOTREF(__pyx_t_9);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_9) < 0) __PYX_ERR(0, 1, __pyx_L1_error)
  __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;

  /*--- Wrapped vars code ---*/

  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_XDECREF(__pyx_t_10);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_XDECREF(__pyx_t_12);
  __Pyx_XDECREF(__pyx_t_13);
  if (__pyx_m) {
    if (__pyx_d) {
      __Pyx_AddTraceback("init asynq.decorators", __pyx_clineno, __pyx_lineno, __pyx_filename);
    }
    Py_DECREF(__pyx_m); __pyx_m = 0;
  } else if (!PyErr_Occurred()) {
    PyErr_SetString(PyExc_ImportError, "init asynq.decorators");
  }
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  #if PY_MAJOR_VERSION < 3
  return;
  #else
  return __pyx_m;
  #endif
}

/* --- Runtime support code --- */
/* Refnanny */
#if CYTHON_REFNANNY
static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) {
    PyObject *m = NULL, *p = NULL;
    void *r = NULL;
    m = PyImport_ImportModule((char *)modname);
    if (!m) goto end;
    p = PyObject_GetAttrString(m, (char *)"RefNannyAPI");
    if (!p) goto end;
    r = PyLong_AsVoidPtr(p);
end:
    Py_XDECREF(p);
    Py_XDECREF(m);
    return (__Pyx_RefNannyAPIStruct *)r;
}
#endif

/* GetBuiltinName */
static PyObject *__Pyx_GetBuiltinName(PyObject *name) {
    PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name);
    if (unlikely(!result)) {
        PyErr_Format(PyExc_NameError,
#if PY_MAJOR_VERSION >= 3
            "name '%U' is not defined", name);
#else
            "name '%.200s' is not defined", PyString_AS_STRING(name));
#endif
    }
    return result;
}

/* KeywordStringCheck */
static CYTHON_INLINE int __Pyx_CheckKeywordStrings(
    PyObject *kwdict,
    const char* function_name,
    int kw_allowed)
{
    PyObject* key = 0;
    Py_ssize_t pos = 0;
#if CYTHON_COMPILING_IN_PYPY
    if (!kw_allowed && PyDict_Next(kwdict, &pos, &key, 0))
        goto invalid_keyword;
    return 1;
#else
    while (PyDict_Next(kwdict, &pos, &key, 0)) {
        #if PY_MAJOR_VERSION < 3
        if (unlikely(!PyString_CheckExact(key)) && unlikely(!PyString_Check(key)))
        #endif
            if (unlikely(!PyUnicode_Check(key)))
                goto invalid_keyword_type;
    }
    if ((!kw_allowed) && unlikely(key))
        goto invalid_keyword;
    return 1;
invalid_keyword_type:
    PyErr_Format(PyExc_TypeError,
        "%.200s() keywords must be strings", function_name);
    return 0;
#endif
invalid_keyword:
    PyErr_Format(PyExc_TypeError,
    #if PY_MAJOR_VERSION < 3
        "%.200s() got an unexpected keyword argument '%.200s'",
        function_name, PyString_AsString(key));
    #else
        "%s() got an unexpected keyword argument '%U'",
        function_name, key);
    #endif
    return 0;
}

/* None */
static CYTHON_INLINE void __Pyx_RaiseClosureNameError(const char *varname) {
    PyErr_Format(PyExc_NameError, "free variable '%s' referenced before assignment in enclosing scope", varname);
}

/* PyObjectCall */
#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) {
    PyObject *result;
    ternaryfunc call = func->ob_type->tp_call;
    if (unlikely(!call))
        return PyObject_Call(func, arg, kw);
    if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object")))
        return NULL;
    result = (*call)(func, arg, kw);
    Py_LeaveRecursiveCall();
    if (unlikely(!result) && unlikely(!PyErr_Occurred())) {
        PyErr_SetString(
            PyExc_SystemError,
            "NULL result without error in PyObject_Call");
    }
    return result;
}
#endif

/* FetchCommonType */
static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type) {
    PyObject* fake_module;
    PyTypeObject* cached_type = NULL;
    fake_module = PyImport_AddModule((char*) "_cython_" CYTHON_ABI);
    if (!fake_module) return NULL;
    Py_INCREF(fake_module);
    cached_type = (PyTypeObject*) PyObject_GetAttrString(fake_module, type->tp_name);
    if (cached_type) {
        if (!PyType_Check((PyObject*)cached_type)) {
            PyErr_Format(PyExc_TypeError,
                "Shared Cython type %.200s is not a type object",
                type->tp_name);
            goto bad;
        }
        if (cached_type->tp_basicsize != type->tp_basicsize) {
            PyErr_Format(PyExc_TypeError,
                "Shared Cython type %.200s has the wrong size, try recompiling",
                type->tp_name);
            goto bad;
        }
    } else {
        if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad;
        PyErr_Clear();
        if (PyType_Ready(type) < 0) goto bad;
        if (PyObject_SetAttrString(fake_module, type->tp_name, (PyObject*) type) < 0)
            goto bad;
        Py_INCREF(type);
        cached_type = type;
    }
done:
    Py_DECREF(fake_module);
    return cached_type;
bad:
    Py_XDECREF(cached_type);
    cached_type = NULL;
    goto done;
}

/* CythonFunction */
static PyObject *
__Pyx_CyFunction_get_doc(__pyx_CyFunctionObject *op, CYTHON_UNUSED void *closure)
{
    if (unlikely(op->func_doc == NULL)) {
        if (op->func.m_ml->ml_doc) {
#if PY_MAJOR_VERSION >= 3
            op->func_doc = PyUnicode_FromString(op->func.m_ml->ml_doc);
#else
            op->func_doc = PyString_FromString(op->func.m_ml->ml_doc);
#endif
            if (unlikely(op->func_doc == NULL))
                return NULL;
        } else {
            Py_INCREF(Py_None);
            return Py_None;
        }
    }
    Py_INCREF(op->func_doc);
    return op->func_doc;
}
static int
__Pyx_CyFunction_set_doc(__pyx_CyFunctionObject *op, PyObject *value)
{
    PyObject *tmp = op->func_doc;
    if (value == NULL) {
        value = Py_None;
    }
    Py_INCREF(value);
    op->func_doc = value;
    Py_XDECREF(tmp);
    return 0;
}
static PyObject *
__Pyx_CyFunction_get_name(__pyx_CyFunctionObject *op)
{
    if (unlikely(op->func_name == NULL)) {
#if PY_MAJOR_VERSION >= 3
        op->func_name = PyUnicode_InternFromString(op->func.m_ml->ml_name);
#else
        op->func_name = PyString_InternFromString(op->func.m_ml->ml_name);
#endif
        if (unlikely(op->func_name == NULL))
            return NULL;
    }
    Py_INCREF(op->func_name);
    return op->func_name;
}
static int
__Pyx_CyFunction_set_name(__pyx_CyFunctionObject *op, PyObject *value)
{
    PyObject *tmp;
#if PY_MAJOR_VERSION >= 3
    if (unlikely(value == NULL || !PyUnicode_Check(value))) {
#else
    if (unlikely(value == NULL || !PyString_Check(value))) {
#endif
        PyErr_SetString(PyExc_TypeError,
                        "__name__ must be set to a string object");
        return -1;
    }
    tmp = op->func_name;
    Py_INCREF(value);
    op->func_name = value;
    Py_XDECREF(tmp);
    return 0;
}
static PyObject *
__Pyx_CyFunction_get_qualname(__pyx_CyFunctionObject *op)
{
    Py_INCREF(op->func_qualname);
    return op->func_qualname;
}
static int
__Pyx_CyFunction_set_qualname(__pyx_CyFunctionObject *op, PyObject *value)
{
    PyObject *tmp;
#if PY_MAJOR_VERSION >= 3
    if (unlikely(value == NULL || !PyUnicode_Check(value))) {
#else
    if (unlikely(value == NULL || !PyString_Check(value))) {
#endif
        PyErr_SetString(PyExc_TypeError,
                        "__qualname__ must be set to a string object");
        return -1;
    }
    tmp = op->func_qualname;
    Py_INCREF(value);
    op->func_qualname = value;
    Py_XDECREF(tmp);
    return 0;
}
static PyObject *
__Pyx_CyFunction_get_self(__pyx_CyFunctionObject *m, CYTHON_UNUSED void *closure)
{
    PyObject *self;
    self = m->func_closure;
    if (self == NULL)
        self = Py_None;
    Py_INCREF(self);
    return self;
}
static PyObject *
__Pyx_CyFunction_get_dict(__pyx_CyFunctionObject *op)
{
    if (unlikely(op->func_dict == NULL)) {
        op->func_dict = PyDict_New();
        if (unlikely(op->func_dict == NULL))
            return NULL;
    }
    Py_INCREF(op->func_dict);
    return op->func_dict;
}
static int
__Pyx_CyFunction_set_dict(__pyx_CyFunctionObject *op, PyObject *value)
{
    PyObject *tmp;
    if (unlikely(value == NULL)) {
        PyErr_SetString(PyExc_TypeError,
               "function's dictionary may not be deleted");
        return -1;
    }
    if (unlikely(!PyDict_Check(value))) {
        PyErr_SetString(PyExc_TypeError,
               "setting function's dictionary to a non-dict");
        return -1;
    }
    tmp = op->func_dict;
    Py_INCREF(value);
    op->func_dict = value;
    Py_XDECREF(tmp);
    return 0;
}
static PyObject *
__Pyx_CyFunction_get_globals(__pyx_CyFunctionObject *op)
{
    Py_INCREF(op->func_globals);
    return op->func_globals;
}
static PyObject *
__Pyx_CyFunction_get_closure(CYTHON_UNUSED __pyx_CyFunctionObject *op)
{
    Py_INCREF(Py_None);
    return Py_None;
}
static PyObject *
__Pyx_CyFunction_get_code(__pyx_CyFunctionObject *op)
{
    PyObject* result = (op->func_code) ? op->func_code : Py_None;
    Py_INCREF(result);
    return result;
}
static int
__Pyx_CyFunction_init_defaults(__pyx_CyFunctionObject *op) {
    int result = 0;
    PyObject *res = op->defaults_getter((PyObject *) op);
    if (unlikely(!res))
        return -1;
    #if CYTHON_COMPILING_IN_CPYTHON
    op->defaults_tuple = PyTuple_GET_ITEM(res, 0);
    Py_INCREF(op->defaults_tuple);
    op->defaults_kwdict = PyTuple_GET_ITEM(res, 1);
    Py_INCREF(op->defaults_kwdict);
    #else
    op->defaults_tuple = PySequence_ITEM(res, 0);
    if (unlikely(!op->defaults_tuple)) result = -1;
    else {
        op->defaults_kwdict = PySequence_ITEM(res, 1);
        if (unlikely(!op->defaults_kwdict)) result = -1;
    }
    #endif
    Py_DECREF(res);
    return result;
}
static int
__Pyx_CyFunction_set_defaults(__pyx_CyFunctionObject *op, PyObject* value) {
    PyObject* tmp;
    if (!value) {
        value = Py_None;
    } else if (value != Py_None && !PyTuple_Check(value)) {
        PyErr_SetString(PyExc_TypeError,
                        "__defaults__ must be set to a tuple object");
        return -1;
    }
    Py_INCREF(value);
    tmp = op->defaults_tuple;
    op->defaults_tuple = value;
    Py_XDECREF(tmp);
    return 0;
}
static PyObject *
__Pyx_CyFunction_get_defaults(__pyx_CyFunctionObject *op) {
    PyObject* result = op->defaults_tuple;
    if (unlikely(!result)) {
        if (op->defaults_getter) {
            if (__Pyx_CyFunction_init_defaults(op) < 0) return NULL;
            result = op->defaults_tuple;
        } else {
            result = Py_None;
        }
    }
    Py_INCREF(result);
    return result;
}
static int
__Pyx_CyFunction_set_kwdefaults(__pyx_CyFunctionObject *op, PyObject* value) {
    PyObject* tmp;
    if (!value) {
        value = Py_None;
    } else if (value != Py_None && !PyDict_Check(value)) {
        PyErr_SetString(PyExc_TypeError,
                        "__kwdefaults__ must be set to a dict object");
        return -1;
    }
    Py_INCREF(value);
    tmp = op->defaults_kwdict;
    op->defaults_kwdict = value;
    Py_XDECREF(tmp);
    return 0;
}
static PyObject *
__Pyx_CyFunction_get_kwdefaults(__pyx_CyFunctionObject *op) {
    PyObject* result = op->defaults_kwdict;
    if (unlikely(!result)) {
        if (op->defaults_getter) {
            if (__Pyx_CyFunction_init_defaults(op) < 0) return NULL;
            result = op->defaults_kwdict;
        } else {
            result = Py_None;
        }
    }
    Py_INCREF(result);
    return result;
}
static int
__Pyx_CyFunction_set_annotations(__pyx_CyFunctionObject *op, PyObject* value) {
    PyObject* tmp;
    if (!value || value == Py_None) {
        value = NULL;
    } else if (!PyDict_Check(value)) {
        PyErr_SetString(PyExc_TypeError,
                        "__annotations__ must be set to a dict object");
        return -1;
    }
    Py_XINCREF(value);
    tmp = op->func_annotations;
    op->func_annotations = value;
    Py_XDECREF(tmp);
    return 0;
}
static PyObject *
__Pyx_CyFunction_get_annotations(__pyx_CyFunctionObject *op) {
    PyObject* result = op->func_annotations;
    if (unlikely(!result)) {
        result = PyDict_New();
        if (unlikely(!result)) return NULL;
        op->func_annotations = result;
    }
    Py_INCREF(result);
    return result;
}
static PyGetSetDef __pyx_CyFunction_getsets[] = {
    {(char *) "func_doc", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0},
    {(char *) "__doc__",  (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0},
    {(char *) "func_name", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0},
    {(char *) "__name__", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0},
    {(char *) "__qualname__", (getter)__Pyx_CyFunction_get_qualname, (setter)__Pyx_CyFunction_set_qualname, 0, 0},
    {(char *) "__self__", (getter)__Pyx_CyFunction_get_self, 0, 0, 0},
    {(char *) "func_dict", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0},
    {(char *) "__dict__", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0},
    {(char *) "func_globals", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0},
    {(char *) "__globals__", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0},
    {(char *) "func_closure", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0},
    {(char *) "__closure__", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0},
    {(char *) "func_code", (getter)__Pyx_CyFunction_get_code, 0, 0, 0},
    {(char *) "__code__", (getter)__Pyx_CyFunction_get_code, 0, 0, 0},
    {(char *) "func_defaults", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0},
    {(char *) "__defaults__", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0},
    {(char *) "__kwdefaults__", (getter)__Pyx_CyFunction_get_kwdefaults, (setter)__Pyx_CyFunction_set_kwdefaults, 0, 0},
    {(char *) "__annotations__", (getter)__Pyx_CyFunction_get_annotations, (setter)__Pyx_CyFunction_set_annotations, 0, 0},
    {0, 0, 0, 0, 0}
};
static PyMemberDef __pyx_CyFunction_members[] = {
    {(char *) "__module__", T_OBJECT, offsetof(__pyx_CyFunctionObject, func.m_module), PY_WRITE_RESTRICTED, 0},
    {0, 0, 0,  0, 0}
};
static PyObject *
__Pyx_CyFunction_reduce(__pyx_CyFunctionObject *m, CYTHON_UNUSED PyObject *args)
{
#if PY_MAJOR_VERSION >= 3
    return PyUnicode_FromString(m->func.m_ml->ml_name);
#else
    return PyString_FromString(m->func.m_ml->ml_name);
#endif
}
static PyMethodDef __pyx_CyFunction_methods[] = {
    {"__reduce__", (PyCFunction)__Pyx_CyFunction_reduce, METH_VARARGS, 0},
    {0, 0, 0, 0}
};
#if PY_VERSION_HEX < 0x030500A0
#define __Pyx_CyFunction_weakreflist(cyfunc) ((cyfunc)->func_weakreflist)
#else
#define __Pyx_CyFunction_weakreflist(cyfunc) ((cyfunc)->func.m_weakreflist)
#endif
static PyObject *__Pyx_CyFunction_New(PyTypeObject *type, PyMethodDef *ml, int flags, PyObject* qualname,
                                      PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) {
    __pyx_CyFunctionObject *op = PyObject_GC_New(__pyx_CyFunctionObject, type);
    if (op == NULL)
        return NULL;
    op->flags = flags;
    __Pyx_CyFunction_weakreflist(op) = NULL;
    op->func.m_ml = ml;
    op->func.m_self = (PyObject *) op;
    Py_XINCREF(closure);
    op->func_closure = closure;
    Py_XINCREF(module);
    op->func.m_module = module;
    op->func_dict = NULL;
    op->func_name = NULL;
    Py_INCREF(qualname);
    op->func_qualname = qualname;
    op->func_doc = NULL;
    op->func_classobj = NULL;
    op->func_globals = globals;
    Py_INCREF(op->func_globals);
    Py_XINCREF(code);
    op->func_code = code;
    op->defaults_pyobjects = 0;
    op->defaults = NULL;
    op->defaults_tuple = NULL;
    op->defaults_kwdict = NULL;
    op->defaults_getter = NULL;
    op->func_annotations = NULL;
    PyObject_GC_Track(op);
    return (PyObject *) op;
}
static int
__Pyx_CyFunction_clear(__pyx_CyFunctionObject *m)
{
    Py_CLEAR(m->func_closure);
    Py_CLEAR(m->func.m_module);
    Py_CLEAR(m->func_dict);
    Py_CLEAR(m->func_name);
    Py_CLEAR(m->func_qualname);
    Py_CLEAR(m->func_doc);
    Py_CLEAR(m->func_globals);
    Py_CLEAR(m->func_code);
    Py_CLEAR(m->func_classobj);
    Py_CLEAR(m->defaults_tuple);
    Py_CLEAR(m->defaults_kwdict);
    Py_CLEAR(m->func_annotations);
    if (m->defaults) {
        PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m);
        int i;
        for (i = 0; i < m->defaults_pyobjects; i++)
            Py_XDECREF(pydefaults[i]);
        PyObject_Free(m->defaults);
        m->defaults = NULL;
    }
    return 0;
}
static void __Pyx_CyFunction_dealloc(__pyx_CyFunctionObject *m)
{
    PyObject_GC_UnTrack(m);
    if (__Pyx_CyFunction_weakreflist(m) != NULL)
        PyObject_ClearWeakRefs((PyObject *) m);
    __Pyx_CyFunction_clear(m);
    PyObject_GC_Del(m);
}
static int __Pyx_CyFunction_traverse(__pyx_CyFunctionObject *m, visitproc visit, void *arg)
{
    Py_VISIT(m->func_closure);
    Py_VISIT(m->func.m_module);
    Py_VISIT(m->func_dict);
    Py_VISIT(m->func_name);
    Py_VISIT(m->func_qualname);
    Py_VISIT(m->func_doc);
    Py_VISIT(m->func_globals);
    Py_VISIT(m->func_code);
    Py_VISIT(m->func_classobj);
    Py_VISIT(m->defaults_tuple);
    Py_VISIT(m->defaults_kwdict);
    if (m->defaults) {
        PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m);
        int i;
        for (i = 0; i < m->defaults_pyobjects; i++)
            Py_VISIT(pydefaults[i]);
    }
    return 0;
}
static PyObject *__Pyx_CyFunction_descr_get(PyObject *func, PyObject *obj, PyObject *type)
{
    __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func;
    if (m->flags & __Pyx_CYFUNCTION_STATICMETHOD) {
        Py_INCREF(func);
        return func;
    }
    if (m->flags & __Pyx_CYFUNCTION_CLASSMETHOD) {
        if (type == NULL)
            type = (PyObject *)(Py_TYPE(obj));
        return __Pyx_PyMethod_New(func, type, (PyObject *)(Py_TYPE(type)));
    }
    if (obj == Py_None)
        obj = NULL;
    return __Pyx_PyMethod_New(func, obj, type);
}
static PyObject*
__Pyx_CyFunction_repr(__pyx_CyFunctionObject *op)
{
#if PY_MAJOR_VERSION >= 3
    return PyUnicode_FromFormat("<cyfunction %U at %p>",
                                op->func_qualname, (void *)op);
#else
    return PyString_FromFormat("<cyfunction %s at %p>",
                               PyString_AsString(op->func_qualname), (void *)op);
#endif
}
#if CYTHON_COMPILING_IN_PYPY
static PyObject * __Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) {
    PyCFunctionObject* f = (PyCFunctionObject*)func;
    PyCFunction meth = f->m_ml->ml_meth;
    PyObject *self = f->m_self;
    Py_ssize_t size;
    switch (f->m_ml->ml_flags & (METH_VARARGS | METH_KEYWORDS | METH_NOARGS | METH_O)) {
    case METH_VARARGS:
        if (likely(kw == NULL || PyDict_Size(kw) == 0))
            return (*meth)(self, arg);
        break;
    case METH_VARARGS | METH_KEYWORDS:
        return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
    case METH_NOARGS:
        if (likely(kw == NULL || PyDict_Size(kw) == 0)) {
            size = PyTuple_GET_SIZE(arg);
            if (likely(size == 0))
                return (*meth)(self, NULL);
            PyErr_Format(PyExc_TypeError,
                "%.200s() takes no arguments (%" CYTHON_FORMAT_SSIZE_T "d given)",
                f->m_ml->ml_name, size);
            return NULL;
        }
        break;
    case METH_O:
        if (likely(kw == NULL || PyDict_Size(kw) == 0)) {
            size = PyTuple_GET_SIZE(arg);
            if (likely(size == 1)) {
                PyObject *result, *arg0 = PySequence_ITEM(arg, 0);
                if (unlikely(!arg0)) return NULL;
                result = (*meth)(self, arg0);
                Py_DECREF(arg0);
                return result;
            }
            PyErr_Format(PyExc_TypeError,
                "%.200s() takes exactly one argument (%" CYTHON_FORMAT_SSIZE_T "d given)",
                f->m_ml->ml_name, size);
            return NULL;
        }
        break;
    default:
        PyErr_SetString(PyExc_SystemError, "Bad call flags in "
                        "__Pyx_CyFunction_Call. METH_OLDARGS is no "
                        "longer supported!");
        return NULL;
    }
    PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments",
                 f->m_ml->ml_name);
    return NULL;
}
#else
static PyObject * __Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) {
	return PyCFunction_Call(func, arg, kw);
}
#endif
static PyTypeObject __pyx_CyFunctionType_type = {
    PyVarObject_HEAD_INIT(0, 0)
    "cython_function_or_method",
    sizeof(__pyx_CyFunctionObject),
    0,
    (destructor) __Pyx_CyFunction_dealloc,
    0,
    0,
    0,
#if PY_MAJOR_VERSION < 3
    0,
#else
    0,
#endif
    (reprfunc) __Pyx_CyFunction_repr,
    0,
    0,
    0,
    0,
    __Pyx_CyFunction_Call,
    0,
    0,
    0,
    0,
    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
    0,
    (traverseproc) __Pyx_CyFunction_traverse,
    (inquiry) __Pyx_CyFunction_clear,
    0,
#if PY_VERSION_HEX < 0x030500A0
    offsetof(__pyx_CyFunctionObject, func_weakreflist),
#else
    offsetof(PyCFunctionObject, m_weakreflist),
#endif
    0,
    0,
    __pyx_CyFunction_methods,
    __pyx_CyFunction_members,
    __pyx_CyFunction_getsets,
    0,
    0,
    __Pyx_CyFunction_descr_get,
    0,
    offsetof(__pyx_CyFunctionObject, func_dict),
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
#if PY_VERSION_HEX >= 0x030400a1
    0,
#endif
};
static int __pyx_CyFunction_init(void) {
#if !CYTHON_COMPILING_IN_PYPY
    __pyx_CyFunctionType_type.tp_call = PyCFunction_Call;
#endif
    __pyx_CyFunctionType = __Pyx_FetchCommonType(&__pyx_CyFunctionType_type);
    if (__pyx_CyFunctionType == NULL) {
        return -1;
    }
    return 0;
}
static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *func, size_t size, int pyobjects) {
    __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func;
    m->defaults = PyObject_Malloc(size);
    if (!m->defaults)
        return PyErr_NoMemory();
    memset(m->defaults, 0, size);
    m->defaults_pyobjects = pyobjects;
    return m->defaults;
}
static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *func, PyObject *tuple) {
    __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func;
    m->defaults_tuple = tuple;
    Py_INCREF(tuple);
}
static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *func, PyObject *dict) {
    __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func;
    m->defaults_kwdict = dict;
    Py_INCREF(dict);
}
static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *func, PyObject *dict) {
    __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func;
    m->func_annotations = dict;
    Py_INCREF(dict);
}

/* PyObjectCallMethO */
    #if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) {
    PyObject *self, *result;
    PyCFunction cfunc;
    cfunc = PyCFunction_GET_FUNCTION(func);
    self = PyCFunction_GET_SELF(func);
    if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object")))
        return NULL;
    result = cfunc(self, arg);
    Py_LeaveRecursiveCall();
    if (unlikely(!result) && unlikely(!PyErr_Occurred())) {
        PyErr_SetString(
            PyExc_SystemError,
            "NULL result without error in PyObject_Call");
    }
    return result;
}
#endif

/* PyObjectCallOneArg */
    #if CYTHON_COMPILING_IN_CPYTHON
static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) {
    PyObject *result;
    PyObject *args = PyTuple_New(1);
    if (unlikely(!args)) return NULL;
    Py_INCREF(arg);
    PyTuple_SET_ITEM(args, 0, arg);
    result = __Pyx_PyObject_Call(func, args, NULL);
    Py_DECREF(args);
    return result;
}
static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) {
#ifdef __Pyx_CyFunction_USED
    if (likely(PyCFunction_Check(func) || PyObject_TypeCheck(func, __pyx_CyFunctionType))) {
#else
    if (likely(PyCFunction_Check(func))) {
#endif
        if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) {
            return __Pyx_PyObject_CallMethO(func, arg);
        }
    }
    return __Pyx__PyObject_CallOneArg(func, arg);
}
#else
static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) {
    PyObject *result;
    PyObject *args = PyTuple_Pack(1, arg);
    if (unlikely(!args)) return NULL;
    result = __Pyx_PyObject_Call(func, args, NULL);
    Py_DECREF(args);
    return result;
}
#endif

/* GetModuleGlobalName */
      static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name) {
    PyObject *result;
#if CYTHON_COMPILING_IN_CPYTHON
    result = PyDict_GetItem(__pyx_d, name);
    if (likely(result)) {
        Py_INCREF(result);
    } else {
#else
    result = PyObject_GetItem(__pyx_d, name);
    if (!result) {
        PyErr_Clear();
#endif
        result = __Pyx_GetBuiltinName(name);
    }
    return result;
}

/* PyObjectCallNoArg */
        #if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) {
#ifdef __Pyx_CyFunction_USED
    if (likely(PyCFunction_Check(func) || PyObject_TypeCheck(func, __pyx_CyFunctionType))) {
#else
    if (likely(PyCFunction_Check(func))) {
#endif
        if (likely(PyCFunction_GET_FLAGS(func) & METH_NOARGS)) {
            return __Pyx_PyObject_CallMethO(func, NULL);
        }
    }
    return __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL);
}
#endif

/* SaveResetException */
          #if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) {
    *type = tstate->exc_type;
    *value = tstate->exc_value;
    *tb = tstate->exc_traceback;
    Py_XINCREF(*type);
    Py_XINCREF(*value);
    Py_XINCREF(*tb);
}
static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) {
    PyObject *tmp_type, *tmp_value, *tmp_tb;
    tmp_type = tstate->exc_type;
    tmp_value = tstate->exc_value;
    tmp_tb = tstate->exc_traceback;
    tstate->exc_type = type;
    tstate->exc_value = value;
    tstate->exc_traceback = tb;
    Py_XDECREF(tmp_type);
    Py_XDECREF(tmp_value);
    Py_XDECREF(tmp_tb);
}
#endif

/* PyErrExceptionMatches */
          #if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err) {
    PyObject *exc_type = tstate->curexc_type;
    if (exc_type == err) return 1;
    if (unlikely(!exc_type)) return 0;
    return PyErr_GivenExceptionMatches(exc_type, err);
}
#endif

/* GetException */
          #if CYTHON_COMPILING_IN_CPYTHON
static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) {
#else
static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) {
#endif
    PyObject *local_type, *local_value, *local_tb;
#if CYTHON_COMPILING_IN_CPYTHON
    PyObject *tmp_type, *tmp_value, *tmp_tb;
    local_type = tstate->curexc_type;
    local_value = tstate->curexc_value;
    local_tb = tstate->curexc_traceback;
    tstate->curexc_type = 0;
    tstate->curexc_value = 0;
    tstate->curexc_traceback = 0;
#else
    PyErr_Fetch(&local_type, &local_value, &local_tb);
#endif
    PyErr_NormalizeException(&local_type, &local_value, &local_tb);
#if CYTHON_COMPILING_IN_CPYTHON
    if (unlikely(tstate->curexc_type))
#else
    if (unlikely(PyErr_Occurred()))
#endif
        goto bad;
    #if PY_MAJOR_VERSION >= 3
    if (local_tb) {
        if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0))
            goto bad;
    }
    #endif
    Py_XINCREF(local_tb);
    Py_XINCREF(local_type);
    Py_XINCREF(local_value);
    *type = local_type;
    *value = local_value;
    *tb = local_tb;
#if CYTHON_COMPILING_IN_CPYTHON
    tmp_type = tstate->exc_type;
    tmp_value = tstate->exc_value;
    tmp_tb = tstate->exc_traceback;
    tstate->exc_type = local_type;
    tstate->exc_value = local_value;
    tstate->exc_traceback = local_tb;
    Py_XDECREF(tmp_type);
    Py_XDECREF(tmp_value);
    Py_XDECREF(tmp_tb);
#else
    PyErr_SetExcInfo(local_type, local_value, local_tb);
#endif
    return 0;
bad:
    *type = 0;
    *value = 0;
    *tb = 0;
    Py_XDECREF(local_type);
    Py_XDECREF(local_value);
    Py_XDECREF(local_tb);
    return -1;
}

/* PyErrFetchRestore */
            #if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) {
    PyObject *tmp_type, *tmp_value, *tmp_tb;
    tmp_type = tstate->curexc_type;
    tmp_value = tstate->curexc_value;
    tmp_tb = tstate->curexc_traceback;
    tstate->curexc_type = type;
    tstate->curexc_value = value;
    tstate->curexc_traceback = tb;
    Py_XDECREF(tmp_type);
    Py_XDECREF(tmp_value);
    Py_XDECREF(tmp_tb);
}
static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) {
    *type = tstate->curexc_type;
    *value = tstate->curexc_value;
    *tb = tstate->curexc_traceback;
    tstate->curexc_type = 0;
    tstate->curexc_value = 0;
    tstate->curexc_traceback = 0;
}
#endif

/* RaiseDoubleKeywords */
            static void __Pyx_RaiseDoubleKeywordsError(
    const char* func_name,
    PyObject* kw_name)
{
    PyErr_Format(PyExc_TypeError,
        #if PY_MAJOR_VERSION >= 3
        "%s() got multiple values for keyword argument '%U'", func_name, kw_name);
        #else
        "%s() got multiple values for keyword argument '%s'", func_name,
        PyString_AsString(kw_name));
        #endif
}

/* ParseKeywords */
            static int __Pyx_ParseOptionalKeywords(
    PyObject *kwds,
    PyObject **argnames[],
    PyObject *kwds2,
    PyObject *values[],
    Py_ssize_t num_pos_args,
    const char* function_name)
{
    PyObject *key = 0, *value = 0;
    Py_ssize_t pos = 0;
    PyObject*** name;
    PyObject*** first_kw_arg = argnames + num_pos_args;
    while (PyDict_Next(kwds, &pos, &key, &value)) {
        name = first_kw_arg;
        while (*name && (**name != key)) name++;
        if (*name) {
            values[name-argnames] = value;
            continue;
        }
        name = first_kw_arg;
        #if PY_MAJOR_VERSION < 3
        if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) {
            while (*name) {
                if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key))
                        && _PyString_Eq(**name, key)) {
                    values[name-argnames] = value;
                    break;
                }
                name++;
            }
            if (*name) continue;
            else {
                PyObject*** argname = argnames;
                while (argname != first_kw_arg) {
                    if ((**argname == key) || (
                            (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key))
                             && _PyString_Eq(**argname, key))) {
                        goto arg_passed_twice;
                    }
                    argname++;
                }
            }
        } else
        #endif
        if (likely(PyUnicode_Check(key))) {
            while (*name) {
                int cmp = (**name == key) ? 0 :
                #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3
                    (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 :
                #endif
                    PyUnicode_Compare(**name, key);
                if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad;
                if (cmp == 0) {
                    values[name-argnames] = value;
                    break;
                }
                name++;
            }
            if (*name) continue;
            else {
                PyObject*** argname = argnames;
                while (argname != first_kw_arg) {
                    int cmp = (**argname == key) ? 0 :
                    #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3
                        (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 :
                    #endif
                        PyUnicode_Compare(**argname, key);
                    if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad;
                    if (cmp == 0) goto arg_passed_twice;
                    argname++;
                }
            }
        } else
            goto invalid_keyword_type;
        if (kwds2) {
            if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad;
        } else {
            goto invalid_keyword;
        }
    }
    return 0;
arg_passed_twice:
    __Pyx_RaiseDoubleKeywordsError(function_name, key);
    goto bad;
invalid_keyword_type:
    PyErr_Format(PyExc_TypeError,
        "%.200s() keywords must be strings", function_name);
    goto bad;
invalid_keyword:
    PyErr_Format(PyExc_TypeError,
    #if PY_MAJOR_VERSION < 3
        "%.200s() got an unexpected keyword argument '%.200s'",
        function_name, PyString_AsString(key));
    #else
        "%s() got an unexpected keyword argument '%U'",
        function_name, key);
    #endif
bad:
    return -1;
}

/* RaiseArgTupleInvalid */
            static void __Pyx_RaiseArgtupleInvalid(
    const char* func_name,
    int exact,
    Py_ssize_t num_min,
    Py_ssize_t num_max,
    Py_ssize_t num_found)
{
    Py_ssize_t num_expected;
    const char *more_or_less;
    if (num_found < num_min) {
        num_expected = num_min;
        more_or_less = "at least";
    } else {
        num_expected = num_max;
        more_or_less = "at most";
    }
    if (exact) {
        more_or_less = "exactly";
    }
    PyErr_Format(PyExc_TypeError,
                 "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)",
                 func_name, more_or_less, num_expected,
                 (num_expected == 1) ? "" : "s", num_found);
}

/* RaiseException */
            #if PY_MAJOR_VERSION < 3
static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb,
                        CYTHON_UNUSED PyObject *cause) {
    __Pyx_PyThreadState_declare
    Py_XINCREF(type);
    if (!value || value == Py_None)
        value = NULL;
    else
        Py_INCREF(value);
    if (!tb || tb == Py_None)
        tb = NULL;
    else {
        Py_INCREF(tb);
        if (!PyTraceBack_Check(tb)) {
            PyErr_SetString(PyExc_TypeError,
                "raise: arg 3 must be a traceback or None");
            goto raise_error;
        }
    }
    if (PyType_Check(type)) {
#if CYTHON_COMPILING_IN_PYPY
        if (!value) {
            Py_INCREF(Py_None);
            value = Py_None;
        }
#endif
        PyErr_NormalizeException(&type, &value, &tb);
    } else {
        if (value) {
            PyErr_SetString(PyExc_TypeError,
                "instance exception may not have a separate value");
            goto raise_error;
        }
        value = type;
        type = (PyObject*) Py_TYPE(type);
        Py_INCREF(type);
        if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) {
            PyErr_SetString(PyExc_TypeError,
                "raise: exception class must be a subclass of BaseException");
            goto raise_error;
        }
    }
    __Pyx_PyThreadState_assign
    __Pyx_ErrRestore(type, value, tb);
    return;
raise_error:
    Py_XDECREF(value);
    Py_XDECREF(type);
    Py_XDECREF(tb);
    return;
}
#else
static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) {
    PyObject* owned_instance = NULL;
    if (tb == Py_None) {
        tb = 0;
    } else if (tb && !PyTraceBack_Check(tb)) {
        PyErr_SetString(PyExc_TypeError,
            "raise: arg 3 must be a traceback or None");
        goto bad;
    }
    if (value == Py_None)
        value = 0;
    if (PyExceptionInstance_Check(type)) {
        if (value) {
            PyErr_SetString(PyExc_TypeError,
                "instance exception may not have a separate value");
            goto bad;
        }
        value = type;
        type = (PyObject*) Py_TYPE(value);
    } else if (PyExceptionClass_Check(type)) {
        PyObject *instance_class = NULL;
        if (value && PyExceptionInstance_Check(value)) {
            instance_class = (PyObject*) Py_TYPE(value);
            if (instance_class != type) {
                int is_subclass = PyObject_IsSubclass(instance_class, type);
                if (!is_subclass) {
                    instance_class = NULL;
                } else if (unlikely(is_subclass == -1)) {
                    goto bad;
                } else {
                    type = instance_class;
                }
            }
        }
        if (!instance_class) {
            PyObject *args;
            if (!value)
                args = PyTuple_New(0);
            else if (PyTuple_Check(value)) {
                Py_INCREF(value);
                args = value;
            } else
                args = PyTuple_Pack(1, value);
            if (!args)
                goto bad;
            owned_instance = PyObject_Call(type, args, NULL);
            Py_DECREF(args);
            if (!owned_instance)
                goto bad;
            value = owned_instance;
            if (!PyExceptionInstance_Check(value)) {
                PyErr_Format(PyExc_TypeError,
                             "calling %R should have returned an instance of "
                             "BaseException, not %R",
                             type, Py_TYPE(value));
                goto bad;
            }
        }
    } else {
        PyErr_SetString(PyExc_TypeError,
            "raise: exception class must be a subclass of BaseException");
        goto bad;
    }
#if PY_VERSION_HEX >= 0x03030000
    if (cause) {
#else
    if (cause && cause != Py_None) {
#endif
        PyObject *fixed_cause;
        if (cause == Py_None) {
            fixed_cause = NULL;
        } else if (PyExceptionClass_Check(cause)) {
            fixed_cause = PyObject_CallObject(cause, NULL);
            if (fixed_cause == NULL)
                goto bad;
        } else if (PyExceptionInstance_Check(cause)) {
            fixed_cause = cause;
            Py_INCREF(fixed_cause);
        } else {
            PyErr_SetString(PyExc_TypeError,
                            "exception causes must derive from "
                            "BaseException");
            goto bad;
        }
        PyException_SetCause(value, fixed_cause);
    }
    PyErr_SetObject(type, value);
    if (tb) {
#if CYTHON_COMPILING_IN_PYPY
        PyObject *tmp_type, *tmp_value, *tmp_tb;
        PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb);
        Py_INCREF(tb);
        PyErr_Restore(tmp_type, tmp_value, tb);
        Py_XDECREF(tmp_tb);
#else
        PyThreadState *tstate = PyThreadState_GET();
        PyObject* tmp_tb = tstate->curexc_traceback;
        if (tb != tmp_tb) {
            Py_INCREF(tb);
            tstate->curexc_traceback = tb;
            Py_XDECREF(tmp_tb);
        }
#endif
    }
bad:
    Py_XDECREF(owned_instance);
    return;
}
#endif

/* ArgTypeTest */
              static void __Pyx_RaiseArgumentTypeInvalid(const char* name, PyObject *obj, PyTypeObject *type) {
    PyErr_Format(PyExc_TypeError,
        "Argument '%.200s' has incorrect type (expected %.200s, got %.200s)",
        name, type->tp_name, Py_TYPE(obj)->tp_name);
}
static CYTHON_INLINE int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,
    const char *name, int exact)
{
    if (unlikely(!type)) {
        PyErr_SetString(PyExc_SystemError, "Missing type object");
        return 0;
    }
    if (none_allowed && obj == Py_None) return 1;
    else if (exact) {
        if (likely(Py_TYPE(obj) == type)) return 1;
        #if PY_MAJOR_VERSION == 2
        else if ((type == &PyBaseString_Type) && likely(__Pyx_PyBaseString_CheckExact(obj))) return 1;
        #endif
    }
    else {
        if (likely(PyObject_TypeCheck(obj, type))) return 1;
    }
    __Pyx_RaiseArgumentTypeInvalid(name, obj, type);
    return 0;
}

/* GetItemInt */
              static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) {
    PyObject *r;
    if (!j) return NULL;
    r = PyObject_GetItem(o, j);
    Py_DECREF(j);
    return r;
}
static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i,
                                                              CYTHON_NCP_UNUSED int wraparound,
                                                              CYTHON_NCP_UNUSED int boundscheck) {
#if CYTHON_COMPILING_IN_CPYTHON
    if (wraparound & unlikely(i < 0)) i += PyList_GET_SIZE(o);
    if ((!boundscheck) || likely((0 <= i) & (i < PyList_GET_SIZE(o)))) {
        PyObject *r = PyList_GET_ITEM(o, i);
        Py_INCREF(r);
        return r;
    }
    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
#else
    return PySequence_GetItem(o, i);
#endif
}
static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i,
                                                              CYTHON_NCP_UNUSED int wraparound,
                                                              CYTHON_NCP_UNUSED int boundscheck) {
#if CYTHON_COMPILING_IN_CPYTHON
    if (wraparound & unlikely(i < 0)) i += PyTuple_GET_SIZE(o);
    if ((!boundscheck) || likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
        PyObject *r = PyTuple_GET_ITEM(o, i);
        Py_INCREF(r);
        return r;
    }
    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
#else
    return PySequence_GetItem(o, i);
#endif
}
static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list,
                                                     CYTHON_NCP_UNUSED int wraparound,
                                                     CYTHON_NCP_UNUSED int boundscheck) {
#if CYTHON_COMPILING_IN_CPYTHON
    if (is_list || PyList_CheckExact(o)) {
        Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o);
        if ((!boundscheck) || (likely((n >= 0) & (n < PyList_GET_SIZE(o))))) {
            PyObject *r = PyList_GET_ITEM(o, n);
            Py_INCREF(r);
            return r;
        }
    }
    else if (PyTuple_CheckExact(o)) {
        Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o);
        if ((!boundscheck) || likely((n >= 0) & (n < PyTuple_GET_SIZE(o)))) {
            PyObject *r = PyTuple_GET_ITEM(o, n);
            Py_INCREF(r);
            return r;
        }
    } else {
        PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;
        if (likely(m && m->sq_item)) {
            if (wraparound && unlikely(i < 0) && likely(m->sq_length)) {
                Py_ssize_t l = m->sq_length(o);
                if (likely(l >= 0)) {
                    i += l;
                } else {
                    if (!PyErr_ExceptionMatches(PyExc_OverflowError))
                        return NULL;
                    PyErr_Clear();
                }
            }
            return m->sq_item(o, i);
        }
    }
#else
    if (is_list || PySequence_Check(o)) {
        return PySequence_GetItem(o, i);
    }
#endif
    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
}

/* CallNextTpDealloc */
              static void __Pyx_call_next_tp_dealloc(PyObject* obj, destructor current_tp_dealloc) {
    PyTypeObject* type = Py_TYPE(obj);
    while (type && type->tp_dealloc != current_tp_dealloc)
        type = type->tp_base;
    while (type && type->tp_dealloc == current_tp_dealloc)
        type = type->tp_base;
    if (type)
        type->tp_dealloc(obj);
}

/* CallNextTpTraverse */
              static int __Pyx_call_next_tp_traverse(PyObject* obj, visitproc v, void *a, traverseproc current_tp_traverse) {
    PyTypeObject* type = Py_TYPE(obj);
    while (type && type->tp_traverse != current_tp_traverse)
        type = type->tp_base;
    while (type && type->tp_traverse == current_tp_traverse)
        type = type->tp_base;
    if (type && type->tp_traverse)
        return type->tp_traverse(obj, v, a);
    return 0;
}

/* CallNextTpClear */
              static void __Pyx_call_next_tp_clear(PyObject* obj, inquiry current_tp_clear) {
    PyTypeObject* type = Py_TYPE(obj);
    while (type && type->tp_clear != current_tp_clear)
        type = type->tp_base;
    while (type && type->tp_clear == current_tp_clear)
        type = type->tp_base;
    if (type && type->tp_clear)
        type->tp_clear(obj);
}

/* GetVTable */
              static void* __Pyx_GetVtable(PyObject *dict) {
    void* ptr;
    PyObject *ob = PyObject_GetItem(dict, __pyx_n_s_pyx_vtable);
    if (!ob)
        goto bad;
#if PY_VERSION_HEX >= 0x02070000
    ptr = PyCapsule_GetPointer(ob, 0);
#else
    ptr = PyCObject_AsVoidPtr(ob);
#endif
    if (!ptr && !PyErr_Occurred())
        PyErr_SetString(PyExc_RuntimeError, "invalid vtable found for imported type");
    Py_DECREF(ob);
    return ptr;
bad:
    Py_XDECREF(ob);
    return NULL;
}

/* SetVTable */
              static int __Pyx_SetVtable(PyObject *dict, void *vtable) {
#if PY_VERSION_HEX >= 0x02070000
    PyObject *ob = PyCapsule_New(vtable, 0, 0);
#else
    PyObject *ob = PyCObject_FromVoidPtr(vtable, 0);
#endif
    if (!ob)
        goto bad;
    if (PyDict_SetItem(dict, __pyx_n_s_pyx_vtable, ob) < 0)
        goto bad;
    Py_DECREF(ob);
    return 0;
bad:
    Py_XDECREF(ob);
    return -1;
}

/* Import */
              static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) {
    PyObject *empty_list = 0;
    PyObject *module = 0;
    PyObject *global_dict = 0;
    PyObject *empty_dict = 0;
    PyObject *list;
    #if PY_VERSION_HEX < 0x03030000
    PyObject *py_import;
    py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import);
    if (!py_import)
        goto bad;
    #endif
    if (from_list)
        list = from_list;
    else {
        empty_list = PyList_New(0);
        if (!empty_list)
            goto bad;
        list = empty_list;
    }
    global_dict = PyModule_GetDict(__pyx_m);
    if (!global_dict)
        goto bad;
    empty_dict = PyDict_New();
    if (!empty_dict)
        goto bad;
    {
        #if PY_MAJOR_VERSION >= 3
        if (level == -1) {
            if (strchr(__Pyx_MODULE_NAME, '.')) {
                #if PY_VERSION_HEX < 0x03030000
                PyObject *py_level = PyInt_FromLong(1);
                if (!py_level)
                    goto bad;
                module = PyObject_CallFunctionObjArgs(py_import,
                    name, global_dict, empty_dict, list, py_level, NULL);
                Py_DECREF(py_level);
                #else
                module = PyImport_ImportModuleLevelObject(
                    name, global_dict, empty_dict, list, 1);
                #endif
                if (!module) {
                    if (!PyErr_ExceptionMatches(PyExc_ImportError))
                        goto bad;
                    PyErr_Clear();
                }
            }
            level = 0;
        }
        #endif
        if (!module) {
            #if PY_VERSION_HEX < 0x03030000
            PyObject *py_level = PyInt_FromLong(level);
            if (!py_level)
                goto bad;
            module = PyObject_CallFunctionObjArgs(py_import,
                name, global_dict, empty_dict, list, py_level, NULL);
            Py_DECREF(py_level);
            #else
            module = PyImport_ImportModuleLevelObject(
                name, global_dict, empty_dict, list, level);
            #endif
        }
    }
bad:
    #if PY_VERSION_HEX < 0x03030000
    Py_XDECREF(py_import);
    #endif
    Py_XDECREF(empty_list);
    Py_XDECREF(empty_dict);
    return module;
}

/* PatchModuleWithCoroutine */
              static PyObject* __Pyx_Coroutine_patch_module(PyObject* module, const char* py_code) {
#if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED)
    int result;
    PyObject *globals, *result_obj;
    globals = PyDict_New();  if (unlikely(!globals)) goto ignore;
    result = PyDict_SetItemString(globals, "_cython_coroutine_type",
    #ifdef __Pyx_Coroutine_USED
        (PyObject*)__pyx_CoroutineType);
    #else
        Py_None);
    #endif
    if (unlikely(result < 0)) goto ignore;
    result = PyDict_SetItemString(globals, "_cython_generator_type",
    #ifdef __Pyx_Generator_USED
        (PyObject*)__pyx_GeneratorType);
    #else
        Py_None);
    #endif
    if (unlikely(result < 0)) goto ignore;
    if (unlikely(PyDict_SetItemString(globals, "_module", module) < 0)) goto ignore;
    if (unlikely(PyDict_SetItemString(globals, "__builtins__", __pyx_b) < 0)) goto ignore;
    result_obj = PyRun_String(py_code, Py_file_input, globals, globals);
    if (unlikely(!result_obj)) goto ignore;
    Py_DECREF(result_obj);
    Py_DECREF(globals);
    return module;
ignore:
    Py_XDECREF(globals);
    PyErr_WriteUnraisable(module);
    if (unlikely(PyErr_WarnEx(PyExc_RuntimeWarning, "Cython module failed to patch module with custom type", 1) < 0)) {
        Py_DECREF(module);
        module = NULL;
    }
#else
    py_code++;
#endif
    return module;
}

/* PatchInspect */
              static PyObject* __Pyx_patch_inspect(PyObject* module) {
#if defined(__Pyx_Generator_USED) && (!defined(CYTHON_PATCH_INSPECT) || CYTHON_PATCH_INSPECT)
    static int inspect_patched = 0;
    if (unlikely((!inspect_patched) && module)) {
        module = __Pyx_Coroutine_patch_module(
            module, ""
"old_types = getattr(_module.isgenerator, '_cython_generator_types', None)\n"
"if old_types is None or not isinstance(old_types, set):\n"
"    old_types = set()\n"
"    def cy_wrap(orig_func, type=type, cython_generator_types=old_types):\n"
"        def cy_isgenerator(obj): return type(obj) in cython_generator_types or orig_func(obj)\n"
"        cy_isgenerator._cython_generator_types = cython_generator_types\n"
"        return cy_isgenerator\n"
"    _module.isgenerator = cy_wrap(_module.isgenerator)\n"
"old_types.add(_cython_generator_type)\n"
        );
        inspect_patched = 1;
    }
#else
    if (0) return __Pyx_Coroutine_patch_module(module, NULL);
#endif
    return module;
}

/* ImportFrom */
              static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) {
    PyObject* value = __Pyx_PyObject_GetAttrStr(module, name);
    if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) {
        PyErr_Format(PyExc_ImportError,
        #if PY_MAJOR_VERSION < 3
            "cannot import name %.230s", PyString_AS_STRING(name));
        #else
            "cannot import name %S", name);
        #endif
    }
    return value;
}

/* CalculateMetaclass */
              static PyObject *__Pyx_CalculateMetaclass(PyTypeObject *metaclass, PyObject *bases) {
    Py_ssize_t i, nbases = PyTuple_GET_SIZE(bases);
    for (i=0; i < nbases; i++) {
        PyTypeObject *tmptype;
        PyObject *tmp = PyTuple_GET_ITEM(bases, i);
        tmptype = Py_TYPE(tmp);
#if PY_MAJOR_VERSION < 3
        if (tmptype == &PyClass_Type)
            continue;
#endif
        if (!metaclass) {
            metaclass = tmptype;
            continue;
        }
        if (PyType_IsSubtype(metaclass, tmptype))
            continue;
        if (PyType_IsSubtype(tmptype, metaclass)) {
            metaclass = tmptype;
            continue;
        }
        PyErr_SetString(PyExc_TypeError,
                        "metaclass conflict: "
                        "the metaclass of a derived class "
                        "must be a (non-strict) subclass "
                        "of the metaclasses of all its bases");
        return NULL;
    }
    if (!metaclass) {
#if PY_MAJOR_VERSION < 3
        metaclass = &PyClass_Type;
#else
        metaclass = &PyType_Type;
#endif
    }
    Py_INCREF((PyObject*) metaclass);
    return (PyObject*) metaclass;
}

/* Py3ClassCreate */
              static PyObject *__Pyx_Py3MetaclassPrepare(PyObject *metaclass, PyObject *bases, PyObject *name,
                                           PyObject *qualname, PyObject *mkw, PyObject *modname, PyObject *doc) {
    PyObject *ns;
    if (metaclass) {
        PyObject *prep = __Pyx_PyObject_GetAttrStr(metaclass, __pyx_n_s_prepare);
        if (prep) {
            PyObject *pargs = PyTuple_Pack(2, name, bases);
            if (unlikely(!pargs)) {
                Py_DECREF(prep);
                return NULL;
            }
            ns = PyObject_Call(prep, pargs, mkw);
            Py_DECREF(prep);
            Py_DECREF(pargs);
        } else {
            if (unlikely(!PyErr_ExceptionMatches(PyExc_AttributeError)))
                return NULL;
            PyErr_Clear();
            ns = PyDict_New();
        }
    } else {
        ns = PyDict_New();
    }
    if (unlikely(!ns))
        return NULL;
    if (unlikely(PyObject_SetItem(ns, __pyx_n_s_module, modname) < 0)) goto bad;
    if (unlikely(PyObject_SetItem(ns, __pyx_n_s_qualname, qualname) < 0)) goto bad;
    if (unlikely(doc && PyObject_SetItem(ns, __pyx_n_s_doc, doc) < 0)) goto bad;
    return ns;
bad:
    Py_DECREF(ns);
    return NULL;
}
static PyObject *__Pyx_Py3ClassCreate(PyObject *metaclass, PyObject *name, PyObject *bases,
                                      PyObject *dict, PyObject *mkw,
                                      int calculate_metaclass, int allow_py2_metaclass) {
    PyObject *result, *margs;
    PyObject *owned_metaclass = NULL;
    if (allow_py2_metaclass) {
        owned_metaclass = PyObject_GetItem(dict, __pyx_n_s_metaclass);
        if (owned_metaclass) {
            metaclass = owned_metaclass;
        } else if (likely(PyErr_ExceptionMatches(PyExc_KeyError))) {
            PyErr_Clear();
        } else {
            return NULL;
        }
    }
    if (calculate_metaclass && (!metaclass || PyType_Check(metaclass))) {
        metaclass = __Pyx_CalculateMetaclass((PyTypeObject*) metaclass, bases);
        Py_XDECREF(owned_metaclass);
        if (unlikely(!metaclass))
            return NULL;
        owned_metaclass = metaclass;
    }
    margs = PyTuple_Pack(3, name, bases, dict);
    if (unlikely(!margs)) {
        result = NULL;
    } else {
        result = PyObject_Call(metaclass, margs, mkw);
        Py_DECREF(margs);
    }
    Py_XDECREF(owned_metaclass);
    return result;
}

/* GetAttr */
              static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *o, PyObject *n) {
#if CYTHON_COMPILING_IN_CPYTHON
#if PY_MAJOR_VERSION >= 3
    if (likely(PyUnicode_Check(n)))
#else
    if (likely(PyString_Check(n)))
#endif
        return __Pyx_PyObject_GetAttrStr(o, n);
#endif
    return PyObject_GetAttr(o, n);
}

/* Globals */
              static PyObject* __Pyx_Globals(void) {
    Py_ssize_t i;
    PyObject *names;
    PyObject *globals = __pyx_d;
    Py_INCREF(globals);
    names = PyObject_Dir(__pyx_m);
    if (!names)
        goto bad;
    for (i = PyList_GET_SIZE(names)-1; i >= 0; i--) {
#if CYTHON_COMPILING_IN_PYPY
        PyObject* name = PySequence_ITEM(names, i);
        if (!name)
            goto bad;
#else
        PyObject* name = PyList_GET_ITEM(names, i);
#endif
        if (!PyDict_Contains(globals, name)) {
            PyObject* value = __Pyx_GetAttr(__pyx_m, name);
            if (!value) {
#if CYTHON_COMPILING_IN_PYPY
                Py_DECREF(name);
#endif
                goto bad;
            }
            if (PyDict_SetItem(globals, name, value) < 0) {
#if CYTHON_COMPILING_IN_PYPY
                Py_DECREF(name);
#endif
                Py_DECREF(value);
                goto bad;
            }
        }
#if CYTHON_COMPILING_IN_PYPY
        Py_DECREF(name);
#endif
    }
    Py_DECREF(names);
    return globals;
bad:
    Py_XDECREF(names);
    Py_XDECREF(globals);
    return NULL;
}

/* CodeObjectCache */
              static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) {
    int start = 0, mid = 0, end = count - 1;
    if (end >= 0 && code_line > entries[end].code_line) {
        return count;
    }
    while (start < end) {
        mid = start + (end - start) / 2;
        if (code_line < entries[mid].code_line) {
            end = mid;
        } else if (code_line > entries[mid].code_line) {
             start = mid + 1;
        } else {
            return mid;
        }
    }
    if (code_line <= entries[mid].code_line) {
        return mid;
    } else {
        return mid + 1;
    }
}
static PyCodeObject *__pyx_find_code_object(int code_line) {
    PyCodeObject* code_object;
    int pos;
    if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) {
        return NULL;
    }
    pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line);
    if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) {
        return NULL;
    }
    code_object = __pyx_code_cache.entries[pos].code_object;
    Py_INCREF(code_object);
    return code_object;
}
static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) {
    int pos, i;
    __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries;
    if (unlikely(!code_line)) {
        return;
    }
    if (unlikely(!entries)) {
        entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry));
        if (likely(entries)) {
            __pyx_code_cache.entries = entries;
            __pyx_code_cache.max_count = 64;
            __pyx_code_cache.count = 1;
            entries[0].code_line = code_line;
            entries[0].code_object = code_object;
            Py_INCREF(code_object);
        }
        return;
    }
    pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line);
    if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) {
        PyCodeObject* tmp = entries[pos].code_object;
        entries[pos].code_object = code_object;
        Py_DECREF(tmp);
        return;
    }
    if (__pyx_code_cache.count == __pyx_code_cache.max_count) {
        int new_max = __pyx_code_cache.max_count + 64;
        entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc(
            __pyx_code_cache.entries, (size_t)new_max*sizeof(__Pyx_CodeObjectCacheEntry));
        if (unlikely(!entries)) {
            return;
        }
        __pyx_code_cache.entries = entries;
        __pyx_code_cache.max_count = new_max;
    }
    for (i=__pyx_code_cache.count; i>pos; i--) {
        entries[i] = entries[i-1];
    }
    entries[pos].code_line = code_line;
    entries[pos].code_object = code_object;
    __pyx_code_cache.count++;
    Py_INCREF(code_object);
}

/* AddTraceback */
              #include "compile.h"
#include "frameobject.h"
#include "traceback.h"
static PyCodeObject* __Pyx_CreateCodeObjectForTraceback(
            const char *funcname, int c_line,
            int py_line, const char *filename) {
    PyCodeObject *py_code = 0;
    PyObject *py_srcfile = 0;
    PyObject *py_funcname = 0;
    #if PY_MAJOR_VERSION < 3
    py_srcfile = PyString_FromString(filename);
    #else
    py_srcfile = PyUnicode_FromString(filename);
    #endif
    if (!py_srcfile) goto bad;
    if (c_line) {
        #if PY_MAJOR_VERSION < 3
        py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
        #else
        py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
        #endif
    }
    else {
        #if PY_MAJOR_VERSION < 3
        py_funcname = PyString_FromString(funcname);
        #else
        py_funcname = PyUnicode_FromString(funcname);
        #endif
    }
    if (!py_funcname) goto bad;
    py_code = __Pyx_PyCode_New(
        0,
        0,
        0,
        0,
        0,
        __pyx_empty_bytes, /*PyObject *code,*/
        __pyx_empty_tuple, /*PyObject *consts,*/
        __pyx_empty_tuple, /*PyObject *names,*/
        __pyx_empty_tuple, /*PyObject *varnames,*/
        __pyx_empty_tuple, /*PyObject *freevars,*/
        __pyx_empty_tuple, /*PyObject *cellvars,*/
        py_srcfile,   /*PyObject *filename,*/
        py_funcname,  /*PyObject *name,*/
        py_line,
        __pyx_empty_bytes  /*PyObject *lnotab*/
    );
    Py_DECREF(py_srcfile);
    Py_DECREF(py_funcname);
    return py_code;
bad:
    Py_XDECREF(py_srcfile);
    Py_XDECREF(py_funcname);
    return NULL;
}
static void __Pyx_AddTraceback(const char *funcname, int c_line,
                               int py_line, const char *filename) {
    PyCodeObject *py_code = 0;
    PyFrameObject *py_frame = 0;
    py_code = __pyx_find_code_object(c_line ? c_line : py_line);
    if (!py_code) {
        py_code = __Pyx_CreateCodeObjectForTraceback(
            funcname, c_line, py_line, filename);
        if (!py_code) goto bad;
        __pyx_insert_code_object(c_line ? c_line : py_line, py_code);
    }
    py_frame = PyFrame_New(
        PyThreadState_GET(), /*PyThreadState *tstate,*/
        py_code,             /*PyCodeObject *code,*/
        __pyx_d,      /*PyObject *globals,*/
        0                    /*PyObject *locals*/
    );
    if (!py_frame) goto bad;
    py_frame->f_lineno = py_line;
    PyTraceBack_Here(py_frame);
bad:
    Py_XDECREF(py_code);
    Py_XDECREF(py_frame);
}

/* CIntToPy */
              static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) {
    const long neg_one = (long) -1, const_zero = (long) 0;
    const int is_unsigned = neg_one > const_zero;
    if (is_unsigned) {
        if (sizeof(long) < sizeof(long)) {
            return PyInt_FromLong((long) value);
        } else if (sizeof(long) <= sizeof(unsigned long)) {
            return PyLong_FromUnsignedLong((unsigned long) value);
        } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) {
            return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
        }
    } else {
        if (sizeof(long) <= sizeof(long)) {
            return PyInt_FromLong((long) value);
        } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) {
            return PyLong_FromLongLong((PY_LONG_LONG) value);
        }
    }
    {
        int one = 1; int little = (int)*(unsigned char *)&one;
        unsigned char *bytes = (unsigned char *)&value;
        return _PyLong_FromByteArray(bytes, sizeof(long),
                                     little, !is_unsigned);
    }
}

/* CIntFromPyVerify */
              #define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\
    __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0)
#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\
    __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1)
#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\
    {\
        func_type value = func_value;\
        if (sizeof(target_type) < sizeof(func_type)) {\
            if (unlikely(value != (func_type) (target_type) value)) {\
                func_type zero = 0;\
                if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\
                    return (target_type) -1;\
                if (is_unsigned && unlikely(value < zero))\
                    goto raise_neg_overflow;\
                else\
                    goto raise_overflow;\
            }\
        }\
        return (target_type) value;\
    }

/* CIntFromPy */
              static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) {
    const long neg_one = (long) -1, const_zero = (long) 0;
    const int is_unsigned = neg_one > const_zero;
#if PY_MAJOR_VERSION < 3
    if (likely(PyInt_Check(x))) {
        if (sizeof(long) < sizeof(long)) {
            __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x))
        } else {
            long val = PyInt_AS_LONG(x);
            if (is_unsigned && unlikely(val < 0)) {
                goto raise_neg_overflow;
            }
            return (long) val;
        }
    } else
#endif
    if (likely(PyLong_Check(x))) {
        if (is_unsigned) {
#if CYTHON_USE_PYLONG_INTERNALS
            const digit* digits = ((PyLongObject*)x)->ob_digit;
            switch (Py_SIZE(x)) {
                case  0: return (long) 0;
                case  1: __PYX_VERIFY_RETURN_INT(long, digit, digits[0])
                case 2:
                    if (8 * sizeof(long) > 1 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(long) >= 2 * PyLong_SHIFT) {
                            return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]));
                        }
                    }
                    break;
                case 3:
                    if (8 * sizeof(long) > 2 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(long) >= 3 * PyLong_SHIFT) {
                            return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]));
                        }
                    }
                    break;
                case 4:
                    if (8 * sizeof(long) > 3 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(long) >= 4 * PyLong_SHIFT) {
                            return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]));
                        }
                    }
                    break;
            }
#endif
#if CYTHON_COMPILING_IN_CPYTHON
            if (unlikely(Py_SIZE(x) < 0)) {
                goto raise_neg_overflow;
            }
#else
            {
                int result = PyObject_RichCompareBool(x, Py_False, Py_LT);
                if (unlikely(result < 0))
                    return (long) -1;
                if (unlikely(result == 1))
                    goto raise_neg_overflow;
            }
#endif
            if (sizeof(long) <= sizeof(unsigned long)) {
                __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x))
            } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) {
                __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x))
            }
        } else {
#if CYTHON_USE_PYLONG_INTERNALS
            const digit* digits = ((PyLongObject*)x)->ob_digit;
            switch (Py_SIZE(x)) {
                case  0: return (long) 0;
                case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, (sdigit) (-(sdigit)digits[0]))
                case  1: __PYX_VERIFY_RETURN_INT(long,  digit, +digits[0])
                case -2:
                    if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
                            return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])));
                        }
                    }
                    break;
                case 2:
                    if (8 * sizeof(long) > 1 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
                            return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])));
                        }
                    }
                    break;
                case -3:
                    if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
                            return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])));
                        }
                    }
                    break;
                case 3:
                    if (8 * sizeof(long) > 2 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
                            return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])));
                        }
                    }
                    break;
                case -4:
                    if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) {
                            return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])));
                        }
                    }
                    break;
                case 4:
                    if (8 * sizeof(long) > 3 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) {
                            return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])));
                        }
                    }
                    break;
            }
#endif
            if (sizeof(long) <= sizeof(long)) {
                __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x))
            } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) {
                __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x))
            }
        }
        {
#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray)
            PyErr_SetString(PyExc_RuntimeError,
                            "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers");
#else
            long val;
            PyObject *v = __Pyx_PyNumber_IntOrLong(x);
 #if PY_MAJOR_VERSION < 3
            if (likely(v) && !PyLong_Check(v)) {
                PyObject *tmp = v;
                v = PyNumber_Long(tmp);
                Py_DECREF(tmp);
            }
 #endif
            if (likely(v)) {
                int one = 1; int is_little = (int)*(unsigned char *)&one;
                unsigned char *bytes = (unsigned char *)&val;
                int ret = _PyLong_AsByteArray((PyLongObject *)v,
                                              bytes, sizeof(val),
                                              is_little, !is_unsigned);
                Py_DECREF(v);
                if (likely(!ret))
                    return val;
            }
#endif
            return (long) -1;
        }
    } else {
        long val;
        PyObject *tmp = __Pyx_PyNumber_IntOrLong(x);
        if (!tmp) return (long) -1;
        val = __Pyx_PyInt_As_long(tmp);
        Py_DECREF(tmp);
        return val;
    }
raise_overflow:
    PyErr_SetString(PyExc_OverflowError,
        "value too large to convert to long");
    return (long) -1;
raise_neg_overflow:
    PyErr_SetString(PyExc_OverflowError,
        "can't convert negative value to long");
    return (long) -1;
}

/* CIntFromPy */
              static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) {
    const int neg_one = (int) -1, const_zero = (int) 0;
    const int is_unsigned = neg_one > const_zero;
#if PY_MAJOR_VERSION < 3
    if (likely(PyInt_Check(x))) {
        if (sizeof(int) < sizeof(long)) {
            __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x))
        } else {
            long val = PyInt_AS_LONG(x);
            if (is_unsigned && unlikely(val < 0)) {
                goto raise_neg_overflow;
            }
            return (int) val;
        }
    } else
#endif
    if (likely(PyLong_Check(x))) {
        if (is_unsigned) {
#if CYTHON_USE_PYLONG_INTERNALS
            const digit* digits = ((PyLongObject*)x)->ob_digit;
            switch (Py_SIZE(x)) {
                case  0: return (int) 0;
                case  1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0])
                case 2:
                    if (8 * sizeof(int) > 1 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) {
                            return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]));
                        }
                    }
                    break;
                case 3:
                    if (8 * sizeof(int) > 2 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) {
                            return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]));
                        }
                    }
                    break;
                case 4:
                    if (8 * sizeof(int) > 3 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) {
                            return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]));
                        }
                    }
                    break;
            }
#endif
#if CYTHON_COMPILING_IN_CPYTHON
            if (unlikely(Py_SIZE(x) < 0)) {
                goto raise_neg_overflow;
            }
#else
            {
                int result = PyObject_RichCompareBool(x, Py_False, Py_LT);
                if (unlikely(result < 0))
                    return (int) -1;
                if (unlikely(result == 1))
                    goto raise_neg_overflow;
            }
#endif
            if (sizeof(int) <= sizeof(unsigned long)) {
                __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x))
            } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) {
                __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x))
            }
        } else {
#if CYTHON_USE_PYLONG_INTERNALS
            const digit* digits = ((PyLongObject*)x)->ob_digit;
            switch (Py_SIZE(x)) {
                case  0: return (int) 0;
                case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, (sdigit) (-(sdigit)digits[0]))
                case  1: __PYX_VERIFY_RETURN_INT(int,  digit, +digits[0])
                case -2:
                    if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) {
                            return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])));
                        }
                    }
                    break;
                case 2:
                    if (8 * sizeof(int) > 1 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) {
                            return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])));
                        }
                    }
                    break;
                case -3:
                    if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) {
                            return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])));
                        }
                    }
                    break;
                case 3:
                    if (8 * sizeof(int) > 2 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) {
                            return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])));
                        }
                    }
                    break;
                case -4:
                    if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) {
                            return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])));
                        }
                    }
                    break;
                case 4:
                    if (8 * sizeof(int) > 3 * PyLong_SHIFT) {
                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
                            __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0])))
                        } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) {
                            return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])));
                        }
                    }
                    break;
            }
#endif
            if (sizeof(int) <= sizeof(long)) {
                __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x))
            } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) {
                __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x))
            }
        }
        {
#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray)
            PyErr_SetString(PyExc_RuntimeError,
                            "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers");
#else
            int val;
            PyObject *v = __Pyx_PyNumber_IntOrLong(x);
 #if PY_MAJOR_VERSION < 3
            if (likely(v) && !PyLong_Check(v)) {
                PyObject *tmp = v;
                v = PyNumber_Long(tmp);
                Py_DECREF(tmp);
            }
 #endif
            if (likely(v)) {
                int one = 1; int is_little = (int)*(unsigned char *)&one;
                unsigned char *bytes = (unsigned char *)&val;
                int ret = _PyLong_AsByteArray((PyLongObject *)v,
                                              bytes, sizeof(val),
                                              is_little, !is_unsigned);
                Py_DECREF(v);
                if (likely(!ret))
                    return val;
            }
#endif
            return (int) -1;
        }
    } else {
        int val;
        PyObject *tmp = __Pyx_PyNumber_IntOrLong(x);
        if (!tmp) return (int) -1;
        val = __Pyx_PyInt_As_int(tmp);
        Py_DECREF(tmp);
        return val;
    }
raise_overflow:
    PyErr_SetString(PyExc_OverflowError,
        "value too large to convert to int");
    return (int) -1;
raise_neg_overflow:
    PyErr_SetString(PyExc_OverflowError,
        "can't convert negative value to int");
    return (int) -1;
}

/* SwapException */
              #if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) {
    PyObject *tmp_type, *tmp_value, *tmp_tb;
    tmp_type = tstate->exc_type;
    tmp_value = tstate->exc_value;
    tmp_tb = tstate->exc_traceback;
    tstate->exc_type = *type;
    tstate->exc_value = *value;
    tstate->exc_traceback = *tb;
    *type = tmp_type;
    *value = tmp_value;
    *tb = tmp_tb;
}
#else
static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) {
    PyObject *tmp_type, *tmp_value, *tmp_tb;
    PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb);
    PyErr_SetExcInfo(*type, *value, *tb);
    *type = tmp_type;
    *value = tmp_value;
    *tb = tmp_tb;
}
#endif

/* PyObjectCallMethod1 */
              static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name, PyObject* arg) {
    PyObject *method, *result = NULL;
    method = __Pyx_PyObject_GetAttrStr(obj, method_name);
    if (unlikely(!method)) goto bad;
#if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyMethod_Check(method))) {
        PyObject *self = PyMethod_GET_SELF(method);
        if (likely(self)) {
            PyObject *args;
            PyObject *function = PyMethod_GET_FUNCTION(method);
            args = PyTuple_New(2);
            if (unlikely(!args)) goto bad;
            Py_INCREF(self);
            PyTuple_SET_ITEM(args, 0, self);
            Py_INCREF(arg);
            PyTuple_SET_ITEM(args, 1, arg);
            Py_INCREF(function);
            Py_DECREF(method); method = NULL;
            result = __Pyx_PyObject_Call(function, args, NULL);
            Py_DECREF(args);
            Py_DECREF(function);
            return result;
        }
    }
#endif
    result = __Pyx_PyObject_CallOneArg(method, arg);
bad:
    Py_XDECREF(method);
    return result;
}

/* CoroutineBase */
              #include <structmember.h>
#include <frameobject.h>
static PyObject *__Pyx_Coroutine_Send(PyObject *self, PyObject *value);
static PyObject *__Pyx_Coroutine_Close(PyObject *self);
static PyObject *__Pyx_Coroutine_Throw(PyObject *gen, PyObject *args);
#define __Pyx_Coroutine_Undelegate(gen) Py_CLEAR((gen)->yieldfrom)
#if 1 || PY_VERSION_HEX < 0x030300B0
static int __Pyx_PyGen_FetchStopIterationValue(PyObject **pvalue) {
    PyObject *et, *ev, *tb;
    PyObject *value = NULL;
    __Pyx_PyThreadState_declare
    __Pyx_PyThreadState_assign
    __Pyx_ErrFetch(&et, &ev, &tb);
    if (!et) {
        Py_XDECREF(tb);
        Py_XDECREF(ev);
        Py_INCREF(Py_None);
        *pvalue = Py_None;
        return 0;
    }
    if (likely(et == PyExc_StopIteration)) {
#if PY_VERSION_HEX >= 0x030300A0
        if (ev && Py_TYPE(ev) == (PyTypeObject*)PyExc_StopIteration) {
            value = ((PyStopIterationObject *)ev)->value;
            Py_INCREF(value);
            Py_DECREF(ev);
            Py_XDECREF(tb);
            Py_DECREF(et);
            *pvalue = value;
            return 0;
        }
#endif
        if (!ev || !PyObject_TypeCheck(ev, (PyTypeObject*)PyExc_StopIteration)) {
            if (!ev) {
                Py_INCREF(Py_None);
                ev = Py_None;
            } else if (PyTuple_Check(ev)) {
                if (PyTuple_GET_SIZE(ev) >= 1) {
                    PyObject *value;
#if CYTHON_COMPILING_IN_CPYTHON
                    value = PySequence_ITEM(ev, 0);
#else
                    value = PyTuple_GET_ITEM(ev, 0);
                    Py_INCREF(value);
#endif
                    Py_DECREF(ev);
                    ev = value;
                } else {
                    Py_INCREF(Py_None);
                    Py_DECREF(ev);
                    ev = Py_None;
                }
            }
            Py_XDECREF(tb);
            Py_DECREF(et);
            *pvalue = ev;
            return 0;
        }
    } else if (!PyErr_GivenExceptionMatches(et, PyExc_StopIteration)) {
        __Pyx_ErrRestore(et, ev, tb);
        return -1;
    }
    PyErr_NormalizeException(&et, &ev, &tb);
    if (unlikely(!PyObject_TypeCheck(ev, (PyTypeObject*)PyExc_StopIteration))) {
        __Pyx_ErrRestore(et, ev, tb);
        return -1;
    }
    Py_XDECREF(tb);
    Py_DECREF(et);
#if PY_VERSION_HEX >= 0x030300A0
    value = ((PyStopIterationObject *)ev)->value;
    Py_INCREF(value);
    Py_DECREF(ev);
#else
    {
        PyObject* args = __Pyx_PyObject_GetAttrStr(ev, __pyx_n_s_args);
        Py_DECREF(ev);
        if (likely(args)) {
            value = PySequence_GetItem(args, 0);
            Py_DECREF(args);
        }
        if (unlikely(!value)) {
            __Pyx_ErrRestore(NULL, NULL, NULL);
            Py_INCREF(Py_None);
            value = Py_None;
        }
    }
#endif
    *pvalue = value;
    return 0;
}
#endif
static CYTHON_INLINE
void __Pyx_Coroutine_ExceptionClear(__pyx_CoroutineObject *self) {
    PyObject *exc_type = self->exc_type;
    PyObject *exc_value = self->exc_value;
    PyObject *exc_traceback = self->exc_traceback;
    self->exc_type = NULL;
    self->exc_value = NULL;
    self->exc_traceback = NULL;
    Py_XDECREF(exc_type);
    Py_XDECREF(exc_value);
    Py_XDECREF(exc_traceback);
}
static CYTHON_INLINE
int __Pyx_Coroutine_CheckRunning(__pyx_CoroutineObject *gen) {
    if (unlikely(gen->is_running)) {
        PyErr_SetString(PyExc_ValueError,
                        "generator already executing");
        return 1;
    }
    return 0;
}
static CYTHON_INLINE
PyObject *__Pyx_Coroutine_SendEx(__pyx_CoroutineObject *self, PyObject *value) {
    PyObject *retval;
    __Pyx_PyThreadState_declare
    assert(!self->is_running);
    if (unlikely(self->resume_label == 0)) {
        if (unlikely(value && value != Py_None)) {
            PyErr_SetString(PyExc_TypeError,
                            "can't send non-None value to a "
                            "just-started generator");
            return NULL;
        }
    }
    if (unlikely(self->resume_label == -1)) {
        PyErr_SetNone(PyExc_StopIteration);
        return NULL;
    }
    __Pyx_PyThreadState_assign
    if (value) {
#if CYTHON_COMPILING_IN_PYPY
#else
        if (self->exc_traceback) {
            PyTracebackObject *tb = (PyTracebackObject *) self->exc_traceback;
            PyFrameObject *f = tb->tb_frame;
            Py_XINCREF(__pyx_tstate->frame);
            assert(f->f_back == NULL);
            f->f_back = __pyx_tstate->frame;
        }
#endif
        __Pyx_ExceptionSwap(&self->exc_type, &self->exc_value,
                            &self->exc_traceback);
    } else {
        __Pyx_Coroutine_ExceptionClear(self);
    }
    self->is_running = 1;
    retval = self->body((PyObject *) self, value);
    self->is_running = 0;
    if (retval) {
        __Pyx_ExceptionSwap(&self->exc_type, &self->exc_value,
                            &self->exc_traceback);
#if CYTHON_COMPILING_IN_PYPY
#else
        if (self->exc_traceback) {
            PyTracebackObject *tb = (PyTracebackObject *) self->exc_traceback;
            PyFrameObject *f = tb->tb_frame;
            Py_CLEAR(f->f_back);
        }
#endif
    } else {
        __Pyx_Coroutine_ExceptionClear(self);
    }
    return retval;
}
static CYTHON_INLINE
PyObject *__Pyx_Coroutine_MethodReturn(PyObject *retval) {
    if (unlikely(!retval && !PyErr_Occurred())) {
        PyErr_SetNone(PyExc_StopIteration);
    }
    return retval;
}
static CYTHON_INLINE
PyObject *__Pyx_Coroutine_FinishDelegation(__pyx_CoroutineObject *gen) {
    PyObject *ret;
    PyObject *val = NULL;
    __Pyx_Coroutine_Undelegate(gen);
    __Pyx_PyGen_FetchStopIterationValue(&val);
    ret = __Pyx_Coroutine_SendEx(gen, val);
    Py_XDECREF(val);
    return ret;
}
static PyObject *__Pyx_Coroutine_Send(PyObject *self, PyObject *value) {
    PyObject *retval;
    __pyx_CoroutineObject *gen = (__pyx_CoroutineObject*) self;
    PyObject *yf = gen->yieldfrom;
    if (unlikely(__Pyx_Coroutine_CheckRunning(gen)))
        return NULL;
    if (yf) {
        PyObject *ret;
        gen->is_running = 1;
        #ifdef __Pyx_Generator_USED
        if (__Pyx_Generator_CheckExact(yf)) {
            ret = __Pyx_Coroutine_Send(yf, value);
        } else
        #endif
        #ifdef __Pyx_Coroutine_USED
        if (__Pyx_Coroutine_CheckExact(yf)) {
            ret = __Pyx_Coroutine_Send(yf, value);
        } else
        #endif
        {
            if (value == Py_None)
                ret = Py_TYPE(yf)->tp_iternext(yf);
            else
                ret = __Pyx_PyObject_CallMethod1(yf, __pyx_n_s_send, value);
        }
        gen->is_running = 0;
        if (likely(ret)) {
            return ret;
        }
        retval = __Pyx_Coroutine_FinishDelegation(gen);
    } else {
        retval = __Pyx_Coroutine_SendEx(gen, value);
    }
    return __Pyx_Coroutine_MethodReturn(retval);
}
static int __Pyx_Coroutine_CloseIter(__pyx_CoroutineObject *gen, PyObject *yf) {
    PyObject *retval = NULL;
    int err = 0;
    #ifdef __Pyx_Generator_USED
    if (__Pyx_Generator_CheckExact(yf)) {
        retval = __Pyx_Coroutine_Close(yf);
        if (!retval)
            return -1;
    } else
    #endif
    #ifdef __Pyx_Coroutine_USED
    if (__Pyx_Coroutine_CheckExact(yf)) {
        retval = __Pyx_Coroutine_Close(yf);
        if (!retval)
            return -1;
    } else
    #endif
    {
        PyObject *meth;
        gen->is_running = 1;
        meth = __Pyx_PyObject_GetAttrStr(yf, __pyx_n_s_close);
        if (unlikely(!meth)) {
            if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
                PyErr_WriteUnraisable(yf);
            }
            PyErr_Clear();
        } else {
            retval = PyObject_CallFunction(meth, NULL);
            Py_DECREF(meth);
            if (!retval)
                err = -1;
        }
        gen->is_running = 0;
    }
    Py_XDECREF(retval);
    return err;
}
static PyObject *__Pyx_Generator_Next(PyObject *self) {
    __pyx_CoroutineObject *gen = (__pyx_CoroutineObject*) self;
    PyObject *yf = gen->yieldfrom;
    if (unlikely(__Pyx_Coroutine_CheckRunning(gen)))
        return NULL;
    if (yf) {
        PyObject *ret;
        gen->is_running = 1;
        ret = Py_TYPE(yf)->tp_iternext(yf);
        gen->is_running = 0;
        if (likely(ret)) {
            return ret;
        }
        return __Pyx_Coroutine_FinishDelegation(gen);
    }
    return __Pyx_Coroutine_SendEx(gen, Py_None);
}
static PyObject *__Pyx_Coroutine_Close(PyObject *self) {
    __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self;
    PyObject *retval, *raised_exception;
    PyObject *yf = gen->yieldfrom;
    int err = 0;
    if (unlikely(__Pyx_Coroutine_CheckRunning(gen)))
        return NULL;
    if (yf) {
        Py_INCREF(yf);
        err = __Pyx_Coroutine_CloseIter(gen, yf);
        __Pyx_Coroutine_Undelegate(gen);
        Py_DECREF(yf);
    }
    if (err == 0)
        PyErr_SetNone(PyExc_GeneratorExit);
    retval = __Pyx_Coroutine_SendEx(gen, NULL);
    if (retval) {
        Py_DECREF(retval);
        PyErr_SetString(PyExc_RuntimeError,
                        "generator ignored GeneratorExit");
        return NULL;
    }
    raised_exception = PyErr_Occurred();
    if (!raised_exception
        || raised_exception == PyExc_StopIteration
        || raised_exception == PyExc_GeneratorExit
        || PyErr_GivenExceptionMatches(raised_exception, PyExc_GeneratorExit)
        || PyErr_GivenExceptionMatches(raised_exception, PyExc_StopIteration))
    {
        if (raised_exception) PyErr_Clear();
        Py_INCREF(Py_None);
        return Py_None;
    }
    return NULL;
}
static PyObject *__Pyx_Coroutine_Throw(PyObject *self, PyObject *args) {
    __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self;
    PyObject *typ;
    PyObject *tb = NULL;
    PyObject *val = NULL;
    PyObject *yf = gen->yieldfrom;
    if (!PyArg_UnpackTuple(args, (char *)"throw", 1, 3, &typ, &val, &tb))
        return NULL;
    if (unlikely(__Pyx_Coroutine_CheckRunning(gen)))
        return NULL;
    if (yf) {
        PyObject *ret;
        Py_INCREF(yf);
        if (PyErr_GivenExceptionMatches(typ, PyExc_GeneratorExit)) {
            int err = __Pyx_Coroutine_CloseIter(gen, yf);
            Py_DECREF(yf);
            __Pyx_Coroutine_Undelegate(gen);
            if (err < 0)
                return __Pyx_Coroutine_MethodReturn(__Pyx_Coroutine_SendEx(gen, NULL));
            goto throw_here;
        }
        gen->is_running = 1;
        #ifdef __Pyx_Generator_USED
        if (__Pyx_Generator_CheckExact(yf)) {
            ret = __Pyx_Coroutine_Throw(yf, args);
        } else
        #endif
        #ifdef __Pyx_Coroutine_USED
        if (__Pyx_Coroutine_CheckExact(yf)) {
            ret = __Pyx_Coroutine_Throw(yf, args);
        } else
        #endif
        {
            PyObject *meth = __Pyx_PyObject_GetAttrStr(yf, __pyx_n_s_throw);
            if (unlikely(!meth)) {
                Py_DECREF(yf);
                if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
                    gen->is_running = 0;
                    return NULL;
                }
                PyErr_Clear();
                __Pyx_Coroutine_Undelegate(gen);
                gen->is_running = 0;
                goto throw_here;
            }
            ret = PyObject_CallObject(meth, args);
            Py_DECREF(meth);
        }
        gen->is_running = 0;
        Py_DECREF(yf);
        if (!ret) {
            ret = __Pyx_Coroutine_FinishDelegation(gen);
        }
        return __Pyx_Coroutine_MethodReturn(ret);
    }
throw_here:
    __Pyx_Raise(typ, val, tb, NULL);
    return __Pyx_Coroutine_MethodReturn(__Pyx_Coroutine_SendEx(gen, NULL));
}
static int __Pyx_Coroutine_traverse(PyObject *self, visitproc visit, void *arg) {
    __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self;
    Py_VISIT(gen->closure);
    Py_VISIT(gen->classobj);
    Py_VISIT(gen->yieldfrom);
    Py_VISIT(gen->exc_type);
    Py_VISIT(gen->exc_value);
    Py_VISIT(gen->exc_traceback);
    return 0;
}
static int __Pyx_Coroutine_clear(PyObject *self) {
    __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self;
    Py_CLEAR(gen->closure);
    Py_CLEAR(gen->classobj);
    Py_CLEAR(gen->yieldfrom);
    Py_CLEAR(gen->exc_type);
    Py_CLEAR(gen->exc_value);
    Py_CLEAR(gen->exc_traceback);
    Py_CLEAR(gen->gi_name);
    Py_CLEAR(gen->gi_qualname);
    return 0;
}
static void __Pyx_Coroutine_dealloc(PyObject *self) {
    __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self;
    PyObject_GC_UnTrack(gen);
    if (gen->gi_weakreflist != NULL)
        PyObject_ClearWeakRefs(self);
    if (gen->resume_label > 0) {
        PyObject_GC_Track(self);
#if PY_VERSION_HEX >= 0x030400a1
        if (PyObject_CallFinalizerFromDealloc(self))
#else
        Py_TYPE(gen)->tp_del(self);
        if (self->ob_refcnt > 0)
#endif
        {
            return;
        }
        PyObject_GC_UnTrack(self);
    }
    __Pyx_Coroutine_clear(self);
    PyObject_GC_Del(gen);
}
static void __Pyx_Coroutine_del(PyObject *self) {
    PyObject *res;
    PyObject *error_type, *error_value, *error_traceback;
    __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self;
    __Pyx_PyThreadState_declare
    if (gen->resume_label <= 0)
        return ;
#if PY_VERSION_HEX < 0x030400a1
    assert(self->ob_refcnt == 0);
    self->ob_refcnt = 1;
#endif
    __Pyx_PyThreadState_assign
    __Pyx_ErrFetch(&error_type, &error_value, &error_traceback);
    res = __Pyx_Coroutine_Close(self);
    if (res == NULL)
        PyErr_WriteUnraisable(self);
    else
        Py_DECREF(res);
    __Pyx_ErrRestore(error_type, error_value, error_traceback);
#if PY_VERSION_HEX < 0x030400a1
    assert(self->ob_refcnt > 0);
    if (--self->ob_refcnt == 0) {
        return;
    }
    {
        Py_ssize_t refcnt = self->ob_refcnt;
        _Py_NewReference(self);
        self->ob_refcnt = refcnt;
    }
#if CYTHON_COMPILING_IN_CPYTHON
    assert(PyType_IS_GC(self->ob_type) &&
           _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
    _Py_DEC_REFTOTAL;
#endif
#ifdef COUNT_ALLOCS
    --Py_TYPE(self)->tp_frees;
    --Py_TYPE(self)->tp_allocs;
#endif
#endif
}
static PyObject *
__Pyx_Coroutine_get_name(__pyx_CoroutineObject *self)
{
    Py_INCREF(self->gi_name);
    return self->gi_name;
}
static int
__Pyx_Coroutine_set_name(__pyx_CoroutineObject *self, PyObject *value)
{
    PyObject *tmp;
#if PY_MAJOR_VERSION >= 3
    if (unlikely(value == NULL || !PyUnicode_Check(value))) {
#else
    if (unlikely(value == NULL || !PyString_Check(value))) {
#endif
        PyErr_SetString(PyExc_TypeError,
                        "__name__ must be set to a string object");
        return -1;
    }
    tmp = self->gi_name;
    Py_INCREF(value);
    self->gi_name = value;
    Py_XDECREF(tmp);
    return 0;
}
static PyObject *
__Pyx_Coroutine_get_qualname(__pyx_CoroutineObject *self)
{
    Py_INCREF(self->gi_qualname);
    return self->gi_qualname;
}
static int
__Pyx_Coroutine_set_qualname(__pyx_CoroutineObject *self, PyObject *value)
{
    PyObject *tmp;
#if PY_MAJOR_VERSION >= 3
    if (unlikely(value == NULL || !PyUnicode_Check(value))) {
#else
    if (unlikely(value == NULL || !PyString_Check(value))) {
#endif
        PyErr_SetString(PyExc_TypeError,
                        "__qualname__ must be set to a string object");
        return -1;
    }
    tmp = self->gi_qualname;
    Py_INCREF(value);
    self->gi_qualname = value;
    Py_XDECREF(tmp);
    return 0;
}
static __pyx_CoroutineObject *__Pyx__Coroutine_New(PyTypeObject* type, __pyx_coroutine_body_t body,
                                                   PyObject *closure, PyObject *name, PyObject *qualname) {
    __pyx_CoroutineObject *gen = PyObject_GC_New(__pyx_CoroutineObject, type);
    if (gen == NULL)
        return NULL;
    gen->body = body;
    gen->closure = closure;
    Py_XINCREF(closure);
    gen->is_running = 0;
    gen->resume_label = 0;
    gen->classobj = NULL;
    gen->yieldfrom = NULL;
    gen->exc_type = NULL;
    gen->exc_value = NULL;
    gen->exc_traceback = NULL;
    gen->gi_weakreflist = NULL;
    Py_XINCREF(qualname);
    gen->gi_qualname = qualname;
    Py_XINCREF(name);
    gen->gi_name = name;
    PyObject_GC_Track(gen);
    return gen;
}

/* PatchGeneratorABC */
                  #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED)
static PyObject* __Pyx_patch_abc_module(PyObject *module);
static PyObject* __Pyx_patch_abc_module(PyObject *module) {
    module = __Pyx_Coroutine_patch_module(
        module, ""
"if _cython_generator_type is not None:\n"
"    try: Generator = _module.Generator\n"
"    except AttributeError: pass\n"
"    else: Generator.register(_cython_generator_type)\n"
"if _cython_coroutine_type is not None:\n"
"    try: Coroutine = _module.Coroutine\n"
"    except AttributeError: pass\n"
"    else: Coroutine.register(_cython_coroutine_type)\n"
    );
    return module;
}
#endif
static int __Pyx_patch_abc(void) {
#if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED)
    static int abc_patched = 0;
    if (!abc_patched) {
        PyObject *module;
        module = PyImport_ImportModule((PY_VERSION_HEX >= 0x03030000) ? "collections.abc" : "collections");
        if (!module) {
            PyErr_WriteUnraisable(NULL);
            if (unlikely(PyErr_WarnEx(PyExc_RuntimeWarning,
                    ((PY_VERSION_HEX >= 0x03030000) ?
                        "Cython module failed to register with collections.abc module" :
                        "Cython module failed to register with collections module"), 1) < 0)) {
                return -1;
            }
        } else {
            module = __Pyx_patch_abc_module(module);
            abc_patched = 1;
            if (unlikely(!module))
                return -1;
            Py_DECREF(module);
        }
        module = PyImport_ImportModule("backports_abc");
        if (module) {
            module = __Pyx_patch_abc_module(module);
            Py_XDECREF(module);
        }
        if (!module) {
            PyErr_Clear();
        }
    }
#else
    if (0) __Pyx_Coroutine_patch_module(NULL, NULL);
#endif
    return 0;
}

/* Generator */
                  static PyMethodDef __pyx_Generator_methods[] = {
    {"send", (PyCFunction) __Pyx_Coroutine_Send, METH_O,
     (char*) PyDoc_STR("send(arg) -> send 'arg' into generator,\nreturn next yielded value or raise StopIteration.")},
    {"throw", (PyCFunction) __Pyx_Coroutine_Throw, METH_VARARGS,
     (char*) PyDoc_STR("throw(typ[,val[,tb]]) -> raise exception in generator,\nreturn next yielded value or raise StopIteration.")},
    {"close", (PyCFunction) __Pyx_Coroutine_Close, METH_NOARGS,
     (char*) PyDoc_STR("close() -> raise GeneratorExit inside generator.")},
    {0, 0, 0, 0}
};
static PyMemberDef __pyx_Generator_memberlist[] = {
    {(char *) "gi_running", T_BOOL, offsetof(__pyx_CoroutineObject, is_running), READONLY, NULL},
    {(char*) "gi_yieldfrom", T_OBJECT, offsetof(__pyx_CoroutineObject, yieldfrom), READONLY,
     (char*) PyDoc_STR("object being iterated by 'yield from', or None")},
    {0, 0, 0, 0, 0}
};
static PyGetSetDef __pyx_Generator_getsets[] = {
    {(char *) "__name__", (getter)__Pyx_Coroutine_get_name, (setter)__Pyx_Coroutine_set_name,
     (char*) PyDoc_STR("name of the generator"), 0},
    {(char *) "__qualname__", (getter)__Pyx_Coroutine_get_qualname, (setter)__Pyx_Coroutine_set_qualname,
     (char*) PyDoc_STR("qualified name of the generator"), 0},
    {0, 0, 0, 0, 0}
};
static PyTypeObject __pyx_GeneratorType_type = {
    PyVarObject_HEAD_INIT(0, 0)
    "generator",
    sizeof(__pyx_CoroutineObject),
    0,
    (destructor) __Pyx_Coroutine_dealloc,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE,
    0,
    (traverseproc) __Pyx_Coroutine_traverse,
    0,
    0,
    offsetof(__pyx_CoroutineObject, gi_weakreflist),
    0,
    (iternextfunc) __Pyx_Generator_Next,
    __pyx_Generator_methods,
    __pyx_Generator_memberlist,
    __pyx_Generator_getsets,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
#if PY_VERSION_HEX >= 0x030400a1
    0,
#else
    __Pyx_Coroutine_del,
#endif
    0,
#if PY_VERSION_HEX >= 0x030400a1
    __Pyx_Coroutine_del,
#endif
};
static int __pyx_Generator_init(void) {
    __pyx_GeneratorType_type.tp_getattro = PyObject_GenericGetAttr;
    __pyx_GeneratorType_type.tp_iter = PyObject_SelfIter;
    __pyx_GeneratorType = __Pyx_FetchCommonType(&__pyx_GeneratorType_type);
    if (unlikely(!__pyx_GeneratorType)) {
        return -1;
    }
    return 0;
}

/* CheckBinaryVersion */
                  static int __Pyx_check_binary_version(void) {
    char ctversion[4], rtversion[4];
    PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION);
    PyOS_snprintf(rtversion, 4, "%s", Py_GetVersion());
    if (ctversion[0] != rtversion[0] || ctversion[2] != rtversion[2]) {
        char message[200];
        PyOS_snprintf(message, sizeof(message),
                      "compiletime version %s of module '%.100s' "
                      "does not match runtime version %s",
                      ctversion, __Pyx_MODULE_NAME, rtversion);
        return PyErr_WarnEx(NULL, message, 1);
    }
    return 0;
}

/* VoidPtrExport */
                  static int __Pyx_ExportVoidPtr(PyObject *name, void *p, const char *sig) {
    PyObject *d;
    PyObject *cobj = 0;
    d = PyDict_GetItem(__pyx_d, __pyx_n_s_pyx_capi);
    Py_XINCREF(d);
    if (!d) {
        d = PyDict_New();
        if (!d)
            goto bad;
        if (__Pyx_PyObject_SetAttrStr(__pyx_m, __pyx_n_s_pyx_capi, d) < 0)
            goto bad;
    }
#if PY_VERSION_HEX >= 0x02070000
    cobj = PyCapsule_New(p, sig, 0);
#else
    cobj = PyCObject_FromVoidPtrAndDesc(p, (void *)sig, 0);
#endif
    if (!cobj)
        goto bad;
    if (PyDict_SetItem(d, name, cobj) < 0)
        goto bad;
    Py_DECREF(cobj);
    Py_DECREF(d);
    return 0;
bad:
    Py_XDECREF(cobj);
    Py_XDECREF(d);
    return -1;
}

/* FunctionExport */
                  static int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *sig) {
    PyObject *d = 0;
    PyObject *cobj = 0;
    union {
        void (*fp)(void);
        void *p;
    } tmp;
    d = PyObject_GetAttrString(__pyx_m, (char *)"__pyx_capi__");
    if (!d) {
        PyErr_Clear();
        d = PyDict_New();
        if (!d)
            goto bad;
        Py_INCREF(d);
        if (PyModule_AddObject(__pyx_m, (char *)"__pyx_capi__", d) < 0)
            goto bad;
    }
    tmp.fp = f;
#if PY_VERSION_HEX >= 0x02070000
    cobj = PyCapsule_New(tmp.p, sig, 0);
#else
    cobj = PyCObject_FromVoidPtrAndDesc(tmp.p, (void *)sig, 0);
#endif
    if (!cobj)
        goto bad;
    if (PyDict_SetItemString(d, name, cobj) < 0)
        goto bad;
    Py_DECREF(cobj);
    Py_DECREF(d);
    return 0;
bad:
    Py_XDECREF(cobj);
    Py_XDECREF(d);
    return -1;
}

/* ModuleImport */
                  #ifndef __PYX_HAVE_RT_ImportModule
#define __PYX_HAVE_RT_ImportModule
static PyObject *__Pyx_ImportModule(const char *name) {
    PyObject *py_name = 0;
    PyObject *py_module = 0;
    py_name = __Pyx_PyIdentifier_FromString(name);
    if (!py_name)
        goto bad;
    py_module = PyImport_Import(py_name);
    Py_DECREF(py_name);
    return py_module;
bad:
    Py_XDECREF(py_name);
    return 0;
}
#endif

/* TypeImport */
                  #ifndef __PYX_HAVE_RT_ImportType
#define __PYX_HAVE_RT_ImportType
static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name,
    size_t size, int strict)
{
    PyObject *py_module = 0;
    PyObject *result = 0;
    PyObject *py_name = 0;
    char warning[200];
    Py_ssize_t basicsize;
#ifdef Py_LIMITED_API
    PyObject *py_basicsize;
#endif
    py_module = __Pyx_ImportModule(module_name);
    if (!py_module)
        goto bad;
    py_name = __Pyx_PyIdentifier_FromString(class_name);
    if (!py_name)
        goto bad;
    result = PyObject_GetAttr(py_module, py_name);
    Py_DECREF(py_name);
    py_name = 0;
    Py_DECREF(py_module);
    py_module = 0;
    if (!result)
        goto bad;
    if (!PyType_Check(result)) {
        PyErr_Format(PyExc_TypeError,
            "%.200s.%.200s is not a type object",
            module_name, class_name);
        goto bad;
    }
#ifndef Py_LIMITED_API
    basicsize = ((PyTypeObject *)result)->tp_basicsize;
#else
    py_basicsize = PyObject_GetAttrString(result, "__basicsize__");
    if (!py_basicsize)
        goto bad;
    basicsize = PyLong_AsSsize_t(py_basicsize);
    Py_DECREF(py_basicsize);
    py_basicsize = 0;
    if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred())
        goto bad;
#endif
    if (!strict && (size_t)basicsize > size) {
        PyOS_snprintf(warning, sizeof(warning),
            "%s.%s size changed, may indicate binary incompatibility. Expected %zd, got %zd",
            module_name, class_name, basicsize, size);
        if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad;
    }
    else if ((size_t)basicsize != size) {
        PyErr_Format(PyExc_ValueError,
            "%.200s.%.200s has the wrong size, try recompiling. Expected %zd, got %zd",
            module_name, class_name, basicsize, size);
        goto bad;
    }
    return (PyTypeObject *)result;
bad:
    Py_XDECREF(py_module);
    Py_XDECREF(result);
    return NULL;
}
#endif

/* VoidPtrImport */
                  #ifndef __PYX_HAVE_RT_ImportVoidPtr
#define __PYX_HAVE_RT_ImportVoidPtr
static int __Pyx_ImportVoidPtr(PyObject *module, const char *name, void **p, const char *sig) {
    PyObject *d = 0;
    PyObject *cobj = 0;
    d = PyObject_GetAttrString(module, (char *)"__pyx_capi__");
    if (!d)
        goto bad;
    cobj = PyDict_GetItemString(d, name);
    if (!cobj) {
        PyErr_Format(PyExc_ImportError,
            "%.200s does not export expected C variable %.200s",
                PyModule_GetName(module), name);
        goto bad;
    }
#if PY_VERSION_HEX >= 0x02070000
    if (!PyCapsule_IsValid(cobj, sig)) {
        PyErr_Format(PyExc_TypeError,
            "C variable %.200s.%.200s has wrong signature (expected %.500s, got %.500s)",
             PyModule_GetName(module), name, sig, PyCapsule_GetName(cobj));
        goto bad;
    }
    *p = PyCapsule_GetPointer(cobj, sig);
#else
    {const char *desc, *s1, *s2;
    desc = (const char *)PyCObject_GetDesc(cobj);
    if (!desc)
        goto bad;
    s1 = desc; s2 = sig;
    while (*s1 != '\0' && *s1 == *s2) { s1++; s2++; }
    if (*s1 != *s2) {
        PyErr_Format(PyExc_TypeError,
            "C variable %.200s.%.200s has wrong signature (expected %.500s, got %.500s)",
             PyModule_GetName(module), name, sig, desc);
        goto bad;
    }
    *p = PyCObject_AsVoidPtr(cobj);}
#endif
    if (!(*p))
        goto bad;
    Py_DECREF(d);
    return 0;
bad:
    Py_XDECREF(d);
    return -1;
}
#endif

/* FunctionImport */
                  #ifndef __PYX_HAVE_RT_ImportFunction
#define __PYX_HAVE_RT_ImportFunction
static int __Pyx_ImportFunction(PyObject *module, const char *funcname, void (**f)(void), const char *sig) {
    PyObject *d = 0;
    PyObject *cobj = 0;
    union {
        void (*fp)(void);
        void *p;
    } tmp;
    d = PyObject_GetAttrString(module, (char *)"__pyx_capi__");
    if (!d)
        goto bad;
    cobj = PyDict_GetItemString(d, funcname);
    if (!cobj) {
        PyErr_Format(PyExc_ImportError,
            "%.200s does not export expected C function %.200s",
                PyModule_GetName(module), funcname);
        goto bad;
    }
#if PY_VERSION_HEX >= 0x02070000
    if (!PyCapsule_IsValid(cobj, sig)) {
        PyErr_Format(PyExc_TypeError,
            "C function %.200s.%.200s has wrong signature (expected %.500s, got %.500s)",
             PyModule_GetName(module), funcname, sig, PyCapsule_GetName(cobj));
        goto bad;
    }
    tmp.p = PyCapsule_GetPointer(cobj, sig);
#else
    {const char *desc, *s1, *s2;
    desc = (const char *)PyCObject_GetDesc(cobj);
    if (!desc)
        goto bad;
    s1 = desc; s2 = sig;
    while (*s1 != '\0' && *s1 == *s2) { s1++; s2++; }
    if (*s1 != *s2) {
        PyErr_Format(PyExc_TypeError,
            "C function %.200s.%.200s has wrong signature (expected %.500s, got %.500s)",
             PyModule_GetName(module), funcname, sig, desc);
        goto bad;
    }
    tmp.p = PyCObject_AsVoidPtr(cobj);}
#endif
    *f = tmp.fp;
    if (!(*f))
        goto bad;
    Py_DECREF(d);
    return 0;
bad:
    Py_XDECREF(d);
    return -1;
}
#endif

/* InitStrings */
                  static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) {
    while (t->p) {
        #if PY_MAJOR_VERSION < 3
        if (t->is_unicode) {
            *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL);
        } else if (t->intern) {
            *t->p = PyString_InternFromString(t->s);
        } else {
            *t->p = PyString_FromStringAndSize(t->s, t->n - 1);
        }
        #else
        if (t->is_unicode | t->is_str) {
            if (t->intern) {
                *t->p = PyUnicode_InternFromString(t->s);
            } else if (t->encoding) {
                *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL);
            } else {
                *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1);
            }
        } else {
            *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1);
        }
        #endif
        if (!*t->p)
            return -1;
        ++t;
    }
    return 0;
}

static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) {
    return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str));
}
static CYTHON_INLINE char* __Pyx_PyObject_AsString(PyObject* o) {
    Py_ssize_t ignore;
    return __Pyx_PyObject_AsStringAndSize(o, &ignore);
}
static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) {
#if CYTHON_COMPILING_IN_CPYTHON && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT)
    if (
#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII
            __Pyx_sys_getdefaultencoding_not_ascii &&
#endif
            PyUnicode_Check(o)) {
#if PY_VERSION_HEX < 0x03030000
        char* defenc_c;
        PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL);
        if (!defenc) return NULL;
        defenc_c = PyBytes_AS_STRING(defenc);
#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII
        {
            char* end = defenc_c + PyBytes_GET_SIZE(defenc);
            char* c;
            for (c = defenc_c; c < end; c++) {
                if ((unsigned char) (*c) >= 128) {
                    PyUnicode_AsASCIIString(o);
                    return NULL;
                }
            }
        }
#endif
        *length = PyBytes_GET_SIZE(defenc);
        return defenc_c;
#else
        if (__Pyx_PyUnicode_READY(o) == -1) return NULL;
#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII
        if (PyUnicode_IS_ASCII(o)) {
            *length = PyUnicode_GET_LENGTH(o);
            return PyUnicode_AsUTF8(o);
        } else {
            PyUnicode_AsASCIIString(o);
            return NULL;
        }
#else
        return PyUnicode_AsUTF8AndSize(o, length);
#endif
#endif
    } else
#endif
#if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE))
    if (PyByteArray_Check(o)) {
        *length = PyByteArray_GET_SIZE(o);
        return PyByteArray_AS_STRING(o);
    } else
#endif
    {
        char* result;
        int r = PyBytes_AsStringAndSize(o, &result, length);
        if (unlikely(r < 0)) {
            return NULL;
        } else {
            return result;
        }
    }
}
static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) {
   int is_true = x == Py_True;
   if (is_true | (x == Py_False) | (x == Py_None)) return is_true;
   else return PyObject_IsTrue(x);
}
static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) {
  PyNumberMethods *m;
  const char *name = NULL;
  PyObject *res = NULL;
#if PY_MAJOR_VERSION < 3
  if (PyInt_Check(x) || PyLong_Check(x))
#else
  if (PyLong_Check(x))
#endif
    return __Pyx_NewRef(x);
  m = Py_TYPE(x)->tp_as_number;
#if PY_MAJOR_VERSION < 3
  if (m && m->nb_int) {
    name = "int";
    res = PyNumber_Int(x);
  }
  else if (m && m->nb_long) {
    name = "long";
    res = PyNumber_Long(x);
  }
#else
  if (m && m->nb_int) {
    name = "int";
    res = PyNumber_Long(x);
  }
#endif
  if (res) {
#if PY_MAJOR_VERSION < 3
    if (!PyInt_Check(res) && !PyLong_Check(res)) {
#else
    if (!PyLong_Check(res)) {
#endif
      PyErr_Format(PyExc_TypeError,
                   "__%.4s__ returned non-%.4s (type %.200s)",
                   name, name, Py_TYPE(res)->tp_name);
      Py_DECREF(res);
      return NULL;
    }
  }
  else if (!PyErr_Occurred()) {
    PyErr_SetString(PyExc_TypeError,
                    "an integer is required");
  }
  return res;
}
static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) {
  Py_ssize_t ival;
  PyObject *x;
#if PY_MAJOR_VERSION < 3
  if (likely(PyInt_CheckExact(b))) {
    if (sizeof(Py_ssize_t) >= sizeof(long))
        return PyInt_AS_LONG(b);
    else
        return PyInt_AsSsize_t(x);
  }
#endif
  if (likely(PyLong_CheckExact(b))) {
    #if CYTHON_USE_PYLONG_INTERNALS
    const digit* digits = ((PyLongObject*)b)->ob_digit;
    const Py_ssize_t size = Py_SIZE(b);
    if (likely(__Pyx_sst_abs(size) <= 1)) {
        ival = likely(size) ? digits[0] : 0;
        if (size == -1) ival = -ival;
        return ival;
    } else {
      switch (size) {
         case 2:
           if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) {
             return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
           }
           break;
         case -2:
           if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) {
             return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
           }
           break;
         case 3:
           if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) {
             return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
           }
           break;
         case -3:
           if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) {
             return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
           }
           break;
         case 4:
           if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) {
             return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
           }
           break;
         case -4:
           if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) {
             return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]));
           }
           break;
      }
    }
    #endif
    return PyLong_AsSsize_t(b);
  }
  x = PyNumber_Index(b);
  if (!x) return -1;
  ival = PyInt_AsSsize_t(x);
  Py_DECREF(x);
  return ival;
}
static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) {
    return PyInt_FromSize_t(ival);
}


#endif /* Py_PYTHON_H */
